我正在使用Bison,我的CFG有一个Shift减少冲突,这使我的优先权失去了作用。
这是我的代码:
Decl : vartype T_Identifier T_Semicolon {
// replace it with your implementation
Identifier *id = new Identifier(@2, $2);
$$ = new VarDecl(id, $1);
}
| vartype T_Identifier T_Equal primaryExpr T_Semicolon {
Identifier *id = new Identifier(@2, $2);
$$ = new VarDecl(id, $1, $4);
}
| function_prototype T_Semicolon {$$ = $1;}
;
我对此特定规则有一个减少冲突。我希望最后一行(function_prototype ...)具有最高优先级,但冲突会转移并将我发送到另一个状态。仅供参考," function_prototype"是一个非终结符,其规则为" vartype T_Identifier T_LeftParenth"。这是来自野牛的输出文件:
State 28 conflicts: 1 shift/reduce
...
state 28
4 Decl: vartype . T_Identifier T_Semicolon
5 | vartype . T_Identifier T_Equal primaryExpr T_Semicolon
11 fully_specified_type: vartype .
T_Identifier shift, and go to state 34
T_Identifier [reduce using rule 11 (fully_specified_type)]
...
state 34
4 Decl: vartype T_Identifier . T_Semicolon
5 | vartype T_Identifier . T_Equal primaryExpr T_Semicolon
T_Equal shift, and go to state 36
T_Semicolon shift, and go to state 37
State 34跳过了我的"功能原型"规则!如何修复此冲突和优先级问题?
答案 0 :(得分:1)
在Decl: vartype
规则与fully_specified_type: vartype
规则之间发生冲突 - 看到vartype
后,当前瞻为T_Identifier
时,它就没有了; t知道这是否是fully_specified type
。因此它会转换(默认分辨率),将其视为vartype
的简单Decl
。
一般来说,这类事情通常是一个问题,需要多个令牌前瞻才能知道如何解析事物,但由于您没有显示与fully_specified_type
规则相关的任何内容,很难说如何解决它。很可能有一种方法可以重构你的语法(可能只是摆脱fully_qualified_type
并且只是在使用它的地方直接使用vartype
。