Как построить Peg.js 0.7.0 Parser, используя Rhino (Java SE 6 Scriptengine API)
-
13-12-2019 - |
Вопрос
Я создавал парсеров, используя плагин 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
, в моем тесте, является основной грамматикой, используемой в качестве AN Пример на сайте и генеракодицетагкод.
Решение
Я отслеживал причину этой проблемы.'Peg.compiler.emitter.codie.pushraw.unindent ()' line 3681 Уничтожает шаблоны.Я не полностью решил, насколько важна эта функция для парсера, но кажется, что «приятно иметь».Я заменил тело функции локально, и Rhino работал, как ожидалось.
function unindent(code, level, unindentFirst) {
return code
}
.
Я знаю, что Дэвид не заинтересован в поддержке носорога, но я думал, что должен поделиться этим в этой теме, чтобы другие могли решить проблему по мере необходимости.