を解析し、私はそれは訪問者を実行するために訪問者/レクサー/構文解析器ファイルを生成するために、10Sを取り、別の4S、デバッグ遅いANTLR発生と
time java -jar lib/antlr-4.5-complete.jar -visitor -o build -Dlanguage=Python2 xxx.g4
time ./main.py
をANTLR4 + Python2ターゲットを使用しています。
どのように低速をデバッグする必要がありますか?
を解析し、私はそれは訪問者を実行するために訪問者/レクサー/構文解析器ファイルを生成するために、10Sを取り、別の4S、デバッグ遅いANTLR発生と
time java -jar lib/antlr-4.5-complete.jar -visitor -o build -Dlanguage=Python2 xxx.g4
time ./main.py
をANTLR4 + Python2ターゲットを使用しています。
どのように低速をデバッグする必要がありますか?
多くのantlr4パーサを書きますが、私はスピードの問題に常に直面しています。私はPythonのターゲットがかなり遅いという気持ちがあります。パーサが本当に遅い場合は、通常、同じターミナルルールを持つ複数のサブルールがあるため、パーサが混乱するという意味で、reduce/reduceの問題があります。
パーサーが遅い場合は、トレースモードをオンにしてトレースメッセージを表示します。トレースメッセージが常に同じルールで遅延された場合、調査を開始するのはルールです。ルールのサブルールを見て、最上位の遅延ルールになるサブルールが複数あるかどうかを確認します。ルールをコメント化したり変更したりして、パーサーの高速化を確認することができます。文法がC++文法のように大きいときは難しいです。
antlrパーサー文法を最適化するための経験則として、左再帰を排除する方法と、同じ開始規則を持つ副規則を削除する方法があります。例えば
declaration: declspecifier* what_follows1 | declspecifier* what_follows2 | declspecifier* what_follows3
経験的に私は文法規則のこの種を見つけるには、パーサが遅くなります。一度に少しずつ変更し、速度が変わるかどうかを確認し、減速ステップが壊れていないことを確認します。
これはすべて意味があると思います。
文法を投稿して、他の人が改善を提案できるようにすることができます(文法に述語がある場合、それが原因である可能性が高いです)。または、プロファイラを使用しますが、それは直接的な答えを与えないかもしれません。 –
@BartKiersそれは何千もの行を持っています...それを確認する一般的な方法はありますか? – daisy