%left
и %right
определяют ассоциативность оператора. Ассоциативность операции определяет, какая из двух операций с одинаковым уровнем приоритета выполняется первой.
Предположим, у нас есть грамматические правила:
exp ::= exp + exp
exp ::= ID
и предположим, что нам нужно проанализировать выражение x + y-z. Видите ли, поскольку уровень приоритета плюса и минуса одинаков, это выражение можно интерпретировать как (x + y) -z или x + (y-z). Это не кажется большим делом, но вносит двусмысленность в грамматику.
Не говоря уже о проблемах и теории, предположим, что мы анализируем выражение. 6 + 5-7, и предположим, что наш язык может работать только с натуральными числами и выдает исключение, когда происходит потеря значимости. Результат (6+5)-7
(4) не будет отличаться от 6+(5-7)
(исключение), поэтому мы не сможем предсказать результат - если мы не определим порядок оценки, указав ассоциативность операторов. Также рассмотрите случай таких выражений, как f()+g()+h()
, когда операнды являются функциями, которые могут иметь побочные эффекты.
person
SáT
schedule
14.10.2012