2012-07-29 57 views
2

我一直在使用PEG.js版本0.6成功构建使用Maven插件(即从Java代码调用PEG.js)的解析器。 1,但是现在在尝试升级到新的版本,它的失败与错误消息:如何使用Rhino构建PEG.js 0.7.0解析器(Java SE 6 ScriptEngine API)

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的基本语法。

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

回答

7

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

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

我知道大卫是不是有意支持犀牛,但我想我应该在此线程共享这个所以别人也许能够根据需要解决的问题。

+0

你知道我们是否有当前版本的pegjs解决方案吗? – AnujKu 2015-10-06 15:15:52