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(); }