приоритет бизонов (на самом деле используется jison, но он должен быть таким же) - PullRequest
3 голосов
/ 16 февраля 2012

Я использую 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.

Спасибо!

1 Ответ

2 голосов
/ 16 февраля 2012

Причина этого в том, что %prec будет устанавливать приоритет правила, а не на всех отдельных токенах.Таким образом, индивидуальный приоритет токенов в RHS правила все еще имеет значение.

Таким образом, установка %prec в вашем правиле умножения не изменит приоритет символа '*'.Когда приоритет пытается разрешить конфликты, он сравнивает приоритет уменьшенных действий с приоритетом токена, который должен быть смещен.Поскольку * не имеет приоритета, грамматика с вашими изменениями становится неоднозначной.

...