野牛冲突转移/减少

时间:2013-11-30 20:11:43

标签: 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 content; 
content : VAR decllist SEMICOLON cmpdstmt DOT ;

decllist :  declaration | declaration SEMICOLON decllist ;
declaration : IDENTIFIER COLON type 
        | IDENTIFIER COMMA declaration;

我该如何解决这个冲突? 谢谢!

1 个答案:

答案 0 :(得分:2)

首先,请发布一些自给自足的内容。这并不太难:将语法片段中不需要的非终结符转换为标记。在你的情况下:

%%
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并阅读生成的*.output文件,其中包含:

State 10

    3 decllist: declaration .  ["SEMICOLON"]
    4         | declaration . "SEMICOLON" decllist

    "SEMICOLON"  shift, and go to state 14

    "SEMICOLON"  [reduce using rule 3 (decllist)]

换句话说,Bison不知道如何阅读declaration后跟;。这是因为由于declaration的规则,“;(规则3)可以后跟content。这种冲突不能通过优先级/关联性来解决,因为在某些情况下,移位是正确的(如果在decllist之后有;),在其他情况下,reduce是正确的(因为有一个{{ 1}} cmpdstmt之后。你必须重写你的语法,以帮助解析器生成器“看到更多的规则”。

例如,您可以将;规则中的;发送到content规则:

decllist

应该这样做。