我在以下野牛语法中遇到 reduce/reduce 冲突

I am getting a reduce/reduce conflict in the following bison grammar

以下语法匹配 bison 中带有字段声明的结构。有人可以指出 reduce reduce 冲突在哪里吗?

结构示例: 结构 mystruct { int var;}

%start start

    %%
    start      : program             { $$ = parser::root->adopt(); }
               ;
    program    : program structdef   { $$ = ->adopt (); }
               |
               ;
    structdef  : TOK_STRUCT TOK_IDENT '{' fielddecls '}' {
               destroy();  destroy();
               $$ = ->adopt(, );}
               ;
    fielddecls : fielddecl {$$ = ;}
               | fielddecl fielddecls {$$ = ->adopt();}
               | {$$ = nullptr;}
               ;
    fielddecl  : basetype TOK_IDENT ';' {$$ = ->adopt();}
               ;
    basetype   : TOK_VOID    {$$ = ;}
               | TOK_INT     {$$ = ;}
               | TOK_STRING  {$$ = ;}
               | TOK_IDENT   {$$ = ;}
               ;

    %%

规则有问题

fielddecls : fielddecl {$$ = ;}
           | fielddecl fielddecls {$$ = ->adopt();}
           | {$$ = nullptr;}
           ;

这是模棱两可的——你有一个递归规则和两个基本情况,所以任何 1 个或多个 fielddecl 的序列都可以被识别。您只需要一个基本案例:

fielddecls : fielddecl fielddecls {$$ = ->adopt();}
           | {$$ = nullptr;}
           ;

将匹配 0 个或多个 fielddecl 的任何序列。