如何使用Rhino构建PEG.js 0.7.0解析器(Java SE 6 ScriptEngine API)

Leo*_*mes 2 javascript rhino parser-generator scriptengine pegjs

我一直在使用PEG.js版本0.6.1使用Maven插件(即从Java代码调用PEG.js)构建解析器,但是现在在尝试升级到新版本时,它失败并显示错误消息:

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);
Run Code Online (Sandbox Code Playgroud)

其中,grammarSource在我的测试情况下,是作为基本语法的网站例如,和PEGJS_LIB = peg-0.7.0.js.

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

小智 7

我找出了这个问题的原因.'PEG.compiler.emitter.Codie.pushRaw.unindent()'第3681行销毁模板.我还没有完全确定这个函数对于解析器有多重要,但它似乎是一个"很高兴".我在本地替换了函数体,Rhino按预期工作.

function unindent(code, level, unindentFirst) {
  return code
}
Run Code Online (Sandbox Code Playgroud)

我知道大卫对支持Rhino不感兴趣,但我认为我应该在这个帖子上分享这个,以便其他人可以根据需要解决问题.