Как создать анализатор PEG.js 0.7.0 с помощью Rhino (Java SE 6 ScriptEngine API)
Я создавал парсеры, используя плагин Maven (т.е. вызывая PEG.js из Java-кода), успешно используя 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
в моем тестовом примере это базовая грамматика, использованная в качестве примера на веб-сайте, и PEGJS_LIB = peg-0.7.0.js
,
Любые идеи приветствуются! Я исчерпал их здесь...
1 ответ
Я разыскал причину этой проблемы. Строка 3681 "PEG.compiler.emitter.Codie.pushRaw.unindent ()" уничтожает шаблоны. Я не до конца определил, насколько важна эта функция для синтаксического анализатора, но она кажется "приятной". Я заменил тело функции локально, и Rhino работал как положено.
function unindent(code, level, unindentFirst) {
return code
}
Я знаю, что Дэвид не заинтересован в поддержке Rhino, но я подумал, что должен поделиться этим в этой теме, чтобы другие могли решить проблему по мере необходимости.