规则的一部分是:
Type----> BOOL
| INT
| CHAR
| DOUBLE
| ID
| INT '['']'
;
rule: VarDec rule
| VarDec
;
VarDec: Type ID ';'
;在这种情况下,Parser.output会给我一个警告:
**state 25**
4 rule: VarDec . rule
5 | VarDec .
BOOL shift, and go to state 3
INT shift, and go to state 4
CHAR shift, and go to state 5
DOUBLE shift, and go to state 6
ID shift, and go to state 7
BOOL [reduce using rule 5 (rule)]
INT [reduce using rule 5 (rule)]
CHAR [reduce using rule 5 (rule)]
DOUBLE [reduce using rule 5 (rule)]
ID [reduce using rule 5 (rule)]
$default reduce using rule 5 (rule)
rule go to state 28
VarDec go to state 25
Type go to state 27有没有人能帮我解决这个问题,我已经读了很多文章,但是我不知道出了什么问题,并提前感谢大家……:)
发布于 2013-05-29 14:10:22
上面的例子不足以再现shift/reduce冲突。
decl : rule VarDec;这条规则导致了你的问题。
发布于 2013-10-29 02:38:20
冲突发生在这样一种状态下:解析堆栈顶部有一个规则,而下一个标记是BOOL、INT、CHAR、DOUBLE或ID。然后,解析器需要提前查看至少两个标记,以确定它是否正在寻找另一个规则--在这种情况下,现在正确的操作是转移,以预期稍后将后面的标记减少为“规则”--或者是否正在寻找其他东西--在这种情况下,正确的操作是将当前位于堆栈顶部的VarDec减少为“规则”。
应该可以通过更改您的“规则”规则来解决此特定冲突,如下所示:
rule: rule VarDec
| VarDec
;使用左递归而不是右递归。这也很好,因为您应该始终使用左递归而不是 rules中的右递归。这确保了您可以在有限的堆栈空间内解析任何输入。
Bison标识的实际状态可能会随着这种变化而略有不同,但如果仍有一个状态在堆栈顶部具有规则,并且BOOL、INT、CHAR、DOUBLE或ID中的一个作为下一个令牌,则只有一个可能的操作(仅提供规则):将堆栈上的VarDec减少为“规则”。没有其他可能的解析,即使即将到来的令牌后来被证明不会简化为VarDec。
https://stackoverflow.com/questions/16798450
复制相似问题