Пример #1
0
void Parser::parseBlockBody() {
  Token t = lex.peek();
  if (t.type == Token::LBRACE) {
    lex.consume(Token::LBRACE);
    parseStatements();
    lex.consume(Token::RBRACE);
  } else {
    switch (t.type) {
      case Token::FLOAT:
      case Token::STRING:
      case Token::COLOR:
      case Token::POINT:
      case Token::VECTOR:
      case Token::NORMAL:
      case Token::MATRIX:
      case Token::UNIFORM:
      case Token::VARYING:
        parseVariableDecl();
        break;
      case Token::IDENTIFIER:
        if (lex.peek(2).type == Token::LPAREN)
          parseCallStmt();
        else
          parseAssignmentStmt();
        break;
      case Token::SEMI:
        lex.consume(Token::SEMI);
        break;
      case Token::IF:
        parseIfStmt();
        break;
      case Token::FOR:
        parseForLoop();
        break;
      case Token::WHILE:
        parseWhileLoop();
        break;
      case Token::SOLAR:
        parseSolarLoop();
        break;
      case Token::ILLUMINATE:
        parseIlluminateLoop();
        break;
      case Token::ILLUMINANCE:
        parseIlluminanceLoop();
        break;
      case Token::BREAK:
        parseBreakStmt();
        break;
      case Token::CONTINUE:
        parseContinueStmt();
        break;
      case Token::RETURN:
        parseReturnStmt();
        break;
      default:
        assert(0 && "Expected a statement!");
    }
  }
}
Пример #2
0
/***************************************************************
* Function: CodeParser::parseStatement()
* Purpose : Parse the XML code of a statement
* Initial : Maxime Chevalier-Boisvert on November 5, 2008
****************************************************************
Revisions and bug fixes:
*/
Statement* CodeParser::parseStatement(const XML::Element* pElement)
{
	// If this is an expression statement
	if (pElement->getName() == "ExprStmt")
	{
		// Parse the expression statement
		return parseExprStmt(pElement);
	}

	// If this is an assignment statement
	else if (pElement->getName() == "AssignStmt")
	{
		// Parse the assignment statement
		return parseAssignStmt(pElement);
	}

	// If this is an if-else statement
	else if (pElement->getName() == "IfStmt")
	{
		// Parse the if-else statement
		return parseIfStmt(pElement);
	}

	// If this is a switch statement
	else if (pElement->getName() == "SwitchStmt")
	{
		// Parse the switch statement
		return parseSwitchStmt(pElement);
	}

	// If this is a for loop statement
	else if (pElement->getName() == "ForStmt")
	{
		// Parse the for loop statement
		return parseForStmt(pElement);
	}

	// If this is a while loop statement
	else if (pElement->getName() == "WhileStmt")
	{
		// Parse the while loop statement
		return parseWhileStmt(pElement);
	}

	// If this a break statement
	else if (pElement->getName() == "BreakStmt")
	{
		// Create and return a break statement object
		return new BreakStmt();
	}

	// If this a continue statement
	else if (pElement->getName() == "ContinueStmt")
	{
		// Create and return a continue statement object
		return new ContinueStmt();
	}

	// If this a return statement
	else if (pElement->getName() == "ReturnStmt")
	{
		// Parse the return statement
		return parseReturnStmt(pElement);
	}

	// Otherwise
	else
	{
		// This is an invalid statement type, throw an exception
		throw XML::ParseError("Invalid statement type: \"" + pElement->getName() + "\"", pElement->getTextPos());
	}
}