GLR は、パース ツリー/フォレストが必要で、ブラック ボックスを気にしない場合に最適です。LR/LALR 競合を静的に解決するのではなく、徹底的なテストを介して解析時にあいまいさをチェックすることを犠牲にして、必要なCFGを入力できます。それは良いトレードオフだと言う人もいます。無料の C++ 文法を持つ Ira Baxter の DMS ツールまたは Elkhound は、このクラスの問題に役立ちます。ANTLR言語アプリケーションの大規模なクラスにも役立ちますが、トップダウン アプローチを使用して、セマンティック述語を許可する LL(*) と呼ばれる再帰的降下パーサーを生成します。ここでは、述語を使用すると、CFG を超えて状況依存言語を解析できることを証明なしで述べます。プログラマーは、優れたエラー処理などのアクションを文法に挿入したり、シングルステップ デバッグを好みます。LLは3つとも得意です。LLは手作業なので分かりやすいです。ウィキペディアが LR の方がエラー処理に優れているというナンセンスを信じないでください。とはいえ、ANTLR で多くのバックトラックを行うと、LL(*) ではエラーが実際に悪化します (PEG にはこの問題があります)。
後戻りし直します。PEG、ANTLR、およびその他の非決定論的戦略と同様に、GLR も投機 (バックトラック) を行います。非決定論的な LR 状態では、GLR はサブパーサーを「フォーク」して実行可能なパスを試します。とにかく、LL にはエラー処理のための適切なコンテキストがあります。LR が式に一致していることを認識している場合、LL は代入または条件付きの式であることを認識していIF
ます。LR は、どちらかになる可能性があることを知っていますが、確かではありません。
GLR はO(n^3)
最悪のケースです。packrat/PEG はO(n)
最悪のケースです。ANTLR はO(n^2)
循環先読み DFA によるものですがO(n)
、実際にはそうです。本当に関係ありません。GLRは十分に高速です。
ANTLRはアンチLRではなく、言語認識のためのもう 1 つのツールですが、私はそれも気に入っています; )
率直に言って、80 年代の多くの若いプログラマーと同じように、私は LALR を理解していませんでしたし、ブラック ボックスも好きではありませんでした (今では GLR エンジンの美しさを掘り下げていますが、それでも LL の方が好きです)。私は市販の LL(k) ベースのコンパイラを構築し、手動で構築したものを生成するツールを構築することにしました。ANTLR は万人向けではなく、C++ のようなエッジ ケースは GLR でより適切に処理される可能性がありますが、多くの人は ANTLR が自分のコンフォート ゾーンに収まると感じています。2008 年 1 月以降、ANTLRWorks 内で ANTLR のバイナリ jar とソース zip の合計が 134,000 回ダウンロードされました (Google Analytics による)。多くの経験的データを含む LL(*)に関する論文を参照してください。