
- •Цель лабораторных работ:
- •Лабораторная работа № 1 разработка грамматики заданного языка.
- •Краткие теоретические сведения
- •Формы записи грамматики
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Лабораторная работа № 2 работа с таблицей символов Проектирование лексического анализатора
- •Краткие теоретические сведения
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Лабораторная работа № 3 Синтаксический и семантический анализ. Построение простейшего дерева вывода
- •Краткие теоретические сведения
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Лабораторная работа № 4 Генерация и оптимизация объектного кода
- •Краткие теоретические сведения
- •1 Алгоритм генерации объектного кода по дереву вывода
- •Построение ассемблерного кода по дереву вывода
- •Построение списка триад по дереву вывода.
- •Оптимизация объектного кода методом свертки
- •Оптимизация объектного кода методом исключения лишних операций
- •Общий алгоритм генерации и оптимизации объектного кода
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
Порядок выполнения работы
Получить вариант задания у преподавателя.
Изучить алгоритм генерации объектного кода по дереву синтаксического разбора.
Разработать фрагменты объектного кода, реализующие на языке ассемблера простейшие операции в заданной грамматике.
Выполнить генерацию объектного кода вручную для выбранного простейшего примера. Проверить корректность результата.
Изучить алгоритмы оптимизации результирующего кода методом свертки и методом исключения лишних операций.
Подготовить и защитить отчет.
Написать и отладить программу на ЭВМ.
Сдать работающую программу преподавателю.
Требования к оформлению отчета
Отчет должен содержать следующие разделы:
Задание по лабораторной работе.
Краткое изложение цели работы.
Запись заданной грамматики входного языка в форме Бэкуса-Наура.
Фрагменты объектного кода на языке ассемблера для операций заданной грамматики.
Простейший пример генерации кода по дереву синтаксического разбора.
Текст программы (оформляется после выполнения программы на ЭВМ).
Основные контрольные вопросы
Что такое транслятор, компилятор и интерпретатор ? Расскажите об общей структуре компилятора.
Как строится дерево вывода (синтаксического разбора) ? Какие исходные данные необходимы для его построения ?
Объясните работу алгоритма генерации объектного кода по дереву синтаксического разбора.
За счет чего обеспечивается возможность генерации кода на разных объектных языках по одному и тому же дереву ?
Какую роль выполняет генерация объектного кода в процессе компиляции ?
Какие данные необходимы компилятору для генерации объектного кода ? Какие действия выполняет компилятор перед генерацией ?
Дайте определение понятию оптимизации программы. Для чего используется оптимизация ?
Какие существуют методы оптимизации объектного кода ?
Что такое триады и для чего они используются ? Какие еще существуют методы для представления объектных команд ?
Объясните работу алгоритма свертки.
Что такое лишняя операция ? Что такое “число зависимости” ?
Объясните работу алгоритма исключения лишних операций.
Варианты заданий
Для всех вариантов задаётся общая часть в которую входит следующее. Ключевые слова, обозначающие начало и конец программы, описание типа, ввод и вывод, присваивание, true, false.
Разделители : +, -, _, (, ), =, <, >, ,; ,”, “, ‘,’ и пробел.
Идентификаторы должны начинаться с буквы, не включать в себя разделители, количество позиций не должно превышать 14.
x, y, z – условные обозначения переменных. Разрешается заменять их другими идентификаторами. Все начальные присвоения дописать, если необходимо.
Текст программы должен допускать использование комментариев. Вариант задания выбирается по согласованию с преподавателем. Язык реализации студент выбирает самостоятельно.
Контекстные условия:
1. Любое имя, используемое в программе, должно быть описано и только
один раз.
2. В операторе присваивания типы переменной и выражения должны
совпадать.
3. В условном операторе и в операторе цикла в качестве условия возможно
только логическое выражение.
4. Операнды операции отношения должны быть целочисленными.
5. Тип выражения и совместимость типов операндов в выражении
определяются по обычным правилам; старшинство операций задано синтаксисом.
В любом месте программы, кроме идентификаторов, служебных слов и чисел,
может находиться произвольное число пробелов и комментариев вида {< любые
символы, кроме } и ⊥(символ конца текста исходной программы)>}
True, false, read и write - служебные слова (их нельзя переопределять, как
стандартные идентификаторы Паскаля).
Сохраняется паскалевское правило о разделителях между идентификаторами,
числами и служебными словами.
1) PROGRAMM;
integer x;
bool y;
integer z;
x=3;
y=true;
z=(x+2) – (x+convert(y,’integer’));
FUNC convert(bool y, integer s);
ENDF;
END;
2) PROGRAMM;
float x;
integer y;
integer z;
x=3.25;
y=5;
z=(3+2) – (y+convert(x,’integer’));
FUNC convert(float y, integer s);
ENDF;
END;
3) PROGRAMM;
integer x;
string y;
string z;
x=3;
y=”www;
z=y + (“abc”+convert(x,’string’));
FUNC convert(integer y, string s);
ENDF;
END;
4) PROGRAMM;
bool x;
string y;
string z;
x=true;
y=”www;
z=y + (“abc”+convert(x,’string’));
FUNC convert(bool y, string s);
ENDF;
END;
5) PROGRAMM;
integer x;
string y;
integer z;
x=5;
y=”www;
z=x + (5+length(y) - x;
FUNC length(integer s);
ENDF;
END;
6) PROGRAMM;
integer x;
string z;
for x=5 by 1 to 10
z=z+convert (x,’string’);
endfor;
FUNC convert(integer y, string s);
ENDF;
END;
7) PROGRAMM;
integer x;
integer z;
for x=5 by 1 to 10
z=z+x;
endfor;
END;
8) PROGRAMM;
integer x;
integer z;
string y;
y=”www”;
for x=5 by 1 to 10
z= 5+length(y) - x;
endfor;
FUNC length(integer s);
ENDF;
END;
9) PROGRAMM;
integer x;
integer z;
bool y;
y=true;
for x=5 by 1 to 10
z=z+x+convert (y,’integer’);
endfor;
FUNC convert(bool y, string s);
ENDF;
END;
10) PROGRAMM;
integer x;
string z;
bool y;
if x=5 then y=true else y=false endif;
z=”www”+convert(z,’string’) + “5”;
FUNC convert(bool y, string s);
ENDF;
END;
11) PROGRAMM;
integer x;
bool y;
integer z;
if x=5 then y=true else y=false endif;
z=convert(y,’integer’) + 5;
END;
12) PROGRAMM;
integer x;
bool y;
string z;
z=”www”;
if x=5 then y=(length(z) > 5); else y=(length(z)<5) endif;
FUNC length(string s);
ENDF;
END;
13) PROGRAMM;
integer x;
bool y;
string z;
z=”www”;
y=true;
if x=5 then z= convert (y,string); else z=z+ convert (y,string); endif;
FUNC convert(bool y, string s);
ENDF;
END;
14) PROGRAMM;
integer x;
bool y;
string z;
z=”www”;
y=true;
if x=5 then z= convert (y,string); else z=z+ convert (y,string); endif;
FUNC convert(bool y, string s);
ENDF;
END;
15) PROGRAMM;
integer x;
integer z;
string z;
z=’5’;
while length(z)<=5;
z=z+convert (x,’string’);
endwhile;
FUNC convert(integer y, string s);
ENDF;
FUNC length(string s);
ENDF;
END;
16) PROGRAMM;
integer x;
integer z;
x=1;
z=x;
while x<z;
z=z+x;
endwhile;
END;
17) PROGRAMM;
integer x;
integer z;
string y;
y=”www”;
x=1;
z=x;
while z<15;
z= z+5+length(y) - x;
endwhile;
FUNC length(string s);
ENDF;
END;
18) PROGRAMM;
integer x;
integer z;
bool y;
y=true;
x=1;
z=x;
while z<10;
z=z+x+convert (y,’integer’);
endwhile;
FUNC convert(bool y, string s);
ENDF;
END;
19) PROGRAMM;
integer x;
integer z;
bool y;
y=true;
x=1;
z=x;
while z<10;
z=z+x+length(convert (y,’string’));
endwhile;
FUNC convert(string y, string s);
ENDF;
FUNC length (string s);
ENDF;
END;