LR(1)アイテムの先読みを計算する方法を理解するのに苦労しています。
私がこの文法を持っているとしましょう:
S -> AB
A -> aAb | a
B -> d
LR(1)アイテムは、先読みのあるLR(0)アイテムです。したがって、状態0の次のLR(0)アイテムを取得します。
S -> .AB , {lookahead}
A -> .aAb, {lookahead}
A -> .a, {lookahead}
状態:1
A -> a.Ab, {lookahead}
A -> a. ,{lookahead}
A -> .aAb ,{lookahead}
A ->.a ,{lookahead}
誰かが先読みを計算する方法を説明できますか?一般的なアプローチは何ですか?
前もって感謝します
LR(1)パーサーで使用される先読みは、次のように計算されます。まず、開始状態には次の形式のアイテムがあります
S -> .w ($)
すべてのプロダクションS-> wに対して、ここでSは開始記号です。ここで、$マーカーは入力の終わりを示します。
次に、A-> x.By(t)の形式のアイテムを含む状態(xは終端記号と非終端記号の任意の文字列、Bは非終端記号)の場合、B->。wの形式のアイテムを追加します。 (s)すべてのプロダクションB-> wおよびセットFIRST(yt)内のすべての端末。 (ここで、FIRSTは FIRSTセット を指します。これは通常LLパーサーについて話すときに導入されます。これまでに見たことがない場合は、これらの講義ノートを確認するのに数分かかります)。
これを文法で試してみましょう。まず、以下を含むアイテムセットを作成します。
S -> .AB ($)
次に、2番目のルールを使用して、Aのすべてのプロダクションについて、そのプロダクションに対応し、FIRST(B $)のすべての端末の先読みを使用して新しいアイテムを追加します。 Bは常に文字列dを生成するため、FIRST(B $)= dであるため、ここで紹介するすべての生成には先読みdがあります。これは与える
S -> .AB ($)
A -> .aAb (d)
A -> .a (d)
それでは、この初期状態で「a」を見ることに対応する状態を構築しましょう。まず、以下で始まるプロダクションごとに1つのステップにドットを移動します。
A -> a.Ab (d)
A -> a. (d)
ここで、最初の項目には非終端記号の前にドットがあるため、ルールを使用して、Aの生成ごとに1つの項目を追加し、それらの項目に先読みFIRST(bd)= bを与えます。これは与える
A -> a.Ab (d)
A -> a. (d)
A -> .aAb (b)
A -> .a (b)
このプロセスを続行すると、最終的に、このLR(1)パーサーのすべてのLR(1)状態が構築されます。これはここに示されています:
[0]
S -> .AB ($)
A -> .aAb (d)
A -> .a (d)
[1]
A -> a.Ab (d)
A -> a. (d)
A -> .aAb (b)
A -> .a (b)
[2]
A -> a.Ab (b)
A -> a. (b)
A -> .aAb (b)
A -> .a (b)
[3]
A -> aA.b (d)
[4]
A -> aAb. (d)
[5]
S -> A.B ($)
B -> .d ($)
[6]
B -> d. ($)
[7]
S -> AB. ($)
[8]
A -> aA.b (b)
[9]
A -> aAb. (b)
それが役立つ場合に備えて、私は昨年の夏にコンパイラコースを教え、すべての講義スライドはオンラインで入手可能を持っています。ボトムアップ解析のスライドでは、LR解析と解析テーブルの構築の詳細をすべて網羅している必要があります。これらがお役に立てば幸いです。
お役に立てれば!
これが文法のLR(1)オートマトンです。以下は上記で行われているためです。オートマトンを描画してみる方が理解に適していると思います。フローにより、先読みの概念がより明確になります。
また、8つではなく11の状態を取得します。
State 0
S: .A B ["$"]
A: .a A b ["d"]
A: .a ["d"]
Transitions
S -> 1
A -> 2
a -> 5
Reductions
none
State 1
S_Prime: S .$ ["$"]
Transitions
none
Reductions
none
State 2
S: A .B ["$"]
B: .d ["$"]
Transitions
B -> 3
d -> 4
Reductions
none
State 3
S: A B .["$"]
Transitions
none
Reductions
$ => S: A B .
State 4
B: d .["$"]
Transitions
none
Reductions
$ => B: d .
State 5
A: a .A b ["d"]
A: .a A b ["b"]
A: .a ["b"]
A: a .["d"]
Transitions
A -> 6
a -> 8
Reductions
d => A: a .
State 6
A: a A .b ["d"]
Transitions
b -> 7
Reductions
none
State 7
A: a A b .["d"]
Transitions
none
Reductions
d => A: a A b .
State 8
A: a .A b ["b"]
A: .a A b ["b"]
A: .a ["b"]
A: a .["b"]
Transitions
A -> 9
a -> 8
Reductions
b => A: a .
State 9
A: a A .b ["b"]
Transitions
b -> 10
Reductions
none
State 10
A: a A b .["b"]
Transitions
none
Reductions
b => A: a A b .
作成したLR(1)アイテムセットには、さらに2つのアイテムが必要です。
I8 A-> aA.b、b from I2
I9 A-> aAb。 、BからI8