Исследование методов и алгоритмов работы трансляторов предметно-ориентированных языков
Обзор методов и алгоритмов работы интерпретатора языка МИЛАН. Грамматика модифицированного языка в виде диаграмм Вирта. Описание лексического анализатора и интерпретатора модифицированного языка МИЛАН. Программная реализация и тестирование интерпретатора.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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">Т А Б Л И Ц А Л Е К С Е М</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> </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">МАССИВ ИДЕНТИФИКАТОРОВ </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">МАССИВ КОНСТАНТ </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