Rhino を使用して PEG.js 0.7.0 パーサーを構築する方法 (Java SE 6 ScriptEngine API)
-
13-12-2019 - |
質問
私は Maven プラグインを使用してパーサーを構築しています (つまり、Java コードから PEG.js を呼び出す) 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
.
あらゆるアイデアを歓迎します。ここで足りなくなりました...
解決
この問題の原因を突き止めました。「PEG.compiler.emitter.Codie.pushRaw.unindent()」行 3681 はテンプレートを破棄します。この関数がパーサーにとってどれほど重要であるかは完全には判断できませんが、「あれば便利」なようです。関数の本体をローカルで置き換えたところ、Rhino は期待どおりに機能しました。
function unindent(code, level, unindentFirst) {
return code
}
David が Rhino のサポートに興味がないことはわかっていますが、他の人が必要に応じて問題を解決できるように、このスレッドでこのことを共有する必要があると思いました。