我的语法有两个令牌声明:
%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
具有更高的优先级,所以不应该通过转移来解决这种冲突吗?
答案 0 :(得分:6)
不,因为%token
没有设置令牌的优先级(你称之为优先级) - 它声明令牌以无优先级存在。如果要为令牌声明优先级,则需要使用%left
,%right
或%nonassoc
所有这两者都声明令牌并设置其优先级。如果您将代码更改为
%nonassoc RP
%nonassoc ELSE
然后RP
和ELSE
将设置其优先级,ELSE
将具有更高的优先级,并且shift / reduce冲突将通过优先级解决。
答案 1 :(得分:1)