Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

kursovik / прогам реализация

.docx
Скачиваний:
28
Добавлен:
02.04.2015
Размер:
94.79 Кб
Скачать

{

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

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

return 0;

}

}

else

{

/* Конструкция <оператор>. Неверный оператор WHILE. */

$Code_Error=19;

return 0;

}

}

break;

case _IF_ :

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

$Number_Lexem++;

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

ProcedureB();

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

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

if ($Code_Error!=-1)

return 0;

/* y18: в переменную $Ai снять элемент со стека $StekRes */

/* ($Ai<--$StekRes), если $Ai=1, то это истина, */

/* иначе - ложь */

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

{

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

$Code_Error=16;

return 0;

}

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

{

/* Конструкция <оператор>. */

/* Отсутствует THEN в операторе IF. */

$Code_Error=20;

return 0;

}

/* проверка истинности условия: $Ai==1 (TRUE), */

/* $Ai==0 (FALSE) */

if ($Ai==1) /* Обработка TRUE */

{

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

$Number_Lexem++;

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

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

ProcedureL();

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

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

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

if ($Code_Error!=-1)

return 0;

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

{

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

/* */

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

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

{

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

$Number_Lexem++;

return 0;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует ENDIF в операторе IF.*/

$Code_Error=21;

return 0;

}

}

elseif ($Tab_Lexems[$Number_Lexem]->Code==_ENDIF_)

{

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

$Number_Lexem++;

return 0;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует ENDIF в операторе IF.*/

$Code_Error=21;

return 0;

}

}

else /* Обработка FALSE */

{

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

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

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

{

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

$Number_Lexem++;

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

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

ProcedureL();

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

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

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

if ($Code_Error!=-1)

return 0;

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

{

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

$Number_Lexem++;

return 0;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует ENDIF в операторе IF.*/

$Code_Error=21;

return 0;

}

}

elseif ($Tab_Lexems[$Number_Lexem]->Code==_ENDIF_)

{

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

$Number_Lexem++;

return 0;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует ELSE или ENDIF в операторе IF.*/

$Code_Error=22;

return 0;

}

}

break;

case _SWITH_ :

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

$Number_Lexem++;

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

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

$Number_Lexem++;

else

{

/* Конструкция <оператор>. */

/* Отсутствует ( в операторе SWITH.*/

$Code_Error=34;

return 0;

}

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

ProcedureE();

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

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

if ($Code_Error!=-1)

return 0;

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

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

$Number_Lexem++;

else

{

/* Конструкция <оператор>. */

/* Отсутствует ) в операторе SWITH.*/

$Code_Error=35;

return 0;

}

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

{

/*функция у21: снять вершину стека $StekRes в переменную $Ai [$StekRes->$Ai];

отправить значение переменной $Ai в стек $StekCaseValue[$Ai->$StekCaseValue];

в стек $StekDefaultValue занести 1 [$StekDefaultValue->1]*/

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

{

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

$Code_Error=16;

return 0;

}

if (!Stek_Integer(2, $StekCaseValue, $TopCaseValue, $Ai))

{

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

$Code_Error=36;

return 0;

}

$Ai=1;

if (!Stek_Integer(2, $StekDefaultValue, $TopDefaultValue, $Ai))

{

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

$Code_Error=37;

return 0;

}

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

$Number_Lexem++;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует { в операторе SWITH.*/

$Code_Error=38;

return 0;

}

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

{

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

$Number_Lexem++;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует CASE в операторе SWITH.*/

$Code_Error=39;

return 0;

}

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

{

/*функция у22: y22: снять вершину стека $StekCaseValue в переменную $Ai [$StekCaseValue ->$Ai];

отправить значение переменной $Ai в стек $StekCaseValue [$Ai-> $StekCaseValue];

значение прочитанной константы занести в $Bi[$Tab_Constants[$Tab_Lexems[$Number_Lexem]->Value]];

сравнить $Ai и $bi: $Ai==$Bi – движение по TRUE, иначе по FALSE; */

if (!Stek_Integer(1, $StekCaseValue, $TopCaseValue, $Ai))

{

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

$Code_Error=16;

return 0;

}

if (!Stek_Integer(2, $StekCaseValue, $TopCaseValue, $Ai))

{

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

$Code_Error=40;

return 0;

}

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

if ($Ai==$Bi)

$Ai=1;

else

$Ai=0;

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

$Number_Lexem++;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует константа в операторе SWITH.*/

$Code_Error=41;

return 0;

}

if ($Ai==1)

{

/*функция у23: снять вершину стека $StekDefaultValue в переменную $ai[$StekDefaultValue->$Ai];

переменной $Ai присвоить значение 0[$Ai=0];

отправить переменную $Ai в стек $StekDefaultValue[$Ai->$StekDefaultValue];*/

if (!Stek_Integer(1, $StekDefaultValue, $TopDefaultValue, $Ai))

{

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

$Code_Error=42;

return 0;

}

$Ai=0;

if (!Stek_Integer(2, $StekDefaultValue, $TopDefaultValue, $Ai))

{

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

$Code_Error=37;

return 0;

}

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

{

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

$Number_Lexem++;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует : в операторе SWITH.*/

$Code_Error=43;

return 0;

}

ProcedureL();

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

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

if ($Code_Error!=-1)

return 0;

}

else

{

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

{

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

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

номеру текущей лексемы присвоить значение $Ai [$Ai->$Number_Lexem]*/

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

$Number_Lexem=$Ai;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует : в операторе SWITH.*/

$Code_Error=43;

return 0;

}

}

ProcedureZ();

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

/* обработки конструкции <содержимое> */

if ($Code_Error!=-1)

return 0;

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

{

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

переменную $Ai[$StekCaseValue->$Ai];*/

if (!Stek_Integer(1, $StekCaseValue, $TopCaseValue, $Ai))

{

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

$Code_Error=40;

return 0;

}

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

$Number_Lexem++;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует } в операторе SWITH.*/

$Code_Error=44;

return 0;

}

break;

case _FOR_ :

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

$Number_Lexem++;

/*Обработка возможного преддекремента*/

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

ProcedureX();

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

/* обработки преддекремента */

if ($Code_Error!=-1)

return 0;

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

{

/* y13:добавить значение лексемы с номером $Number_Lexem */

/* в стек $StekIdent ($Tab_Lexems[$Number_Lexem]->Value-->$StekIdent)*/

if (!Stek_Integer(2, $StekIdent, $TopIdent,$Tab_Lexems[$Number_Lexem]->Value))

{

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

$Code_Error=14;

Exit;

}

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

$Number_Lexem++;

}

else

{

/*Ошибка в FOR - нет идентификатора*/

$Code_Error=48;

return 0;

}

/* Обработка возможного постдекремента*/

ProcedureY();

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

{

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

$Number_Lexem++;

}

else

{

/*Ошибка в FOR - нет присвоения*/

$Code_Error=49;

echo "Нет присвоения";

return 0;

}

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

ProcedureE();

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

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

if ($Code_Error!=-1)

return 0;

/* y14: в переменную $Ai снять элемент со стека $StekRes*/

/* ($Ai<--$StekRes), в переменную $Bi снять со стека */

/* $StekIdent значение лексемы ident ($Bi<--$StekIdent), */

/* идентификатору с номером $Bi, присвоить значение $Ai */

/* $ArrIdent[$Bi]=$Ai */

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

{

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

$Code_Error=16;

return 0;

}

if (!Stek_Integer(1, $StekIdent, $TopIdent, $Bi))

{

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

$Code_Error=17;

return 0;

}

if (!Stek_Integer(2, $StekIdent, $TopIdent, $Bi))

{

/* Переполнение в стеке $StekIdent */

$Code_Error=14;

return 0;

}

$ArrIdent[$Bi]=$Ai;

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

{

/*функция y29: значение текущей лексемы занести в стек

$StekForExit [$Tab_Lexems[$Number_Lexem]->Value -> $StekForExit];*/

if (!Stek_Integer(2, $StekForExit, $TopForExit, $Tab_Lexems[$Number_Lexem]->Value))

{

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

$Code_Error=52;

return 0;

}

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

$Number_Lexem++;

}

else

{

/*Ошибка в FOR - нет TO */

$Code_Error=50;

return 0;

}

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

ProcedureE();

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

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

if ($Code_Error!=-1)

return 0;

/*функция у27: y27: снять вершину стека $StekRes в переменную $ai[$StekRes->$Ai];*/

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

{

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

$Code_Error=16;

return 0;

}

ProcedureU();

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

/* обработки конструкции <шаг> */

if ($Code_Error!=-1)

return 0;

ProcedureL();

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

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

if ($Code_Error!=-1)

return 0;

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

{

/*y28: значение текущей лексемы занести в $Ai [$Tab_Lexems[$Number_Lexem]->Value -> $Ai];

номеру текущей лексемы присвоить значение переменной $Ai [$Ai->$Number_Lexem]*/

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

$Number_Lexem=$Ai;

}

else

{

/*Ошибка в FOR - нет ENDFOR */

$Code_Error=51;

return 0;

}

while ($ForWhile)

{

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

ProcedureE();

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

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

if ($Code_Error!=-1)

return 0;

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

переменную $ForAi[$StekRes->$ForAi];*/

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

{

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

$Code_Error=16;

return 0;

}

ProcedureU();

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

/* обработки конструкции <шаг> */

if ($Code_Error!=-1)

return 0;

/*функция у31: переменную $ForAi занести в переменную $ForBi[U()->$ForBi];

занести в переменную $ForCi вершину стека $StekIdent [$StekIdent->$ForCi];

занести в стек $StekIdent значение переменной $ForCi [$ForCi->$StekIdent];

занести в переменную $ForDi значение идентификатора с номером $ForCi[ArrIdent[$ForCi]->$ ForDi];

сравнить $ForDi+$ForBi и $ForAi: $ForDi+$ForBi<=$ForAi – движение по ветке TRUE, иначе по FALSE*/

$ForBi=$Ai;

if (!Stek_Integer(1, $StekIdent, $TopIdent,$ForCi))

{

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

$Code_Error=17;

return 0;

}

if (!Stek_Integer(2, $StekIdent, $TopIdent,$ForCi))

{

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

$Code_Error=14;

return 0;

}

$ForDi=$ArrIdent[$ForCi];

$ForDi+=$ForBi;

// Ветка TRUE

if (($ForDi < $ForAi) or ($ForDi == $ForAi) )

{

/*функция y32: значение идентификатора с номером $ForCi увеличить на

значение переменной $ForBi[$ForCi+=$ForBi];*/

$ArrIdent[$ForCi]+=$ForBi;

ProcedureL();

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

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

if ($Code_Error!=-1)

return 0;

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

{

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

$Number_Lexem=$Ai;

}

else

{

/*Ошибка в FOR - нет ENDFOR */

$Code_Error=51;

return 0;

}

}

else

// Ветка FALSE

{

/*функция y33: снять вершину стека $StekForExit в $Ai [$StekForExit->$Ai];

текущему номеру лексемы присвоить значение переменной $Ai [$Ai->$NumberLexem]

извлечь из стека $StekIdent в переменную $ForCi [$StekIdent->$ForCi]*/

if (!Stek_Integer(1, $StekForExit, $TopForExit,$Ai))

{

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

$Code_Error=53;

return 0;

}

$Number_Lexem=$Ai;

if (!Stek_Integer(1, $StekIdent, $TopIdent,$ForCi))

{

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

$Code_Error=17;

return 0;

}

$ForWhile=0;

}

}

break;

endswitch;

/*y36:снять вершину стека $StekPostDecCount в переменную $Ai [$StekPostDecCount->$Ai];

снять вершину $StekPostDec в переменную $Bi [$StekPostDec->$Bi],

идентификатор с номером $Bi уменьшить на 1[ArrIdent[$ai]--], уменьшить $Ai на 1

[$Ai--] и выполнять эту операцию до обнуления $Ai;*/

if (!Stek_Integer(1, $StekPostDecCount, $TopPostDecCount, $Ai))

{

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

$Code_Error=61;

return 0;

}

while ($Ai)

{

if (!Stek_Integer(1, $StekPostDec, $TopPostDec, $Bi))

{

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

$Code_Error=59;

return 0;

}

$ArrIdent[$Bi]--;

$Ai--;

}

return 0;

} /* End ProcdureS */

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

/* Процедура ProcedureU - обработка конструкции */

/* <шаг> ::= STEP <выражение> */

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

function ProcedureU(){

global $Number_Lexem;

global $StekRes;

global $TopRes;

global $Code_Error;

global $Ai;

global $Tab_Lexems;

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

{

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

$Number_Lexem++;

ProcedureE();

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

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

if ($Code_Error!=-1)

return 0;

/*функция y37: снять вершину стека $StekRes в переменную $Ai [$StekRes->$Ai];*/

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

{

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

$Code_Error=16;

return 0;

}

}

else

{

/*функция y38: Переменной $Ai присвоить значение 1 [$Ai->1]*/

$Ai=1;

}

} /*end of ProcedureU */

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

/* Процедура ProcedureZ - обработка конструкции */

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

/* <содержимое> | DEFAUT : <последовательность_операторов> | ? */

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

function ProcedureZ(){

global $TopRes;

global $StekRes;

global $StekCaseValue;

global $TopCaseValue;

global $TopDefaultValue;

global $StekDefaultValue;

global $Tab_Lexems;

global $Number_Lexem;

global $Tab_Constants;

global $Code_Error;

global $StekIdent;

global $TopIdent;

global $ArrIdent;

global $Ai;

global $Bi;

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

{

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

$Number_Lexem++;

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

{

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

переменную $Ai [$StekCaseValue ->$Ai]; отправить значение

переменной $Ai в стек $StekCaseValue [$Ai-> $StekCaseValue];

значение прочитанной константы занести в $Bi

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

сравнить $Ai и $Bi: $Ai==$Bi – движение по TRUE, иначе по FALSE;*/

if (!Stek_Integer(1, $StekCaseValue, $TopCaseValue, $Ai))

{

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

$Code_Error=16;

return 0;

}

if (!Stek_Integer(2, $StekCaseValue, $TopCaseValue, $Ai))

{

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

$Code_Error=40;

return 0;

}

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

if ($Ai==$Bi)

$Ai=1;

else

$Ai=0;

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

$Number_Lexem++;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует константа в операторе SWITH.*/

$Code_Error=41;

return 0;

}

/* Ветка TRUE */

if ($Ai)

{

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

переменную $ai[$StekDefaultValue->$Ai]; переменной $Ai

присвоить значение 0[$Ai=0]; отправить переменную $Ai в стек

$StekDefaultValue[$Ai->$StekDefaultValue];*/

if (!Stek_Integer(1, $StekDefaultValue, $TopDefaultValue, $Ai))

{

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

$Code_Error=42;

return 0;

}

$Ai=0;

if (!Stek_Integer(2, $StekDefaultValue, $TopDefaultValue, $Ai))

{

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

$Code_Error=36;

return 0;

}

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

{

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

$Number_Lexem++;

}

else

{

/* Конструкция <оператор>. */

/* Отсутствует : в операторе SWITH.*/

$Code_Error=43;

return 0;

}

ProcedureL();

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

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

if ($Code_Error!=-1)

return 0;

}

/* Ветка FALSE */

else

{

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

{

/* функция y24: снять значение текущей лексемы в

Соседние файлы в папке kursovik