generated at
LR法の構文解析の手順
LR法を用いた構文解析の手順
所詮は決定性有限オートマトンなので、それを踏まえていると理解しやすい

参考

前提
こういう構文規則のparserで
構文規則
1. E := E + T 2. E := T 3. T := T * F 4. T := F 5. F := ( E ) 6. F := id
a + b * c $ という入力をparseする手順を示す
つまり [a,+,b,*,c,$] というToken列を入力に取る


準備するもの
上の構文規則からLR法の構文解析表を予め用意しておく
構文解析表
ACTIONGOTO
state id + * ( ) $ ETF
0s5 s4 123
1 s6 acc
2 r2s7 r2r2
3 r4r4 r4r4
4s5 s4 823
5 r6r6 r6r6
6s5 s4 93
7s5 s4 10
8 s6 s11
9 r1s7 r1r1
10 r3r3 r3r3
11 r5r5 r5r5


構文解析の手順
以下のような表を上から埋めていくとわかり易い
Reduceされたら出力ストリームに値が追加される
解析手順
状態入力ストリーム出力ストリームスタック表の見る箇所次のアクション説明用
0a + b * c $0 0/id Shift 5
5+ b * c $0 id 55/+ , 0/FReduce 6
3+ b * c $60 F 33/+, 0/TReduce 4
2+ b * c $6, 40 T 22/+, 0/EReduce 2
1+ b * c $6, 4, 20 E 11/+Shift 6
6b * c $6, 4, 20 E 1 + 6 6/idShift 5
5* c $6, 4, 20 E 1 + 6 id 55/*, 6/FReduce 6
3* c $6, 4, 2, 60 E 1 + 6 F 33/*, 6/TReduce 4
9* c $6, 4, 2, 6, 40 E 1 + 6 T 99/*Shift 7
7c $6, 4, 2, 6, 40 E 1 + 6 T 1 * 77/idShift 5
5$6, 4, 2, 6, 40 E 1 + 6 T 1 * 7 id 55/$, 7/FReduce 6
10$6, 4, 2, 6, 4, 60 E 1 + 6 T 1 * 7 F 1010/$, 6/TReduce 3
9$6, 4, 2, 6, 4, 6, 30 E 1 + 6 T 99/$, 0/EReduce 1
1$6, 4, 2, 6, 4, 6, 3, 10 E 11/$acc


初期状態
スタックが空の状態から始める
スタートはstateが0のところから表を見る
状態0 であり、最初の入力ストリームの文字が a なので構文解析表の 0/id を見る
これは s5 なので、つまり Shift 5 を表す
これを「次のアクション」に書く
よって、次の行の「状態」は 5 になる
①により s5 が実行されるので
「状態」は 5 へ移動し
スタックには入力記号の id と状態 5 を積む
これはShiftが、「先頭の入力Tokenと状態をスタックにpushする」という命令のため。
構文解析表の 5/+ を見ると r6 なのでReduceが起きる
スタックのトップの 5 と、次の入力にあたる + を見ている
Reduceは「スタックから 記号 状態 のペアを取り除き、構文規則に合致する」というものだった
6 番目の構文規則 F := id を適用してスタックの id F に還元する
スタックから id 5 を取り除くと、残るのは 0 なので、表の 0/F を見る
②でReduce 6が実行されたので出力ストリームに6を追加
③でReduce 4が実行されたので出力ストリームに4を追加
T := T * F を適用するのでスタックから3ペアをpopする
つまり T , * , F の3つ分をpop
0 E 1 + 6 T 1 * 7 F 10 0 E 1 + 6
その後、 T 9 をpush
T := T * F の左辺の T
6/T にあたる 9
状態1で入力が $ なので、 1/$ を見る
acc なので成功して停止
この時点での出力ストリーム 6, 4, 2, 6, 4, 6, 3, 1 の規則を a + b * c $ に適用すれば解析ができるということを表す