slrとlalr を理解しています
* slr(simple lr): 単一のLookaheadシンボルを使用して、正しい削減を決定します。これは、最も単純なLRパーサータイプです。
* lalr(look-ahead lr): 同じ見た目のシンボルを持つSLRパーサーの状態を組み合わせて、より強力なパーサーになります。各状態に * lookaheadセット *(複数のシンボル)を使用します。
lalrを実証しますが、slr
1。 SLR解析テーブルを構築します: 文法のためにSLR解析テーブルを作成します。これには次のことが含まれます。
-LR(0)オートマトンの構築。
- 各非ターミナルのフォローセットを計算します。
- LR(0)オートマトンに基づいて解析テーブルを埋め、フォローセット。
2。 SLR表の競合を特定します: 同じ状態とLookaheadシンボルに複数のアクション(削減またはシフト)が必要な状況を探します。競合を見つけた場合、文法はSLRではありません。
3。 lalr解析テーブルを構築します: 次に、LALR解析テーブルを構築します。これには次のことが含まれます。
-SLR状態を同一のLookaheadセットと組み合わせる。
-SLRテーブルの競合を解決するために、複合Lookaheadセットを使用します。
4。 LALRテーブルが競合のないことを確認してください: LALRテーブルに競合がない場合、文法はLALRです。
例
簡単な例を見てみましょう:
`` `
s-> a a
a-> b | c
`` `
slr競合:
* SLRパーサーは、「A」が表示される州で競合します。 「A」をシフトするか、ルール「A-> B」を使用して減らすことができます。 SLRパーサーには1つのLookaheadシンボルしかありません。これら2つのアクションを区別することはできません。
lalr解像度:
* Lalrパーサーでは、「A」が表示される状態は、Lookaheadに基づいて2つの状態に分割されます。
* 状態1: lookahead set {a}( "a-> b"に縮小)
* 状態2: lookahead set {$}(shifts "a")
この解決策は紛争を排除し、文法をlalrにします。
キーポイント
*文法がSLRの場合、それもLALRです。ただし、逆は真実ではありません。
* LALRパーサーは、SLRパーサーができない特定の競合を解決できるため、SLRパーサーよりも強力です。
* lalrの解析は、解析力と効率性のバランスが良いため、実際によく使用されます。
特定の文法を念頭に置いている場合はお知らせください。LALRではなくLALRであるかどうかを確認するプロセスをご覧ください。
