Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_раб_1_4.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
622.08 Кб
Скачать

Порядок выполнения работы

  1. Получить вариант задания у преподавателя.

  2. Изучить алгоритм генерации объектного кода по дереву синтаксического разбора.

  3. Разработать фрагменты объектного кода, реализующие на языке ассемблера простейшие операции в заданной грамматике.

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

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

  6. Подготовить и защитить отчет.

  7. Написать и отладить программу на ЭВМ.

  8. Сдать работающую программу преподавателю.

Требования к оформлению отчета

Отчет должен содержать следующие разделы:

  • Задание по лабораторной работе.

  • Краткое изложение цели работы.

  • Запись заданной грамматики входного языка в форме Бэкуса-Наура.

  • Фрагменты объектного кода на языке ассемблера для операций заданной грамматики.

  • Простейший пример генерации кода по дереву синтаксического разбора.

  • Текст программы (оформляется после выполнения программы на ЭВМ).

Основные контрольные вопросы

  1. Что такое транслятор, компилятор и интерпретатор ? Расскажите об общей структуре компилятора.

  2. Как строится дерево вывода (синтаксического разбора) ? Какие исходные данные необходимы для его построения ?

  3. Объясните работу алгоритма генерации объектного кода по дереву синтаксического разбора.

  4. За счет чего обеспечивается возможность генерации кода на разных объектных языках по одному и тому же дереву ?

  5. Какую роль выполняет генерация объектного кода в процессе компиляции ?

  6. Какие данные необходимы компилятору для генерации объектного кода ? Какие действия выполняет компилятор перед генерацией ?

  7. Дайте определение понятию оптимизации программы. Для чего используется оптимизация ?

  8. Какие существуют методы оптимизации объектного кода ?

  9. Что такое триады и для чего они используются ? Какие еще существуют методы для представления объектных команд ?

  10. Объясните работу алгоритма свертки.

  11. Что такое лишняя операция ? Что такое “число зависимости” ?

  12. Объясните работу алгоритма исключения лишних операций.

Варианты заданий

Для всех вариантов задаётся общая часть в которую входит следующее. Ключевые слова, обозначающие начало и конец программы, описание типа, ввод и вывод, присваивание, 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;