utArray<Statement *> *TypeCompiler::visitStatementArray( utArray<Statement *> *_statements) { if (_statements != NULL) { utArray<Statement *>& statements = *_statements; for (unsigned int i = 0; i < statements.size(); i++) { statements[i] = visitStatement(statements[i]); } } return _statements; }
void TreeBuilder::visitNode(StmtGroup &node) { for (Token token = m_scanner->scan(); token.getType() != Token::Type_EOF; token = m_scanner->scan()) { if (token.getType() == Token::Type_IDENTIFIER) { StmtPtr stmt = visitStatement(token); if (stmt->isValid()) { node.pushBack(stmt); } } else { std::string message = "Unexpected token: " + token.classify(); notify(Error::ErrorInfo(message, token)); if (token.getType() != Token::Type_SEMICOLON) restoreScannerState(); } } }
/** * @brief TreeBuilder::visitNode * @param node * * Looks for variable name and statement, checks syntax correctness */ void TreeBuilder::visitNode(WhileStmt &node) { Token token = m_scanner->scan(); if (token.getType() != Token::Type_LBRACKET) { std::string message = "Expected '(' in while condition, got " + token.classify(); notify(Error::ErrorInfo(message, token)); if (token.getType() != Token::Type_SEMICOLON) restoreScannerState(); return; } token = m_scanner->scan(); if (token.getType() != Token::Type_IDENTIFIER) { std::string message = "Expected variable name in while condition, got " + token.classify(); notify(Error::ErrorInfo(message, token)); if (token.getType() != Token::Type_SEMICOLON) restoreScannerState(); return; } if (!ASTInterpreter::isVariableSupported(token.getValue())) { notify(Error::ErrorInfo("Variable not supported", token)); restoreScannerState(); return; } node.setVarName(token.getValue()); token = m_scanner->scan(); if (token.getType() != Token::Type_RBRACKET) { std::string message = "Expected ')' in while condition, got " + token.classify(); notify(Error::ErrorInfo(message, token)); if (token.getType() != Token::Type_SEMICOLON) restoreScannerState(); return; } token = m_scanner->scan(); if (token.getType() != Token::Type_IDENTIFIER) { std::string message = "Expected statement after while, got " + token.classify(); notify(Error::ErrorInfo(message, token)); if (token.getType() != Token::Type_SEMICOLON) restoreScannerState(); return; } StmtPtr stmt = visitStatement(token); if (stmt && (stmt->isValid())) { node.statement() = stmt; } }
FunctionStmtAST *Parser::visitFunctionStatement(PrototypeAST *proto) { int bkup = Tokens->getCurIndex(); if (Tokens->getCurString() == "{") { Tokens->getNExtToken(); } else { return NULL; } FunctionStmtAST *func_stmt = new FunctionStmtAST(); for (int i = 0; i < proto->getParamNum(); i++) { VariableDecAST *vdecl = new VariableDeclAST(proto->getParamName(i)); vdecl->setDeclType(VariableDeclAST::param); func_stmt->addVariableDeclaration(vdecl); VariableTable.push_back(vdecl->getName()); } VariableDeclAST *var_decl; BaseAST *stmt; BaseAST *last_stmt; if (stmt = visitStatement()) { while(stmt) { last_stmt = stmt; func_stmt->addStatement(stmt); stmt = visitStatement(); } } else if (var_decl = visitVariableDeclaration()) { while (var_decl) { var_decl->setDeclType(VariableDeclAST::local); if (std::find(VariableTable.begin(), VariableTable.end(), var_decl->getName()) != VariableTable.end()) { SAFE_DELETE(var_decl); SAFE_dELETE(func_stmt); return NULL; } func_stmt->addVariableDeclaration(var_decl); VariableTable.push_back(var_decl->getName()); var_decl = visitVariableDeclaration(); } if (stmt = visitStatement()) { while (stmt) { last_stmt = stmt; func_stmt->addStatement(stmt); stmt = visitStatement(); } } } else { SAFE_DELETE(func_stmt); Tokens->applyTokenIndex(bkup); return NULL; } if (!last_stmt || !llvm::isa<JumpStmtAST>(last_stmt)) { SAFE_DELETE(func_stmt); Tokens->applyTokenIndex(bkup); return NULL; } if (Tokens->getCurString() == "}") { Tokens->getNextToken(); return func_stmt; } else { SAFE_DE+ETE(func_stmt); Tokens->applyTokenIndex(bkup); return NULL; } }