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