CP-Homework2
[!ABSTRACT]
Modern Compiler Implementation in C.pdf P85
3220104929 250306
3.6
(a)
nullable | FIRST | FOLLOW | |
---|---|---|---|
S | no | u | |
B | no | w | z, v, x, y |
D | yes | x, y, \(\epsilon\) | z |
E | yes | y, \(\epsilon\) | z, x |
F | yes | x, \(\epsilon\) | z |
(b)
u | v | w | x | y | z | |
---|---|---|---|---|---|---|
S | uBDz | |||||
B | Bv, w | |||||
D | EF | EF | ||||
E | \(\epsilon\) | y | \(\epsilon\) | |||
F | x | \(\epsilon\) |
(c)
T[B,w]
项有两个 production,所以这个文法不是 LL(1) 的
(d)
为了使其转化为最小的 LL(1)文法,需要消除左递归
将 \(B\rightarrow Bv|w\) 转化为 \(B\rightarrow wT,T\rightarrow vT|\epsilon\),其它不变即可
3.9
我们可以得到 LR(0) Item 的 NFA:
将其转化为 DFA:
再获取各个非终结符的 follow 集合:
- \(Follow(S) = \{\$\}\)
- \(Follow(V) = \{=,\$\}\)
- \(Follow(E) = \{=,\$\}\)
据此可以构造出一个 SLR(1) Parsing Table:
S | $ | E | V | x | * | = | |
---|---|---|---|---|---|---|---|
1 | g2 | g6 | g3 | s4 | s5 | ||
2 | accept | ||||||
3 | r3 | s8, r3 | |||||
4 | r4 | r4 | |||||
5 | g10 | g9 | s4 | s5 | |||
6 | r6 | ||||||
7 | r7 | ||||||
8 | g7 | g9 | s4 | s5 | |||
9 | r9 | r9 | |||||
10 | r10 | r10 |
出现冲突的项是 T[3,=]
3.13
我们可以得到 LR(1) Item 的 NFA:
将其转化为 DFA:
据此可以构造出一个 LALR(1) Parsing Table:
X | M | $ | a | b | c | d | |
---|---|---|---|---|---|---|---|
1 | g2 | g3 | s7 | s5 | |||
2 | accept | ||||||
3 | s4 | ||||||
4 | r1 | ||||||
5 | r5 | s6 | |||||
6 | r3 | ||||||
7 | g8 | s10 | |||||
8 | s9 | ||||||
9 | r2 | ||||||
10 | s11 | r5 | |||||
11 | r4 |
可以看到不存在冲突项,所以该语法是 LALR(1)文法
我们可以得到 LR(0) Item 的 NFA:
将其转化为 DFA:
获取非终结符的 follow 集合:
- \(Follow(X) = \{\$\}\)
- \(Follow(M) = \{a,c\}\)
据此可以构造出一个 SLR(1) Parsing Table:
X | M | $ | a | b | c | d | |
---|---|---|---|---|---|---|---|
1 | g2 | g3 | s5 | s10 | |||
2 | accept | ||||||
3 | s4 | ||||||
4 | r1 | ||||||
5 | g6 | s7 | |||||
6 | s8 | ||||||
7 | r5, s9 | r5 | |||||
8 | r2 | ||||||
9 | r4 | ||||||
10 | r5 | s11, r5 | |||||
11 | r3 |
可以看到存在冲突项 T[7,a], T[10,c]
,所以该文法不是 SLR(1) 文法
3.14
nullable | FIRST | FOLLOW | |
---|---|---|---|
S | no | (, ], ) | |
X | no | ), ] | |
E | yes | \(\epsilon\) | ], ) |
F | yes | \(\epsilon\) | ], ) |
A | yes | \(\epsilon\) | ], ) |
据此可以构造出一个 LL(1) Parsing Table:
] | ( | ) | |
---|---|---|---|
S | E] | (X | F) |
X | F] | E) | |
E | A | A | |
F | A | A | |
A | \(\epsilon\) | \(\epsilon\) |
可以看到不存在冲突项,所以该语法是 LL(1)文法
对于该文法,我们增加一个起始符号 \(S^\prime\) 以及对应的产生式 \(S^\prime \rightarrow S\$\) ,我们可以得到 LR(1) Item 的 NFA:
将其转化为 DFA:
如上图所示,state 9 和 state 14 具有相同的核心,但合并后会出现 reduce-reduce conflict,所以该文法不是 LALR(1)文法