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

8.2.4 Работа машины

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

procedure execute;

var i:integer;

begin

for i:=0 to sgCode.RowCount-2 do

begin

if sgCode.Cells[0,i]='ldc'

then ldc(strtofloat(sgCode.Cells[1,i]));

if sgCode.Cells[0,i]='ldv'

then ldv(sgCode.Cells[1,i]);

if sgCode.Cells[0,i]='add'

then add;

end;

end;

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

8.3 Контрольные вопросы

1 В чем состоит задача генератора кода?

2 Из каких составных частей состоит машина?

3 В каком направлении по дереву разбора выполняется программа?

4 Каким образом влияет положение генератора кода в функции узла дерева? Пояснить на примере операции вычитания.

8.4 Задание

Реализовать транслятор, встроив генератор кода в синтаксический анализатор, построенный в лабораторной работе № 3.

Сложность при реализации может вызвать команда If. Для того, чтобы эта команда работала корректно необходимо ввести еще одну команду машины goto(номер строки). Эта команда должна перенести выполнение кода с текущей строки на строку, указанную в качестве параметра. Команда if должна иметь в качестве аргумента строку, на которую должно передаваться управление, в случае, если условие ложно. Часть кода, соответствующая истинному условию, должна заканчиваться командой goto, передающей управление на строку, следующую за кодом, обрабатывающим ложное условие.

8.5 Защита лабораторной работы

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

9 Лабораторная работа № 7 “Автоматизированное построение трансляторов с использованием генератора yacc”

9.1 Цель работы

Целью выполнения лабораторной работы является:

  • закрепление теоретических знаний в области атрибутных грамматик;

  • получение опыта работы со средствами автоматизированного построения трансляторов на примере генератора компиляторов Yacc.

9.2 Общие сведения

Одним из средств автоматизированного построения трансляторов является генератор компиляторов Yacc.

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

Этот генератор работает с атрибутными грамматиками. Атрибутные грамматики характеризуются тем, что с каждым грамматическим символом связывается множество атрибутов.

Атрибуты в атрибутных грамматиках могут быть двух видов: синтезируемые и наследуемые. Синтезируемые атрибуты вычисляют свои значения, используя только значения атрибутов потомков. Наследуемые атрибуты при вычислении значений используют значения атрибутов соседей и родителей.

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

Исходный текст для Yacc, основой которого являются продукции и семантические правила, пишется в текстовом редакторе, например в блокноте, и сохраняется в файле с расширением y. Работа программы yacc.exe, в качестве параметра которой выступает исходный файл с расширением y, строит транслятор. Yacc строит транслятор на основе кода, содержащегося в файле Yyparse.cod. Если исходный текст содержит ошибки, то при генерации транслятора будет создан файл ошибок с расширением lst.

Полученный в результате работы yacc модуль присоединяется к проекту Delphi, который содержит текст основной программы. Для корректной работы с этим проектом, он должен использовать библиотеку Yacclib.pas.

Транслятор строится Yacc в виде функции yyparse, которая вызывается из основной программы.

При генерации транслятора Yacc включает код лексического анализатора, построенного Lex. На рисунке 28 приведена схема взаимодействия модулей компилятора.

Рисунок 28 - Схема взаимодействия модулей компилятора.

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