Автор работы: Пользователь скрыл имя, 28 Февраля 2013 в 14:05, курсовая работа
В данном курсовом проекте разрабатывается модуль транслятора. Транслятор это обрабатывающая программа, предназначенная для преобразования исходной программы в объектный модуль. Транслятор обычно выполняет также диагностику ошибок и формирует словари идентификаторов.
По способу обработки входных данных трансляторы разделяются на компиляторы и интерпретаторы.
В рамках данной курсовой работы модуль транслятора состоит из блока лексического, синтаксического и семантического анализатора, блока интерпретации и построения кода на языке Ассемблер.
Введение 3
1 Постановка задачи 4
2 Разработка метода решения 5
2.1 Лексический анализатор 5
2.2 Синтаксический анализатор 5
2.3 Семантический анализатор 6
2.4 Таблица символов 7
2.5 Генератор кода 8
3 Описание программы 9
3.1 Назначение программы 9
3.2 Требования к программному и техническому обеспечению 9
3.3 Используемые переменные и спецификация методов 9
4 Руководство оператора 11
5 Программа и методика испытаний 12
Заключение 15
Библиографический список 16
Министерство образования и науки Украины
Севастопольский национальный технический Университет
Кафедра КиВТ
Пояснительная записка
к курсовому проекту
«Разработка, отладка и тестирование транслятора для учебного языка высокого уровня»
по дисциплине
«Системное программное
Выполнили: студенты гр. М-32д
Исаев Виталий
Проверила: доцент Шаталова Ю.Г.
Севастополь 2011
Содержание
Введение 3
1 Постановка задачи 4
2 Разработка метода решения 5
2.1 Лексический анализатор 5
2.2 Синтаксический анализатор 5
2.3 Семантический анализатор 6
2.4 Таблица символов 7
2.5 Генератор кода 8
3 Описание программы 9
3.1 Назначение программы 9
3.2 Требования к программному и техническому обеспечению 9
3.3 Используемые переменные и спецификация методов 9
4 Руководство оператора 11
5 Программа и методика испытаний 12
Заключение 15
Библиографический список 16
Приложение 17
Введение
В данном курсовом проекте разрабатывается модуль транслятора. Транслятор это обрабатывающая программа, предназначенная для преобразования исходной программы в объектный модуль. Транслятор обычно выполняет также диагностику ошибок и формирует словари идентификаторов.
По способу обработки входных данных трансляторы разделяются на компиляторы и интерпретаторы.
В рамках данной курсовой работы модуль транслятора состоит из блока лексического, синтаксического и семантического анализатора, блока интерпретации и построения кода на языке Ассемблер.
Разработать программу транслятора языка PL0 c заданной грамматикой. При реализации синтаксического анализатора использовать алгоритм разбора рекурсивный спуск.
Исходными данными является программа на языке PL0.
Также необходимо предусмотреть пользовательский интерфейс, с помощью которого осуществляется мониторинг текущих результатов выполнения программы.
Грамматика языка PL0
<программа>::=<блок>.
<блок>::=<декларация констант><декларация переменных><декларация процедур>
<декларация констант>::=CONST<
<декларация переменных>::=VAR<
<декларация процедур>::=<
<список описаний процедур>::=<
<список определений констант>:
<определение константы>::=<имя константы>=<число>
<список переменных>::=<список
переменных>,<переменная>|<
<переменная>::=<идентификатор>
<список описаний процедур>::=
<оператор>::=<переменная>:=<
CALL<имя процедуры>|
BEGIN<список операторов>END|
IF<условие>THEN<оператор>|
WHILE<условие>DO<оператор>|$
<имя процедуры>::=<
<список операторов>::=<список
операторов>;<оператор>|<
<условие>::=<выражение>|<
<выражение><><выражение>
<выражение><<<выражение>
<выражение>>><выражение>
<выражение>>=<выражение>
<выражение><=<выраа%ние>
<выражение>::=<терм>
0терм>::=<слагаемое>|<терм>+<
<слагаемое>::=<множитель>|<
<слагаемое>/<множитель>
<множитель>::=<переменная>|<
<идентификатор>::=<буква>|<
<идентификатор><цифра>
<число>::=<натуральное число>|+<натуральное число>|
-<натуральное число>
<натуральное число>::=<цифра>|
<буква>::=A|B|C|D|E|F|G|N|I|J|
<цифра>::=0|1|2|3|4|5|6|7|8|9
2 Разработка метода решения
2.1 Лексический анализатор
Лексический анализатор (или сканер) - это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передается для дальнейшей обработки компилятором на этапе синтаксического анализа и разбора.
Таблица типов лексем:
while |
ttWHILE |
= |
ttDEFINE |
<< |
ttLESS |
do |
ttDO |
:= |
ttASSIGN |
<= |
ttLEQU |
begin |
ttBEGIN |
+ |
ttPLUS |
>= |
ttGEQU |
end |
ttEND |
- |
ttMINUS |
<> |
ttNEQU |
const |
ttCONST |
* |
ttMUL |
. |
ttDOT |
var |
ttVAR |
/ |
ttDIV |
( |
ttLBRACKET |
call |
ttCALL |
== |
ttEQUAL |
) |
ttRBRACKET |
procedure |
ttPROCEDURE |
>> |
ttGREATER |
, |
ttCOMMA |
ttPRINT |
? |
ttUNKNOW |
; |
ttSEMICOLON | |
<eof> |
ttEOF |
число |
ttNUMBER |
идент |
ttIDENT |
Входные данные – имя файла с листингов PL0.
Выходные данные – таблица лексем. Следует отметить, что она строится не сразу, а постепенно.
Обнаруживаемые ошибки:
Неизвестная лексема
2.2 Синтаксический анализатор
По иерархии грамматик Хомского выделяют 4 основные группы языков (и описывающих их грамматик). При этом наибольший интерес представляют регулярные и контексно-свободные (КС) грамматики и языки. Они используются при описании синтаксиса языков программирования. С помощью регулярных грамматик можно описать лексемы языка - идентификаторы, константы, служебные слова и прочие. На основе КС-грамматик строятся более крупные синтаксические конструкции - описания типов и переменных, арифметические и логические выражения, управляющие операторы, и, наконец, полностью вся программа на исходном языке.
Входные цепочки регулярных языков распознаются с помощью конечных автоматов (КА). Они лежат в основе сканеров, выполняющих лексический анализ и выделение слов в тексте программы на входном языке. Результатом работы сканера является преобразование исходной программы в список или таблицу лексем. Дальнейшую ее обработку выполняет другая часть компилятора - синтаксический анализатор. Его работа основана на использовании правил КС-грамматики, описывающих конструкции исходного языка.
Входные данные – лексический анализатор
Выходные данные – синтаксическое дерево
2.3 Семантический анализатор
Фаза контроля типов решает проверяет, удовлетворяет ли программа контекстным условиям. Главной составляющей контекстных условия является "правильное использование" программой типов данных, предоставляемых входным языком, т.е. корректность выражений, встречающихся в программе, с точки зрения использования типов. Данная задача включает нахождение объявления в программе каждого используемого идентификатора, и проверку корректности его появления в использующем контексте.
Входные данные – синтаксическое дерево
Выходные данные – список сообщений
Обнаруживаемые ошибки:
Идентификатор уже объявлен
Неизвестная процедура
Неизвестная переменная
Деление на ноль
Переменная не инициализирована
Подсказки:
Идентификатор не используется
2.4 Таблица символов
В процессе работы компилятор хранит информацию об объектах программы в специальных таблицах символов. Как правило, информация о каждом объекте состоит из двух основных элементов: имени объекта и описания объекта. Информация об объектах программы должна быть организована таким образом, чтобы поиск ее был по возможности быстрее, а требуемая память по возможности меньше.
Кроме того, со стороны языка программирования
могут быть дополнительные требования
к организации информации. Имена
могут иметь определенную область
видимости. Например, поле записи должно
быть уникально в пределах структуры
(или уровня структуры), но может
совпадать с именем объекта вне
записи (или другого уровня записи).
В то же время имя поля может
открываться оператором присоединения,
и тогда может возникнуть конфликт
имен (или неоднозначность в
Реализована на основе хеш-таблицы.
Структура символа:
2.5 Генератор кода
Генерация
объектного кода - это перевод компилятором
внутреннего представления
Генерация объектного кода выполняется после того, как выполнен синтаксический анализ программы и все необходимые действия по подготовке к генерации кода: распределено адресное пространство под функции и переменные, проверено соответствие имен и типов переменных, констант и функций в синтаксических конструкциях исходной программы и т.д.
Входные данные – синтаксическое дерево
Выходные данные – объектный код
3 Описание программы
Данная программа представляет собой модель транслятора и иллюстрирует работу его основных блоков.
Для функционирования программы необходимо:
Лексический анализатор.
Реализован классом «Lexer». Возвращает следующую лексему
Public Token nextToken();
Синтаксический анализатор.
Реализован классом «Parser». Строит абстрактное синтаксическое дерево.
Семантический анализатор.
Реализован одним классом «SemanticCheck». Выполняет семантический анализ.
Public void visit(DivedeOpNode divideOpNode);
DivideOpNode – оператор деления
Интерпретатор.
Реализован классом «PL0». Интерпретирует синтаксическое дерево.
public void run();
Генератор кода.
Реализован классом «CodeGenerator». Генерирует код по синтаксическому дереву
public CodeGenerator(List<String> listing);
List<String> listing – список команд
Node – реализация абстрактного синтаксического дерева
SyntaxVisitor – реализация абстрактного синтаксического дерева. Реализован с помощью шаблона проектирования – “Посетитель” для удобного обхода всех ветвей дерева.
PeekReader - реализация буферного читателя потока символов
Следует отметить, что в программе был реализован необходимый уровень абстракции для разделения компилятора и интерфейса программы. Такой подход делает их полностью независимыми.
4 Руководство оператора
Пользовательский интерфейс
Назначение панелей управления:
С помощью меню “Файл” можно открыть, сохранить листинг исходной программы.
В меню “Проект” скомпилировать или настроить проект.
Также, основные функции вынесены на главную панель.
5 Программа и методика испытаний
Пример №1 Лексическая ошибка
Специально введем лексическую ошибку
Ошибка обнаружена.
Пример №2 Синтаксическая ошибка
Пример №3 Семантические ошибки
Ошибки обнаружены.
Пример №4 Числа Фибоначчи
Попробуем
вывести несколько чисел
Программа отработала корректно.
Пример №5
Вычисление факториала