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

时间:2012-07-29 11:05:32

标签: javascript rhino parser-generator scriptengine pegjs

我一直在使用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的基本语法。

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

1 个答案:

答案 0 :(得分:7)

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

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

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