已知文法 A→aAd|aAb|ε 是否为 SLR(1) 文法?
该文法不是 SLR(1) 文法。
原因如下:
- 计算 FOLLOW(A):
FOLLOW(A) = { $, b, d }
- 计算 CLOSURE({[A' → ·A, $]}):
CLOSURE({[A' → ·A, $]}) = {[A' → ·A, $], [A → ·aAd, $], [A → ·aAb, $], [A → ·ε, $]}
- 计算 GOTO({[A' → ·A, $]}, a):
GOTO({[A' → ·A, $]}, a) = {[A → a·Ad, $], [A → a·Ab, $]}
- 计算 GOTO({[A → a·Ad, $], [A → a·Ab, $]}, d):
GOTO({[A → a·Ad, $], [A → a·Ab, $]}, d) = {[A → aA·d, $]}
- 计算 ACTION 和 GOTO 表:
| | a | b | d | $ | |----|---|---|---|---| | 0 | s2 | | | | | 1 | | | | acc | | 2 | r3 | s4 | | r3 | | 3 | r1 | r1 | r1 | r1 | | 4 | | | s5 | | | 5 | r2 | r2 | r2 | r2 |
其中,s表示移进(shift),r表示规约(reduce),acc表示接受。
可以发现,ACTION 表中有移进-规约冲突和规约-规约冲突,因此该文法不是 SLR(1) 文法。
原文地址: https://www.cveoy.top/t/topic/na5Q 著作权归作者所有。请勿转载和采集!