⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}bool Parser::parseInitDeclarator(InitDeclaratorAST *&node){    int start = tokenStream->cursor();    DeclaratorAST *decl = 0;    AST *init = 0;    if (!parseDeclarator(decl)) {        return false;    }    parseInitializer(init);    InitDeclaratorAST *ast = CreateNode<InitDeclaratorAST>(m_pool);    ast->setDeclarator(decl);    ast->setInitializer(init);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseBaseClause(BaseClauseAST *&node){    int start = tokenStream->cursor();    if (tokenStream->lookAhead() != ':') {        return false;    }    advance();    BaseClauseAST *bca = CreateNode<BaseClauseAST>(m_pool);    BaseSpecifierAST *baseSpec = 0;    if (parseBaseSpecifier(baseSpec)) {        bca->addBaseSpecifier(baseSpec);        while (tokenStream->lookAhead() == ',') {            advance();            if (!parseBaseSpecifier(baseSpec)) {                reportError(i18n("Base class specifier expected"));                return false;            }            bca->addBaseSpecifier(baseSpec);        }    } else        return false;    UPDATE_POS(bca, start, tokenStream->cursor());    node = bca;    return true;}bool Parser::parseInitializer(AST *&node){    if (tokenStream->lookAhead() == '=') {        advance();        if (!parseInitializerClause(node)) {            reportError(i18n("Initializer clause expected"));            return false;        }        return true;    } else if (tokenStream->lookAhead() == '(') {        advance();        AbstractExpressionAST *expr = 0;        skipCommaExpression(expr);        CHECK(')', ")");        node = expr;        return true;    }    return false;}bool Parser::parseMemInitializerList(AST *&/*node*/){    AST *init = 0;    if (!parseMemInitializer(init)) {        return false;    }    while (tokenStream->lookAhead() == ',') {        advance();        if (!parseMemInitializer(init)) {            break;        }    }    return true;}bool Parser::parseMemInitializer(AST *&/*node*/){    NameAST *initId = 0;    if (!parseMemInitializerId(initId)) {        reportError(i18n("Identifier expected"));        return false;    }    ADVANCE('(', '(');    AbstractExpressionAST *expr = 0;    skipCommaExpression(expr);    ADVANCE(')', ')');    return true;}bool Parser::parseTypeIdList(AST *&node){    int start = tokenStream->cursor();    TypeIdAST *typeId = 0;    if (!parseTypeId(typeId)) {        return false;    }    AST *ast = CreateNode<AST>(m_pool);    typeId->setParent(ast);    while (tokenStream->lookAhead() == ',') {        advance();        if (parseTypeId(typeId)) {            typeId->setParent(ast);        } else {            reportError(i18n("Type id expected"));            break;        }    }    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node){    int start = tokenStream->cursor();    BaseSpecifierAST *ast = CreateNode<BaseSpecifierAST>(m_pool);    AST *access = 0;    if (tokenStream->lookAhead() == Token_virtual) {        AST_FROM_TOKEN(virt, tokenStream->cursor());        ast->setIsVirtual(virt);        advance();        parseAccessSpecifier(access);    } else {        parseAccessSpecifier(access);        if (tokenStream->lookAhead() == Token_virtual) {            AST_FROM_TOKEN(virt, tokenStream->cursor());            ast->setIsVirtual(virt);            advance();        }    }    NameAST *name = 0;    if (!parseName(name)) {        reportError(i18n("Class name expected"));    }    ast->setAccess(access);    ast->setName(name);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseInitializerClause(AST *&node){    if (tokenStream->lookAhead() == '{') {        if (!skip('{','}')) {            reportError(i18n("} missing"));        } else            advance();    } else {        AbstractExpressionAST *expr = 0;        if (!parseAssignmentExpression(expr)) {            //reportError(i18n("Expression expected"));        }        node = expr;    }    return true;}bool Parser::parseMemInitializerId(NameAST *&node){    return parseName(node);}bool Parser::parsePtrToMember(AST *&/*node*/)     /// ### create the AST node{    int start = tokenStream->cursor();    if (tokenStream->lookAhead() == Token_scope)        advance();    ClassOrNamespaceNameAST *name = 0;    while (tokenStream->lookAhead() == Token_identifier) {        if (!parseUnqualifiedName(name))            break;        if (tokenStream->lookAhead() == Token_scope                && tokenStream->lookAhead(1) == '*') {            advance();            advance();            return true;        }        if (tokenStream->lookAhead() == Token_scope)            advance();    }    tokenStream->rewind(start);    return false;}bool Parser::parseUnqualifiedName(ClassOrNamespaceNameAST *&node, bool parseTemplateId){    int start = tokenStream->cursor();    bool isDestructor = false;    ClassOrNamespaceNameAST *ast = CreateNode<ClassOrNamespaceNameAST>(m_pool);    if (tokenStream->lookAhead() == Token_identifier) {        int startName = tokenStream->cursor();        AST *n = CreateNode<AST>(m_pool);        advance();        UPDATE_POS(n, startName, tokenStream->cursor());        ast->setName(n);    } else if (tokenStream->lookAhead() == '~' && tokenStream->lookAhead(1) == Token_identifier) {        int startName = tokenStream->cursor();        AST *n = CreateNode<AST>(m_pool);        advance(); // skip ~        advance(); // skip classname        UPDATE_POS(n, startName, tokenStream->cursor());        ast->setName(n);        isDestructor = true;    } else if (tokenStream->lookAhead() == Token_operator) {        AST *n = 0;        if (!parseOperatorFunctionId(n))            return false;        ast->setName(n);    } else {        return false;    }    if (parseTemplateId && !isDestructor) {        int index = tokenStream->cursor();        if (tokenStream->lookAhead() == '<') {            advance();            // optional template arguments            TemplateArgumentListAST *args = 0;            parseTemplateArgumentList(args);            if (tokenStream->lookAhead() != '>') {                tokenStream->rewind(index);            } else {                advance();                ast->setTemplateArgumentList(args);            }        }    }    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseStringLiteral(AST *&node){    int start = tokenStream->cursor();    while (tokenStream->lookAhead()) {        if (tokenStream->lookAhead() == Token_identifier &&            tokenStream->currentTokenText() == "L" && tokenStream->lookAhead(1) == Token_string_literal) {            advance();            advance();        } else if (tokenStream->lookAhead() == Token_string_literal) {            advance();        } else            return false;    }    AST *ast = CreateNode<AST>(m_pool);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::skipExpressionStatement(StatementAST *&node){    int start = tokenStream->cursor();    AbstractExpressionAST *expr = 0;    skipCommaExpression(expr);    ADVANCE(';', ";");    ExpressionStatementAST *ast = CreateNode<ExpressionStatementAST>(m_pool);    ast->setExpression(expr);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseStatement(StatementAST *&node){    int start = tokenStream->cursor();    switch(tokenStream->lookAhead()) {    case Token_while:        return parseWhileStatement(node);    case Token_do:        return parseDoStatement(node);    case Token_for:        return parseForStatement(node);    case Token_if:        return parseIfStatement(node);    case Token_switch:        return parseSwitchStatement(node);    case Token_try:        return parseTryBlockStatement(node);    case Token_case:    case Token_default:        return parseLabeledStatement(node);    case Token_break:    case Token_continue:        advance();        ADVANCE(';', ";");        return true;    case Token_goto:        advance();        ADVANCE(Token_identifier, "identifier");        ADVANCE(';', ";");        return true;    case Token_return:    {        advance();        AbstractExpressionAST *expr = 0;        skipCommaExpression(expr);        ADVANCE(';', ";");        ReturnStatementAST *ast = CreateNode<ReturnStatementAST>(m_pool);        ast->setExpression(expr);        UPDATE_POS(ast, start, tokenStream->cursor());        node = ast;    }    return true;    case '{':        return parseCompoundStatement(node);    case Token_identifier:        if (parseLabeledStatement(node))            return true;        break;    }    if (parseDeclarationStatement(node))        return true;    return skipExpressionStatement(node);}bool Parser::parseCondition(ConditionAST *&node){    int start = tokenStream->cursor();    ConditionAST *ast = CreateNode<ConditionAST>(m_pool);    TypeSpecifierAST *spec = 0;    if (parseTypeSpecifier(spec)) {        DeclaratorAST *decl = 0;        if (parseDeclarator(decl) && tokenStream->lookAhead() == '=') {            advance();            AbstractExpressionAST *expr = 0;            if (parseExpression(expr)) {                ast->setTypeSpec(spec);                ast->setDeclarator(decl);                ast->setExpression(expr);                UPDATE_POS(ast, start, tokenStream->cursor());                node = ast;                return true;            }        }    }    tokenStream->rewind(start);    AbstractExpressionAST *expr = 0;    if (!skipCommaExpression(expr)) {        return false;    }    ast->setExpression(expr);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseWhileStatement(StatementAST *&node){    int start = tokenStream->cursor();    ADVANCE(Token_while, "while");    ADVANCE('(' , "(");    ConditionAST *cond = 0;    if (!parseCondition(cond)) {        reportError(i18n("condition expected"));        return false;    }    ADVANCE(')', ")");    StatementAST *body = 0;    if (!parseStatement(body)) {        reportError(i18n("statement expected"));        return false;    }    WhileStatementAST *ast = CreateNode<WhileStatementAST>(m_pool);    ast->setCondition(cond);    ast->setStatement(body);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseDoStatement(StatementAST *&node){    int start = tokenStream->cursor();    ADVANCE(Token_do, "do");    StatementAST *body = 0;    if (!parseStatement(body)) {        reportError(i18n("statement expected"));        //return false;    }    ADVANCE_NR(Token_while, "while");    ADVANCE_NR('(' , "(");    AbstractExpressionAST *expr = 0;    if (!skipCommaExpression(expr)) {        reportError(i18n("expression expected"));        //return false;    }    ADVANCE_NR(')', ")");    ADVANCE_NR(';', ";");    DoStatementAST *ast = CreateNode<DoStatementAST>(m_pool);    ast->setStatement(body);    //ast->setCondition(condition);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseForStatement(StatementAST *&node){    int start = tokenStream->cursor();    ADVANCE(Token_for, "for");    ADVANCE('(', "(");    StatementAST *init = 0;    if (!parseForInitStatement(init)) {        reportError(i18n("for initialization expected"));        return false;    }    ConditionAST *cond = 0;    parseCondition(cond);    ADVANCE(';', ";");    AbstractExpressionAST *expr = 0;    skipCommaExpression(expr);    ADVANCE(')', ")");    StatementAST *body = 0;    if (!parseStatement(body))        return false;    ForStatementAST *ast = CreateNode<ForStatementAST>(m_pool);    ast->setInitStatement(init);    ast->setCondition(cond);    // ast->

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -