Автор: Пользователь скрыл имя, 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
Предмет “Теория языков программирования и методы трансляции” изучается на 4 курсе студентами специальности 220400 - “Программное обеспечение вычислительной техники и автоматизированных систем”. Главная задача предмета обучить студентов знаниям и умениям в области современных методов и средств поэтапной разработки компиляторов.
Тема данного курсового проекта, это – разработка алгоритма компилятора и реализация созданного алгоритма на скриптовом языке программирования PHP.
В данном курсовом проекте будет поэтапно создан компилятор. Для разработки компилятора первым и наиболее главным шагом должна служить создание грамматики, посредствам которой компилятор должен будет производить анализ и синтез кода исходной программы во внутреннее представление. Написание компилятора заключается в создании трех основных модулей, во-первых, это лексический анализатор, который производит поиск лексем в исходном тексте обрабатываемой программы, во-вторых, разработка синтаксического анализатора, целью которого является поиск конструкции исходного языка и сравнение её с заранее определенной грамматикой, и, наконец, перевод во внутренние коды, который осуществляет преобразование исходного кода обрабатываемой программы во внутренние коды при учете удачной работы лексического и синтаксического анализатора.
Разработать компилятор, который должен выполнять лексический, синтаксический анализ обрабатываемого текста и преобразовывать его во внутренние коды.
В данном курсовом проекте требуется разработать алгоритм компилятора, реализующий три основные задачи:
Исходя из этого, наиболее целесообразно будет разбить решение поставленной задачи на три главные составляющие, названные выше.
Первоначальными входными данными будет текст программы Pascal-подобного языка программирования. Первым шагом в написании компилятора, должно быть создание грамматики для лексического и синтаксического анализа.
Для выполнения поставленной задачи была использована описанная ниже грамматика:
<program> ::= <variables_
<variables_definitions> ::=
<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> ::= <var> := <operation>; |
if <compare> then <body> |
if <compare> then <body> else <body> |
while <compare> do <body>
<compare> ::= <select_
<operation> ::= <select_
<select_expression><
<select_expression> ::= <var> | <number>
<compare_operators> ::= <> | = | < | > | <= | >=
<arithmetic_operators> ::= + | - | * | /
Для простоты реализации и понимания алгоритма, его лучше всего разбить на 4 части:
Листинг программы, реализующей подключение файла с исходным обрабатываемым текстом, запуск анализа и синтеза компилятора при успешной обработке исходного текста, расположен в ПРИЛОЖЕНИИ 1.
Блок-схема алгоритма, описывающая используемый лексический анализатор, представлена на рисунке 2.1, а листинг программы, реализующей этот алгоритм – в ПРИЛОЖЕНИИ 2.
Рис 2.1
Блок-схема алгоритма, описывающая используемый синтаксический анализатор, представлена на рисунке 2.2, а листинг программы, реализующей этот алгоритм – в ПРИЛОЖЕНИИ 3.
Рис 2.2
Блок-схема алгоритма, осуществляющего перевод обрабатываемого текста во внутренние коды, представлена на рисунке 2.3, а листинг программы, реализующей этот алгоритм – в ПРИЛОЖЕНИИ 4.
Рис 2.3
Используя описанные выше блок-схемы алгоритмов, представляется возможным реализовать задачу, поставленную на курсовое проектирование, на любом языке программирования. В представленном курсовом проекте реализация была осуществлена на скриптовом языке программирования PHP.
Программы (скрипты), написанные для реализации данного курсового проекта, были созданы для работы с языком программирования PHP, который является очень удобным и мощным для разработчиков инструментарием. Основной функциональностью языка, которая использовалась в процессе разработки, являются регулярные выражения, действия которых основаны на сравнении обрабатываемой строки с заранее определенным шаблоном. При правильном и умелом использовании регулярных выражений, можно осуществлять поиск совершенно разнообразных подстрок в тексте, что и было использовано в данной курсовой работе.
Листинги всех программ, изложенные в Приложениях, были написаны с использованием знаний в области Объектно-Ориентированного Программирования (ООП), то есть в созданных в ходе проектирования программах описываются и используются следующие классы:
Структура программы изображена на рисунке 3.1.
Рис 3.1
Таким образом, основной частью программы является лексический и синтаксический анализаторы, а также не менее значимая процедура перевода текста исходной программы во внутренние коды.
Данными, требующимися для успешной работы программы, является файл с текстом исходной программы. Для успешной компиляции файла требуется, чтобы в обрабатываемом файле отсутствовали лексические и синтаксические ошибки, что проверяется сравнением текста файла с используемой Pascal-подобной грамматикой.
Данными, результирующими работу программы, будут внутренние коды.
Рис 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-подобной лексикой, тем самым можно утверждать, что задача данной курсовой работы была успешно выполнена.
Файл <index.php>
<?php
include_once("include/
include_once("include/lexer.
include_once("include/grammar.
include_once("include/parser.
include_once("include/lexer_
include_once("include/
$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://".$
$this->source = $this->path."/
if ($dir = opendir($this->source)) {
while (false !== ($file = readdir($dir))) {
if ($file != "." && $file != "..") {
array_push($this->files,$this-
}
}
closedir($dir);
}
}
//--
function nextSourceFile () {
return array_pop($this->files);
}
//--
function printSourceCode ($str, $filename) {
$result = "<hr/><hr/><h3>Текст
исходного обрабатываемого
$result .= "<pre>".$str."</pre>";
$result .= "<hr/>";
Return $result;
}
//--
function readSourceFile ($file) {
return $str = @file_get_contents($file);