Приоритет бизонов (на самом деле с использованием Jison, но это должно быть то же самое)

StackOverflow https://stackoverflow.com/questions/9312023

  •  26-10-2019
  •  | 
  •  

Вопрос

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

Спасибо!

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top