jsr223 +编写脚本解释器
好的。 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 的客户,如果没有帮助,我不知道输入行何时完成脚本引擎本身。
Rhino 的交互式 shell 使用 Rhino 的 Context.stringIsCompilableUnit()
(请参阅 LXR 的 用法 和 实现)。
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).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我实现了一些可以与 Java SE 6 Rhino (Javascript) 和 Jython 1.5.2 (Python) 配合使用的东西,使用了一种相当简单的方法,类似于 Rhino 的交互式 shell(请参阅我在问题末尾的评论)
我不想要发生的是:
这是我编写的一个实现我的方法的辅助类:
I implemented something that works OK with Java SE 6 Rhino (Javascript) and Jython 1.5.2 (Python), using a fairly simple approach similar to Rhino's interactive shell (see my remark at the end of the question):
What I didn't want to happen is either:
Here's a helper class I wrote that implements my approach:
创建一个从键盘(Scanner 类)读取数据并从多行输入创建完整字符串的方法。在空行上输入表示用户输入结束。将字符串传递给 eval 方法。
Create a method that reads from the keyboard (Scanner class) and creates a complete string from multiple lines of input. Enter on a blank line signals the end of user input. Pass the string into the eval method.