我在这里有两个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")))
这些都不应该给出相同的输出吗?我在这做错了什么让他们生成不同的解析树?