Beispiel #1
0
/*** 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;
}
Beispiel #2
0
	//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;
		}
	}