我一直在使用Maven插件(即从Java代码调用PEG.js)并成功使用PEG.js 0.6.1版来构建解析器,但是现在尝试升级到新版本时,它失败并显示错误消息:
sun.org.mozilla.javascript.internal.EcmaError: SyntaxError: missing ; before statement (#3213(eval)#1) in #3213(eval) at line number 1
在调试时,我注意到PEG.buildParser()函数调用产生的解析器在语法上看起来是错误的,但是从浏览器调用它时当然不会发生。

这是我的称呼方式:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine jsEngine = manager.getEngineByName("JavaScript");

jsEngine.eval(new InputStreamReader(this.getClass().getResourceAsStream(PEGJS_LIB)));

Invocable invok = (Invocable) jsEngine;
Object peg = jsEngine.get("PEG");

invok.invokeMethod(peg, "buildParser", grammarSource);

在我的测试案例中,grammarSource是用作example in the websitePEGJS_LIB = peg-0.7.0.js的基本语法。

任何想法都欢迎!我在这里用光了...

最佳答案

我跟踪了此问题的原因。 'PEG.compiler.emitter.Codie.pushRaw.unindent()'行3681破坏了模板。我还没有完全确定该功能对解析器的重要性,但是看起来“很不错”。我在本地替换了函数的主体,Rhino正常工作。

function unindent(code, level, unindentFirst) {
  return code
}

我知道David对支持Rhino不感兴趣,但是我认为我应该在此主题上分享这一点,以便其他人可以根据需要解决该问题。

关于javascript - 如何使用Rhino(Java SE 6 ScriptEngine API)建立PEG.js 0.7.0解析器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11708721/

10-09 17:58