Автор: Пользователь скрыл имя, 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
$this->count++;
$this->errors['obligatory']['
}
elseif (count($this->keyws[$key][$
$this->count++;
$this->errors['obligatory']['
}
}
foreach
($this->preerrors['obligatory'
if (count($this->keyws[$val["key"
$this->count++;
$this->errors['obligatory']['
}
}
//
foreach
($this->preerrors['pair']['
$count=-1;
foreach ($value as $key=>$val) {
if ($count == -1) {
$count = count($this->keyws[$val["key"]
} else {
if (count($this->keyws[$val["key"
$this->count++;
$this->errors['pair']['equal']
}
}
}
}
foreach
($this->preerrors['pair']['
$count=-1;
foreach ($value as $key=>$val) {
if ($count == -1) {
$count = count($this->keyws[$val["key"]
} else {
if (count($this->keyws[$val["key"
$this->count++;
$this->errors['pair']['nomore'
}
}
}
}
}
//--
function parseError ($string, $nomber, $key="", $pos="" ) { // компиляция сообщения об ошибке
$error_text = str_replace("@N@", $nomber, $string);
if ($key) $error_text = str_replace("@key@", $key, $error_text);
if ($pos) $error_text = str_replace("@pos@", $pos, $error_text);
$error_text =
str_replace(array("@pos@","@
//print_r($error_text);
Return $error_text;
}
//--
function printResult () { // отбражение результатов сканирования
$error = "";
if ($this->count) {
$error
.= $this->text_errors["preerror"]
foreach ($this->errors as $key1=>$val1) {
foreach ($val1 as $key2=>$val2) {
if ($key1 == "unknown") {
$error .= $this->parseError($this->text_
} else {
foreach ($val2 as $key3=>$val3) {
if ($key1 == "pair") {
$error .= $this->parseError($this->text_
} else {
foreach ($val3 as $key4=>$val4) {
$error .= $this->parseError($this->text_
}
}
}
}
}
}
}
if ($error) {
$error
.= $this->parseError($this->text_
} else {
$error = $this->text_errors["noerror"];
}
$this->error_mess = $error;
}
//--
function lxScan () { // запуск сканирования
$this->lxRemoveComments();
$this->lxDelimeters();
$this->lxIdentificators();
$this->lxKeyws();
$this->lxDiagnostics();
Return $this->printResult();
}
}
?>
Файл <grammar.php>
<?php
class Grammar {
var
$lang=array();
function Grammar() {
// $this->lang
//0 y
$this->lang['y']='(\+|\*|\/|-|
//1 x
$this->lang['x']='(<>|=|<|>|<=
//2 тип
$this->lang['type']='\
//3 идентификатор
$this->lang['var']='(\\$[\w]+\
//4 идентифик
$this->lang['id']='('.$this->
//5 выбор_выраж
$this->lang['select_
//6 опер
$this->lang['operator']='('.$
//7 выражение
$this->lang['expression']='('.
//8 стандарт_тип
$this->lang['standard_type']='
//9 объявл_перем
$this->lang['definition_var']=
//10 инструкция
$this->lang['instruction']='((
// 11 тело
$this->lang['body']='(\s*
// 12 программа
$this->lang['programm']='(\s*'
}
}
?>
Файл <parser.php>
<?php
class Parser extends Grammar{
var
$in_code,
$out_code,
$error_mes,
$error_trigger=false;
//--
function Parser($code){
$this->in_code=$code;
$this->in_code=preg_replace("/
$this->in_code=preg_replace("/
parent::Grammar();
}
//--
function prsParse() {
$array=array();
preg_match('/'.$this->lang['
if ( isset($array[0][0]) ) {
$this->out_code=$array[0][0];
if ($this->in_code!=$this->out_
$this->error_trigger=true;
}
} else {
$this->error_trigger=true;
}
if ($this->error_trigger) {
$this->error_mes='Компиляция на этапе синтаксического анализа завершилась неудачно. Пожалуйста проверьте правильность кода.<hr/>';
Return false;
} else {
$this->error_mes='Компиляция успешно прошла этап синтаксического анализа.<hr/>';
Return true;
}
}
}
?>
Файл <transform.php>
<?
class Transform {
var
$sourceString,
$resultString;
//--
function Transform ($sourceString) {
$this->sourceString = $sourceString;
$this->resultString = $sourceString;
}
//--
function trfAriphmetic () {
preg_match_all('/\\$[\w|\d]*\
$count=1;
$step = 0;
foreach ($array[0] as $key=>$val_) {
$result = "";
$val = preg_replace('/\s*/si',"",$
$res = preg_replace('/:=.*?;/si',"",$
$operations = preg_replace('/\\$[\w|\d]*\s*:
$operations = preg_replace('/\s*/si',"",$
$add = explode('+',$operations);
foreach ($add as $key1=>$val1) {
$sub = explode('-',$val1);
foreach ($sub as $key2=>$val2) {
$mult = explode('*',$val2);
foreach ($mult as $key3=>$val3) {
$div = explode('/',$val3);
if (isset($div[1])) {
$count++;
$step=1;
foreach ($div as $key4=>$val4) {
if ($key4 == 0) {
$result.="LOAD ".$val4."<br/>";
} else {
$result.="DIV ".$val4."<br/>";
$result.="STORE TEMP_".$count."<br/>";
}
}
$mult[$key3]="TEMP_".$count;
$sub[$key2]="TEMP_".$count;
$add[$key1]="TEMP_".$count;
}
}
if (isset($mult[1])) {
$count++;
$step=1;
foreach ($mult as $key3=>$val3) {
if ($key3 == 0) {
$result.="LOAD ".$val3."<br/>";
} else {
$result.="MULT ".$val3."<br/>";
$result.="STORE TEMP_".$count."<br/>";
}
}
$sub[$key2]="TEMP_".$count;
$add[$key1]="TEMP_".$count;
}
}
if (isset($sub[1])) {
$count++;
$step=1;
foreach ($sub as $key2=>$val2) {
if ($key2 == 0) {
$result.="LOAD ".$val2."<br/>";
} else {
$result.="SUB ".$val2."<br/>";
$result.="STORE TEMP_".$count."<br/>";
}
}
$add[$key1]="TEMP_".$count;
}
}
if (isset($add[1])) {
$count++;
$step=1;
foreach ($add as $key1=>$val1) {
if ($key1 == 0) {
$result.="LOAD ".$val1."<br/>";
} else {
$result.="ADD ".$val1."<br/>";
$result.="STORE TEMP_".$count."<br/>";
}
}
}
$result .= "LOAD ".($step ? "TEMP_$count" : "$operations")."<br/>";
$result .= "STORE ".$res."<br/>";
$step=0;
$this->resultString = str_replace($val_,"<br/>".$
}
}
//--
function trfPrintResult () {
$result = "<hr/><hr/><h4>Внутренние коды:</h4>";
$result .= $this->resultString;
$result .= "<hr/>";
Return $result;
}
//--
function trfExpressionAnalyse ($val, $pos_false=false) {
$array3 = array(); $result="";
preg_match_all('/(<>|<=|>=|>|<
if (isset($array3[0])) {
$operands = explode($array3[0][0],$val);
switch ($array3[0][0]) {
case ">":
$result = $operands[0]."-".$operands[1].
break;
case "<":
$result = $operands[1]."-".$operands[0].
break;
case "=":
$result = $operands[0]."-".$operands[1].
break;
case "<>":
$result = $operands[0]."-".$operands[1].
break;
case ">=":
$result = $operands[0]."-".$operands[1].
break;
case "<=":
$result = $operands[1]."-".$operands[0].
break;
}
}
return $result;
}
//--
function trfCompares () {
$array2 = array();
preg_match_all('/if.*?then\s*
foreach ($array2[0] as $key=>$val_) {
$val = preg_replace('/if\s*/si',"",$
$val = preg_replace('/\s*then\s*
$expression = $this->trfExpressionAnalyse($
preg_match_all('/if.*?then\s*
if (isset($array5[0][0])) {
$pos_true = strlen($array5[0][0]) + strpos ($this->resultString,$array5[
preg_match_all('/if.*?then\s*
if (isset($array6[0][0])) {
$pos_false = strlen($array6[0][0]) + strpos ($this->resultString,$array6[
}
$this->resultString = substr_replace ( $this->resultString, $pos_false." BR ", $pos_true,0);
}
$this->resultString = str_replace($val_,$expression,
}
}
//--
function trfCircles () {
$array1 = array();
preg_match_all('/while.*?do\s*
foreach ($array1[0] as $key=>$val_) {
$val = preg_replace('/\s*do\s*begin\
$val = preg_replace('/while\s*/si',""
$expression = $this->trfExpressionAnalyse($
$pos_false = strpos($this->resultString,$
preg_match_all('/while.*?do\s*
if (isset($array4[0][0])) {
$pos_true = strpos ($this->resultString,$array4[
$this->resultString = substr_replace ( $this->resultString, $pos_false." BR ", $pos_true,0);
}
$this->resultString = str_replace($val_,$expression,
}
}
//--
function trfRemoveOther () {
$this->resultString = preg_replace('/^.*?begin\s*/
$this->resultString = preg_replace('/\s*end\..*/si',
$this->resultString = preg_replace('/((\s*end\s*)|(\
}
}
?>
Содержание: