【问题标题】:rules precedence in bison野牛的规则优先级
【发布时间】:2023-06-06 03:12:02
【问题描述】:
语法规则如下:
ProcessExpression : EventExpression "->" ProcessExpression
| ProcessName ;
请你告诉我如何告诉 bison 第一条规则的优先级高于第二条?
我试过了:
%nonassoc PROC
%right "->"
ProcessExpression : EventExpression "->" ProcessExpression
| ProcessName % prec PROC;
但是没有任何结果。
谢谢。
【问题讨论】:
标签:
bison
rules
operator-precedence
【解决方案1】:
为了解决 reduce/reduce 冲突,bison 按照它们在源文件中的顺序为规则提供优先级,因此,作为第一个,第一个规则具有更高的优先级。但这显然不是你想要的,否则你不会问这个问题。
使用 %nonassoc/%right 为令牌提供优先级以解决移位/减少冲突。在这种情况下,重要的是令牌的优先级转移到要减少的规则的优先级。只涉及一个规则(尽管在当前状态下可能存在其他规则部分解析),因此在这种情况下谈论一个规则的优先级高于或低于另一个规则是没有意义的。
那么你想要做什么呢?到底出了什么问题? EventExpression 和 ProcessName 是否有些相似,所以它们有冲突?您没有提供有关这些规则是什么的信息...
【解决方案2】:
我认为,只有在存在左递归时,您才能应用您所写的内容。所以试试这样的。
%nonassoc PROC
%left EVENT
ProcessExpression : EventExpression "->" ProcessExpression %prec EVENT
| ProcessName % prec PROC;
谢谢,
悟空。