Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры_по тяпу готовые.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
952.32 Кб
Скачать

32. Генератор компиляторов уасс. Использование неоднозначных грамматик.

Одним из средств автоматизированного построения трансляторов является генератор компиляторов Yacc. Yacc строит синтаксический анализатор, работающий на основе метода “сдвиг - приведение”.

Этот генератор работает с атрибутными грамматиками. Атрибутные грамматики характеризуются тем, что с каждым грамматическим символом связывается множество атрибутов. Атрибуты в атрибутных грамматиках могут быть двух видов: синтезируемые и наследуемые. Синтезируемые атрибуты вычисляют свои значения, используя только значения атрибутов потомков. Наследуемые атрибуты при вычислении значений используют значения атрибутов соседей и родителей. Исходный текст для Yacc, основой которого являются продукции и семантические правила, пишется в текстовом редактор и сохраняется в файле с расширением y. Если исходный текст содержит ошибки, то при генерации транслятора будет создан файл ошибок с расширением lst. Полученный в результате работы yacc модуль присоединяется к проекту Delphi, который содержит текст основной программы. Транслятор строится Yacc в виде функции yyparse, которая вызывается из основной программы. Исходный текст для yacc состоит из трех частей: определения, продукции и вспомогательные процедуры. Части разделяются символами %%.

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

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

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

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

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

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

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

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

Если мы используем неоднозначную грамматику, то LALR-алгоритм будет генерировать конфликты действий синтаксического анализа. Yacc может автоматически решать конфликты исходы из правил:

1) Конфликт свертка/свертка разрешает выбором продукции, находящейся первой в спецификации Yacc.

2) конфликт перенос/свертка разрешается в пользу переноса. Это правило корректно разрешает конфликт, возникающий из-за неоднозначности появления else.

Yacc разрешает конфликты перенос/свертка назначением приоритета и ассоциативности каждой продукции, участвующей в конфликте. Если необходимо осуществить выбор между переносом входного символа a и сверкой в соответствии с продукцией A-> α, то Yacc выполняет свертку, если приоритет продукции выше приоритета a, или если приоритеты одинаковы, и ассоциативность продукции – левая. В противном случае перенос.

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