OK.ScriptEngine.eval(String string)
оценивает строку полностью, а ScriptEngine.eval(Reader reader)
оценивает ввод от Reader
полностью.
Так что, если у меня есть файлЯ могу открыть FileInputStream, обернуть вокруг него Reader и вызвать scriptEngine.eval(reader)
.
Если у меня есть полный оператор в виде строки, я могу позвонить scriptEngine.eval(string)
.
Что мне делать, если мне нужно реализовать интерактивный переводчик?У меня есть пользователь, который в интерактивном режиме набирает многострочный оператор, например,
function f() {
return 3;
}
Если я читаю входные данные построчно и использую строковую форму eval()
, я получу в итоге его неполноеоператоры, например function f() {
и получающие ошибку.
Если я передам Reader, ScriptEngine
будет ждать бесконечно, пока ввод не будет завершен, и он не будет интерактивным.
Помощь!
Просто чтобы уточнить: проблема здесь в том, что я могу только пропустить ScriptEngine.eval()
полных операторов, и, как клиент ScriptEngine, я не знаю, когда строка ввода завершится без какой-либо помощи со сторонысам ScriptEngine.
Интерактивная оболочка Rhino использует Rhino Context.stringIsCompilableUnit()
(см. LXR для использования использования и ).