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

- 46 -

Цель лабораторных работ: 1

Лабораторная работа № 1 РАЗРАБОТКА ГРАММАТИКИ ЗАДАННОГО ЯЗЫКА. 3

Краткие теоретические сведения 4

Формы записи грамматики 6

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

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

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

Лабораторная работа № 2 РАБОТА с таблицей символов Проектирование лексического анализатора 9

Краткие теоретические сведения 9

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

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

Лабораторная работа № 3 Синтаксический и семантический анализ. Построение простейшего дерева вывода 19

Краткие теоретические сведения 19

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

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

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

Лабораторная работа № 4 Генерация и оптимизация объектного кода 27

Краткие теоретические сведения 27

1 Алгоритм генерации объектного кода по дереву вывода 28

Построение ассемблерного кода по дереву вывода 29

Построение списка триад по дереву вывода. 31

Оптимизация объектного кода методом свертки 33

Оптимизация объектного кода методом исключения лишних операций 34

Общий алгоритм генерации и оптимизации объектного кода 35

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

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

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

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

Рекомендуемая литература 45

Цель лабораторных работ:

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

О пределения и логические связи языковых процессоров.

Языковым процессором — называется программа по обработке данных, представленных во входном формате на одном из языков. Программа выполняет роль перекодировки входного формата в некоторый выходной набор данных. Такие программы разрабатываются на основе синтаксически ориентированных методов и в зависимости от входного и выходного формата данных подразделяются на следующие четыре типа:

• Компиляторы

• Интерпретаторы

• Ассемблеры

• Препроцессоры.

Компилятор — это такой языковый процессор, в котором входной формат данных — язык высокого уровня, а выходной формат — объектный код. Иначе говоря, это программа, осуществляющая перевод с языка высокого уровня на язык более низкого уровня, машинный или близкий к машинному.

Язык, на котором написана исходная программа, которая поступает на вход компилятору, называется исходным языком.

рис 1.1

Язык, на котором написан сам компилятор, называется языком реализации.

Язык, на который переводится исходная программа компилятором, называется целевым языком. Программа на целевом языке называется объектным кодом.

На рис. 1.1 приведены логические связи компиляторов. Сплошными стрелками показана передача управления, пунктирными – информационные связи. рис 1.1 Логические связи компилятора

Охарактеризуем каждый блок в отдельности и при этом определим сопутствующие понятия:

1. Исходный текст или программа поступает в компилятор на некотором входном языке первоначально в сканер, или лексический анализатор (блок 1), который выполняет декомпозицию текста на токены(лексемы) или просто символы. При этом сканер строит таблицу внутренних представлений идентификаторов и присваивает каждой лексеме определённый внутренний код. Таким образом, на выходе имеем программу на некотором внутреннем языке, где каждый токен заменен на соответствующий ему внутренний код.

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

Литера(литерал)— неделимая информационная единица, из которых набирается текст программы, в простом информационном понятии нформационное терминальное поле на клавиатуре компьютера или компьютерный алфавит ASCII и EBCDIC. Иначе говоря, это знаковые клавиши на клавиатуре терминала , исключая служебные и функциональные. Токены (лексемы) могут состоять из одной или более литер, более строгое математическое понятие этой категории будет приведено ниже.

Выход сканера — программа на определённом внутреннем коде. Так, ключевые слова в языке Си имеют один внутренний код, разделители - другой, числовые константы - третий и так далее. Сканер анализирует лишь алфавит грамматики языка.

2.Синтаксис — синтаксический анализатор проводит анализ на соответствие программы на входном языке грамматическим правилам этого языка и совместно с процессором синтаксических ошибок занимается обработкой несоответствия синтаксиса грамматики, нейтрализацией этих мест в программе и сообщением пользователю на терминал об этих ошибках. Иногда блоки 1 и 2 в компиляторах совмещены, в этом случае синтаксический анализатор обращается к сканеру, как к функции, за очередной лексемой.

3.Семантика — семантический анализатор предполагает смысловую обработку, т.е. из семантически правильных конструкций генерирует программу на промежуточном коде, который может быть представлен в виде триад, тетрад, ПОЛИЗ и др. Промежуточный код служит для упрощения генерации кода на целевом языке и называется обычно промежуточным представлением программы. Как правило, интерпретатор на третьем блоке заканчивает свою работу.

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

5.Генератор кода — обрабатывает промежуточный код в набор объектных кодов, то есть переводит программный сегмент в объектный код. При необходимости в процессе генерации программы на целевой язык выполняется машинно-зависимая оптимизация.

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

---------------- про цикл _ картинка

----------------

Ассемблер. Входной формат — команды ассемблера, близкие к кодам машины. А выходной формат - исполнительный код или машинные команды для загрузчика.