我在以下野牛语法中遇到 reduce/reduce 冲突
I am getting a reduce/reduce conflict in the following bison grammar
以下语法匹配 bison 中带有字段声明的结构。有人可以指出 reduce reduce 冲突在哪里吗?
结构示例:
结构 mystruct { int var;}
%start start
%%
start : program { $$ = parser::root->adopt(); }
;
program : program structdef { $$ = ->adopt (); }
|
;
structdef : TOK_STRUCT TOK_IDENT '{' fielddecls '}' {
destroy(); destroy();
$$ = ->adopt(, );}
;
fielddecls : fielddecl {$$ = ;}
| fielddecl fielddecls {$$ = ->adopt();}
| {$$ = nullptr;}
;
fielddecl : basetype TOK_IDENT ';' {$$ = ->adopt();}
;
basetype : TOK_VOID {$$ = ;}
| TOK_INT {$$ = ;}
| TOK_STRING {$$ = ;}
| TOK_IDENT {$$ = ;}
;
%%
规则有问题
fielddecls : fielddecl {$$ = ;}
| fielddecl fielddecls {$$ = ->adopt();}
| {$$ = nullptr;}
;
这是模棱两可的——你有一个递归规则和两个基本情况,所以任何 1 个或多个 fielddecl 的序列都可以被识别。您只需要一个基本案例:
fielddecls : fielddecl fielddecls {$$ = ->adopt();}
| {$$ = nullptr;}
;
将匹配 0 个或多个 fielddecl 的任何序列。
以下语法匹配 bison 中带有字段声明的结构。有人可以指出 reduce reduce 冲突在哪里吗?
结构示例: 结构 mystruct { int var;}
%start start
%%
start : program { $$ = parser::root->adopt(); }
;
program : program structdef { $$ = ->adopt (); }
|
;
structdef : TOK_STRUCT TOK_IDENT '{' fielddecls '}' {
destroy(); destroy();
$$ = ->adopt(, );}
;
fielddecls : fielddecl {$$ = ;}
| fielddecl fielddecls {$$ = ->adopt();}
| {$$ = nullptr;}
;
fielddecl : basetype TOK_IDENT ';' {$$ = ->adopt();}
;
basetype : TOK_VOID {$$ = ;}
| TOK_INT {$$ = ;}
| TOK_STRING {$$ = ;}
| TOK_IDENT {$$ = ;}
;
%%
规则有问题
fielddecls : fielddecl {$$ = ;}
| fielddecl fielddecls {$$ = ->adopt();}
| {$$ = nullptr;}
;
这是模棱两可的——你有一个递归规则和两个基本情况,所以任何 1 个或多个 fielddecl 的序列都可以被识别。您只需要一个基本案例:
fielddecls : fielddecl fielddecls {$$ = ->adopt();}
| {$$ = nullptr;}
;
将匹配 0 个或多个 fielddecl 的任何序列。