2

PEG.js バージョン 0.6.1 を使用して Maven プラグイン (つまり、Java コードから PEG.js を呼び出す) を使用してパーサーを構築してきましたが、新しいバージョンにアップグレードしようとすると、次のエラー メッセージが表示されて失敗します。

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.

どんなアイデアでも大歓迎です!私はここでそれらを使い果たしました...

4

1 に答える 1

7

この問題の原因を突き止めました。「PEG.compiler.emitter.Codie.pushRaw.unindent()」の 3681 行目でテンプレートが破棄されます。この関数がパーサーにとってどれほど重要かは完全には判断できていませんが、「あると便利」のように思えます。関数の本体をローカルで置き換えたところ、Rhino は期待どおりに動作しました。

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

David が Rhino のサポートに関心がないことは知っていますが、必要に応じて他の人が問題を解決できるように、このスレッドでこれを共有する必要があると考えました。

于 2012-10-05T12:21:09.387 に答える