Использование UNIX для синтаксического и лексического анализа

       

Объявления Yacc


В разделе объявлений Yacc определяются лексемы, а также приоритет операторов и начальные символы для синтаксического анализа. Для объявления значений используются семь ключевых слов. Конструкция %token определяет лексемы, используемые в синтаксическом анализаторе. Допускается дополнительно определять поле объединения в угловых скобках, это объединение передает информацию от лексического анализатора к синтаксическому и ниже будет описано более подробно.

После дополнительного поля можно перечислять имена лексем, при желании сопровождая каждое из них номером. Эти лексемы будут преобразованы в значения #define и использованы в коде С для определения конструкций. Например:

%token WORD 0 SEHTENCE MONTH

Определены три лексемы, которые возвращаются ууlех() в случае, если лексема WORD принимает значение целого числа 0. %left и %right определяют старшинство лексем слева направо или справа налево. Синтаксис такой же, что и для %token. Директивы порядка старшинства в исходном тексте Yacc определяет старшинство операторов. Конструкция %nonassoc определяет лексемы, которые не должны использоваться при любой ассоциации. Конструкция %type определяет тип лексем, которые не являются печатными (нетерминальные лексемы). Поскольку эти лексемы не печатаются, им нельзя присваивать числовые значения.

Остальные конструкции объявлений немного различны. Конструкция %start определяет нетерминальный символ, который нужно рассматривать как начальный. Это должна быть самая большая, чаще всего употребляемая структура, определенная в грамматике. Если символ %start не определен, Yacc по умолчанию принимает его равным первому символу первого правила.

Конструкция %union объявляется аналогично объединению в С. Например, можно объявить объединение:

%union { long vall; short sval; char* string; }

При этом изменяется определение структуры yylval, которая используется для передачи данных между синтаксическим и лексическим анализаторами. После объявления объединения можно расставить метки в строках %token. В случае возвращения данных из лексического анализатора нужно объявить лексемы следующим образом:

%token <vall> TIME %token <строка> WORD %token <sval> MONTH DATE

Yacc автоматически сохраняет эти поля объединения для проверки соответствия типов в результирующей грамматике.



Содержание раздела