Реализация компилятора усеченного языка Pascal с использованием технологии автоматизации
Взаимосвязь стадий процесса проектирования сложных программных систем. Создание компилятора подмножества языка высокого уровня (Pascal) на язык Ассемблера. Структура входных и выходных данных, алгоритмы их обработки. Рабочая документация программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 27.07.2014 |
Размер файла | 256,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
Министерство высшего и профессионального образования
Ульяновский государственный технический университет
Кафедра “Вычислительная техника”
Дисциплина “Лингвистическое обеспечение САПР”
Пояснительная записка к курсовой работе
«Реализация компилятора усеченного языка Pascal с использованием технологии автоматизации»
Выполнила студентка группы
ИВТАПбд-31 Ткачева Е.А.
Проверил: Макаров П.С.
Ульяновск, 2014
- Аннотация
Настоящая курсовая работа выполнена как результат прослушивания курса лекций и выполнения лабораторных работ по дисциплине "Системное программное обеспечение". Целью ее является формирование представления о взаимосвязи различных стадий единого процесса проектирования сложных программных систем.
В задании предлагается создать компилятор подмножества языка высокого уровня (Pascal) на язык ассемблера.
Изучение объекта
Краткая теория
Компилятор - это программа, на вход которой поступает какой - нибудь текст, а на выходе - машинный код com или exe файл.
Объектный код - полуфабрикат. Объектный код - перемещаемый, в нем не разрешены внешние ссылки. Ссылки - переходы: внутренние и внешние.
Для преобразования исходного текста в объектный модуль нужно сделать анализ и синтез.
Цель анализа состоит в том, чтобы разобрать исходный текст на составляющие и понять смысл каждой конструкции. Есть три этапа анализа: лексический, синтаксический и семантический. С точки зрения структуры компилятора, синтаксический анализ главный.
Синтез состоит из подготовки, генерации команд и собственной генерации. Подготовка включает в себя выделение памяти, преобразования внутреннего представления. Генерация состоит в формировании машинных команд в выходных потоках компиляторов. Если вся эта работа выполняется за один раз, то компилятор называется однопроходным.
Основные термины и определения из области формальных языков
Язык - это некоторое подмножество строк и цепочек символов, образованных из элементов алфавита.
Цепочка символов - это некоторая линейная последовательность элементов некоторого конечного множества элементов, которое называется алфавитом. В цепочке выделяется голова и хвост.
Грамматика - это четверка, где V - некоторый алфавит, Т - подмножество V, которое называется алфавитом терминальных символов; Р - это набор правил специального вида, где U - элемент алфавита V, а u - элемент итерации алфавита V. G = {V,T,P,Z}. Z - начальный символ грамматики, который входит в алфавит V.
Сентенциальная форма грамматики - это множество цепочек, которые можно вывести с начального символа грамматики. Сентенциальная форма состоит только из терминальных символов, называется предложением грамматики.
Техническое задание
Ядром (основой) курсовой работы является - транслятор или компилятор.
При этом система должна быть построена с использованием технологии автоматизации.
В качестве языка программирования использовать усеченный Паскаль. Необходимо реализовать следующие возможности Паскаля:
1. Объявление глобальных переменных.
2. Тип всех переменных - целый.
3. Реализовать READ и WRITE либо как встроенные операции, либо как процедуры.
4. READ должна обеспечивать ввод целых переменных.
5. WRITE должна обеспечивать вывод значений выражений целого типа.
6. Выражения в языке должны записываться по правилам Паскаля.
Пример: b * b - 4 * a * c
7. Реализовать следующие инструкции:
a. Присвоение: i:= i + 1
b. Составной оператор: begin … end
c. Развилка: if … then … else …
d. Цикл с постусловием: repeat … until …
e. Цикл FOR
8. Текст программы должен представлять собой последовательность строк, состоящих из символов, образующих алфавит языка.
9. Алфавит языка состоит из следующих символов:
Латинские буквы;
Арабские цифры от 0 до 9;
Специальные символы:
+ - * / = > <:; () [ ] { } “,
10. Служебные слова языка
else
then
word
end
for
if
integer
begin
byte
char
do
define
writeinteger
writeword
writestring
wait
to
repeat
until
Лексический анализатор (сканер)
Лексический анализатор необходимо реализовать вручную - без использования специальных средств типа lex/flex/jlex, и функций типа scanf.
Лексический анализатор должен удалять из входной строки пробелы, и передавать синтаксическому анализатору (парсеру) лексемы по одной. Кроме всех других лексем он должен распознавать целые числа. Если в ходе лексического разбора была обнаружена ошибка, необходимо выдать внятное сообщение об ошибке с указанием места обнаружения ошибки в исходном тексте (номер строки и, желательно, номера столбца).
Синтаксический анализатор (парсер)
Синтаксический анализатор необходимо реализовать вручную - без использования специальных средств типа yacc/bison/cup. Его нужно реализовать как предиктивный синтаксический анализатор. На вход парсера поступают лексемы с выхода сканера, на выходе парсера получается промежуточный код. Если в ходе синтаксического разбора была обнаружена ошибка, необходимо выдать внятное сообщение об ошибке с указанием места обнаружения ошибки в исходном тексте (номер строки и, желательно, номера столбца).
Грамматика входного языка
<CompileProgram>::=<Vars><BeginEndStruct >
<Vars>::={Define <Имя переменной>: <Тип переменной>;}
<Имя переменной>::=<Буква> {<Буква> | <Цифра>}
<Буква>::=a | b | c |... | z | A | B | C | … | Z
<Цифра>::= 0 | 1 | 2 |... | 9
<Тип переменной>::=<Тип> | <Тип> [<цифра>]
<Тип>::=byte | word | integer | char
<BeginEndStruct>::=begin <CommandVerify> end.
<CommandVerify>::=<Имя переменной>=<ProcedureE> |
If <ProcedureE> <Знак> <ProcedureE> then <CommandVerify>
{else <CommandVerify>}|
For <Имя переменной>=<ProcedureE> do <CommandVerify> |
Repeat<CommandVerify>Until<ProcedureE> <Знак><ProcedureE>|
WriteInteger (<ProcedureE>) | WriteWord (<ProcedureE>) |
WriteString (“<Символ>”, Ln)
<ProcedureE>::=<ProcedureT>{ + | - <ProcedureT>}
<ProcedureT>::=<ProcedureF> {* | / <ProcedureF>}
<ProcedureF>::=(<ProcedureE>) | <Цифра> | <Имя переменной> | Wait |
<Имя переменной>[<Цифра>]
<Знак сравнения>::> | < | =
<Символ>::={<Буква>} | {<Цифра>} | {<Знак>}
Технический проект. Общие сведения
Проект состоит из 3х частей:
- Сервер автоматизации
- Клиент автоматизации
- Компилятор
Сервер автоматизации запускает компилятор, на вход которого подает исходный код программы, полученной от клиента.
После компиляции, получаем исполняемый файл в локальном каталоге, из которого была запущена программа.
Структура входных и выходных данных.
На вход компилятора подается исходный код программы, написанный на стороне клиента на языке, представляющим собой подмножество языка Pascal, грамматика которого описана в этой пояснительной записке.
На выходе компилятора получим исполняемый.com файл.
Алгоритмы обработки данных
Алгоритм работы компилятора:
1.Чтение компилируемого файла
2.Инициализация переменных
3.Компилирование
3.1.Чтение слова из массива
3.1.1.Читаем символ
3.1.2.Записываем в строку символ
3.1.3.Переход на 3.1.1, если не пробел или не комментарий.
3.2.Если “Define”
3.2.1.Проверка записи переменной
3.2.2.Записываем переменную в таблицу
3.3.Если “Begin”
3.3.1.Расспознавание блока
3.3.1.1.Если слово “WriteInteger”
3.3.1.1.1.Компилирование параметра
3.3.1.1.2.При ошибке вывод сообщения
3.3.1.1.3.Формирование кода
3.3.1.1.4.Переход на 3.3.2.
3.3.1.2.Если слово “WriteWord”
3.3.1.2.1.Компилирование параметра
3.3.1.2.2.При ошибке вывод сообщения
3.3.1.2.3.Формирование кода
3.3.1.2.4.Переход на 3.3.2.
3.3.1.3.Если слово “WriteString”
3.3.1.3.1.Компилирование параметра
3.3.1.3.2.При ошибке вывод сообщения
3.3.1.3.3.Формирование кода
3.3.1.3.4.Переход на 3.3.2.
3.3.1.4.Если слово “Begin”
3.3.1.4.1.Переход на 3.3.1.
3.3.1.4.2.Если не “End” или “Until” то на 3.3.1.4.
3.3.1.5.Если слово “If”
3.3.1.5.1.Компилирование параметров
3.3.1.5.1.1.Компилирование выражений
3.3.1.5.1.2.При ошибке вывод сообщения
3.3.1.5.2.Переход на 3.3.1.
3.3.1.5.3.Проверка слова “Else”
3.3.1.5.3.1.Переход на 3.3.1.
3.3.1.6.Если слово “Repeat”
3.3.1.6.1.Формирование кода
3.3.1.6.2.Переход на 3.3.1
3.3.1.6.3.Проверка на слово “Until”
3.3.1.6.4.Компилирование параметров
3.3.1.6.4.1.Компилирование выражений
3.3.1.6.4.2.При ошибке вывод сообщения
3.3.1.7.Если слово “For”
3.3.1.7.1.Компилирование параметров
3.3.1.7.1.1.Компилирование выражений
3.3.1.7.1.2.При ошибке вывод сообщения
3.3.1.7.2.Формирование кода
3.3.1.7.3.Переход на 3.3.1.
3.3.1.8.Иначе
3.3.1.8.1.Проверка математических выражений
3.3.1.8.2.При ошибке вывод сообщения
3.3.1.8.3.Компилирование выражений
3.3.1.8.4.Если не математ. выраж. то ошибка
3.3.2.Если не “End” то переход на 3.3.1.
3.4.Если “End.”
4.Запись полученного кода в файл
Алгоритм работы сервера автоматизации
1. Получение исходного кода программы от клиента
2. Создание временного файла с исходным кодом, полученным от клиента
3. Создание.bat файла для запуска компилятора
4. Получение сообщений о процессе компиляции
5. Удаление временных файлов
6. Уведомление клиента о результатах компиляции
Рабочая документация
Описание исходных модулей.
Interface.cs - файл исходного кода, описывающего интерфейс COM-объекта сервера.
MyServer.cs - исходный код, реализующий интерфейс IServer из Interface.cs и выполняющий компиляцию исходного кода программ.
MyClientCOM - проект, реализующий клиента автоматизации, который подключается к серверу, отправляет ему исходный код программы и получает сообщения о результате компиляции от сервера.
Компилятор написан на языке Pascal.
Описание исходного кода компилятора
1.Процедура инициализации - Initialization;
Инициализирует переменные и создает имя выходного файла
2.Процедура ошибки - WriteError;
Выводит на экран ошибку с информацией
3.Процедура создания кода - PutInFile1;
Запись байт-кода команды в выходную строку кода
4.Процедура создания кода - PutInFile2;
Запись байт-кода команды в выходную строку кода
5.Процедура создания кода - PutInFile3;
Запись байт-кода команды в выходную строку кода
6.Процедура создания кода - PutInFile4;
Запись байт-кода команды в выходную строку кода
7.Процедура записи в стек - PushInStack;
Запись слова в стек
8.Функция извлечения из стека - PopInStac;
Извлечение слова из стека
9.Функция слово - NextWord;
Вырезает слово из программы
10.Функция проверки - VariableInBasa;
Проверка переменной в таблице
11.Процедура кода - WriteCode;
Печать числа на экран
12.Процедура кода - ReadCode;
Ввод значения
13.Процедура компилирования - ProcedureE;
Компилирование выражения
14.Процедура компилирования - ProcedureT;
Компилирование выражения
15.Процедура компилирования - ProcedureF;
Компилирование выражения
16.Процедура кода - CompareCodeVerify;
Формирование кода сравнения
17.Процедура компилирования - CompileProgram;
Компилировнание начального кода и заполнение таблиц
18.Процедура проверки - BeginStruct;
Проверка переменных втаблице
19.Процедура цикла - BeginEndStruct;
Компилирует структуру Begin End.
20.Процедура распознавания - CommandVerify;
Распознавание комманд и создание кода
Предварительные испытания
Исходный код программ, которые использовались для тестирования компилятора:
SORT.PRG - сортировка массива.
{Пример программы сортировки массива по возрастанию}
define Matr:word[10];
define i:integer;
define tmp:word;
define flag:word;
Begin
WriteString("Input array"Ln)
For i=1 to 10 do {Ввод матрицы}
Begin
WriteString("Matr[") WriteWord(i) WriteString("]=")
Matr[i]=Wait WriteString(""Ln)
End
repeat
flag=1 {Начальное значение флага}
for i=1 to 9 do
Begin
if matr[i]>matr[i+1] then {Способ сортировки}
begin
tmp=matr[i] {Обмен данными соседних элементов}
matr[i]=matr[i+1]
matr[i+1]=tmp
flag=0 {Установка флага обмена}
end
End
until flag=1 {Делать пока есть перестановки}
WriteString(""Ln) {Пустая строка}
WriteString("Отсортированный массив"Ln)
For i=1 to 10 do {Печать матрицы}
Begin
WriteString("Matr[") WriteWord(i) WriteString("]=")
WriteWord(Matr[i]) WriteString(""Ln)
End
End.
Demo.PRG - ввод массива и присваивание значения = 10 тем элементам, которые превышают это значение
define i:integer;
define j:integer;
define tmp:byte;
define Massiv:byte[5];
begin
for i=1 to 5 do
begin
writestring("Введите М[")
writeinteger(i)
writeString("]")
Massiv[i]=wait
writestring(""Ln)
end
i=1
repeat
if Massiv[i]>10 then
begin
Massiv[i]=10
end
i=i+1
until i>5
for i=1 to 5 do
begin
writestring("М[")
writeword(i)
writestring("]")
writeword(Massiv[i])
writestring(""Ln)
end
end.
Документация для пользователя
Для работы компилятора необходимо запустить Сервер и Клиент.
Сервер:
Данная форма отвечает за вывод сообщений о компиляции.
компилятор pascal ассемблер
Клиент:
Данная форма предназначена для написания кода на усеченном языке Pascal, и компиляции этого кода на сервере.
Поле 1 предназначено для написания кода программы, поле 2 задает имя выходного файла, в поле 3 выводятся сообщения о результате компиляции, полученные с сервера.
Кнопка «Compile» - отправляет исходный код на сервер, где он компилируется в исполняемый файл.
Исполняемый файл будет находиться в директории, в которую был установлен компилятор.
Исходные коды программ пишутся на усеченном языке Pascal, грамматика которого описана выше в этой записке.
Заключение
В ходе работы над курсовым проектом были закреплены знания, полученные в рамках дисциплины «Системное программное обеспечение». Так же были получены практические навыки работы по построению компиляторов и созданию и взаимодействию с COM-объектами с использованием COM технологии.
Список литературы
1. Юров В.И. Ассемблер.
2. Системное программное обеспечение: Учебник для вузов /А. Ю. Молчанов -- СПб.: Питер, 2003 -- 396 с.
3. Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение - СПб.: Питер, 2001 (2002) - 736 с.
4. Ахо А., Сети Р., Ульман Дж. Компиляторы: принципы, технологии и инструменты: Пер. с англ. -- М.: Издательский дом «Вильямс», 2003 -- 768 с.
5. Молчанов А.Ю. Системное программное обеспечение. Лабораторный практикум. - СПб.: Питер, 2005 - 284 с
6. Робин Хантер Основные концепции компиляторов - М.: Издательский дом «Вильямс», 2002 - 256 с.
Размещено на Allbest.ru
Подобные документы
Программный комплекс для разработки программы транслирующей программу с языка Pascal на язык С++. Построение логической и арифметической модели решения. Разработка компилятора для программы. Методы отладки программы и создание для нее документации.
курсовая работа [742,6 K], добавлен 03.07.2011Построение компилятора с языка высокого уровня как одного из элементов системы программирования. Разработка компилятора ассемблера, модификация базы данных исходного макета. Загрузчик, эмулятор, отладчик. Использование Flex и Bison для программирования.
курсовая работа [599,0 K], добавлен 04.11.2014Структура, классификация и требования к реализации компилятора. Проектирование и реализация анализирующей части компилятора языка С++. Способы реализации лексического анализа. Алгоритм работы синтаксического анализатора. Принципы программной реализации.
курсовая работа [774,2 K], добавлен 26.01.2013Принцип работы транслятора. Исследование формата данных объектного файла шестнадцатиразрядной системы DOS для последующего преобразования его в файл программы. Используемые директивы и команды ассемблера. Алгоритмы программы и таблицы компилятора.
контрольная работа [35,9 K], добавлен 07.07.2012История создания и развитие Pascal. Особенности пакета программирования Turbo. его возможности редактора текстов, компилятора и отладчика. Построения программы на языке Turbo Pascal, ее структура, типы алгоритмов, одномерные и многомерные массивы.
курсовая работа [519,3 K], добавлен 25.06.2011Оптимизация с использованием языка низкого уровня ассемблера. Его связь с языками высокого уровня. Отдельно компилируемые модули. Разработка программных модулей на ассемблере с использованием компиляторов TASM5.0 фирмы Borlandи MASM6.14 фирмы Microsoft.
курсовая работа [405,5 K], добавлен 18.05.2014Особенности разработки программ на языке Turbo Pascal на примере программы обработки массива данных с построением диаграммы. Функции программы и основные требования к ней. Состав входных и выходных данных. Использование предметной области "Садовод".
курсовая работа [789,1 K], добавлен 13.03.2013Характеристика используемой операционной системы, языка программирования. Структура программы на языке Turbo Pascal 7.1. Операторы языка Turbo Pascal. Проведение сортировки записей. Алгоритмы программы и подпрограмм. Причины возникновения ошибок.
курсовая работа [454,1 K], добавлен 13.06.2014История языка Pascal, его основные концепции. Линейный и циклический алгоритмы, типы данных. Условные операторы, операторы цикла. Программа вычисления суммы n первых членов геометрической прогрессии по любым двум ее членам, номера которых известны.
отчет по практике [421,8 K], добавлен 07.06.2010Free Pascal как свободная реализация языка Паскаль, совместимая с Borland Pascal и Object Pascal - Delphi, но при этом обладающая и некоторыми дополнительными возможностями. Основы алгоритмизации и программирования, создание визуальных приложений.
учебное пособие [4,2 M], добавлен 13.12.2011