Как создать парсер 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.

Любые идеи приветствуются! У меня они закончились здесь...


person Leo Gomes    schedule 29.07.2012    source источник


Ответы (1)


Я отследил причину этой проблемы. Строка 3681 PEG.compiler.emitter.Codie.pushRaw.unindent() уничтожает шаблоны. Я еще не полностью определил, насколько важна эта функция для синтаксического анализатора, но мне кажется, что это «приятно иметь». Я заменил тело функции локально, и Rhino заработал, как и ожидалось.

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

Я знаю, что Дэвид не заинтересован в поддержке Rhino, но я подумал, что должен поделиться этим в этой теме, чтобы другие могли решить проблему по мере необходимости.

person Gavin Hogan    schedule 05.10.2012
comment
Вы не знаете, есть ли у нас решение для текущей версии pegjs? - person AnujKu; 06.10.2015