void Parser::S ()
{
int pl0, pl1, pl2, pl3;
if (c_type == LEX_IF) // Если следующяя лексема - if
{
gl(); // получаем следующую лексему
E();
eq_bool(); // проверка текущей лексемы булька она или нет
pl2 = prog.get_free (); // получаем топовый индекс массива лексем
prog.blank(); //увеличили счетчик лексем на единицу (free++)
prog.put_lex (Lex(POLIZ_FGO)); //кладем лексему в программу
if (c_type == LEX_THEN) // Если следующяя лексема then
{
gl(); // получаем следующую лексему
S();
pl3 = prog.get_free(); // получаем топовый индекс массива лексем
prog.blank(); //увеличили счетчик лексем на еднициу (free++)
prog.put_lex (Lex(POLIZ_GO)); //кладем лексему в программу
prog.put_lex (Lex(POLIZ_LABEL, prog.get_free()), pl2); //кладем лексему в свободное место
if (c_type == LEX_ELSE) // Если следующяя лексема else
{
gl(); // получаем следующую лексему
S();
prog.put_lex (Lex(POLIZ_LABEL, prog.get_free()), pl3); //кладем лексему в свободное место
}
else
throw curr_lex; // в противном случае ошибка
}
else
throw curr_lex; // в противном случае ошибка
}//end if
else if (c_type == LEX_WHILE) // Если следующяя лексема while
{
pl0=prog.get_free(); // получаем топовый индекс массива лексем
gl(); // получаем следующую лексему
E();
eq_bool(); // проверка на бульку(булька ли наша лексема)
pl1=prog.get_free(); // получаем топовый индекс массива лексем
prog.blank(); /////////////////////////////////////
prog.put_lex (Lex(POLIZ_FGO)); /////////////////////////////////////
if (c_type == LEX_DO) // Если следующяя лексема do
{
gl(); // получаем следующую лексему
S();
prog.put_lex (Lex (POLIZ_LABEL, pl0)); /////////////////////////////////////
prog.put_lex(Lex(POLIZ_GO)); /////////////////////////////////////
prog.put_lex(Lex(POLIZ_LABEL, prog.get_free()), pl1); /////////////////////////////////////
}
else
throw curr_lex;// в противном случае ошибка
}//end while
else if (c_type == LEX_READ) // Если следующяя лексема read
{
gl(); // получаем следующую лексему
if (c_type == LEX_LPAREN) // Если следующяя лексема (
{
gl(); // получаем следующую лексему
if (c_type == LEX_ID) //Если следующяя лексема равна LEX_ID - id лексемы в таблице TID
{
check_id_in_read(); // переменная обьявлена
prog.put_lex (Lex ( POLIZ_ADDRESS, c_val) ); /////////////////////////////////////
gl(); // получаем следующую лексему
}
else
throw curr_lex; // в противном случае ошибка
if ( c_type == LEX_RPAREN ) // Если следующяя лексема )
{
gl(); // получаем следующую лексему
prog.put_lex (Lex (LEX_READ)); /////////////////////////////////////
}
else
throw curr_lex; // в противном случае ошибка
}
else
throw curr_lex; // в противном случае ошибка
}//end read
else if (c_type == LEX_WRITE) //Если следующяя лексема write
{
gl(); // получаем следующую лексему
if (c_type == LEX_LPAREN) // Если следующяя лексема (
{
gl(); // получаем следующую лексему
E();
if (c_type == LEX_RPAREN) // Если следующяя лексема )
{
gl(); // получаем следующую лексему
prog.put_lex (Lex(LEX_WRITE)); /////////////////////////////////////
}
else
throw curr_lex; // в противном случае ошибка
}
else
throw curr_lex; // в противном случае ошибка
}//end write
else if (c_type == LEX_ID) // Если следующяя лексема равна LEX_ID - id лексемы в таблице TID
{
check_id (); // тип текущей лексемы
prog.put_lex (Lex ( POLIZ_ADDRESS, c_val) ); /////////////////////////////////////
gl();
if ( c_type == LEX_ASSIGN )// Если следующяя лексема равна :=
{
gl(); // получаем следующую лексему
E();
eq_type(); // проверка типа
prog.put_lex (Lex (LEX_ASSIGN) ); /////////////////////////////////////
}
else
throw curr_lex; // в противном случае ошибка
}//assign-end
else
B();
}