/*** Parse from zero-level ***/ void Parser::parse() { if(hasTokens() && peekToken().getType() == T_EOL) parseSeparation(); while(hasTokens()) { // if(peekToken().getType() == T_PROC) // parseProcedureDefinition(); // else if(peekToken().getType() == T_FUN) // parseFunctionDefinition(); // else if(peekToken().getType() == T_PROC) { parseProcedure(); parseSeparation(); } else if(peekToken().getType() == T_FUN) { parseFunction(); parseSeparation(); } else { list->pushNode(parseStatement()); parseSeparation(); } } // VariableManager manager; }
//lead into the program void Parser::parseBlock() { ++it; switch (it->tag) { case CONSTANT: parseConstant(); parseBlock(); break; case VAR: parseVariables(); parseBlock(); break; case TYPE: parseType(); parseBlock(); break; case FUNCTION: parseFunction(); parseBlock(); break; case PROCEDURE: parseProcedure(); parseBlock(); break; case BEGIN: { shared_ptr<Statement> block = parseStmtList(currNode == root ? FINISH : END); //root的block与函数的block if (currNode != root) { (static_pointer_cast<FunctionStmt>(currNode))->body=block; } else { block->value.value = "__Main__"; currNode->addNode(block); } bool tmp=it->tag == FINISH || it->tag == END; if (it->tag == END) { it++; match(SEMI); } } break; } }