////////////////////////////////////////// // return value: 0, execute new statement. // -20, abort it. // other error codes from readStmt() ////////////////////////////////////////// Int32 InputStmt::fix(Int32 append_only) { Int32 retval = 0; if (!append_only) { Option option; StringFragment * fragment = first_fragment; while (fragment) { char * new_fragment = new char[MAX_FRAGMENT_LEN + 1]; option = fix_string(fragment->fragment,new_fragment,MAX_FRAGMENT_LEN); if (option == ABORT_O) return -20; // caller is responsible for deleting this InputStmt delete [] fragment->fragment; fragment->fragment = new_fragment; fragment = fragment->next; } } else { retval = readStmt(NULL/*interactive only, so input is stdin*/); } // Pack (or repack) the new stmt. pack(); return retval; } // fix()
/*Conjunto de Construções*/ void SyntaxAnalysis::expression() { Token::Token tokenTemp = vecToken[0]; Token::Token recover; Tree::Tree * tempTree = subTree; setAndAdvance(EXPSTRING); switch (tokenTemp.getTokenType()) { case(Token::INTEGER): case(Token::FLOAT): case(Token::VOID): targetAdvance(); variableDecStmt(); break; case(Token::WRITE): writeStmt(); break; case(Token::READ): readStmt(); break; case(Token::RETURN): returnValue(); break; case(Token::IDENTIFIER): recover = tokenTemp; tokenTemp = targetAdvance(); switch (tokenTemp.getTokenType()) { case(Token::ATTRIBUTION): attributionStmt(); break; case(Token::OPEN): functionCallStmt(); break; default: this->error.expressionError(recover); } break; case(Token::IF): ifStmt(); break; case(Token::REPEAT): whileStmt(); break; default: this->error.expressionError(tokenTemp); } subTree = tempTree; }