我有以下 yacc/bison/happy 语法:
%token
if TokenIf
then TokenThen
else TokenElse
true TokenTrue
false TokenFalse
%left APP
%right IF
%%
Hungry
: NoHungry
| Hungry NoHungry %prec APP
| if Hungry then Hungry else Hungry %prec IF
NoHungry
: true
| false
bison -v
告诉我在以下情况下有两个冲突:
State 12
2 Hungry: Hungry . NoHungry
3 | if Hungry then Hungry else Hungry .
true shift, and go to state 2
false shift, and go to state 3
true [reduce using rule 3 (Hungry)]
false [reduce using rule 3 (Hungry)]
$default reduce using rule 3 (Hungry)
NoHungry go to state 8
我试图通过使用 给出明确的优先级声明来解决冲突%prec
,但无济于事。鉴于野牛根据需要解决冲突(例如,转移而不是减少),这还不错,但我想知道我们如何在不改变公认语言的情况下摆脱冲突。
从 bison 报告中可以看出,冲突与未在优先关系中列出的终端true
和false
。因此,优先规则不适用于这些冲突。
回想一下,产生式和终结符之间定义了优先关系。它不涉及两个终端或两个产生式(因此不能用于解决归约冲突)。可以减少的产生式的优先级与先行终端之间的比较确定是否会发生减少或移位。为了符号方便,产生式由终端的名称表示,通常是产生式中唯一的终端;这对应于一个常见的用例,但有时令人困惑。特别是,%prec
声明仅用于为规则命名以在优先声明中使用,并且最好以这种方式考虑它而不是作为“显式”声明来考虑它。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
简而言之,您问题中简化语法的冲突可以通过在优先关系中显式添加适当的终结符来解决:
%precedence "if"
%precedence "true" "false"
%%
Hungry
: NoHungry
| Hungry NoHungry
| "if" Hungry "then" Hungry "else" Hungry %prec "if"
NoHungry
: "true"
| "false"
摘自-v
输出:
State 12
2 Hungry: Hungry . NoHungry
3 | "if" Hungry "then" Hungry "else" Hungry .
"true" shift, and go to state 2
"false" shift, and go to state 3
$default reduce using rule 3 (Hungry)
NoHungry go to state 8
通过使用-r solved
代替-v
,您可以更明确地看到分辨率:
Conflict between rule 3 and token "true" resolved as shift ("if" < "true").
Conflict between rule 3 and token "false" resolved as shift ("if" < "false").
我可以用作生产"else"
的名称if
,如果没有%prec
声明,这将是默认值,但"if"
似乎更直观。
该%precedence
声明(近野牛版本)并不意味着左边或右边的关联性; 在这种情况下,结合性不适用,因为在冲突中不存在涉及同等优先级的产生和终结的情况。如果 Happy 没有实现它,%left
或者%right
可以出于相同的原因使用它(关联性无关紧要),但我认为%precedence
更好地记录这种情况。
由于这无疑是一个简化的例子,值得注意的是,更完整的语法需要一些语法分析。特别是,优先级大于"if"
必须包含 中的所有终端的终端列表FIRST(NoHungry)
,并且 bison 不提供执行该计算的自动工具,尽管您通常可以从 shift-reduce 冲突报告中提取列表。(它甚至可能"if"
是集合的一部分,在这种情况下,结合性很重要。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句