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

Автор: Пользователь скрыл имя, 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 Кб (Скачать)

      $this->count++;

      $this->errors['obligatory']['one']['notfound'][$this->count]=array('key' => $val["key"], 'value' => $val["val"], 'pos' => $this->keyws[$val["key"]][$val["val"]]["matches"][1]);

     } elseif (count($this->keyws[$key][$val]["matches"])  >  1) {

      $this->count++;

      $this->errors['obligatory']['one']['moreone'][$this->count]=array('key' => $val["key"], 'value' => $val["val"], 'pos' => $this->keyws[$val["key"]][$val["val"]]["matches"][1] );

     }

    }

    foreach ($this->preerrors['obligatory']['more'] as $key=>$val) { // не  найдены ключевые слова (obligatory) должные быть 1 и более раз

     if (count($this->keyws[$val["key"]][$val["val"]]["matches"])  < 1) {

      $this->count++;

      $this->errors['obligatory']['more'][$this->count]=array('key' => $key, 'value' => $val);

     }

    }

  //

    foreach ($this->preerrors['pair']['equal'] as $name=>$value) { // поиск несовпадения количества непарных лексем (pair), которые должны быть равны

     $count=-1;

     foreach ($value as $key=>$val) {

      if ($count == -1) {

       $count = count($this->keyws[$val["key"]][$val["val"]]["matches"]);

     } else {

       if (count($this->keyws[$val["key"]][$val["val"]]["matches"]) != $count) {

        $this->count++;

        $this->errors['pair']['equal'][$this->count]=array('key' => $val["key"], 'value' => $val["val"], 'pos' => $this->keyws[$val["key"]][$val["val"]]["matches"][0]);

       }

      }

     }

    }

    foreach ($this->preerrors['pair']['nomore'] as $name=>$value) { // поиск  несовпадения количества лексем  символов (pair), которые должны быть  не больше

     $count=-1;

     foreach ($value as $key=>$val) {

      if ($count == -1) {

       $count = count($this->keyws[$val["key"]][$val["val"]]["matches"]);

      } else {

       if (count($this->keyws[$val["key"]][$val["val"]]["matches"]) > $count) {

        $this->count++;

        $this->errors['pair']['nomore'][$this->count]=array('key' => $val["key"], 'value' => $val["val"], 'pos' => $this->keyws[$val["key"]][$val["val"]]["matches"][0]);

       }

      }

     }

    }

  }

 

//--

  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@","@key@","@N@"), "", $error_text);

//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_errors[$key1], $key2, $val2["value"], $val2["pos"]);

      } else {

       foreach ($val2 as $key3=>$val3) {

        if ($key1 == "pair") {

         $error .= $this->parseError($this->text_errors[$key1][$key2], $key3, $val3["value"], $val3["pos"]);

        } else {

         foreach ($val3 as $key4=>$val4) {

          $error .= $this->parseError($this->text_errors[$key1][$key2][$key3], $key4, $val4["value"]);

         }

        }

       }

      }

     }

    }

   }

 

   if ($error) {

    $error .= $this->parseError($this->text_errors["error"], $this->count);

   } 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();

  }

}

?>

Приложение 3

Файл <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']='\binteger\b';

 

//3 идентификатор

$this->lang['var']='(\\$[\w]+\b)';

 

//4 идентифик

$this->lang['id']='('.$this->lang['var'].'([\s]*,[\s]*'.$this->lang['var'].')*)';

 

//5 выбор_выраж

$this->lang['select_expression']='('.$this->lang['var'].'|[\d]+)';

 

//6 опер

$this->lang['operator']='('.$this->lang['select_expression'].'(\s*'.$this->lang['y'].'\s*'.$this->lang['select_expression'].'\s*)*)';

 

//7 выражение

$this->lang['expression']='('.$this->lang['select_expression'].'\s*'.$this->lang['x'].'\s*'.$this->lang['select_expression'].')';

 

//8 стандарт_тип

$this->lang['standard_type']='('.$this->lang['id'].'\s*:\s*'.$this->lang['type'].';\s*)*';

 

//9 объявл_перем

$this->lang['definition_var']='(\s*var\s*'.$this->lang['standard_type'].')';

 

//10 инструкция

$this->lang['instruction']='((((\s*if\s*'.$this->lang['expression'].'\s*then\s*begin\s*((('.$this->lang['var'].'\s*:=\s*'.$this->lang['operator'].';\s*)+|(while\s*'.$this->lang['expression'].'\s*do\s*begin\s*(('.$this->lang['var'].'\s*:=\s*'.$this->lang['operator'].';\s*)+|(?R))*\s*end\s*))+|(?R))+\s*end)(\s*else\s*begin\s*((('.$this->lang['var'].'\s*:=\s*'.$this->lang['operator'].';\s*)|(while\s*'.$this->lang['expression'].'\s*do\s*begin\s*(('.$this->lang['var'].'\s*:=\s*'.$this->lang['operator'].';\s*)+|(?R))*\s*end\s*))+|(?R))*\s*end\s*){0,1}))+|(\s*while\s*'.$this->lang['expression'].'\s*do\s*begin\s*(('.$this->lang['var'].'\s*:=\s*'.$this->lang['operator'].';\s*)+|(?R))*\s*end\s*)|(\s*'.$this->lang['var'].'\s*:=\s*'.$this->lang['operator'].';\s*))*';

 

 

// 11 тело

$this->lang['body']='(\s*begin\s*'.$this->lang['instruction'].'\s*end\s*)';

 

// 12 программа

$this->lang['programm']='(\s*'.$this->lang['definition_var'].'\s*'.$this->lang['body'].'\.)';

}

}

?>

 

 

 

 

Файл <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("/\/\*.*?\*\//si", "", $this->in_code);

$this->in_code=preg_replace("/\/\/.*?\r/si", "", $this->in_code);

parent::Grammar();

}

 

//--

function prsParse() {

$array=array();

preg_match('/'.$this->lang['programm'].'/si',$this->in_code,$array,PREG_OFFSET_CAPTURE);

if ( isset($array[0][0]) ) {

$this->out_code=$array[0][0];

if ($this->in_code!=$this->out_code) {

$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;

}

}

}

 

?>

Приложение 4

Файл <transform.php>

 

<?

 class Transform {

  var

   $sourceString,

   $resultString;

 

//--

  function Transform ($sourceString) {

   $this->sourceString = $sourceString;

   $this->resultString = $sourceString;

  }

 

//--

  function trfAriphmetic () {

   preg_match_all('/\\$[\w|\d]*\s*:=.*?;/si',$this->sourceString,$array);  

   $count=1;

   $step = 0;

   foreach ($array[0] as $key=>$val_) {

    $result = "";

    $val = preg_replace('/\s*/si',"",$val_);

    $res = preg_replace('/:=.*?;/si',"",$val);

    $operations = preg_replace('/\\$[\w|\d]*\s*:=/si',"",$val);

    $operations = preg_replace('/\s*/si',"",$operations);

    $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/>".$result,$this->resultString);

   }

  }

 

//--

  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('/(<>|<=|>=|>|<|=)/si',$val,$array3);

   if (isset($array3[0])) {

    $operands = explode($array3[0][0],$val);

    switch ($array3[0][0]) {

     case ">":

      $result = $operands[0]."-".$operands[1]." ".$pos_false." BP ";

      break;

     case "<":

      $result = $operands[1]."-".$operands[0]." ".$pos_false." BP ";

      break;

     case "=":

      $result = $operands[0]."-".$operands[1]." ".$pos_false." BMP ";

      break;

     case "<>":

      $result = $operands[0]."-".$operands[1]." ".$pos_false." BZ ";

      break;

     case ">=":

      $result = $operands[0]."-".$operands[1]." ".$pos_false." BPZ ";

      break;     

     case "<=":

      $result = $operands[1]."-".$operands[0]." ".$pos_false." BPZ ";

      break;

    }

   }

   return $result;

  }

 

//--

  function trfCompares () {

   $array2 = array();

   preg_match_all('/if.*?then\s*begin\s*/si',$this->resultString,$array2);

   foreach ($array2[0] as $key=>$val_) {

    $val = preg_replace('/if\s*/si',"",$val_);

    $val = preg_replace('/\s*then\s*begin\s*/si',"",$val);   

    $expression = $this->trfExpressionAnalyse($val,strpos($this->resultString,$val));

    preg_match_all('/if.*?then\s*begin.*?end\s*else\s*begin.*?end\s*/si',$this->resultString,$array5);

    if (isset($array5[0][0])) {

     $pos_true = strlen($array5[0][0]) + strpos ($this->resultString,$array5[0][0]);

     preg_match_all('/if.*?then\s*begin.*?end\s*else\s*begin\s*/si',$this->resultString,$array6);

     if (isset($array6[0][0])) {

      $pos_false = strlen($array6[0][0]) + strpos ($this->resultString,$array6[0][0]);

     }

     $this->resultString = substr_replace ( $this->resultString, $pos_false." BR ", $pos_true,0);

    }

    $this->resultString = str_replace($val_,$expression,$this->resultString);

   }

  }

 

//--

  function trfCircles () {

   $array1 = array();

   preg_match_all('/while.*?do\s*begin\s*/si',$this->resultString,$array1);  

   foreach ($array1[0] as $key=>$val_) {

    $val = preg_replace('/\s*do\s*begin\s*/si',"",$val_);

    $val = preg_replace('/while\s*/si',"",$val);

    $expression = $this->trfExpressionAnalyse($val,strpos($this->resultString,$val));

    $pos_false = strpos($this->resultString,$val);

    preg_match_all('/while.*?do\s*begin.*?end/si',$this->resultString,$array4);

    if (isset($array4[0][0])) {

     $pos_true = strpos ($this->resultString,$array4[0][0]);

     $this->resultString = substr_replace ( $this->resultString, $pos_false." BR ", $pos_true,0);

    }

    $this->resultString = str_replace($val_,$expression,$this->resultString);

   }

  }

 

//--

  function trfRemoveOther () {

   $this->resultString = preg_replace('/^.*?begin\s*/si',"BLOCK<br/>",$this->resultString);

   $this->resultString = preg_replace('/\s*end\..*/si',"<br/>BLOCKEND",$this->resultString);

   $this->resultString = preg_replace('/((\s*end\s*)|(\s*else\s*)|(\s*begin\s*))/s',"",$this->resultString);

  }

 

 }

 

?>

 

 

 

Содержание:


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