2017-11-10 8 views
0

次の文法は、bisonのフィールド宣言を持つ構造体と一致します。誰かが削減削減競争がどこにあるのかを指摘できますか?以下のbison文法でreduce/reduceの競合が発生しました

構造体例: 構造体体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;} 
       ; 

    %% 

答えて

0

問題があいまいなルール

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

ある - そう、recusiveルールと二つの基地ケースを有しています1つ以上のfielddeclのシーケンスはいずれの方法でも認識できます。

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

は、0以上のfielddeclの任意のシーケンスと一致します。

関連する問題