代码之家  ›  专栏  ›  技术社区  ›  patzi

我在下面的bison语法中得到了一个reduce/reduce冲突

  •  0
  • patzi  · 技术社区  · 7 年前

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

    %start start
    
        %%
        start      : program             { $$ = parser::root->adopt($1); }
                   ;
        program    : program structdef   { $$ = $1->adopt ($2); }
                   |
                   ;
        structdef  : TOK_STRUCT TOK_IDENT '{' fielddecls '}' {
                   destroy($3);  destroy($5);
                   $$ = $1->adopt($2, $4);}
                   ;
        fielddecls : fielddecl {$$ = $1;}
                   | fielddecl fielddecls {$$ = $1->adopt($2);}
                   | {$$ = nullptr;}
                   ;
        fielddecl  : basetype TOK_IDENT ';' {$$ = $1->adopt($2);}
                   ;
        basetype   : TOK_VOID    {$$ = $1;}
                   | TOK_INT     {$$ = $1;}
                   | TOK_STRING  {$$ = $1;}
                   | TOK_IDENT   {$$ = $1;}
                   ;
    
        %%
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Chris Dodd    7 年前

    问题是规则

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

    这是不明确的——您有一个递归规则和两个基本情况,因此任何一个1个或多个fielddecl的序列都可以通过任何一种方式识别。您只需要有一个基本情况:

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

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