2017-11-10 12 views
0

다음 문법은 구조체와 bison의 필드 선언이 일치합니다. 누군가 줄이기 위해 갈등을 줄일 수 있다고 지적 할 수 있습니까?다음 바이슨 문법에서 감소/감소 충돌이 발생했습니다.

구조체 예 : 구조체 MYSTRUCT {INT의 VAR은} - 그래서, 당신이 recusive 규칙과 두베이스의 경우이

%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;} 
      ; 

입니다 1 개 이상의 fielddecl의 순서는 어느 쪽인지 인식 할 수 있습니다. 하나의 기본 케이스 만 있으면됩니다.

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

은 0 이상의 fielddecl의 모든 시퀀스와 일치합니다.