- •1. Принципы работы yacc
- •2. Входные и выходные файлы, структура грамматического ана-
- •3. Процедура построения грамматического анализатора
- •4. Задание входной информации yacc
- •4.1. Структура спецификационного файла
- •4.2. Секция правил
- •4.3. Секция деклараций
- •5. Декларация имен лексем
- •6. Декларация приоритетов и ассоциативности лексем
- •7. Декларация имени начального символа
- •7.1. Секция программ
- •Val. Если функция yylex находится в отдельном файле, то эта
- •7.2. Действия с использованием псевдопеременных
- •8. Конфликты грамматического разбора
- •If '(' условие ')' оператор else
- •9. Структура информационного входного файла y.Output
- •10. Обработка ошибок при грамматическом разборе
- •11. Диагностика ошибок
- •0, Считаются восьмеричными, все остальные - десятичными.
- •Int base, regs[26]; /* в действиях */
- •1. Принципы работы yacc .............................. 3
9. Структура информационного входного файла y.Output
Основную часть данного файла составляет описание состо-
яний построенного грамматического анализатора. Информация о
каждом состоянии приводится в следующем порядке:
- Перечень соответствующих данному состоянию конфигураций
грамматики (конфигурация характеризуется определенным
грамматическим правилом и позицией в его правой части,
достигнутой к данному моменту разбора). Каждая конфигу-
рация представляется правилом с отмеченной с помощью
символа подчеркивания "_" распознанной частью (позицией
конфигурации). Например, конфигурация:
expr: expr +_expr
- 27 -
соответствует распознанной при разборе строки по ука-
занному правилу последовательности символов expr+.
- Действия анализатора при вводе в качестве очередного
просматриваемого символа каждой из лексем. Различные
виды действий указываются следующим образом:
<лексема> сдвиг <номер_состояния> -
сдвиг при вводе данной лексемы в состояние с указанным
номером;
<лексема> свертка <номер_правила> -
свертка при вводе лексемы по правилу с указанным номе-
ром;
<лексема> error -
выдача сообщения об ошибке во входных данных ("синтак-
сическая ошибка") и возврат из процедуры грамматичес-
кого анализа с кодом 1 (дальнейший разбор невозможен);
<лексема> accept -
возврат из процедуры грамматического анализа с кодом 0
(успешное завершение разбора). Последняя из строк,
описывающих действия анализатора, содержит вместо ука-
зания лексемы символ "." и сообщает действие, выполняе-
мое анализатором для всех лексем, не перечисленных в
данном состоянии. Часто эта строка имеет вид:
. error
и указывает, что все перечисленные лексемы в данном
состоянии являются недопустимыми.
- Перечень переходов для данного состояния. Каждый пере-
ход задается строкой
<имя_терминала> переход <номер_состояния>
сообщающей, в какое состояние перейдет анализатор после
свертки указанного нетерминала, если его распознавание
было начато из данного состояния.
Кроме того, описанию состояния может предшествовать
информация о конфликтах обнаруженных yacc для этого состоя-
ния и разрешенных по принципу умолчания. Информация о конф-
ликте содержит тип конфликта (св/св или сдв/св), конкурирую-
щие действия анализатора (при этом для сдвига указывается
номер состояния, для свертки - номер правила) и лексему, при
появлении которой возникает данный конфликт. Узнать, какое
- 28 -
из возможных действий будет выполнено анализатором, можно из
описания самого состояния.
Пример описания состояния:
8:Конфликт сдв/св (сдвиг 5,свертка 2) при +
Состояние 8
a:a_+a
a:a+a_ (2)
+ сдвиг 5
. свертка 2
Состоянию 8 здесь соответствуют две различные позиции, дос-
тигнутые при разборе по правилу
a: a '+' a
Kонфликт между сверткой по этому правилу и сдвигом в состоя-
ние 5 при вводе лексемы "+" разрешен в пользу сдвига. Ввод
остальных лексем вызывает свертку.
После описания состояния возможен ряд сообщений о нес-
вернутых правилах (с указанием этих правил), т.е. о прави-
лах, свертка по которым не будет произведена ни в одном из
состояний. Наличие таких правил с большой вероятностью сви-
детельствует о некорректности грамматики.
В конце файла приводится информация статистического
характера о реальном и предельном количестве терминальных и
нетерминальных символов, грамматических правил и состояний.
Фиксируется число конфликтов каждого типа, число различных
действий грамматического анализатора, занимаемый им объем
памяти, приводятся данные об использовании внутренних струк-
тур данных (множеств).