Пример #1
0
AST* Parser::statement(Scope* ps)
{
    AST* ret = NULL;

    if (expect(";"))
    {
        ret = emptyStatement();
    }
    else if (expect("var"))
    {
        ret = varStatement(ps);
        opteol();
    }
    else if (expect("{"))
    {
        ret = block(ps);
        opteol();
    }
    else if (expect("if"))
    {
        ret = ifStatement(ps);
    }
    else if (expect("switch"))
    {
        ret = switchStatement(ps);
    }
    else if (expect("do"))
    {
        ret = doStatement(ps);
        opteol();
    }
    else if (expect("while"))
    {
        ret = whileStatement(ps);
    }
    else if (expect("for"))
    {
        ret = forStatement(ps);
    }
    else if (expect("with"))
    {
        ret = withStatement(ps);
    }
    else if (expect("continue"))
    {
        ret = continueStatement();
        opteol();
    }
    else if (expect("break"))
    {
        ret = breakStatement();
        opteol();
    }
    else if (expect("return"))
    {
        ret = returnStatement(ps);
        opteol();
    }
    else if (expect("try"))
    {
        ret = tryStatement(ps);
    }
    else if (expect("throw"))
    {
        ret = throwStatement(ps);
        opteol();
    }
    else
    {
        ret = expression(0, ps);
        opteol();
    }

    return ret;
}
Пример #2
0
void GoCodeFormatter::recalculateStateAfter(const QTextBlock &block)
{
    restoreCurrentState(block.previous());

    const LexerState lexerState(tokenizeBlock(block));

    m_newStates.clear();

    int currentState;
    for (m_index = 0; m_index < m_tokens.count(); ++m_index) {
        currentState = m_currentState.top().state;
        m_tk = m_tokens.at(m_index);
        switch (currentState) {
        case TopMost:
            tryDeclaration();
            break;
        case PackageClause:
            switch (m_tk.kind()) {
            case T_IDENTIFIER:  leave(); break;
            default:            break;
            }
            break;
        case ImportDecl:
            switch (m_tk.kind()) {
            case T_LPAREN:      enter(ImportOpen); break;
            case T_STRING:      leave(); break;
            default:            break;
            }
            break;
        case ImportOpen:
            switch (m_tk.kind()) {
            case T_RPAREN:      leave(); leave(); break;
            default:            break;
            }
            break;
        case InterfaceDecl:
            switch (m_tk.kind()) {
            case T_LBRACE:      enter(InterfaceOpen); break;
            default:            break;
            }
            break;
        case InterfaceOpen:
            switch (m_tk.kind()) {
            case T_RBRACE:      leave(); leave(); break;
            default:            break;
            }
            break;
        case StructDecl:
            switch (m_tk.kind()) {
            case T_LBRACE:      enter(StructOpen); break;
            default:            break;
            }
            break;
        case StructOpen:
            switch (m_tk.kind()) {
            case T_RBRACE:      leave(); leave(); break;
            default:            break;
            }
            break;
        case TypeDecl:
            switch (m_tk.kind()) {
            case T_LPAREN:      enter(TypeOpen); break;
            case T_INTERFACE:   leave(); enter(InterfaceDecl); break;
            case T_STRUCT:      leave(); enter(StructDecl); break;
            default:            leave(); break;
            }
            break;
        case TypeOpen:
            switch (m_tk.kind()) {
            case T_INTERFACE:   leave(); enter(InterfaceDecl); break;
            case T_STRUCT:      enter(StructDecl); break;
            case T_RPAREN:      leave(); leave(); break;
            default:            break;
            }
            break;
        case IdentDecl:
            leave(); break; // TODO: implement
            /*
            switch (m_tk.kind()) {
            case T_LPAREN:      enter(IdentArgs); break;
            case T_LBRACE:      enter(IdentFields); break;
            default:            leave(); break;
            }
            break;
        case IdentArgs:
            switch (m_tk.kind()) {
            case T_RPAREN:      leave(); break;
            default:            break;
            }
            break;
        case IdentFields:
            switch (m_tk.kind()) {
            case T_RBRACE:      leave(); break;
            default:            break;
            }
            break;*/
        case ConstDecl:
            leave(); break; // TODO: implement
        case VarDecl:
            leave(); break; // TODO: implement
            /*
            switch (m_tk.kind()) {
            case T_LPAREN:      enter(VarOpen); break;
            case T_EQUAL:       enter(VarExpr); break;
            default:            break;
            }
            break;
        case VarOpen:
            switch (m_tk.kind()) {
            case T_RPAREN:      leave(); leave(); break;
            default:            if (!tryDeclaration()) leave(); break;
            }
            break;
        case VarExpr:
            if (tryDeclaration())
                break;
            else
                leave();
            break;*/
        case FuncDecl:
            switch (m_tk.kind()) {
            case T_LBRACE:      enter(FuncOpen); break;
            case T_LPAREN:      enter(FuncParams); break;
            default:            break;
            }
            break;
        case FuncOpen:
            switch (m_tk.kind()) {
            case T_RBRACE:      leave(); leave(); break;
            default:            tryStatement(); break;
            }
            break;
        case FuncParams:
            switch (m_tk.kind()) {
            case T_RPAREN:      leave(); break;
            default:            break;
            }
            break;
        case BlockOpen:
            switch (m_tk.kind()) {
            case T_RBRACE:      leave(); break;
            default:            tryStatement(); break;
            }
            break;
        case GroupOpen:
            switch (m_tk.kind()) {
            case T_RPAREN:      leave(); break;
            default:            tryStatement(); break;
            }
            break;
        case ForStmt:
            switch (m_tk.kind()) {
            case T_LBRACE:      enter(ForOpen); break;
            default:            break;
            }
            break;
        case ForOpen:
            // TODO: parse arguments
            switch (m_tk.kind()) {
            case T_RBRACE:      leave(); leave(); break;
            default:            tryStatement(); break;
            }
            break;
        case IfStmt:
            switch (m_tk.kind()) {
            case T_LBRACE:      enter(IfOpen); break;
            default:            break;
            }
            break;
        case IfOpen:
            // TODO: parse arguments
            switch (m_tk.kind()) {
            case T_RBRACE:      leave(); leave(); break;
            default:            tryStatement(); break;
            }
            break;
        case SwitchStmt:
            switch (m_tk.kind()) {
            case T_LBRACE:      enter(SwitchOpen); break;
            default:            break;
            }
            break;
        case SwitchOpen:
            switch (m_tk.kind()) {
            case T_RBRACE:      leave(); leave(); break;
            case T_DEFAULT:
            case T_CASE:        enter(CaseClause); break;
            default:            break;
            }
            break;
        case CaseClause:
            switch (m_tk.kind()) {
            case T_COLON:       leave(); enter(CaseOpen); break;
            default:            break;
            }
            break;
        case CaseOpen:
            switch (m_tk.kind()) {
            case T_DEFAULT:
            case T_CASE:        leave(); enter(CaseClause); break;
            case T_RBRACE:      leave(); leave(); leave(); break;
            default:            tryStatement(); break;
            }
            break;
        case Label:
            switch (m_tk.kind()) {
            case T_COLON:       leave(); break;
            default:            leave(); continue; // shouldn't happen
            } break;
        case MultilineCommentStart:
        case MultilineCommentCont:
            if (m_tk.kind() != T_COMMENT) {
                leave();
                continue;
            } else if (m_index == m_tokens.size() - 1
                    && lexerState.multiLine() == LexerState::NoMultiLine) {
                leave();
            } else if (m_index == 0 && m_tk.is(T_COMMENT)) {
                // to allow enter/leave to update the indentDepth
                leave();
                enter(MultilineCommentCont);
            }
            break;
        default:
            break;
        }
    }

    currentState = m_currentState.top().state;
    if (currentState != MultilineCommentStart
            && currentState != MultilineCommentCont
            && (lexerState.multiLine() == LexerState::MultiLineComment)) {
        enter(MultilineCommentStart);
    }

    saveCurrentState(block);
}