我这里有两段 Happy 代码,一段使用普通优先规则,另一段使用上下文相关的优先规则(两者都在此处描述)。
普通的:
%left '+'
%left '*'
%%
Exp :: { Exp }
: Exp '+' Exp { Plus $1 $3 }
| Exp '*' Exp { Times $1 $3 }
| var { Var $1 }
上下文相关:
%left PLUS
%left TIMES
%%
Exp :: { Exp }
: Exp '+' Exp %prec PLUS { Plus $1 $3 }
| Exp '*' Exp %prec TIMES { Times $1 $3 }
| var { Var $1 }
给定输入:
a * b + c * d
普通版给出:
Plus (Times (Var "a") (Var "b")) (Times (Var "c") (Var "d"))
而上下文相关的版本给出:
Times (Var "a") (Plus (Var "b") (Times (Var "c") (Var "c")))
这两者不应该给出相同的输出吗?我在这里做错了什么导致它们生成不同的解析树?