Операционная система UNIX. Руководство программиста


         

Ее можно использовать, чтобы входную


%right '=' %left '+' '-' %left '*' '/'

%%

expr : expr '=' expr | expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | NAME ;

Ее можно использовать, чтобы входную цепочку

a = b = c * d - e - f * g

структурировать следующим образом:

a = (b = (((c * d) - e) - (f * g)))

что соответствует истинным приоритетам операций. При использовании данного механизма должен быть, вообще говоря, задан приоритет унарных операций. Иногда унарная и бинарная операции имеют одно и то же внешнее представление, но различные приоритеты. Примером является унарный и бинарный минус, -.

Унарному минусу можно придать тот же приоритет, что и умножению, или даже выше, в то время как у бинарного минуса приоритет меньше, чем у умножения. Ключевое слово %prec изменяет приоритет операции в пределах одного грамматического правила. Ключевое слово %prec указывается сразу за телом правила, перед действием или завершающей точкой с запятой; за ключевым словом следует имя лексемы или литерал. В результате приоритет правила становится таким же, как и у данной лексемы или литерала. Например, правила

%left '+' '-' %left '*' '/'

%%

expr : expr '+' expr | expr '-' expr | expr '*' expr | expr '/' expr | '-' expr %prec '*' | NAME ;

можно использовать, чтобы установить унарному минусу тот же приоритет, что и у умножения.

Лексему, описанную при помощи конструкций %left, %right или %nonassoc, можно (но не обязательно) описать и при помощи %token.

Приоритеты и ассоциативность yacc использует для того, чтобы разрешить конфликты разбора. Они задают следующие методы разрешения неоднозначностей:


  • Приоритеты и ассоциативность приписываются тем лексемам и литералам, для которых они заданы явно.


  • Грамматическому правилу сопоставляются приоритет и ассоциативность последней лексемы или литерала в теле правила. В случае использования конструкции %prec это сопоставление переопределяется. Некоторым правилам приоритет и ассоциативность могут не сопоставляться.


  • Если есть конфликт свертка-свертка или конфликт свертка-перенос, и входной символ или грамматическое правило не имеют приоритета и ассоциативности, то используется общий метод разрешения неоднозначностей, приведенный в начале раздела, и выдается информация о конфликтах.



  • Содержание  Назад  Вперед