Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект.doc
Скачиваний:
56
Добавлен:
27.01.2015
Размер:
105.98 Кб
Скачать

4. Методические указания.

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

Методически целесообразно всю работу разбить на несколько этапов: этап лексического анализа, этап синтаксического анализа и этап генерации машинного кода. Хотя все эти этапы могут быть соединены в одном.

Лексический анализ обычно затруднений не вызывает, поэтому мы остановимся на двух последних этапах.

Во время синтаксического анализа предложения исходной программы распознаются как языковые конструкции, описываемые используемой грамматикой, что соответствует построению дерева грамматического разбора. Методы грамматического разбора можно разбить на два больших класса - восходящие и нисходящие. Нисходящие методы методически проще и поэтому рекомендуются для курсового проекта. Нисходящие методы начинают с правила грамматики, определяющего конечную цель анализа с корня дерева грамматического разбора, и пытаются так его наращивать, чтобы последующие узлы дерева соответствовали синтаксису анализируемого предложения. В нисходящем методе, называемом рекурсивным спуском, процесс грамматического разбора состоит из отдельных процедур для каждого нетерминального символа, определённого в грамматике. Каждая такая процедура старается во входном потоке найти подстроку, начинающуюся с текущей лексемы, которая может быть интерпретирована как нетерминальный символ, связанный с данной процедурой. В процессе своей работы она может вызывать другие подобные процедуры или даже рекурсивно саму себя для поиска других нетерминальных символов. Если эта процедура находит соответствующий нетерминальный символ, то она заканчивает свою работу, передаёт в вызвавшую её программу признак успешного завершения и устанавливает указатель текущей лексемы на первую лексему после распознанной подстроки. Если же процедура не может найти подстроку, которая могла бы быть интерпретирована как требуемый нетерминальный символ, она заканчивается с признаком неудачи или же вызывает процедуру выдачи диагностического сообщения и процедуру восстановления. Дополнительно процедура должна решать вопрос, какую альтернативу попробовать в качестве следующей. Для метода рекурсивного спуска необходимо, чтобы соответствующую альтернативу можно было выбрать на основании анализа очередной входной лексемы. Поэтому в грамматике, в продукциях не должно быть левых рекурсий.

После того как синтаксис программы проанализирован, последним шагом процесса компиляции является генерация объектного кода. Для генерации необходим набор подпрограмм, соответствующих каждому правилу и каждой альтернативе в правилах грамматики. Как только в результате процесса грамматического разбора будет распознан фрагмент текста исходной программы, соответствующей некоторому правилу грамматики, вызывается подпрограмма, соответствующая этому правилу. Эти программы называют семантическими, поскольку выполняемые ими действия связаны со смыслом, который мы связываем с соответствующими конструкциями языка. Эти программы генерируют объектный код, поэтому их ещё называют программами генерации кода. Поскольку мы решаем учебную задачу, то для наших целей будет достаточно остановиться на генерации программы в промежуточном коде, так называемых четвёрках. Каждая четвёрка записывается в виде:

ОПЕРАЦИЯ, ОПЕР.1, ОПЕР.2, РЕЗУЛЬТАТ.

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

Операция СТОП не будет содержать адресной части. Операция БЕСУСЛОВНЫЙ ПЕРЕХОД не будет содержать ОПЕР.1 и ОПЕР.2, а в РЕЗУЛЬТАТЕ будет указана метка перехода. Для условных переходов в зависимости от значения переменной Х управление передаётся по метке ОПЕР.1, если Х<0, по метке ОПЕР.2, если X=0, по метке РЕЗУЛЬТАТ, если X>0.

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

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

5. Литература.

1.Бек Л. Введение в системное программирование. -М.: Мир, 1988.-448 с.

2. Компаниец Р.И., Маньков Е.В., Филатов Н.Е. Системное программиро-

вание. Основы построения трансляторов.-СПб.: КОРОНА принт, 2010.

-256 с.

3. Хантер Р. Проектирование и конструирование компиляторов. М.:

Финансы и статистика. 2012.

4. Хантер Р. Основные концепции компиляторов. – М.: Изд. дом

"Вильямс", 2013.- 256 с.