У меня есть два фрагмента кода 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")))
Разве они оба не должны давать одинаковый результат? Что я здесь делаю неправильно, из-за чего они генерируют разные деревья синтаксического анализа?