我在下面的野牛语法中遇到了减少/减少冲突
问题描述:
下面的语法匹配一个结构和野牛中的字段声明。有人能指出减少冲突的地方在哪里?我在下面的野牛语法中遇到了减少/减少冲突
结构例: 结构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;}
;
%%
答
的问题是规则
fielddecls : fielddecl {$$ = $1;}
| fielddecl fielddecls {$$ = $1->adopt($2);}
| {$$ = nullptr;}
;
这是不明确的 - 你有一个recusive规则和两个基地的情况,所以任何一个或多个fielddecl的序列都可以被识别。您需要只有一个基本情况:
fielddecls : fielddecl fielddecls {$$ = $1->adopt($2);}
| {$$ = nullptr;}
;
将匹配0或更多fielddecl的任何序列。