Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MетТЯПиМТ-ЛР-2010.doc
Скачиваний:
155
Добавлен:
19.03.2016
Размер:
814.08 Кб
Скачать

9.3 Структура Yacc-программы

Исходный текст для yacc состоит из трех частей: определения, продукции и вспомогательные процедуры. Части разделяются символами %%.

В части определений можно указать код, который должен быть перенесен в текст результирующего транслятора без изменения. Для этого он помещается между символами %{ и %}. В качестве такого кода могут выступать заголовок модуля или объявления типов, используемые затем для описания атрибутов терминалов и нетерминалов.

В результирующем коде будет объявлена переменная yyLval. Эта переменная всегда автоматически определяется YACC в тексте синтаксического анализатора. Она предназначена для хранения атрибутов терминалов, которые должны быть переданы из лексического анализатора в синтаксический. Тип этой переменной YYSType. Этот тип также автоматически определяется YACC в синтаксическом анализаторе. Он представляет собой запись с переменными полями. Количество и имена полей записи определяются количеством и типами объявленных терминалов. Например, если объявлены терминалы стандартного типа real и пользовательского типа mytype, то у типа YYSType будет два поля YYReal и YYMytype.

Часть определений включает следующие разделы.

1 Задание стартового символа.

%start символ

Если такое определение отсутствует, то в качестве стартового символа используется нетерминал левой части первой продукции.

2 Определение атрибутов терминалов грамматики.

%token <тип атрибута> терминал

При наличии такого определения в исходном тексте, в модуле, содержащем транслятор, декларируется константа указанного типа с именем, соответствующим терминалу. Эти константы используются в исходном файле Lex без дополнительных объявлений. В качестве типа может быть использован любой стандартный тип Pascal или декларированный ранее.

3 Задание ассоциативности операций.

%left символ – лево ассоциативная операция

%right символ – право ассоциативная операция

%noassoc символ – неассоциативная операция

Приоритет операции определяется ее положением при определении. Чем ниже задана операция при определении, тем выше ее приоритет.

4 Задание типов атрибутов нетерминалов

%type <тип атрибута> нетерминал.

Вторая часть Yacc-программы содержит продукции и связанные с ними семантические правила. Левая часть продукции отделяется от правой символом “:”.

Семантические правила записываются на языке Pascal и следуют за продукцией, заключенные между символами “{” и “}”. Для обращения в семантических правилах к атрибуту нетерминала левой части продукции используют символы $$. Для обращения к атрибутам грамматических символов правой части продукций используются символы $i, где i – номер грамматического символа в продукции.

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

нетерминал : продукция 1 {семантическое правило 1}

| продукция 2 {семантическое правило 2}

| продукция n {семантическое правило n}

Третья часть Yacc-программы содержит вспомогательные процедуры. Эта часть переносится в результирующий код без изменения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]