我一直在使用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 website和PEGJS_LIB = peg-0.7.0.js
的基本语法。
欢迎任何想法!我在这里用完了......
答案 0 :(得分:7)
我找出了这个问题的原因。 'PEG.compiler.emitter.Codie.pushRaw.unindent()'第3681行销毁模板。我还没有完全确定这个函数对于解析器有多重要,但它似乎是一个“很高兴”。我在本地替换了函数体,Rhino按预期工作。
function unindent(code, level, unindentFirst) {
return code
}
我知道大卫对支持Rhino不感兴趣,但我认为我应该在这个帖子上分享这个,以便其他人可以根据需要解决问题。