Правила yacc
Раздел правил файла грамматики содержит одно или несколько грамматических правил. Каждое правило описывает структуру и присваивает ей имя.
A : ТЕКСТ;Здесь A - нетерминальное имя, а ТЕКСТ - последовательность из 0 или более имен, литералов и семантических действий, после которых могут следовать правила приоритета. Для описания грамматики необходимы только имена и литералы. Семантические действия и правила приоритетов необязательны. Двоеточие и точки запятой должны быть указаны в определениях правил yacc обязательно.
Семантические действия позволяют выполнять определенный код при каждом распознавании правила во входном потоке. В качестве действия может применяться любой оператор C, который будет, например, выполнять ввод-вывод, вызывать функции или изменять значения переменных. Действия могут также вызывать операции анализатора, такие как сдвиг или понижение.
Правила приоритетов определяются ключевым словом %prec и изменяют приоритет соответствующего правила грамматики. Зарезервированное слово %prec может располагаться непосредственно после текста грамматического правила, в нем может указываться имя лексемы или литерал. При использовании такой конструкции приоритет правила становится равным приоритету имени лексемы или литерала.
Повторение нетерминальных имен
A : B C D ;
A : E F ;
A : G ;A : B C D
| E F
| G
;Использование рекурсии в файле грамматики
правило : КонечноеУсловие
| rule EndCaseТаким образом, в простейшем варианте правило соответствует значению КонечноеУсловие, но при этом правило может содержать произвольное число повторений значения КонечноеУсловие. Вторая строка, использующая правило внутри описания конструкции правило, применяет рекурсию. Анализатор последовательно обрабатывает входной поток, пока он не сократится до единственного значения КонечноеУсловие.
правило : КонечноеУсловие
| EndCase ruleПриведенный ниже пример определяет правило line (строка) как произвольную комбинацию элементов string (текст), завершающуюся символом новой строки (\n):
lines : line
| lines line
;
line : string '\n'
;Пустая строка
empty : ;
| x;empty :
| x
;Маркер конца ввода
Когда лексический анализатор достигает конца входного потока, он передает синтаксическому анализатору маркер конца ввода. Этот маркер является специальной лексемой со значением 0, называемой маркером конца. Когда синтаксический анализатор получает маркер конца, он проверяет, для всех ли входных данных были выбраны правила грамматики и образует ли обработанная информация законченный блок (в соответствии с правилами файла грамматики yacc). Если образован законченный блок, анализатор завершает работу. Если блок не образован, анализатор передает сообщение об ошибке и также завершает работу.
Лексический анализатор должен передавать маркер конца в некоторый обоснованный момент - например, по достижении конца файла или конца записи.