Исследование методов и алгоритмов работы трансляторов предметно-ориентированных языков

Обзор методов и алгоритмов работы интерпретатора языка МИЛАН. Грамматика модифицированного языка в виде диаграмм Вирта. Описание лексического анализатора и интерпретатора модифицированного языка МИЛАН. Программная реализация и тестирование интерпретатора.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 19.05.2015
Размер файла 1012,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

/* функция у7: накопление символов константы */

$Word = $Word . $Input_Letter;

$Position_=0;

/* функция у1: прочитать следующий символ */

Read($Input_Letter);

$Position_++;

/* Выделить константу */

while (Isdigit($Input_Letter)):

/* функция у7: накопление символов константы */

$Word=$Word . $Input_Letter;

/* функция у1: прочитать следующий символ */

Read($Input_Letter);

$Position_++;

endwhile;

/* функция у8: проверка на принадлежность */

/* выделенной константы таблице констант */

if (Found_in_Table_Constants($Word)>0)

{

/* функция у11: формирование лексемы */

$Current_Lexem->Code=20;

$Current_Lexem->Value=Found_in_Table_Constants($Word);

}

elseif ($Number_Constants<MAX_CONSTANTS)

{

/* запись выделенной константы в таблицу констант */

$Number_Constants++;

$Constant_Value=intval($Word);

$Tab_Constants[$Number_Constants]=$Constant_Value;

/* функция у11: формирование лексемы */

$Current_Lexem->Code=20;

$Current_Lexem->Value=$Number_Constants;

}

else

/* Превышение максимального количества констант */

$Code_Error=2;

global $Position;

if ($Code_Error==-1)

$Position=$Position+$Position_;

return 0;

} /* End Digit */

/*******************************************************************/

/* Setup_Refference */

/* Процедура расстановки ссылок: */

/* DO-->ENDDO+1, ENDDO-->WHILE+1 */

/* THEN-->ELSE+1 */

/* THEN-->ENDIF+1, ELSE-->ENDIF+1 */

/* */

/* //ADD */

/* TO-->ENDFOR+1 */

/* ENDFOR-->TO */

/* :-->CASE */

/* :-->DEFAULT */

/* :-->} */

/* Аргументы: Массив лексем. */

/* Результат: Массив лексем с расставленными ссылками. */

/*******************************************************************/

function Setup_Refference()

{

/* функция y0: подготовка (инициализация стеков и переменных), */

/* номер очередной лексемы Number_Lexem=1, прочитать лексему с номером */

/* Number_Lexem */

//Глобальные переменные

global $Number_Lexem;

global $Tab_Lexems;

global $Code_Error;

global $Number_Lexems_Programm;

//Локальные переменные

$r=0;

$s=0;

$Top_do = 0;

$Top_if = 0;

$Stek_if = Array();

$Stek_do = Array();

$Number_Lexem = 1;

Stek_Integer(0,$Stek_do,$Top_do,$r);

Stek_Integer(0,$Stek_if,$Top_if,$s);

//ADD

$Stek_repeat = Array();

$Stek_switch = Array();

$Top_repeat = 0;

$Top_switch = 0;

Stek_Integer(0,$Stek_repeat,$Top_repeat,$r);

Stek_Integer(0,$Stek_switch,$Top_switch,$s);

do

{

switch($Tab_Lexems[$Number_Lexem]->Code):

Case _WHILE_ :

/* функция y1: значение $Number_Lexem занести */

/* стек $Stek_do ($Number_Lexem-->$Stek_do) */

if (!Stek_Integer(2,$Stek_do,$Top_do,$Number_Lexem))

{

/* Переполнение стека DO*/

$Code_Error=4;

return 0;

}

/* функция y7: $Number_Lexem++, */

/* прочитать очередную лексему с номером $Number_Lexem */

$Number_Lexem++;

while ($Tab_Lexems[$Number_Lexem]->Code!=_DO_):

/* функция y7: Number_Lexem=Number_Lexem+1, */

/* прочитать очередную лексему с номером $Number_Lexem */

$Number_Lexem++;

if ($Number_Lexem>$Number_Lexems_Programm)

{

/* Несоответствие в операторах WHILE-DO-OD */

$Code_Error=10;

return 0;

}

endwhile;

/* функция y1: значение $Number_Lexem занести */

/* стек $Stek_do ($Number_Lexem-->$Stek_do) */

if (!Stek_Integer(2,$Stek_do,$Top_do,$Number_Lexem))

{

/* Переполнение стека DO */

$Code_Error=4;

return 0;

}

break;

Case _ENDDO_ :

/* функция y2: снять вершину стека $Stek_do в */

/* переменную $s ($s<--$Stek_do), снять вершину */

/* стека $Stek_do в переменную $r ($r<--$Stek_do), */

/* значение $r+1 присвоить лексеме */

/* с номером $Number_Lexem [ENDDO-->WHILE+1] */

/* ($Tab_Lexems[$Number_Lexem]->Value=r+1), */

/* значение Number_Lexem+1 присвоить лексеме */

/* с номером s [DO-->ENDDO+1] */

/* ($Tab_Lexems[$s]->Value=$Number_Lexem+1. */

if (!Stek_Integer(1,$Stek_do,$Top_do,$s))

{

/* Нехватка элементов в стеке DO */

$Code_Error=5;

return 0;

}

if (!Stek_Integer(1,$Stek_do,$Top_do,$r))

{

/* Нехватка элементов в стеке DO */

$Code_Error=5;

return 0;

}

/* ENDDO-->WHILE+1*/

$Tab_Lexems[$Number_Lexem]->Value=$r+1;

/* DO-->ENDDO+1 */

$Tab_Lexems[$s]->Value=$Number_Lexem+1;

break;

Case _IF_ :

/* функция y7: $Number_Lexem++, */

/* прочитать очередную лексему с номером $Number_Lexem */

$Number_Lexem++;

while ($Tab_Lexems[$Number_Lexem]->Code!=_THEN_):

/* функция y7: $Number_Lexem++, */

/* прочитать очередную лексему с номером $Number_Lexem */

$Number_Lexem++;

if ($Number_Lexem>$Number_Lexems_Programm)

{

/* Несоответствие операторах IF-THEN-ELSE-ENDIF */

$Code_Error=11;

return 0;

}

endwhile;

/* функция y3: значение $Number_Lexem занести */

/* стек $Stek_if ($Number_Lexem-->$Stek_if) */

if (!Stek_Integer(2,$Stek_if,$Top_if,$Number_Lexem))

{

/* Переполнение стека IF */

$Code_Error=7;

return 0;

}

break;

Case _ELSE_ :

/* функция y4: снять вершину стека $Stek_if в */

/* переменную $r ($r<--$Stek_if), присвоить */

/* значение $Number_Lexem+1 лексеме c номером */

/* r [THEN-->ELSE+1] */

/* ($Tab_Lexems[$r]->Value=$Number_Lexem+1), */

/* занести в $Stek_ if значение Number_Lexem */

/* ($Number_Lexem-->$Stek_if) */

if (!Stek_Integer(1,$Stek_if,$Top_if,$r))

{

/* Нехватка элементов в стеке IF */

$Code_Error=8;

return 0;

}

/* THEN-->ELSE+1 */

$Tab_Lexems[$r]->Value=$Number_Lexem+1;

if (!Stek_Integer(2,$Stek_if,$Top_if,$Number_Lexem))

{

/* Переполнение стека IF */

$Code_Error=7;

return 0;

}

break;

Case _ENDIF_ :

/* функция y5: снять вершину стека $Stek_if в */

/* переменную $r ($r<--$Stek_if), присвоить */

/* значение $Number_Lexem+1 лексеме c номером */

/* $r [THEN-->ENDIF+1, ELSE-->ENDIF+1] */

/* ($Tab_Lexems[$r]->Value=$Number_Lexem+1) */

/* занести в $Stek_ if значение Number_Lexem */

/* ($Number_Lexem-->$Stek_if) */

if (!Stek_Integer(1,$Stek_if,$Top_if,$r))

{

/* Нехватка элементов в стеке IF */

$Code_Error=8;

return 0;

}

/* THEN-->ENDIF+1, ELSE -->ENDIF+1 */

$Tab_Lexems[$r]->Value=$Number_Lexem+1;

break;

//ADD

Case _REPEAT_ :

/*y6: Значение $Number_Lexem+1 занести в стек $Stek_repeat ($Number_Lexem+1-->$Stek_repeat);*/

$r=$Number_Lexem+1;

if (!Stek_Integer(2,$Stek_repeat,$Top_repeat,$r))

{

/* Переполнение стека $Stek_repeat */

$Code_Error=35;

return 0;

}

break;

Case _UNTIL_:

/* Снять вершину стека $Stek_repeat в переменную $r ($r<--$Stek_repeat).*/

/* Лексеме с номером $Number_Lexem присвоить значение $r */

/* $Tab_Lexems[$Number_Lexem]->Value=$r) [UNTIL?REPEAT+1].*/

if (!Stek_Integer(1,$Stek_repeat,$Top_repeat,$r))

{

/* Нехватка элементов в стеке $Stek_repeat */

$Code_Error=36;

return 0;

}

/* UNTIL-->REPEAT */

$Tab_Lexems[$Number_Lexem]->Value=$r;

break;

Case _SWITCH_ :

/* функция y11: $Number_Lexem++, */

/* прочитать очередную лексему с номером $Number_Lexem */

$Number_Lexem++;

while ($Tab_Lexems[$Number_Lexem]->Code!=_TD_):

/* функция y11: Number_Lexem=Number_Lexem+1, */

/* прочитать очередную лексему с номером $Number_Lexem */

$Number_Lexem++;

if ($Number_Lexem>$Number_Lexems_Programm)

{

/* Несоответствие в операторах SWITCH-CASE */

$Code_Error=37;

return 0;

}

endwhile;

/* функция y8: значение $Number_Lexem занести */

/* стек $Stek_switch ($Number_Lexem-->$Stek_switch) */

if (!Stek_Integer(2,$Stek_switch,$Top_switch,$Number_Lexem))

{

/* Переполнение стека SWITCH */

$Code_Error=38;

return 0;

}

break;

Case _TD_ :

/* функция y9: снять вершину стека $Stek_switch в */

/* переменную $r ($r<--$Stek_switch), снять вершину стека $Stek_switch в */

/* переменную $s ($s<--$Stek_switch), значение $r присвоить лексеме с */

/* номером $s ($Tab_Lexems[$s]->Value=$r) [:->CASE, :->DEFAULT].*/

/* Значение $Number_Lexem занести в стек $Stek_switch ($Number_Lexem->$Stek_switch)*/

if (!Stek_Integer(1,$Stek_switch,$Top_switch,$r))

{

/* Нехватка элементов в стеке SWITCH */

$Code_Error=39;

return 0;

}

if (!Stek_Integer(1,$Stek_switch,$Top_switch,$s))

{

/* Нехватка элементов в стеке SWITCH */

$Code_Error=39;

return 0;

}

/* :->CASE, :->DEFAULT */

$Tab_Lexems[$s]->Value=$r;

/* $Number_Lexem->$Stek_switch */

if (!Stek_Integer(2,$Stek_switch,$Top_switch,$Number_Lexem))

{

/* Переполнение стека SWITCH */

$Code_Error=38;

return 0;

}

break;

Case _DEFAULT_ :

Case _CASE_ :

/* функция y8: значение $Number_Lexem занести */

/* стек $Stek_switch ($Number_Lexem-->$Stek_switch) */

if (!Stek_Integer(2,$Stek_switch,$Top_switch,$Number_Lexem))

{

/* Переполнение стека SWITCH */

$Code_Error=38;

return 0;

}

break;

Case _ESWCH_ :

/* функция y10: снять вершину стека $Stek_switch в */

/* переменную $r ($r<--$Stek_switch), значение $Number_Lexem присвоить лексеме с */

/* номером $r ($Tab_Lexems[$r]->Value=$Number_Lexem) [:->}].*/

if (!Stek_Integer(1,$Stek_switch,$Top_switch,$r))

{

/* Нехватка элементов в стеке SWITCH */

$Code_Error=39;

return 0;

}

/* : -> } */

$Tab_Lexems[$r]->Value=$Number_Lexem;

break;

endswitch;

/* функция y7: $Number_Lexem++, */

/* прочитать очередную лексему с номером */

$Number_Lexem++;

}

while ($Number_Lexem<=$Number_Lexems_Programm);

if ($Top_if!=0)

{

/* Несоответствие в операторах IF-THEN-ELSE-ENDIF */

$Code_Error=11;

}

if ($Top_do!=0)

{

/* Несоответствие в операторах WHILE-DO-OD */

$Code_Error=10;

}

//ADD

if ($Top_repeat!=0)

{

/* Несоответствие в операторах REPEAT-UNTIL */

$Code_Error=34;

}

if ($Top_switch!=0)

{

/* Несоответствие в операторах SWITCH-CASE */

$Code_Error=37;

}

} /* End Setup_Refference */

/*********************************************************************/

/* Print_Tab_Lexems */

/* Процедура печати таблицы массива лексем. */

/* Аргументы: нет аргументов. */

/* Результат: Высвечивание на экране таблицы. */

/*********************************************************************/

Function Print_Tab_Lexems()

{

$Number = '';

$Number_ = '';

$Zastav = ''; /* Шапка таблицы массива лексем */

$TabLex = ''; /* Таблица массива лексем */

global $Number_Lexems_Programm;

global $Tab_Lexems;

global $ct_TabLEX_Code_str;

global $ct_TabLEX_Value_str;

echo '<br><H2> <div align="center">РЕЗУЛЬТАТ РАБОТЫ ЛЕКСИЧЕСКОГО АНАЛИЗАТОРА</div></H2><br><hr><br>';

/* Начало процедуры Print_Tab_Lexems */

/* Формирование шапки таблицы массива лексем */

$Zastav = '<table border=1 width="600" align="center"><tr><td colspan=19><div align="center">Т А Б Л И Ц А &nbsp; Л Е К С Е М</div></td></tr>';

$Zastav .= '<tr><td> Номер </td>';

$End=intval($Number_Lexems_Programm /10)+1;

for ($i=0;$i<=9;$i++)

{

$Zastav .='<td align="center"> ' . $i . '</td>';

}

$Zastav .= '</tr>';

/* печать таблицы массива лексем */

/* Вывод содержимого таблицы */

for ($i=1; $i<=$End;$i++)

{

$ct_Pos=($i-1)*10;

$TabLex= '<tr><td align="center">'. strval($ct_Pos) . '</td>';

for ($j=0;$j<=9;$j++)

{

if ((($i==1) && ($j==0)) || ($Tab_Lexems[$ct_Pos+$j]->Code)=='')

$TabLex .='<td>&nbsp;</td>';

else

{

$Number = $Tab_Lexems[$ct_Pos+$j]->Code;

$Number_= $Tab_Lexems[$ct_Pos+$j]->Value;

$ct_TabLEX_Code_str.= $Number.'%';

$ct_TabLEX_Value_str.= $Number_.'%';

$TabLex .='<td align="center">' . Space(2-strlen($Number)) . $Number . ',' . Space(2-strlen($Number_)) . $Number_ . '</td>';

}

}

$Zastav .= $TabLex .'</tr>';

}

$Zastav .= '</table>';

echo ($Zastav);

} /* End Print_Tab_Lexems */

/*********************************************************************/

/* Print_Tab_Identifiers_Constants */

/* Процедура печати таблицы массивов идентификаторов и констант. */

/* Аргументы: нет аргументов. */

/* Результат: Высвечивание на экране таблиц. */

/*********************************************************************/

Function Print_Tab_Identifiers_Constants()

{

$Number='';

$Number_='';

/* Таблица массивов идентификаторов и констант */

$Tab_Identifiers_Constants = '';

global $Tab_Constants;

global $Tab_Identifiers;

global $Number_Identifiers;

global $Number_Constants;

/* Начало процедуры Print_Tab_Identifiers_Constatns */

/* Формирование таблицы массива идентификаторов */

$Tab_Identifiers_Constants = '<br><br><table border=1 width="450" align="center"><tr><td colspan=2 align="center">МАССИВ ИДЕНТИФИКАТОРОВ&nbsp;</td></tr>';

$Tab_Identifiers_Constants .= '<tr><td align="center"> Номер </td><td align="center"> ИДЕНТИФИКАТОР </td></tr>';

for($i=1;$i<=$Number_Identifiers;$i++)

{

$Tab_Identifiers_Constants .= '<tr><td align="center">' . $i . '</td><td align="center">' . $Tab_Identifiers[$i] . '</td></tr>';

}

/* Формирование таблицы массива констант */

$Tab_Identifiers_Constants .= '</table><br><br><table border=1 width="450" align="center"><tr><td colspan=2 align="center">МАССИВ КОНСТАНТ&nbsp;</td></tr>';

$Tab_Identifiers_Constants .= '<tr><td align="center"> Номер </td><td align="center"> КОНСТАНТА </td></tr>';

for($i=1;$i<=$Number_Constants;$i++)

{

$Tab_Identifiers_Constants .= '<tr><td align="center">' . $i . '</td><td align="center">' . $Tab_Constants[$i] . '</td></tr>';

}

$Tab_Identifiers_Constants .= '</table>';

echo($Tab_Identifiers_Constants);

} /* Print_Tab_Identifiers_Constants */

/* Основной блок Лексического Анализатора */

/* функция у0: подготовка (инициализация таблиц и переменных) */

global $Code_Error;

global $Tab_Lexems;

global $Input_Letter; // очередной считанный символ из кода (чтение функцией READ в milan.php, счетчик там же)

global $Number_Lexems_Programm;

global $Number_Lexem;

global $Number_Identifiers;

global $Number_Constants;

global $Number_String;

global $Position;

global $Current_Lexem;

/* функция у1: чтение следующего символа программы на языке МИЛАН */

$Comment=FALSE; // флаг открытого комментария ( TRUE - открыт )

if (Read($Input_Letter)==0)

{

echo('ОШИБКА: Отсутствуют данные для разбора.');

exit; // Завершение работы интерпретатора

}

$Position=0;

$Number_String=1;

$ct_spec= '/['.Chr(9). Chr(10).Chr(13). Chr(32).']/i';

do

{

/* Игнорирование спец. символов и пробела */

while (preg_match($ct_spec,$Input_Letter{0}) )

{

switch (ord($Input_Letter{0})):

case 9 : /* функция y2: увеличение счётчика текущей позиции */

/* ($Position=$Position+1) */

$Position++;

break;

case 13 :

/* функция y3: переход на новую строку в программе, */

/* увеличение счётчика текущей строки, и сброс */

/* счётчика позиции ( $Number_String=$Number_String+1,*/

/* Position=0) */

$Number_String++;

$Position=0;

break;

case 32 : /* функция y2: увеличение счётчика текущей позиции $Position++ */

$Position++;

break;

endswitch;

/* функция у1: чтение следующего символа программы на языке МИЛАН */

Read($Input_Letter);

}

if(isAlpha($Input_Letter{0})) // если введённый символ является буквой

Letter();

elseif(isDigit($Input_Letter{0})) // если введённый символ является цифрой

Digit();

else

{

switch ($Input_Letter{0}):

Case ';' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=12;

$Current_Lexem->Value=0;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

break;

Case '=' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=13;

$Current_Lexem->Value=0;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

break;

Case '>' :

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

if ($Input_Letter=='=')

{

/* функция у11: формирование лексемы */

$Current_Lexem->Code=13;

$Current_Lexem->Value=4;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

}

else

{

/* функция у11: формирование лексемы */

$Current_Lexem->Code=13;

$Current_Lexem->Value=2;

}

break;

Case '<' :

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

switch ($Input_Letter):

case '>' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=13;

$Current_Lexem->Value=1;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position=$Position+1;

break;

case '=' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=13;

$Current_Lexem->Value=5;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position=$Position+1;

break;

default:

/* функция у11: формирование лексемы */

$Current_Lexem->Code=13;

$Current_Lexem->Value=3;

break;

endswitch;

break;

Case '+' :

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

//ADD - Формирование лексемы ++

if ($Input_Letter=='+')

{

/* функция у11: формирование лексемы */

$Current_Lexem->Code=26;

$Current_Lexem->Value=0;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

}

else

{

/* функция у11: формирование лексемы + */

$Current_Lexem->Code=14;

$Current_Lexem->Value=0;

}

break;

Case '-' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=14;

$Current_Lexem->Value=1;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

break;

Case '*' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=15;

$Current_Lexem->Value=0;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

break;

Case '/' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=15;

$Current_Lexem->Value=1;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

break;

Case ':' :

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

if ($Input_Letter=='=')

{

/* функция у11: формирование лексемы */

$Current_Lexem->Code=16;

$Current_Lexem->Value=0;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

}

else

//ADD - Формирование лексемы :

{

/* функция у11: формирование лексемы */

$Current_Lexem->Code=_TD_;

$Current_Lexem->Value=0;

}

break;

//ADD

Case '(' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=17;

$Current_Lexem->Value=0;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

break;

Case ')' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=18;

$Current_Lexem->Value=0;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

break;

//ADD

case 123 : /*функция y2: увеличение счётчика текущей позиции $Position++ */

/* функция y1: чтение следующего символа */

do {

$Position++;

if (Read($Input_Letter)==0) {

echo('ОШИБКА: Неожиданный конец программы. Отсутствует закрывающая фигурная скобка "}" комментария.');

exit; /* Завершение работы интерпретатора */

}

}

while (ord($Input_Letter{0})!=125);

break;

Case '{' :

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

if ($Input_Letter!=Chr(13))

{$comment=1;

Read($Input_Letter);

$Position++;

while($Input_Letter!='}'):

Read($Input_Letter);

$Position++;

if($Input_Letter==Chr(26))

{

$Code_Error=43;

Print_Error_Message();

return 0;

}

endwhile;

Read($Input_Letter);

$Position++;

break;

}

else

{

/* функция у11: формирование лексемы */

$Current_Lexem->Code=28;

$Current_Lexem->Value=0;}

break;

Case '}' :

/* функция у11: формирование лексемы */

$Current_Lexem->Code=29;

$Current_Lexem->Value=0;

/* функция у1: чтение следующего символа */

Read($Input_Letter);

$Position++;

break;

/* Признак конца программы */

Case Chr(26) :

End_Lexical_Analyzer();

return 0;

default: /* Неопознанный символ в программе */

$Code_Error=0;

endswitch;

}

/* Переполнение массива лексем */

if ($Number_Lexem+1>MAX_LEXEMS)

$Code_Error=3;

/* Проверка на ошибку */

if ($Code_Error>-1)

{

Print_Error_Message();

return 0;

}

/* функция у9: запись сформированной лексемы в массив лексем */

$Number_Lexem++;

$Tab_Lexems[$Number_Lexem]->Code=$Current_Lexem->Code;

$Tab_Lexems[$Number_Lexem]->Value=$Current_Lexem->Value;

}while (TRUE);

}

/*********************************************************************/

/* Syntactical_Analyzer */

/* Процедура синтаксического анализа, совмещенная со стадией */

/* генерации действий. */

/* Входные данные: массив лексем (после сканера), */

/* массив идентификаторов (после сканера), */

/* массив констант (после сканера). */

/* */

/* Выходные данные: Выполнение программы на языке МИЛАН. */

/* */

/* Обработка конструкций языка осуществляется процедурами: */

/* ProcedureL, ProcedureS, ProcedureB, ProcedureE, */

/* ProcedureT, ProcedureP. */

/* Процедура Syntactical_Analyzer использует стеки: */

/* $StekRes - стек результатов вычислений; */

/* $StekIdent - стек идентификаторов; */

/* $StekMul - стек для операций типа умножения; */

/* $StekSum - стек для операций типа сложения; */

/* $StekRel - стек для операций типа отношения. */

/*********************************************************************/

//Объявление глобальных переменных

$StekRes =Array();

$StekIdent =Array();

$StekMul =Array();

$StekSum =Array();

$StekRel =Array();

$ArrIdent =Array();

$TopRes=0;

$TopIdent=0;

$TopMul=0;

$TopSum=0;

$TopRel=0;

$Ai=0;

$Bi=0;

//ADD

$StekFor =Array();

$StekSw =Array();

$TopFor=0;

$TopSw=0;

Function Syntactical_Analyzer()

{

/*********************************************************************/

/* //ADD */

/* Процедура ProcedureX - обработка конструкции <умолчание> */

/* <умолчание>::=DEFAULT : <последовательность операторов> */

/*************************************************************************/

Function ProcedureX()

{

global $Tab_Lexems;

global $Number_Lexem;

global $Code_Error;

global $Ai;

global $Bi;

//ADD

global $StekSw;

global $TopSw;

if($Tab_Lexems[$Number_Lexem]->Code!=_DEFAULT_)

{

/* Оператор SWITCH. Некорректная конструкция DEFAULT. */

$Code_Error=48;

return 0;

}

/* функция y4: чтение следующей лексемы ($Number_Lexem++)*/

$Number_Lexem++;

if($Tab_Lexems[$Number_Lexem]->Code!=_TD_)

{

/* Оператор SWITCH. Некорректная конструкция DEFAULT. */

$Code_Error=48;

return 0;

}

/* у28: снять вершину стека $StekSw в переменную $Ai ($Ai<--$StekSw),*/

/* скопировать в переменную $Bi (без удаления) значение со стека $StekSw ($Bi<--$StekSw),*/

/* если $Bi=1, то истина, иначе - ложно, */

/* поместить в стек $StekSw переменную $Ai обратно ($StekSw<--$Ai);*/

if (!Stek_Integer(1, $StekSw, $TopSw, $Ai))

{

/* Нехватка элементов в стеке $StekSw */

$Code_Error = 46;

return 0;

}

if (!Stek_Integer(1, $StekSw, $TopSw, $Bi))

{

/* Нехватка элементов в стеке $StekSw */

$Code_Error = 46;

return 0;

}

if (!Stek_Integer(2, $StekSw, $TopSw, $Bi))

{

/* Переполнение стека $StekSw */

$Code_Error = 45;

return 0;

}

if (!Stek_Integer(2, $StekSw, $TopSw, $Ai))

{

/* Переполнение стека $StekSw */

$Code_Error = 45;

return 0;

}

/* Если прохождения ветки не было */

if($Bi==0)

{

/* функция y4: чтение следующей лексемы ($Number_Lexem++)*/

$Number_Lexem++;

/* Обработка конструкции */

/* <последовательность операторов> */

ProcedureL();

/* Проверка на ошибки, появившиеся в процессе */

/* обработки конструкции */

/* <последовательность операторов> */

if ($Code_Error!=-1)

return 0;

}

/* Иначе - выход из оператора */

else

{

/* y17: перейти на лексему номер $Tab_Lexems[$Number_Lexem]->Value */

$Number_Lexem=$Tab_Lexems[$Number_Lexem]->Value;

}

return 0;

}/* End ProcedureX */

/*********************************************************************/

/* //ADD */

/* Процедура ProcedureF - обработка конструкции <ветвь> */

/* <ветвь>::=CASE <константа> : <последовательность операторов> */

/*********************************************************************/

Function ProcedureF()

{

global $Tab_Lexems;

global $Number_Lexem;

global $Code_Error;

global $Tab_Constants;

global $Ai;

global $Bi;

global $StekSw;

global $TopSw;

if($Tab_Lexems[$Number_Lexem]->Code!=_CASE_)

{

/* Оператор SWITCH. Некорректная конструкция CASE. */

$Code_Error=47;

return 0;

}

/* функция y4: чтение следующей лексемы ($Number_Lexem++)*/

$Number_Lexem++;

if($Tab_Lexems[$Number_Lexem]->Code!=_CONSTANT_)

{

/* Оператор SWITCH. Некорректная конструкция CASE. */

$Code_Error=47;

return 0;

}

/* y26: снять значение текущей константы в переменную $Ai, */

/* скопировать вершину стека $StekSw (без удаления) в переменную $Bi ($Bi<--$StekSw), */

/* выполнить операцию сравнения между переменной $Ai и $Bi ($Ai = $Bi), */

/* если равенство выполняется, то истина, иначе - ложь;*/

$Ai=$Tab_Constants[$Tab_Lexems[$Number_Lexem]->Value];

if (!Stek_Integer(1, $StekSw, $TopSw, $Bi))

{

/* Нехватка элементов в стеке $StekSw */

$Code_Error = 46;

return 0;

}

if (!Stek_Integer(2, $StekSw, $TopSw, $Bi))

{

/* Переполнение стека $StekSw */

$Code_Error = 45;

return 0;

}

/* функция y4: чтение следующей лексемы ($Number_Lexem++)*/

$Number_Lexem++;

if($Tab_Lexems[$Number_Lexem]->Code!=_TD_)

{

/* Оператор SWITCH. Некорректная конструкция CASE. */

$Code_Error=47;

return 0;

}

/* Если ветка выполняется*/

if($Ai==$Bi)

{

/* функция y4: чтение следующей лексемы ($Number_Lexem++)*/

$Number_Lexem++;

/* Обработка конструкции */

/* <последовательность операторов> */

ProcedureL();

/* Проверка на ошибки, появившиеся в процессе */

/* обработки конструкции */

/* <последовательность операторов> */

if ($Code_Error!=-1)

return 0;

/* у27: снять вершину стека $StekSw в переменную $Ai ($Ai<--$StekSw), */

/* удалить вершину стека $StekSw, поместить в стек $StekSw значение 1 ($StekSw<--1),*/

/* поместить в стек $StekSw значение $Ai ($StekSw<--$Ai);*/

if (!Stek_Integer(1, $StekSw, $TopSw, $Ai))

{

/* Нехватка элементов в стеке $StekSw */

$Code_Error = 46;

return 0;

}

if (!Stek_Integer(1, $StekSw, $TopSw, $Bi))

{

/* Нехватка элементов в стеке $StekSw */

$Code_Error = 46;

return 0;

}

$Bi=1;

if (!Stek_Integer(2, $StekSw, $TopSw, $Bi))

{

/* Переполнение стека $StekSw */

$Code_Error = 45;

return 0;

}

if (!Stek_Integer(2, $StekSw, $TopSw, $Ai))

{

/* Переполнение стека $StekSw */

$Code_Error = 45;

return 0;

}

}

/* Иначе - переходим на другую */

else

{

/* y17: перейти на лексему номер $Tab_Lexems[$Number_Lexem]->Value */

$Number_Lexem=$Tab_Lexems[$Number_Lexem]->Value;

}

return 0;

}/* End ProcedureF */

/*********************************************************************/

/* //ADD */

/* Процедура ProcedureV - дублироване вложенных конструкций <ветвь> */

/* <выбор>::=<ветвь>|<ветвь><выбор> */

/*********************************************************************/

Function ProcedureV()

{

global $Tab_Lexems;

global $Number_Lexem;

global $Code_Error;

/* Обработка конструкции <ветвь> */

ProcedureF();

/* Проверка на ошибки, появившиеся в процессе */

/* обработки конструкции <условие> */

if ($Code_Error!=-1)

return 0;

While($Tab_Lexems[$Number_Lexem]->Code==_CASE_)

{

/* Обработка конструкции <ветвь> */

ProcedureF();

/* Проверка на ошибки, появившиеся в процессе */

/* обработки конструкции <условие> */

if ($Code_Error!=-1)

return 0;

}

return 0;

}/* End ProcedureV */

/*********************************************************************/

/* Процедура ProcedureP - обработка конструкции <множитель> */

/* <множитель>::=<идентификатор>|<идентификатор>++|<константа>|READ|(<выражение>) */

/*********************************************************************/

Function ProcedureP()

{

global $Tab_Lexems;

global $Tab_Constants;

global $Number_Lexem;

global $StekRes;

global $TopRes;

global $ArrIdent;

global $Code_Error;

$NomIdent =0;

$Cifra =0;

$Ai =0;

switch ($Tab_Lexems[$Number_Lexem]->Code):

Case _INC_:

/* Конструкция <множитель>. Неверная конструкция инкремента.*/

$Code_Error=49;

return 0;

Case _IDENTIFIER_ :

/* y1: занесение в стек StekRes идентификатора $Tab_Lexems[$Number_Lexem]->Value */

$NomIdent=$Tab_Lexems[$Number_Lexem]->Value;

if (!Stek_Integer(2, $StekRes, $TopRes, $ArrIdent[$NomIdent]))

{

/* Переполнение стека $StekRes */

$Code_Error=26;

return 0;

}

/* функция y4: чтение следующей лексемы ($Number_Lexem++)*/

$Number_Lexem++;

//ADD

if ($Tab_Lexems[$Number_Lexem]->Code==_INC_)

{

/* y2: удалить вершину стека StekRes. Cнять значение лексемы

/* $Number_Lexem-1 в переменную $Ai ($Ai<--$Tab_Lexems[$Number_Lexem-1]->Value), */

/* увеличить значение идентификатора с номером $Ai на 1 ($ArrayIdent[$Ai]++). */

/* Занести в стек $StekRes значением $ArrIdent[$Ai]. */

if (!Stek_Integer(1, $StekRes, $TopRes, $Ai))

{

/* Нехватка элементов в стеке $StekRes */

$Code_Error=16;

return 0;

}

$Ai=$Tab_Lexems[$Number_Lexem-1]->Value;

$ArrIdent[$Ai]++;

if (!Stek_Integer(2, $StekRes, $TopRes, $ArrIdent[$Ai]))

{

/* Переполнение стека $StekRes */

$Code_Error=26;

return 0;

}

/* функция y4: чтение следующей лексемы ($Number_Lexem++) */

$Number_Lexem++;

}

return 0;

break;

Case _CONSTANT_ :

$NomIdent=$Tab_Lexems[$Number_Lexem]->Value;

/* y2: занесение в стек $StekRes константы $Tab_Lexems[$Number_Lexem].Value;*/

if (!Stek_Integer(2, $StekRes, $TopRes, $Tab_Constants[$NomIdent]))

{

/* Переполнение стека $StekRes */

$Code_Error=26;

return 0;

}

/* функция y4: чтение следующей лексемы */

/* ($Number_Lexem++) */

$Number_Lexem++;

return 0;

break;

Case _READ_ :

/* y3: прочитать целое число из формы в переменную */

/* $Cifra и положить его в $StekRes ($Cifra-->$StekRes),*/

/* чтение целого числа из формы */

global $ct_buf;

global $ct_readBUF; //$ct_readBUF - переменная является стеком для чтения данных вида "1%2%11"

global $ct_readCount;

global $Tab_Identifiers;

global $Tab_Constants;

global $ct_TabLEX_Value_str;

global $ct_TabLEX_Code_str;

$len = count($ct_readBUF); //количество элементов в массиве $ct_readBUF

if($ct_readCount>=$len)

{

echo('<html>

<head>

<title>Ожидается ввод данных от пользователя:</title>

</head>

<body>

<br><h2>ФОРМА ДЛЯ ВВОДА ДАННЫХ</h2> Запрос №: '.($len+1).'<hr><br>');

echo('ВВЕДИТЕ ЦЕЛОЕ ЧИСЛО:<br><br> ');

echo ('<script type="text/javascript">

function ScanForInt() <!--javascript для обработки-->

{

var x=inputform.stdin.value; <!--получаем текущее введённое значение из поля ввода с именем "stdin" в переменную "x"-->

for(i=0;i<=x.length;i++) <!--цикл для прохода по всей строке "x"-->

{

var s=x.substr(i).charCodeAt(); <!--получаем ASCII код i-ого символа-->

if(s<48 || s>57) <!--диапазон кодов (48..57) соответствет в таблице ASCII - целым числам от 0..9 -->

{

alert("Введите целое число"); <!--выдаём сообщение пользователю -->

return false; <!--выходим из скрипта -->

}

}

return x.length>0; <!--возвращаем TRUE, если длина больше 0, иначе FALSE -->

}

</script>

<form name="inputform" action="milan.php" method="POST">

<input type="text" name="stdin" /> <!--в поле с именем "stdin" хранится введённое пользователем число -->

<input name="source" type="hidden" value="'.$ct_buf.'"/> <!--переменная для хранения исходного кода программы MILAN -->

<input name="lex_code" type="hidden" value="'.$ct_TabLEX_Code_str.'"> <!--поле хранит значения CODE таблицы лексем -->

<input name="lex_value" type="hidden" value="'.$ct_TabLEX_Value_str.'"> <!--поле хранит значения VALUE таблицы лексем -->

<input name="tab_ident" type="hidden" value="' .join('%',$Tab_Identifiers). '"> <!--поле хранит данные таблицы идентификаторов -->

<input name="tab_const" type="hidden" value="' .join('%',$Tab_Constants). '"> <!--поле хранит данные таблицы констант -->

<input name="readbuf" type="hidden" value="'. join("%",$ct_readBUF) .'"/> <!--функция join("%",$ct_readBUF) преобразует массив данных в строку разделённую "%" -->

<input name="mode" type="hidden" value="2"> <!--поле хранит текущий режим работы скрипта-->

<!--Кнопка для отправки данных в скрипт "milan.php", в случае получения значения "TRUE" от функции ScanForInt() -->

<input type="button" name="send" value="Отправить" onclick="if(ScanForInt())inputform.submit()">

...

Подобные документы

  • Проектирование лексического и синтаксического анализаторов учебного языка. Правила преобразования логических выражений в ПОЛИЗ. Формирование триад, оптимизация их списка. Логическая структура программы. Тестирование модулей транслятора-интерпретатора.

    курсовая работа [1,3 M], добавлен 28.05.2013

  • Изучение алгоритма рекурсивного спуска и системы построения грамматики с помощью лексического анализатора Lex. Написание программы интерпретатора языка разметки HTML. Проверка входной последовательности на корректность входа как общая функция программы.

    контрольная работа [226,7 K], добавлен 25.12.2012

  • Входная грамматика в структурированной форме. Функции переходов символьного преобразователя. Работа лексического анализатора. Структуры данных, символы действия. Описание семантики перевода. Построение и программная реализация атрибутного преобразователя.

    курсовая работа [128,9 K], добавлен 03.07.2013

  • Аналитический обзор существующих программ-редакторов схем (Microsoft Office Visio 2007, FCEditor, редактор блок-схем). Математическое описание программы и её интерпретатора. Описание системы и руководство пользователя, XML и текст редактора схем.

    дипломная работа [2,1 M], добавлен 07.07.2012

  • Функции и основные компоненты систем программирования. Средства создания программ. Трансляторы языков программирования. Принципы и фазы работы компилятора, трансформация языка программирования в машинный код. Механизм преобразования интерпретатора.

    презентация [3,3 M], добавлен 07.02.2012

  • Описание синтаксиса и семантики входного языка. Описание типов лексем, определение их синтаксиса. Построение диаграммы лексического анализатора, а также его таблицы, тестирование. Построение КС-грамматики входного языка. Описание промежуточного языка.

    курсовая работа [83,0 K], добавлен 23.01.2014

  • Создание интерактивного интерпретатора для мелких вычислений стандартного "Калькулятора" Windows. Его реализация относительно несложного языка программирования, работающий в интерактивном режиме, то есть выполняющий вводимые команды с клавиатуры.

    курсовая работа [287,3 K], добавлен 17.09.2008

  • Методы грамматического разбора при разработке учебного транслятора. Проектирование лексического анализатора и магазинного автомата. Программная реализация синтаксического анализатора текстового языка высокого уровня. Разработка модуля интерпретации.

    курсовая работа [697,2 K], добавлен 06.01.2013

  • Классификация методов оптимизации. Обзор и выбор языка C#. Алгоритмический анализ задачи, описание алгоритма решения. Графические схемы разработанных алгоритмов. Разработка приложения и результаты тестовых испытаний. Интерфейс пользователя, тестирование.

    курсовая работа [1,6 M], добавлен 08.03.2016

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

    дипломная работа [2,8 M], добавлен 21.07.2013

  • Структура, классификация и требования к реализации компилятора. Проектирование и реализация анализирующей части компилятора языка С++. Способы реализации лексического анализа. Алгоритм работы синтаксического анализатора. Принципы программной реализации.

    курсовая работа [774,2 K], добавлен 26.01.2013

  • Основные особенности эволюционных алгоритмов. Описание алгоритмов селекции, мутации, скрещивания, применяемых для реализации генетических алгоритмов. Вычисление функции приспособленности. Программная реализация. Тестирование и руководство пользователя.

    курсовая работа [1,3 M], добавлен 11.03.2014

  • Исследование симметричных алгоритмов блочного шифрования. Минусы и плюсы алгоритма IDEA. Разработка программы аутентификации пользователя и сообщений на основе алгоритма IDEA. Выбор языка программирования. Тестирование и реализация программного средства.

    курсовая работа [314,2 K], добавлен 27.01.2015

  • Разработка программы-интерпретатора, способной получать на входе текстовый файл (в формате ASCII или ANSI) с текстом программы и на выходе выводить на экран результаты вычислений, определяемых программистом. Выбор лексем, интерфейс и листинг программы.

    курсовая работа [132,0 K], добавлен 12.03.2013

  • Методика разработки и частичная реализация транслятора для языка "С" с использованием языка "С++", производящего разбиение на минимальные неделимые конструкции языка исходной цепочки символов основываясь на лексике языка. Анализ работы программы.

    курсовая работа [841,3 K], добавлен 19.03.2012

  • Аналитический обзор средств и языков описания интеллектуальных порталов. Устройство и особенности языка технологии OSTIS, результаты ее анализа. Разработка предметно-ориентированного языка проектирования интеллектуальных порталов. Описание пример модели.

    дипломная работа [2,5 M], добавлен 08.11.2015

  • Нормализация предметной области "Сайт знакомств" и ее программная реализация с использованием СУБД MySQL, языка HTML, технологии PHP и ADO, скриптовых языков VBScript или JavaScript. Руководство программиста, тестирование, исходный текст приложения.

    реферат [29,0 K], добавлен 09.09.2010

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

    контрольная работа [704,9 K], добавлен 01.02.2013

  • Целые числа в позиционных системах счисления. Недостатки двоичной системы. Разработка алгоритмов, структур данных. Программная реализация алгоритмов перевода в различные системы счисления на языке программирования С. Тестирование программного обеспечения.

    курсовая работа [593,3 K], добавлен 03.01.2015

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

    дипломная работа [2,6 M], добавлен 27.10.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.