Compiler construction 解决GnuWin32野牛中的移位/减少警告?

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向我发出警告:

我有以下规则,当使用bison执行这些规则时,我会收到5个班次/减少警告

规则的一部分是:

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