void Parser int pl0 pl1 pl2 pl3 if c_type LEX_IF Если следующяя лексем

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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();
}