Bison 野牛冲突转移/减少
我是bison\yacc的新手,我正在尝试编写一个类似pascal的语法分析器,我得到了Bison 野牛冲突转移/减少,bison,yacc,Bison,Yacc,我是bison\yacc的新手,我正在尝试编写一个类似pascal的语法分析器,我得到了 analizorSintactic.y: conflicts: 1 shift/reduce analizorSintactic.y:65.13-23: warning: rule useless in parser due to conflicts: decllist: declaration 我得到了以下语法规则的警告 program : PROGRAM IDENTIFIER SEMICOLON c
analizorSintactic.y: conflicts: 1 shift/reduce
analizorSintactic.y:65.13-23: warning: rule useless in parser due to conflicts: decllist: declaration
我得到了以下语法规则的警告
program : PROGRAM IDENTIFIER SEMICOLON content;
content : VAR decllist SEMICOLON cmpdstmt DOT ;
decllist : declaration | declaration SEMICOLON decllist ;
declaration : IDENTIFIER COLON type
| IDENTIFIER COMMA declaration;
如何解决此冲突?
谢谢大家! 首先,请发布一些自给自足的东西。这并不难:将语法片段中不需要的非终结符转换为token。就你而言:
%%
program : "PROGRAM" "IDENTIFIER" "SEMICOLON" content;
content : "VAR" decllist "SEMICOLON" "cmpdstmt" "DOT" ;
decllist : declaration | declaration "SEMICOLON" decllist ;
declaration : "IDENTIFIER" "COLON" "type"
| "IDENTIFIER" "COMMA" declaration;
然后,将该文件馈送到bison--report=all
,并读取生成的*。输出
文件,其中包含:
State 10
3 decllist: declaration . ["SEMICOLON"]
4 | declaration . "SEMICOLON" decllist
"SEMICOLON" shift, and go to state 14
"SEMICOLON" [reduce using rule 3 (decllist)]
换句话说,野牛不知道如何读一个声明
,后面跟着一个代码>。这是因为“单个”声明(规则3)后面可以跟一个因为内容的规则
。这种冲突不能通过优先级/关联性来解决,因为在某些情况下移位是正确的(如果在;
之后有一个decllist
),而在其他情况下reduce是正确的(因为在;
之后有一个cmpdstmt
)。您必须重写语法,以帮助解析器生成器“进一步了解规则”
例如,您可以发送代码>从content
规则到decllist
规则:
%%
program : "PROGRAM" "IDENTIFIER" "SEMICOLON" content;
content : "VAR" decllist "cmpdstmt" "DOT" ;
decllist : declaration "SEMICOLON"
| declaration "SEMICOLON" decllist ;
declaration : "IDENTIFIER" "COLON" "type"
| "IDENTIFIER" "COMMA" declaration;
应该这样做