2

私は数日前からANTLRを学んでいます。それを学ぶ私の目標は、パーサーとレクサーを生成し、それらを Java から自分のターゲット言語 (C/C++/Java/C#/Python のいずれでもなく、それをサポートするツールはありません) に個人的に手で翻訳できるようにすることでした。私が ANTLR を選んだ理由は、その About ページから: ANTLR は、理解しやすく、強力で、柔軟性があり、人間が読める出力を生成するため、広く使用されています[...]

このツールを学習するにあたり、単純な文法の簡単な字句解析器である JSON から始めることにしました。しかし、ANTLR4 を使用してこのレクサー用の .java ファイルを生成すると、かなり油断していました。私は、人間が読めるからはほど遠いシリアライズされたコードの巨大な混乱を手に入れました。

    public static final ATN _ATN =
    ATNSimulator.deserialize(_serializedATN.toCharArray());
static {
    _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
}

いくつかの Google 検索では、この動作を無効にする方法を提供できませんでした。

この動作を無効にして人間が読めるコードを生成する方法はありますか? それとも、このターゲット プログラミング言語用にレクサーとパーサーを手書きする必要がありますか?

4

1 に答える 1

3

ANTLR 4 は、予測に新しいアルゴリズムを使用します。Terence Parr は現在、アルゴリズムを詳細に説明するテクニカル レポートに取り組んでいます。人間が判読できる出力は、生成されたパーサーを参照します。

ANTLR 4 lexer は、DFA レコグナイザーを使用して、ANTLR の以前のリリースよりも速度とメモリ使用量を大幅に改善します。パーサーの場合、_ATNフィールドは への呼び出し内で使用されるデータ構造adaptivePredictです (そのメソッドを呼び出す生成コード内の行に気付くでしょう)。

ANTLR 4 lexer の生成された Java コードを別のプログラミング言語に手動で変換することはできません。文法が厳密に LL(1) である場合 (つまり、生成されたコードに への呼び出しが含まれていない場合)、生成されたパーサーのコードを手動で翻訳できる場合がありますadaptivePredict。ただし、シリアル化された ATN でエンコードされた情報から得られるエラー回復機能は失われます。

于 2013-05-03T16:28:30.997 に答える