1

大きな C コード ファイル (>9000 LoC) があり、次の文法を使用して解析しようとしています。

https://github.com/antlr/grammars-v4/blob/master/c/C.g4

中止するまで1時間以上待ちました。マシンは、4GB の RAM を搭載した Core 2 Duo L9400 です。最大 Java vm-heap-size は 2GB に設定されています。解析エラーは発生しませんが、単に終了しません。

いくつかの調査を行った後、予測モードを SLL に設定しました。これは、数秒以内に「入力時に実行可能な代替手段がない」ものを生成します。

次に、予測モードを LL_EXACT_AMBIG_DETECTION に設定し、DiagnosticErrorListener をパーサーにアタッチしました。これにより、主に宣言/宣言指定子に関する多くの「あいまいなレポート」が生成されます。これにより、パーサーが非常に頻繁にバックトラックを余儀なくされると思いますが、これはおそらく長い解析時間の説明ですか?

文法を書き直す以外に、パフォーマンスを改善するためにできることはありますか?

どんな助けでも大歓迎です;)

4

2 に答える 2

2

まず、ANTLR 4は解析中にバックトラックしないことに注意することが重要です。

あなたが参照している文法は SLL ではないため、ANTLR 4 を最速モードで使用することはできません。ただし、または実験中に、文法を SLL にするために変更した単一の規則を特定することができました。変更された文法は、antlr-interest メーリング リストから入手できる場合があります。今はコンサート中なので、アクセスできません。

于 2013-10-12T00:38:47.047 に答える
0

うん。ルールを 1 つ変更するだけで仕様から変換したことは、それが可能であることを示しています。すぐに最適化します。

于 2013-10-11T16:10:47.873 に答える