2016-09-08 15 views
0

を解析し、私はそれは訪問者を実行するために訪問者/レクサー/構文解析器ファイルを生成するために、10Sを取り、別の4S、デバッグ遅いANTLR発生と

time java -jar lib/antlr-4.5-complete.jar -visitor -o build -Dlanguage=Python2 xxx.g4 
time ./main.py 

をANTLR4 + Python2ターゲットを使用しています。

どのように低速をデバッグする必要がありますか?

+0

文法を投稿して、他の人が改善を提案できるようにすることができます(文法に述語がある場合、それが原因である可能性が高いです)。または、プロファイラを使用しますが、それは直接的な答えを与えないかもしれません。 –

+0

@BartKiersそれは何千もの行を持っています...それを確認する一般的な方法はありますか? – daisy

答えて

0

多くのantlr4パーサを書きますが、私はスピードの問題に常に直面しています。私はPythonのターゲットがかなり遅いという気持ちがあります。パーサが本当に遅い場合は、通常、同じターミナルルールを持つ複数のサブルールがあるため、パーサが混乱するという意味で、reduce/reduceの問題があります。

パーサーが遅い場合は、トレースモードをオンにしてトレースメッセージを表示します。トレースメッセージが常に同じルールで遅延された場合、調査を開始するのはルールです。ルールのサブルールを見て、最上位の遅延ルールになるサブルールが複数あるかどうかを確認します。ルールをコメント化したり変更したりして、パーサーの高速化を確認することができます。文法がC++文法のように大きいときは難しいです。

antlrパーサー文法を最適化するための経験則として、左再帰を排除する方法と、同じ開始規則を持つ副規則を削除する方法があります。例えば

declaration: declspecifier* what_follows1 | declspecifier* what_follows2 | declspecifier* what_follows3

経験的に私は文法規則のこの種を見つけるには、パーサが遅くなります。一度に少しずつ変更し、速度が変わるかどうかを確認し、減速ステップが壊れていないことを確認します。

これはすべて意味があると思います。

関連する問題