Бинарную операцию можно определить как неассоциативную (т.е.
не допускающую появления объединения двух подряд идущих знаков
операции):
%nonassoc '<'
Символы, перечисленные в одном объявлении, имеют одинаковое
старшинство. Старшинство выше для каждого последующего
объявления.
Конфликты разрешаются путем присваивания старшинства и
ассоциативности каждому правилу грамматики и каждому
терминалу, участвующим в конфликте. Если необходимо выбрать
между сдвигом входного символа s и сверткой по правилу A->w,
свертка делается, если старшинство правила больше старшинства
s или если старшинство одинаково, а правило левоассоциативно.
В противном случае делается сдвиг.
Обычно за старшинство правила принимается старшинство самого
правого терминала правила. В тех случаях, когда самый правый
терминал не дает нужного приоритета, этот приоритет можно
назначить следующим объявлением:
%prec терминал
Старшинство и ассоциативность правила в этом случае будут
такими же, как у указанного терминала.
Yacc не сообщает о конфликтах, разрешаемых с помощью
ассоциативности и приоритетов.
Восстановление после ошибок управляется пользователем с
помощью введения в грамматику "правил ошибки" вида A->error w.
Здесь error - ключевое слово Yacc. Когда встречается
синтаксическая ошибка, анализатор трактует состояние, набор
ситуаций для которого содержит правило для error, некоторым
специальным образом: символы из стека выталкиваются до тех
пор, пока на верхушке стека не будет обнаружено состояние, для
которого набор ситуаций содержит ситуацию вида [A-> . error
w]. После чего в стек фиктивно помещается символ error, как
если бы он встретился во входной строке.
Если w пусто, делается свертка. После этого анализатор
пропускает входные символы, пока не найдет такой, с которым
можно продолжить нормальный разбор.
Если w не пусто, просматривается входная строка и делается
попытка свернуть w. Если w состоит только из терминалов, эта
строка ищется во входном потоке.
Литература
1. Aho A., Sethi R., Ullman J. Compilers: principles,
techniques and tools. N.Y.: Addison-Wesley, 1986.
2. Грис Д. Построения компиляторов для цифровых
вычислительных машин. М.: Мир, 1975.
3. Fraser C.W., Hanson D.R. A Retargetable compiler for
ANSI C.// SIGPLAN Notices. 1991. V 26.
4. Надежин Д.Ю., В.А.Серебряков, В.М.Ходукин.
Промежуточный язык Лидер (предварительное
сообщение)//Обработка символьной информации.М.: ВЦ АН
СССР, 1987. С. 50-63.
5. Ахо А., Ульман Д. Теория синтаксического анализа,
перевода и компиляции. М.: Мир, 1978.
6. Кнут Д. Искусство программирования для ЭВМ. Т. 1.
Основные алгоритмы. М.: Мир, 1976.
7. Лавров С.С., Гончарова Л.И. Автоматическая обработка