Я использую jison (javascript-эквивалент Bison), и у меня возникла следующая проблема с приоритетом. Я проиллюстрирую это, используя демо калькулятора
http://zaach.github.com/jison/try/
Работает нормально как есть. Приоритет
%left '+' '-'
%left '*' '/'
%left '^'
%left UMINUS
и грамматика
e
: e '+' e
{$$ = $1+$3;}
| e '-' e
{$$ = $1-$3;}
| e '*' e
{$$ = $1*$3;}
| e '/' e
{$$ = $1/$3;}
| e '^' e
{$$ = Math.pow($1, $3);}
| '-' e %prec UMINUS
{$$ = -$2;}
Если я изменю строку '*' на
| e '*' e %prec TIMESPREC
{$$ = $1*$3;}
и измените приоритет на
%left '+' '-'
%left TIMESPREC '/'
%left '^'
%left UMINUS
это больше не работает. Разве это не должно работать так же? Это может быть полезно, например, если кто-то хочет в конечном итоге иметь синтаксис алгебры, где 2 x + 3 анализируется как (2x) + 3.
Спасибо!