kursovik / прогам реализация
.docx{
/* перейти на лексему номер $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: снять значение текущей лексемы в