2017-11-10 145 views
0

下面的語法匹配一個結構和野牛中的字段聲明。有人能指出減少衝突的地方在哪裏?我在下面的野牛語法中遇到了減少/減少衝突

結構例: 結構MYSTRUCT {VAR INT;}

%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規則和兩個基地的情況,所以任何一個或多個fielddecl的序列都可以被識別。您需要只有一個基本情況:

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

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