Разработка Компилятора

Автор: Пользователь скрыл имя, 21 Марта 2013 в 22:48, курсовая работа

Описание работы

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

Содержание

Введение 2
1 Постановка задачи 3
1.1 Задание на проектирование 3
1.2 Входные данные 3
1.3 Выходные данные 3
2 Аналитическая часть 4
2.1 Анализ поставленной задачи 4
2.2 Описание используемой грамматики 5
2.3 Блок-схема алгоритма 6
3 Проектная часть 10
3.1 Общие сведения 10
3.2 Описание классов 10
3.3 Описание логической структуры 11
3.4 Входные данные 12
3.5 Выходные данные 12
4 Контрольные примеры 13
Заключение 16
Список использованной литературы 17
Приложение 1 18
Приложение 2 20
Приложение 3 26
Приложение 4 28

Работа содержит 1 файл

Курсовик_ТЯП_.DOC

— 661.50 Кб (Скачать)

Введение

 

Предмет “Теория языков программирования и методы трансляции” изучается на 4 курсе студентами специальности 220400 - “Программное обеспечение вычислительной техники и автоматизированных систем”. Главная задача предмета обучить студентов знаниям и умениям в области современных методов и средств поэтапной разработки компиляторов.

Тема данного курсового  проекта, это – разработка алгоритма компилятора и реализация созданного алгоритма на скриптовом языке программирования PHP.

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

  1. Постановка задачи

    1. Задание на проектирование

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

 

    1. Входные данные

  • Файл, содержащий обрабатываемый текст.

 

    1. Выходные данные

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

 

 

    1. Анализ поставленной задачи

В данном курсовом проекте  требуется разработать алгоритм компилятора, реализующий три основные задачи:

    • лексический анализ текста исходной программы;
    • синтаксический анализ текста исходной программы;
    • перевод текста исходной программы во внутренние коды.

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    1. Описание используемой грамматики

Для выполнения поставленной задачи была использована описанная ниже грамматика:

<program> ::= <variables_definitions> <body>.

<variables_definitions> ::= var <variables_definitions> <vars> : integer; |

<vars> : integer;

<vars> ::= <var> | <vars>, <var>

<var> ::= $<list>

<list> ::= <list><letter> | <list> <number>

<number> ::= <number> <digit> | <digit>

<digit> ::= 0 .. 9

<letter> ::= a .. z

<body> ::= begin <select_instruction> end

<select_instruction> ::= <instruction> | <select_instruction> <instruction>

<instruction> ::=  <var> := <operation>; |

if <compare>  then <body> |

if <compare>  then <body> else <body> |

while <compare>  do <body>

<compare> ::= <select_expression><compare_operators> <select_expression>

<operation> ::= <select_expression> |

<select_expression><arithmetic_operators> <select_expression>

<select_expression> ::= <var> | <number>

<compare_operators> ::= <> | = | < | > | <= | >=

<arithmetic_operators> ::= + | - | * | /

 

    1. Блок-схема алгоритма

Для простоты реализации и понимания алгоритма, его лучше всего разбить на 4 части:

  • подключение файла с исходным обрабатываемым текстом, запуск анализа и синтеза компилятора при успешной обработке;
  • лексический анализатор, который:
    • осуществляет поиск  совпадений  лексем с заранее описанными шаблонами ключевых слов, идентификаторов, разделителей, комментариев;
    • находит лексические ошибки, такие как отсутствие обязательных лексем, несовпадение количества взаимосвязанных лексем, нераспознанные лексемы.
  • синтаксический анализатор, который:
    • осуществляет сравнение текста исходной обрабатываемой программы с используемой в курсовом проекте грамматикой и выявляет ошибки, если таковые были найдены.
  • перевод во внутренние коды, то есть преобразование исходного кода программы во внутренние коды.

 

Листинг программы, реализующей  подключение файла с исходным обрабатываемым текстом, запуск анализа и синтеза компилятора при успешной обработке исходного текста, расположен в ПРИЛОЖЕНИИ 1.

Блок-схема алгоритма, описывающая используемый лексический анализатор, представлена на рисунке 2.1, а листинг программы, реализующей этот алгоритм – в ПРИЛОЖЕНИИ 2.


Рис 2.1

 

 

Блок-схема алгоритма, описывающая используемый синтаксический анализатор, представлена на рисунке 2.2, а листинг программы, реализующей этот алгоритм – в ПРИЛОЖЕНИИ 3.

 

 


 

Рис 2.2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Блок-схема алгоритма, осуществляющего перевод обрабатываемого текста во внутренние коды, представлена на рисунке 2.3, а листинг программы, реализующей этот алгоритм – в ПРИЛОЖЕНИИ 4.

 

 

Рис 2.3

 

 

 

 

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

  1. Проектная часть

    1. Общие сведения

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

 

 

    1. Описание классов

Листинги всех программ, изложенные в Приложениях, были написаны с использованием знаний в области  Объектно-Ориентированного Программирования (ООП), то есть в созданных в ходе проектирования программах описываются  и используются следующие классы:

          • Класс Compiller – является основным классом, который осуществляет чтение из файла с исходным кодом программы, запись содержимого в строковую переменную и передает эту переменную на обработку лексическому анализатору (классу Lexer).
          • Класс Lexer – осуществляет лексический анализ текста, а именно поиск комментариев, поиск идентификаторов, поиск путем сравнения с шаблонами ключевых слов, а также заполняет информационную таблицу, которая реализована в виде разряженного (хеш) массива.
          • Класс Grammar – содержит представление используемой грамматики.
          • Класс Parser – выполняет синтаксический анализ текста, который в данной реализации осуществляется путем использования возможности языка программирования PHP – регулярных выражений, которые осуществляют сравнение строки с текстом с заранее предопределенными шаблонами.
          • Класс Transform – осуществляет перевод текста исходной программы во внутренние коды.

 

    1. Описание логической структуры

Структура программы  изображена на рисунке 3.1.

Рис 3.1

 

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

    1. Входные данные

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

 

    1. Выходные данные

Данными, результирующими работу программы, будут внутренние коды.

  1. Контрольные примеры

Рис 4.1 – Пример ошибки на этапе лексического анализа

 

 

Рис 4.2 - Пример ошибки на этапе синтаксического анализа

 

Рис 4.3 – Успешная компиляция (Вариант 1)

 

Рис 4.4 - Успешная компиляция (Вариант 2 - начало)

 

Рис 4.5 - Успешная компиляция (Вариант 2 - продолжение)

 

Рис 4.6 - Успешная компиляция (Вариант 2 - конец)

Заключение

 

В ходе курсовой работы был составлен алгоритм компилятора на основе созданной в процессе разработки грамматики. Описанный в курсовой работе компилятор был реализован на скриптовом языке программирования PHP и является приложением, которое работает непосредственно на стороне сервера, на котором установлен и запущен web-сервер Apache.

Разработка компилятора началась с создания Pascal-подобной грамматики, которая в этапе разработки была переработана и приведена к виду, который описан в данной курсовой работе. Следующим этапом в создании компилятора было написание блок-схем алгоритмов, которые осуществляют немаловажное влияние при написании кода программ. В дальнейшем по составленному алгоритму была создана сама программа (скрипт), отвечающий за компиляцию исходных кодов обрабатываемых программ. При разработке кода компилятора, были использованы знания в области Объектно-Ориентированного Программирования (ООП), что позволило реализовать код программы в виде четырех классов: класса Compiller, который осуществляет подключение файла исходной программы, класса Lexer, производящего лексический анализ текста, класса Grammar, описывающего используемую грамматику, класса Parser, выполняющего синтаксический анализ текста и класса Transform, основной задачей которого является перевод обрабатываемого кода исходной программы во внутренние коды.

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

Список использованной литературы

 

  1. Аляев Ю.А., Козлов О.А. Алгоритмизация и языки программирования Pascal, C++, Visual Basic: Учебно-справочное пособие. – М.: Финансы и статистика, 2002г., 320 с.
  2. Новичков В., Парфилова Н. Алгоритмизация и программирование на Турбо Паскале. Учебное пособие. – М.: Горячая линия - Телеком, 2005 г., 438 с.
  3. Профессиональное PHP программирование 2ое издание. – М.: Символ+, 2003 г., 1048 с.
  4. Ресурсы глобальной сети Internet.
  5. Цифровые информационные ресурсы.

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 1

Файл <index.php>

<?php

include_once("include/compiller.php");

include_once("include/lexer.php");

include_once("include/grammar.php");

include_once("include/parser.php");

include_once("include/lexer_keyws.php");

include_once("include/transform.php");

 

$p = new Compiller;

 

while ($f = $p->nextSourceFile()) {

if ($str = $p->readSourceFile($f)) {

echo $p->printSourceCode($str, $f);

$lexer = new LeXer($str, $lexer_keyws, $lexer_preerrors, $lexer_text_errors);

$lexer->lxScan();

if ($lexer->count == 0) {

echo $lexer->error_mess;

$parser = new Parser($str);

if ($parser->prsParse()) {

echo $parser->error_mes;

$transform = new Transform($str);

$transform->trfAriphmetic();

$transform->trfCompares();

$transform->trfCircles();

$transform->trfRemoveOther();

echo $transform->trfPrintResult();

} else {

echo $parser->error_mes;

}

 

} else {

echo $lexer->error_mess;

}

 

} else {

echo "Error: nocontent ...<br/>";

}

}

 

?>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Файл <compiller.php>

<?

class Compiller {

var

$path,

$link,

$source,

$files = array();

 

//--

function Compiller  ()  {

$this->path = realpath(".");

$this->link = "http://".$GLOBALS['_SERVER']['SERVER_NAME'].$GLOBALS['_SERVER']['REQUEST_URI'];

$this->source = $this->path."/source/";

if ($dir = opendir($this->source)) {

while (false !== ($file = readdir($dir))) {

if ($file != "." && $file != "..") {

array_push($this->files,$this->link."source/".$file);

}

}

closedir($dir);

}

}

 

//--

function nextSourceFile () {

return array_pop($this->files);

}

 

//--

function printSourceCode ($str, $filename) {

$result  = "<hr/><hr/><h3>Текст  исходного обрабатываемого файла  ($filename):</h3>";

$result .= "<pre>".$str."</pre>";

$result .= "<hr/>";

Return $result;

}

 

//--

function readSourceFile ($file) {

return $str = @file_get_contents($file);

Информация о работе Разработка Компилятора