通常、文法はContext Free文法として定義されます-正確な定義はウィキペディアのページに記載されていますが、BLYに基づくPLYの場合と同じように機能し、Bisonはyaccに基づいています。
ここでは、PLYがLALRパーサーを使用することを示しています。これは本質的に、ルックアップテーブルが圧縮されたLRパーサーであり、場合によっては構文解析の競合が発生し、LR文法(LRパーサーが解析できるコンテキストフリーの文法)の表現力の一部が低下します。パーサーのこの特定のブランチと他のパーサーのブランチの制限について知りたい場合は、すべての種類の解析手法(LL、LRなど)の概要をここに示します。
あなたの質問に答えるために:言語が曖昧であっても(つまり、入力を解釈する方法が複数ある)、文脈自由言語を解析できる解析アルゴリズムが存在します:
最初のこのようなアルゴリズムはCYKアルゴリズムで、残念ながら実行時間は。ここで、nは入力文字列の長さ、| G | は文法のサイズであるため、言語の解析には実用的ではありません。O (n3| G | )n| G |
2番目のアルゴリズムはEarleyアルゴリズムです。このアルゴリズムは、文脈自由文法を解析することもできます。アルゴリズムはあいまいな言語を解析するために時間を必要としますが、あいまいな言語を解析するためにO (n 2)時間のみを必要とします。さらに、ほとんどのLR文法では線形時間で動作するようで、特に左再帰の文法で動作します。O (n3)O (n2)
ここでは、Earleyアルゴリズム(の適応)の実用的な実装について議論している論文を見つけることができます。「LRLR(1)解析と比較したEarley解析の一般性((おおよそPLYが行うこと))を考え、PEP((Earleyのアルゴリズムの実装)でさえ)最悪の時間はAユーザー、これは素晴らしい結果です」。
最後のタイプのパーサーはGLRパーサーです。これは、LR解析の一般化バージョンであり、コンテキストフリー言語を解析できます。
GLRの成熟した実装はASF + SDFです。BisonはGLRパーサーも生成できますが、その実装は「標準」GLRアルゴリズムとはわずかに異なります。Elkhoundアルゴリズム GLR / LALRハイブリッドアルゴリズムです。可能な場合はLALRを使用し、必要に応じてGLRを使用して、高速で文法を解析できるようにします。
文脈自由文法以外にも文脈依存文法がありますが、これらは一般に解析するのが難しく、それほど多くの表現力を追加しません。自然言語。
最終ステップとして、無制限の文法があります。この時点では、文法はチューリング完全であるため、特定の言語を解析するのにかかる時間を与えることのできる限界はありません。これは、ほとんどの解析アプリケーションにとって望ましくありません。追加の電力はほとんど必要ありません。すべての機能を使用したい場合は、使用可能な言語マシンがあります。
最後に、特に高速にするために、独自のパーサージェネレーターを実装するのは簡単なことではありません。私は個人的にflex(レクサージェネレーター)のバージョンを作成しましたが、これは比較的単純なアルゴリズムの問題の練習のように思えましたが、特にUnicodeをサポートしようとすると、うまくいくのは非常に複雑になりました。独自に作成するのではなく、既存の実装を使用することを検討してください。