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

📄 parser.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                ast->setName(name);                if (tokenStream->lookAhead() == '=') {                    advance();                    TypeIdAST *typeId = 0;                    if (!parseTypeId(typeId)) {                        syntaxError();                        return false;                    }                    ast->setTypeId(typeId);                }            }            if (tokenStream->lookAhead() == '=') {                advance();                NameAST *templ_name = 0;                parseName(templ_name);            }        }        break;    default:        return false;    } // end switch    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseStorageClassSpecifier(AST *&node){    int start = tokenStream->cursor();    AST *ast = CreateNode<AST>(m_pool);    while (tokenStream->lookAhead()) {        int tk = tokenStream->lookAhead();        if (tk == Token_friend || tk == Token_auto || tk == Token_register || tk == Token_static ||                tk == Token_extern || tk == Token_mutable) {            int startNode = tokenStream->cursor();            advance();            AST *n = CreateNode<AST>(m_pool);            UPDATE_POS(n, startNode, tokenStream->cursor());            n->setParent(ast);        } else            break;    }    if (length(ast->children()) == 0)       return false;    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseFunctionSpecifier(AST *&node){    int start = tokenStream->cursor();    AST *ast = CreateNode<AST>(m_pool);    while (tokenStream->lookAhead()) {        int tk = tokenStream->lookAhead();        if (tk == Token_inline || tk == Token_virtual || tk == Token_explicit) {            int startNode = tokenStream->cursor();            advance();            AST *n = CreateNode<AST>(m_pool);            UPDATE_POS(n, startNode, tokenStream->cursor());            n->setParent(ast);        } else {            break;    }    }    if (length(ast->children()) == 0)       return false;    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseTypeId(TypeIdAST *&node){    /// @todo implement the AST for typeId    int start = tokenStream->cursor();    TypeSpecifierAST *spec = 0;    if (!parseTypeSpecifier(spec)) {        tokenStream->rewind(start);        return false;    }    DeclaratorAST *decl = 0;    parseAbstractDeclarator(decl);    TypeIdAST *ast = CreateNode<TypeIdAST>(m_pool);    ast->setTypeSpecifier(spec);    ast->setDeclarator(decl);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseInitDeclaratorList(InitDeclaratorListAST *&node){    int start = tokenStream->cursor();    InitDeclaratorListAST *ast = CreateNode<InitDeclaratorListAST>(m_pool);    InitDeclaratorAST *decl = 0;    if (!parseInitDeclarator(decl)) {        return false;    }    ast->addInitDeclarator(decl);    while (tokenStream->lookAhead() == ',') {        advance();        if (!parseInitDeclarator(decl)) {            syntaxError();            break;        }        ast->addInitDeclarator(decl);    }    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node){    int start = tokenStream->cursor();    ParameterDeclarationClauseAST *ast = CreateNode<ParameterDeclarationClauseAST>(m_pool);    ParameterDeclarationListAST *params = 0;    if (!parseParameterDeclarationList(params)) {        if (tokenStream->lookAhead() == ')')            goto good;        if (tokenStream->lookAhead() == Token_ellipsis && tokenStream->lookAhead(1) == ')') {            AST_FROM_TOKEN(ellipsis, tokenStream->cursor());            ast->setEllipsis(ellipsis);            advance();            goto good;        }        return false;    }    if (tokenStream->lookAhead() == Token_ellipsis) {        AST_FROM_TOKEN(ellipsis, tokenStream->cursor());        ast->setEllipsis(ellipsis);        advance();    }good:    ast->setParameterDeclarationList(params);    /// @todo add ellipsis    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseParameterDeclarationList(ParameterDeclarationListAST *&node){    int start = tokenStream->cursor();    ParameterDeclarationListAST *ast = CreateNode<ParameterDeclarationListAST>(m_pool);    ParameterDeclarationAST *param = 0;    if (!parseParameterDeclaration(param)) {        tokenStream->rewind(start);        return false;    }    ast->addParameter(param);    while (tokenStream->lookAhead() == ',') {        advance();        if (tokenStream->lookAhead() == Token_ellipsis)            break;        if (!parseParameterDeclaration(param)) {            tokenStream->rewind(start);            return false;        }        ast->addParameter(param);    }    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseParameterDeclaration(ParameterDeclarationAST *&node){    int start = tokenStream->cursor();    AST *storage = 0;    parseStorageClassSpecifier(storage);    // parse decl spec    TypeSpecifierAST *spec = 0;    if (!parseTypeSpecifier(spec)) {        tokenStream->rewind(start);        return false;    }    int index = tokenStream->cursor();    DeclaratorAST *decl = 0;    if (!parseDeclarator(decl)) {        tokenStream->rewind(index);        // try with abstract declarator        parseAbstractDeclarator(decl);    }    AbstractExpressionAST *expr = 0;    if (tokenStream->lookAhead() == '=') {        advance();        if (!parseLogicalOrExpression(expr,true)) {            //reportError(i18n("Expression expected"));        }    }    ParameterDeclarationAST *ast = CreateNode<ParameterDeclarationAST>(m_pool);    ast->setTypeSpec(spec);    ast->setDeclarator(decl);    ast->setExpression(expr);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseClassSpecifier(TypeSpecifierAST *&node){    int start = tokenStream->cursor();    AST *classKey = 0;    int classKeyStart = tokenStream->cursor();    int kind = tokenStream->lookAhead();    if (kind == Token_class || kind == Token_struct || kind == Token_union) {        AST *asn = CreateNode<AST>(m_pool);        classKey = asn;        advance();        UPDATE_POS(classKey, classKeyStart, tokenStream->cursor());    } else {        return false;    }    AST *winDeclSpec = 0;    parseWinDeclSpec(winDeclSpec);    while (tokenStream->lookAhead() == Token_identifier && tokenStream->lookAhead(1) == Token_identifier)            advance();    NameAST *name = 0;    parseName(name);    BaseClauseAST *bases = 0;    if (tokenStream->lookAhead() == ':') {        if (!parseBaseClause(bases)) {            skipUntil('{');        }    }    if (tokenStream->lookAhead() != '{') {        tokenStream->rewind(start);        return false;    }    ADVANCE('{', '{');    ClassSpecifierAST *ast = CreateNode<ClassSpecifierAST>(m_pool);    ast->setWinDeclSpec(winDeclSpec);    ast->setClassKey(classKey);    ast->setName(name);    ast->setBaseClause(bases);    while (tokenStream->lookAhead()) {        if (tokenStream->lookAhead() == '}')            break;        DeclarationAST *memSpec = 0;        int startDecl = tokenStream->cursor();        if (!parseMemberSpecification(memSpec)) {            if (startDecl == tokenStream->cursor())                advance(); // skip at least one token            skipUntilDeclaration();        } else            ast->addDeclaration(memSpec);    }    if (tokenStream->lookAhead() != '}') {        reportError(i18n("} missing"));    } else        advance();    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseAccessSpecifier(AST *&node){    int start = tokenStream->cursor();    switch(tokenStream->lookAhead()) {    case Token_public:    case Token_protected:    case Token_private: {        AST *asn = CreateNode<AST>(m_pool);        node = asn;        advance();        UPDATE_POS(node, start, tokenStream->cursor());        return true;        }    }    return false;}bool Parser::parseMemberSpecification(DeclarationAST *&node){    int start = tokenStream->cursor();    AST *access = 0;    if (tokenStream->lookAhead() == ';') {        advance();        return true;    } else if (tokenStream->lookAhead() == Token_Q_OBJECT || tokenStream->lookAhead() == Token_K_DCOP) {        advance();        return true;    } else if (tokenStream->lookAhead() == Token_signals            || tokenStream->lookAhead() == Token_k_dcop            || tokenStream->lookAhead() == Token_k_dcop_signals) {        AccessDeclarationAST *ast = CreateNode<AccessDeclarationAST>(m_pool);        advance();        AST *n = CreateNode<AST>(m_pool);        UPDATE_POS(n, start, tokenStream->cursor());        ast->addAccess(n);        ADVANCE(':', ":");        UPDATE_POS(ast, start, tokenStream->cursor());        node = ast;        return true;    } else if (parseTypedef(node)) {        return true;    } else if (parseUsing(node)) {        return true;    } else if (parseTemplateDeclaration(node)) {        return true;    } else if (parseAccessSpecifier(access)) {        AccessDeclarationAST *ast = CreateNode<AccessDeclarationAST>(m_pool);        ast->addAccess(access);        int startSlot = tokenStream->cursor();        if (tokenStream->lookAhead() == Token_slots) {            advance();            AST *sl = CreateNode<AST>(m_pool);            UPDATE_POS(sl, startSlot, tokenStream->cursor());            ast->addAccess(sl);        }        ADVANCE(':', ":");        UPDATE_POS(ast, start, tokenStream->cursor());        node = ast;        return true;    }    tokenStream->rewind(start);    AST *storageSpec = 0;    parseStorageClassSpecifier(storageSpec);    AST *cv = 0;    parseCvQualify(cv);    TypeSpecifierAST *spec = 0;    if (parseEnumSpecifier(spec) || parseClassSpecifier(spec)) {        spec->setCvQualify(cv);        AST *cv2 = 0;        parseCvQualify(cv2);        spec->setCv2Qualify(cv2);            InitDeclaratorListAST *declarators = 0;        parseInitDeclaratorList(declarators);        ADVANCE(';', ";");        SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);        ast->setTypeSpec(spec);        ast->setInitDeclaratorList(declarators);        UPDATE_POS(ast, start, tokenStream->cursor());        node = ast;        return true;    }    tokenStream->rewind(start);    return parseDeclarationInternal(node);}bool Parser::parseCtorInitializer(AST *&/*node*/){    if (tokenStream->lookAhead() != ':') {        return false;    }    advance();    AST *inits = 0;    if (!parseMemInitializerList(inits)) {        reportError(i18n("Member initializers expected"));    }    return true;}bool Parser::parseElaboratedTypeSpecifier(TypeSpecifierAST *&node){    int start = tokenStream->cursor();    int tk = tokenStream->lookAhead();    if (tk == Token_class  ||        tk == Token_struct ||        tk == Token_union  ||        tk == Token_enum   ||        tk == Token_typename)    {        AST *kind = CreateNode<AST>(m_pool);        advance();        UPDATE_POS(kind, start, tokenStream->cursor());        NameAST *name = 0;        if (parseName(name)) {            ElaboratedTypeSpecifierAST *ast = CreateNode<ElaboratedTypeSpecifierAST>(m_pool);            ast->setKind(kind);            ast->setName(name);            UPDATE_POS(ast, start, tokenStream->cursor());            node = ast;            return true;        }    }    tokenStream->rewind(start);    return false;}bool Parser::parseDeclaratorId(NameAST *&node){    return parseName(node);}bool Parser::parseExceptionSpecification(AST *&node){    if (tokenStream->lookAhead() != Token_throw) {        return false;    }    advance();    ADVANCE('(', "(");    if (tokenStream->lookAhead() == Token_ellipsis) {        // extension found in MSVC++ 7.x headers        int start = tokenStream->cursor();        AST *ast = CreateNode<AST>(m_pool);        AST_FROM_TOKEN(ellipsis, tokenStream->cursor());        ellipsis->setParent(ast);        advance();        UPDATE_POS(ast, start, tokenStream->cursor());        node = ast;    } else {        parseTypeIdList(node);    }    ADVANCE(')', ")");    return true;}bool Parser::parseEnumerator(EnumeratorAST *&node){    int start = tokenStream->cursor();    if (tokenStream->lookAhead() != Token_identifier) {        return false;    }    advance();    EnumeratorAST *ena = CreateNode<EnumeratorAST>(m_pool);    node = ena;    AST *id = CreateNode<AST>(m_pool);    UPDATE_POS(id, start, tokenStream->cursor());    node->setId(id);    if (tokenStream->lookAhead() == '=') {        advance();        AbstractExpressionAST *expr = 0;        if (!parseConstantExpression(expr)) {            reportError(i18n("Constant expression expected"));        }        node->setExpression(expr);    }    UPDATE_POS(node, start, tokenStream->cursor());    return true;

⌨️ 快捷键说明

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