OK. ScriptEngine.eval(String string) evaluates a string in its entirety, and ScriptEngine.eval(Reader reader) evaluates the input from a Reader in its entirety.
So if I have a file, I can open a FileInputStream, wrap a Reader around it, and call scriptEngine.eval(reader).
If I have a complete statement as a string, I can call scriptEngine.eval(string).
What do I do if I need to implement an interactive interpreter? I have a user who is interactively typing in a multiline statement, e.g.
function f() {
return 3;
}
If I read the input line by line, and use the String form of eval(), I'll end up passing it incomplete statements, e.g. function f() { and get an error.
If I pass in a Reader, the ScriptEngine will wait forever until the input is complete, and it's not interactive.
Help!
Just to clarify: the problem here is that I can only pass ScriptEngine.eval() complete statements, and as the customer of ScriptEngine, I don't know when an input line is complete without some help from the ScriptEngine itself.
Rhino's interactive shell uses Rhino's Context.stringIsCompilableUnit() (see LXR for usage and implementation).