У меня есть простая леворекурсивная грамматика:
expression: primary
| op=( '!' | '-' ) expression
| expression op=( '/' | '*' ) expression
| expression op=('-' | '+') expression
| expression op=('>' | '>=' | '<' | '<=') expression
| expression op=('==' | '!=') expression
| expression op='and' expression
| expression op='or' expression
| IDENTIFIER '=' expression
;
Термины с более высоким приоритетом находятся около верха, термины с более низким приоритетом - около низа.
Всякий раз, когда я сопоставляю сАльтернатива, например expression op=('==' | '!=') expression
, я бы хотел определить приоритет / приоритет 2 дочерних expression
s в альтернативе.Так я могу проверить свое абстрактное синтаксическое дерево.
Например, a = b == a = b
генерирует этот AST:

Если ямог бы определить приоритет / приоритет дочерних выражений, тогда я мог бы создать валидатор, который доказывает, что этот код логически непоследователен, потому что 2 выражения присваивания с низким приоритетом являются прямыми потомками выражения равенства с более высоким приоритетом, что недопустимо.