解决与野牛悬挂的其他问题

时间:2013-06-09 13:57:45

标签: bison

我的语法有两个令牌声明:

%token RP
%token ELSE

这两条规则:

Statement  : IF LP Exp RP Statement;

Statement  : IF LP Exp RP Statement ELSE Statement;

据我所知,规则的优先级取决于其最后一个非终结符的优先级。因此,第一个规则具有RP优先级,第二个规则具有ELSE优先级,高于RP。以下是野牛的输出:

state 73

   11 Statement: IF LP Exp RP Statement .
   12          | IF LP Exp RP Statement . ELSE Statement

    ELSE  shift, and go to state 76

    ELSE      [reduce using rule 11 (Statement)]
    $default  reduce using rule 11 (Statement)

由于ELSE具有更高的优先级,所以不应该通过转移来解决这种冲突吗?

2 个答案:

答案 0 :(得分:6)

不,因为%token没有设置令牌的优先级(你称之为优先级) - 它声明令牌以无优先级存在。如果要为令牌声明优先级,则需要使用%left%right%nonassoc所有这两者都声明令牌并设置其优先级。如果您将代码更改为

%nonassoc RP
%nonassoc ELSE

然后RPELSE将设置其优先级,ELSE将具有更高的优先级,并且shift / reduce冲突将通过优先级解决。

答案 1 :(得分:1)

你应该看一下这个answer,if / else歧义是一种非常常见的语言模式,它在Bison和Yacc的手册,以及龙书和几本书中都有说明。互联网上的教程,如this one

  

由于ELSE具有更高的优先级,不应该通过移位来解决这种冲突吗?

正如在另一个answer中所说的那样,确实如此。冲突正在由野牛做自动转移自动解决,它会告诉你它...它确实选择了IF ELSE,如果你添加了%expect声明它不会警告你它做了什么“自动地”。