Bison 野牛冲突转移/减少

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

我是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 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;
应该这样做