5. LR parsing
5
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
1 + 2 * 3入力
スタック
結果
構文解析表という表を
文法から作成して利用
(作り方は後述)
$
6. LR parsing
6
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
1 + 2 * 3入力
スタック
結果
スタックには最初0が
積まれている
0
$
7. LR parsing
7
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
1 + 2 * 3入力
スタック
結果
構文解析表から
スタックトップの行の
次の入力の列を見る
0
shift 3
$
8. LR parsing
8
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
shift は入力を一つ消費
して、指定された値を
プッシュ
0 3
shift 3
$
9. LR parsing
9
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
(トップ, 入力) を見る
0
reduce 4
3
$
10. LR parsing
10
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
reduce の操作(1)
指定された番号を結果
にメモする
0
reduce 4
4
3
$
11. LR parsing
11
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
reduce の操作(2)
指定された文法の右辺
の記号数だけポップ
0
reduce 4
4
$
12. LR parsing
12
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
reduce の操作(3)
(トップ, 文法の左辺) を
見る
0
reduce 4
4
go to 2
$
13. LR parsing
13
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
reduce の操作(4)
(トップ, 文法の左辺) の
番号をプッシュ
0
reduce 4
4
go to 2
2
$
14. LR parsing
14
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
(トップ, 入力)を見る
0
4
reduce 2
2
$
15. LR parsing
15
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
reduce:
結果にメモ
0
4
reduce 2
2
2
$
16. LR parsing
16
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
reduce:
右辺の個数ポップ
0
4
reduce 2
2
$
17. LR parsing
17
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
reduce:
(トップ, 左辺)を見る
0
4
reduce 2
2
go to 1
$
18. LR parsing
18
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
reduce:
プッシュ
0
4
reduce 2
2
go to 1
1
$
19. LR parsing
19
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
+ 2 * 3入力
スタック
結果
(トップ, 入力)
0
4
shift 4
2
1
$
20. LR parsing
20
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
2 * 3入力
スタック
結果
入力を消費して
プッシュ
0
4
shift 4
2
1 4
$
21. LR parsing
21
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
2 * 3入力
スタック
結果
(トップ, 入力)
0
4 2
1 4
shift 3
$
22. LR parsing
22
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
* 3入力
スタック
結果
入力を消費して
プッシュ
0
4 2
1 4
shift 3
3
$
23. LR parsing
23
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
* 3入力
スタック
結果
(トップ, 入力)
0
4 2
1 4
reduce 4
3
$
24. LR parsing
24
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
* 3入力
スタック
結果
reduce:
結果にメモ
0
4 2
1 4
reduce 4
4
3
$
25. LR parsing
25
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
* 3入力
スタック
結果
reduce:
右辺の個数ポップ
0
4 2
1 4
reduce 4
4
$
26. LR parsing
26
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
* 3入力
スタック
結果
reduce:
(トップ, 左辺)を
プッシュ
0
4 2
1 4
reduce 4
4
go to 6
6
$
27. LR parsing
27
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
* 3入力
スタック
結果
(トップ, 入力)
0
4 2
1 4
shift 5
4
6
$
28. LR parsing
28
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
3入力
スタック
結果
入力消費、プッシュ
0
4 2
1 4
shift 5
4
6 5
$
29. LR parsing
29
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
3入力
スタック
結果
(トップ, 入力)
0
4 2
1 4
shift 7
4
6 5
$
30. LR parsing
30
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2
1 4
shift 7
4
6 5
入力消費、プッシュ
7
$
31. LR parsing
31
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2
1 4
reduce 3
4
6 5
(トップ, 入力)
7
$
32. LR parsing
32
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2
1 4
reduce 3
4
6 5 reduce:
結果にメモ
7
$
3
33. LR parsing
33
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2
1 4
reduce 3
4
reduce:
右辺の記号数ポップ
$
3
34. LR parsing
34
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2
1 4
reduce 3
4
reduce:
(トップ, 左辺)を
プッシュ
$
3
6
go to 6
35. LR parsing
35
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2
1 4
reduce 1
4
(トップ, 入力)
$
3
6
36. LR parsing
36
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2
1 4
reduce 1
4
reduce:
メモ
$
3
6
1
37. LR parsing
37
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2
reduce 1
4
reduce:
右辺の数だけポップ
$
3 1
38. LR parsing
38
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2
reduce 1
4
reduce:
(トップ, 左辺)を
プッシュ
$
3 1
go to 1
1
39. LR parsing
39
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2 4
(トップ, 入力)
$
3 1
1
accept!
40. LR parsing
40
文法
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
構文解析表
入力
スタック
結果
0
4 2 4
accept !
$
3 1
1
accept!
42. LR parsing まとめ
雑なアルゴリズム
1. 構文解析表のスタックトップ行入力列を見る
2. shift n なら入力を消費してスタックに n をプッシュ
3. reduce n なら n を結果にメモして以下の還元操作を行う
a) n番目の構文規則を見る
b) 右辺の記号数だけスタックからポップ
c) 構文解析表のスタックトップ行左辺の記号列の値をプッシュ
4. accept なら終了
42
57. LR(0) 構文解析表
57
Num + * $ E
0 s2 1
1 s3 s4 acc
2
3 s5
4 s6
5
6
S → E ・
がある行の$列をaccに
S → E ·
E → E · + Num
E → E · * Num
I1
58. LR(0) 構文解析表
58
Num + * $ E
0 s2 1
1 s3 s4 acc
2 r3 r3 r3 r3
3 s5
4 s6
5
6 S → E ・以外で・が
終端に来る場合、
reduce (文法の番号)
を全ての列に
E → Num ·
I2
文法
1. E → E + Num
2. E → E * Num
3. E → Num
59. LR(0) 構文解析表
59
Num + * $ E
0 s2 1
1 s3 s4 acc
2 r3 r3 r3 r3
3 s5
4 s6
5 r1 r1 r1 r1
6 S → E ・以外で・が
終端に来る場合、
reduce (文法の番号)
を全ての列に
文法
1. E → E + Num
2. E → E * Num
3. E → Num
E → E + Num ·
I5
60. LR(0) 構文解析表
60
Num + * $ E
0 s2 1
1 s3 s4 acc
2 r3 r3 r3 r3
3 s5
4 s6
5 r1 r1 r1 r1
6 r2 r2 r2 r2 S → E ・以外で・が
終端に来る場合、
reduce (文法の番号)
を全ての列に
1. E → E + Num
2. E → E * Num
3. E → Num
E → E * Num ·
I6
文法
76. Follow集合
76
A → w B (wは任意) の
ような規則がある場合、
Follow(B) に
Follow(A) を追加
First(S) = { Num }
First(E) = { Num }
First(T) = { Num }
0. S → E
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
文法
Follow(S) = { $ }
Follow(E) = {} + Follow(S)
Follow(T) = {}
First集合
77. Follow集合
77
ちなみに、
A → w B C (wは任意)
のような場合でも、
ε First(C) ならば
同じ操作を行う
First(S) = { Num }
First(E) = { Num }
First(T) = { Num }
0. S → E
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
文法
Follow(S) = { $ }
Follow(E) = { $ }
Follow(T) = {}
First集合
78. Follow集合
78
A → x B y (y ε) の
ような規則がある場合、
Follow(B) に First(y)
を追加
First(S) = { Num }
First(E) = { Num }
First(T) = { Num }
0. S → E
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
文法
Follow(S) = { $ }
Follow(E) = { $ } + First(+)
Follow(T) = {}
First集合
79. Follow集合
79
終端記号なので
First(+) = { + }
First(S) = { Num }
First(E) = { Num }
First(T) = { Num }
0. S → E
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
文法
Follow(S) = { $ }
Follow(E) = { +, $ }
Follow(T) = {}
First集合
94. SLR(1) 構文解析表
94
Num + * $ E T
0 s3 1 2
1 s4
2 s5
3
4 s3 6
5 s7
6 s5
7
$ 列追加
終端記号の列はshiftに
95. SLR(1) 構文解析表
95
Num + * $ E T
0 s3 1 2
1 s4 acc
2 s5
3
4 s3 6
5 s7
6 s5
7
S → E · があるので
(1, $) に acc
S → E ·
E → E · + T
I1
0. S → E
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
文法
96. SLR(1) 構文解析表
96
Num + * $ E T
0 s3 1 2
1 s4 acc
2 s5
3
4 s3 6
5 s7
6 r1 s5 r1
7
X → w · (w は任意) と
いう規則を含むとき、
Follow(X) に含まれる
終端記号の列にreduce
0. S → E
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
文法
E → E + T ·
T → T · * Num
I6
Follow(E) = { +, $ }
97. SLR(1) 構文解析表
97
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3
4 s3 6
5 s7
6 r1 s5 r1
7
X → w · なら
Follow(X) に reduce
0. S → E
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
文法
Follow(E) = { +, $ }
E → T ·
T → T · * Num
I2
98. SLR(1) 構文解析表
98
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
0. S → E
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
文法
T → T * Num ·
I7
Follow(T) = { +, *, $ }
X → w · なら
Follow(X) に reduce
99. SLR(1) 構文解析表
99
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6
5 s7
6 r1 s5 r1
7 r3 r3 r3
0. S → E
1. E → E + T
2. E → T
3. T → T * Num
4. T → Num
文法
X → w · なら
Follow(X) に reduce
T → Num ·
I3
Follow(T) = { +, *, $ }
102. SLR(1) で扱えない文法
102
0. S → A
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
S → · A
A → · E = E
A → · Id
E → · E + T
E → · T
T → · Num
T → · Id
I0
A → Id ·
T → Id ·
I1
Id
103. SLR(1) で扱えない文法
103
0. S → A
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
S → · A
A → · E = E
A → · Id
E → · E + T
E → · T
T → · Num
T → · Id
I0
A → Id ·
T → Id ·
I1
Id
Follow(A) = { $ }
Follow(T) = { +, =, $ }
104. SLR(1) で扱えない文法
104
0. S → A
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
S → · A
A → · E = E
A → · Id
E → · E + T
E → · T
T → · Num
T → · Id
I0
A → Id ·
T → Id ·
I1
Id
Follow(A) = { $ }
Follow(T) = { +, =, $ }
構文解析表の (1, $) で
reduce-reduce 衝突
120. 120
Num Id + = A E T
0 5 3 1 2 4
1
2 7 6
3
4
5
6 10 11 8 9
7 5 13 12
8 14
9
10
11
12
13
14 10 11 15
15
LR(1) オートマトン
121. 121
Num Id + = $ A E T
0 s5 s3 1 2 4
1
2 s7 s6
3
4
5
6 s10 s11 8 9
7 s5 s13 12
8 s14
9
10
11
12
13
14 s10 s11 15
15
LR(1) 構文解析表
122. 122
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3
4
5
6 s10 s11 8 9
7 s5 s13 12
8 s14
9
10
11
12
13
14 s10 s11 15
15
LR(1) 構文解析表
S → A · [ $ ] I1
S → w · [ $ ] があれ
ば $ 列に accept
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
123. 123
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4
5
6 s10 s11 8 9
7 s5 s13 12
8 s14
9
10
11
12
13
14 s10 s11 15
15
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
A → Id · [ $ ]
T → Id · [ +, = ]
I3
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
124. 124
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4 r4 r4
5
6 s10 s11 8 9
7 s5 s13 12
8 s14
9
10
11
12
13
14 s10 s11 15
15
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
E → T · [ +, = ]
I4
125. 125
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4 r4 r4
5 r5 r5
6 s10 s11 8 9
7 s5 s13 12
8 s14
9
10
11
12
13
14 s10 s11 15
15
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
T → Num · [ +, = ] I5
126. 126
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4 r4 r4
5 r5 r5
6 s10 s11 8 9
7 s5 s13 12
8 s14 r1
9
10
11
12
13
14 s10 s11 15
15
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
A → E = E · [ $ ]
E → E · + T [ +, $ ]
I8
127. 127
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4 r4 r4
5 r5 r5
6 s10 s11 8 9
7 s5 s13 12
8 s14 r1
9 r4 r4
10
11
12
13
14 s10 s11 15
15
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
E → T · [ +, $ ]
I9
128. 128
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4 r4 r4
5 r5 r5
6 s10 s11 8 9
7 s5 s13 12
8 s14 r1
9 r4 r4
10 r5 r5
11
12
13
14 s10 s11 15
15
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
T → Num · [ +, $ ]
I10
129. 129
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4 r4 r4
5 r5 r5
6 s10 s11 8 9
7 s5 s13 12
8 s14 r1
9 r4 r4
10 r5 r5
11 r6 r6
12
13
14 s10 s11 15
15
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
T → Id · [ +, $ ]
I11
130. 130
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4 r4 r4
5 r5 r5
6 s10 s11 8 9
7 s5 s13 12
8 s14 r1
9 r4 r4
10 r5 r5
11 r6 r6
12 r3 r3
13
14 s10 s11 15
15
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
E → E + T · [ +, = ]
I12
131. 131
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4 r4 r4
5 r5 r5
6 s10 s11 8 9
7 s5 s13 12
8 s14 r1
9 r4 r4
10 r5 r5
11 r6 r6
12 r3 r3
13 r6 r6
14 s10 s11 15
15
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
T → Id · [ +, = ]
I13
132. 132
Num Id + = $ A E T
0 s5 s3 1 2 4
1 acc
2 s7 s6
3 r6 r6 r2
4 r4 r4
5 r5 r5
6 s10 s11 8 9
7 s5 s13 12
8 s14 r1
9 r4 r4
10 r5 r5
11 r6 r6
12 r3 r3
13 r6 r6
14 s10 s11 15
15 r3 r3
LR(1) 構文解析表
X → w · [ a ] なら
a 列に reduce
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
E → E + T · [ +, $ ]
I15
149. 149
Num Id + = A E T
0 17 3 1 2 16
1
2 20 6
3
6 17 18 8 16
8 20
16
17
18
19
20 17 18 19
LALR(1)オートマトン
150. 150
Num Id + = $ A E T
0 s17 s3 1 2 16
1
2 s20 s6
3
6 s17 s18 8 16
8 s20
16
17
18
19
20 s17 s18 19
LALR(1) 構文解析表
151. 151
Num Id + = $ A E T
0 s17 s3 1 2 16
1 acc
2 s20 s6
3
6 s17 s18 8 16
8 s20
16
17
18
19
20 s17 s18 19
LALR(1) 構文解析表
S → A · [ $ ] I1
あとはLR(1)と同じ
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
152. 152
Num Id + = $ A E T
0 s17 s3 1 2 16
1 acc
2 s20 s6
3 r6 r6 r2
6 s17 s18 8 16
8 s20 r1
16
17
18
19
20 s17 s18 19
LALR(1) 構文解析表
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
A → Id · [ $ ]
T → Id · [ +, = ]
I3
A → E = E · [ $ ]
E → E · + T [ +, $ ]
I8
153. 153
Num Id + = $ A E T
0 s17 s3 1 2 16
1 acc
2 s20 s6
3 r6 r6 r2
6 s17 s18 8 16
8 s20 r1
16 r4 r4 r4
17 r5 r5 r5
18 r6 r6 r6
19 r3 r3 r3
20 s17 s18 19
LALR(1) 構文解析表
1. A → E = E
2. A → Id
3. E → E + T
4. E → T
5. T → Num
6. T → Id
E → T · [ +, =, $ ]
I16
T → Num · [ +, =, $ ]
I17
T → Id · [ +, =, $ ]
E → E + T · [ +, =, $ ]
I18
I19
155. GLR parsing [Tomita 1985]
155
文法
1 + 2 * 3入力
LR parsing とは異な
り曖昧性を許す
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
* 4
1 + ((2 * 3) * 4) 1 + (2 * (3 * 4))
$
161. GLR parsing
161
文法
エッジにラベルを付
けて、PFにメモを残
す
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
shift 3
+ 2 * 3入力 * 4 $
GSS 0 3
0
PF :Num 10
162. GLR parsing
162
文法
reduce もだいたい
LR と同様
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
reduce 4
+ 2 * 3入力 * 4 $
GSS 0 3
0
PF :Num 10
163. GLR parsing
163
文法
右辺の個数ポップ
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
go to 2
3
0
捨てる
+ 2 * 3入力 * 4 $
GSS 0
reduce 4
PF :Num 10
164. GLR parsing
164
文法
左辺の記号で go to
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
go to 2
+ 2 * 3入力 * 4 $
GSS 0 2
reduce 4
3
0
捨てる
PF :Num 10
165. GLR parsing
165
文法
エッジにラベルを付
けて、メモを残す
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
go to 2
捨てるラベル
+ 2 * 3入力 * 4 $
GSS 0 2
1
reduce 4
3
0
捨てる
PF :Num 10 :T( )1 0
166. GLR parsing
166
文法
同様に
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
reduce 2
+ 2 * 3入力 * 4 $
GSS 0 2
1
PF :Num 10 :T( )1 0
167. GLR parsing
167
文法
巻きで
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
go to 1
+ 2 * 3入力 * 4 $
GSS 0 1
2
reduce 2
PF :Num 10 :T( )1 0 :E( )2 1
168. GLR parsing
168
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
shift 4
+ 2 * 3入力 * 4 $
GSS 0 1
2
PF :Num 10 :T( )1 0 :E( )2 1
169. GLR parsing
169
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
2 * 3入力 * 4 $
GSS 0 1
2
4
3
shift 4
PF :Num 10 :T( )1 0 :E( )2 1 :+3 +
170. GLR parsing
170
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
shift 3
2 * 3入力 * 4 $
GSS 0 1
2
4
3
PF :Num 10 :T( )1 0 :E( )2 1 :+3 +
171. GLR parsing
171
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
shift 3
* 3入力 * 4 $
GSS 0 1
2
4
3
3
4
PF :Num 10 :T( )1 0 :E( )2 1 :+3 :Num4+ 2
172. GLR parsing
172
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
reduce 4
* 3入力 * 4 $
GSS 0 1
2
4
3
3
4
PF :Num 10 :T( )1 0 :E( )2 1 :+3 :Num4+ 2
173. GLR parsing
173
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
* 3入力 * 4 $
GSS 0 1
2
4
3
2
5
reduce 4
PF :Num 10 :T( )1 0 :E( )2 1 :+3 :Num4+ 2 :T( )5 4
174. GLR parsing
174
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
shift 5
* 3入力 * 4 $
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4+ 2 :T( )5 4
175. GLR parsing
175
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
shift 5
3入力 * 4 $
5
6
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6
+ 2
*
:T( )5 4
176. GLR parsing
176
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
shift 3
3入力 * 4 $
5
6
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6
+ 2
*
:T( )5 4
177. GLR parsing
177
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
shift 3
入力 * 4 $
5
6
3
7
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4+ 2 :T( )5 4
:*6 :Num7* 3
178. GLR parsing
178
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
reduce 4
入力 * 4 $
5
6
3
7
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7
+ 2
* 3
:T( )5 4
179. GLR parsing
179
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
reduce 4
入力 * 4 $
5
6
7
8
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7
+ 2
* 3
:T( )5 4
180. GLR parsing
180
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 * 4 $
5
6
7
8
shift 5 or reduce 3
複数あるとき
は分岐
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7
+ 2
* 3
:T( )5 4
181. GLR parsing
181
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 * 4 $
5
6
7
8
2
9
reduce 優先
shift 5 or reduce 3
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7 :T( , , )9 5 6 8
+ 2
* 3
:T( )5 4
182. GLR parsing
182
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 * 4 $
5
6
7
8
2
9
shift 5
shift 5
同じになった
らまとめる
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7 :T( , , )9 5 6 8
+ 2
* 3
:T( )5 4
183. GLR parsing
183
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 4 $
5
6
7
8
2
9
同じになった
らまとめる
shift 5
shift 5
5
10
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7 :T( , , )9 5 6 8 :*10
+ 2
* 3 *
:T( )5 4
184. GLR parsing
184
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 4 $
5
6
7
8
2
9
shift 3
5
10
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7 :T( , , )9 5 6 8 :*10
+ 2
* 3 *
:T( )5 4
185. GLR parsing
185
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 $
5
6
7
8
2
9
shift 3
5
10
3
11
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7 :T( , , )9 5 6 8 :*10
+ 2
* 3 *
:T( )5 4
:Num11 4
186. GLR parsing
186
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 $
5
6
7
8
2
9
5
10
3
11
reduce 4
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7 :T( , , )9 5 6 8 :*10
+ 2
* 3 *
:T( )5 4
:Num11 4
187. GLR parsing
187
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 $
5
6
7
8
2
9
5
10
7
12
reduce 4
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7 :T( , , )9 5 6 8 :*10
:T( )12 11
+ 2
* 3 *
:T( )5 4
:Num11 4
188. GLR parsing
188
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 $
5
6
7
8
2
9
5
10
7
12
reduce 3
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7 :T( , , )9 5 6 8 :*10
:T( )12 11
+ 2
* 3 *
:T( )5 4
:Num11 4
189. GLR parsing
189
文法
1. E → E + E
2. E → T
3. T → T * T
4. T → Num
Num + * $ E T
0 s3 1 2
1 s4 acc
2 r2 s5 r2
3 r4 r4 r4
4 s3 6 2
5 s3 7
6 s4/r1 r1
7 r3 s5/r3 r3
GSS 0
PF
1
2
4
3
2
5
入力 $
5
6
7
13
2
14
reduce 3
:Num 10 :T( )1 0 :E( )2 1 :+3 :Num4
:*6 :Num7 :T( )8 7 :T( , , )9 5 6 8 :*10
:T( )12 11 :T( , , )13 8 10 12 :T( , , )14 9 10 12
+ 2
* 3 *
:T( )5 4
:Num11 4