2

我一直在使用 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);

其中,grammarSource在我的测试用例中,是网站中用作示例的基本语法,而PEGJS_LIB = peg-0.7.0.js.

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

4

1 回答 1

7

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

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

我知道 David 对支持 Rhino 不感兴趣,但我想我应该在这个线程上分享这个,以便其他人可以根据需要解决问题。

于 2012-10-05T12:21:09.387 回答