Compiler construction 解决GnuWin32野牛中的移位/减少警告?
我有以下规则,当使用bison执行这些规则时,我会收到5个班次/减少警告 规则的一部分是:Compiler construction 解决GnuWin32野牛中的移位/减少警告?,compiler-construction,bison,shift-reduce-conflict,gnuwin32,Compiler Construction,Bison,Shift Reduce Conflict,Gnuwin32,我有以下规则,当使用bison执行这些规则时,我会收到5个班次/减少警告 规则的一部分是: Type----> BOOL | INT | CHAR | DOUBLE | ID | INT '['']' ; rule: VarDec rule | VarDec ; VarDec: Type ID ';' ; 在这种状态下,Parser.output向我发出警告:
Type----> BOOL
| INT
| CHAR
| DOUBLE
| ID
| INT '['']'
;
rule: VarDec rule
| VarDec
;
VarDec: Type ID ';'
;
在这种状态下,Parser.output
向我发出警告:
**状态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
有人能帮我解决这个问题吗?我读了很多文章,但我没能找出问题所在,提前感谢每一个人……) 上述示例不足以再现移位/减少冲突。您可能在其他地方有一个
rule
的实例,后面跟着VarDec
或它开头的标记
如果我添加以下规则,我可以重现冲突:
decl : rule VarDec;
该规则导致了您的问题。冲突发生在解析堆栈顶部有一个VarDec,下一个标记是BOOL、INT、CHAR、DOUBLE、,或者ID。然后解析器需要查看前面的至少两个标记,以确定它是否正在查看另一个VarDec——在这种情况下,当前正确的操作是在预期以后将以下标记减少为“规则”时进行转换——或者它是否在查看其他标记——在这种情况下,正确的操作是减少VarDec当前位于堆栈顶部,用于“规则” 应该可以通过如下方式更改“规则”规则来解决此特定冲突:
rule: rule VarDec
| VarDec
;
使用左递归而不是右递归。这也很好,因为在Bison规则中,您应该始终使用左递归而不是右递归。这确保了您可以使用有限的堆栈空间解析任何输入
Bison标识的实际状态可能与该更改略有不同,但在可能的情况下,仍然有一个堆栈顶部有一个VarDec,另一个标记是BOOL、INT、CHAR、DOUBLE或ID,因此只有一个可能的操作(仅提供了规则):将堆栈上的VarDec减少为“规则”。没有其他可能的解析,即使即将出现的令牌后来证明不是一个VarDec