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

📄 parser.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    return true;}bool Parser::parseSimpleTypeSpecifier(TypeSpecifierAST *&node, bool onlyIntegral){    int start = tokenStream->cursor();    bool isIntegral = false;    bool done = false;    while (!done) {        switch(tokenStream->lookAhead()) {            case Token_char:            case Token_wchar_t:            case Token_bool:            case Token_short:            case Token_int:            case Token_long:            case Token_signed:            case Token_unsigned:            case Token_float:            case Token_double:            case Token_void:                isIntegral = true;                advance();                break;            default:                done = true;        }    }    TypeSpecifierAST *ast = CreateNode<TypeSpecifierAST>(m_pool);    if (isIntegral) {        ClassOrNamespaceNameAST *cl = CreateNode<ClassOrNamespaceNameAST>(m_pool);        AST *n = CreateNode<AST>(m_pool);        UPDATE_POS(n, start, tokenStream->cursor());        cl->setName(n);        UPDATE_POS(cl, start, tokenStream->cursor());        NameAST *name = CreateNode<NameAST>(m_pool);        name->setUnqualifiedName(cl);        UPDATE_POS(name, start, tokenStream->cursor());        ast->setName(name);    } else if (tokenStream->lookAhead() == Token___typeof) {        advance();        if (tokenStream->lookAhead() == '(') {            advance();            TypeIdAST *typeId = 0;            parseTypeId(typeId);            ADVANCE(')', ")");        } else {            AbstractExpressionAST *e = 0;            parseUnaryExpression(e);        }    } else if (onlyIntegral) {        tokenStream->rewind(start);        return false;    } else {        NameAST *name = 0;        if (!parseName(name)) {            tokenStream->rewind(start);            return false;        }        ast->setName(name);    }    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parsePtrOperator(AST *&node){    int start = tokenStream->cursor();    int tok = tokenStream->lookAhead();    AST *memPtr = 0;    switch (tok) {        case '&':        case '*':            advance();            break;        case Token_scope:        case Token_identifier:            if (!parsePtrToMember(memPtr)) {                tokenStream->rewind(start);                return false;            }            break;        default:            return false;    }    AST *cv = 0;    parseCvQualify(cv);    AST *ast = CreateNode<AST>(m_pool);    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseTemplateArgument(AST *&node){    int start = tokenStream->cursor();    TypeIdAST *typeId = 0;    if (parseTypeId(typeId)) {        if (tokenStream->lookAhead() == ',' || tokenStream->lookAhead() == '>') {            node = typeId;            return true;        }    }    tokenStream->rewind(start);    AbstractExpressionAST *expr = 0;    if (!parseLogicalOrExpression(expr, true)) {        return false;    }    node = expr;    return true;}bool Parser::parseTypeSpecifier(TypeSpecifierAST *&spec){    AST *cv = 0;    parseCvQualify(cv);    if (parseElaboratedTypeSpecifier(spec) || parseSimpleTypeSpecifier(spec)) {        spec->setCvQualify(cv);        AST *cv2 = 0;        parseCvQualify(cv2);        spec->setCv2Qualify(cv2);        return true;    }    return false;}bool Parser::parseDeclarator(DeclaratorAST *&node){    int start = tokenStream->cursor();    DeclaratorAST *ast = CreateNode<DeclaratorAST>(m_pool);    DeclaratorAST *decl = 0;    NameAST *declId = 0;    AST *ptrOp = 0;    while (parsePtrOperator(ptrOp)) {        ast->addPtrOp(ptrOp);    }    if (tokenStream->lookAhead() == '(') {        advance();        if (!parseDeclarator(decl)) {            return false;        }        ast->setSubDeclarator(decl);        if (tokenStream->lookAhead() != ')') {            return false;        }        advance();    } else {        if (tokenStream->lookAhead() == ':') {             // unnamed bitfield        } else if (parseDeclaratorId(declId)) {            ast->setDeclaratorId(declId);        } else {            tokenStream->rewind(start);            return false;        }        if (tokenStream->lookAhead() == ':') {            advance();            AbstractExpressionAST *expr = 0;            if (!parseConstantExpression(expr)) {                reportError(i18n("Constant expression expected"));            }            goto update_pos;        }    }    {        bool isVector = true;        while (tokenStream->lookAhead() == '[') {            int startArray = tokenStream->cursor();            advance();            AbstractExpressionAST *expr = 0;            parseCommaExpression(expr);            ADVANCE(']', "]");            AST *array = CreateNode<AST>(m_pool);            UPDATE_POS(array, startArray, tokenStream->cursor());            ast->addArrayDimension(array);            isVector = true;        }        bool skipParen = false;        if (tokenStream->lookAhead() == Token_identifier                && tokenStream->lookAhead(1) == '('                && tokenStream->lookAhead(2) == '(') {            advance();            advance();            skipParen = true;        }        int tok = tokenStream->lookAhead();        if (ast->subDeclarator() && !(isVector || tok == '(' || tok == ',' || tok == ';' || tok == '=')) {            tokenStream->rewind(start);            return false;        }        int index = tokenStream->cursor();        if (tokenStream->lookAhead() == '(') {            advance();            ParameterDeclarationClauseAST *params = 0;            if (!parseParameterDeclarationClause(params)) {                tokenStream->rewind(index);                goto update_pos;            }            ast->setParameterDeclarationClause(params);            if (tokenStream->lookAhead() != ')') {                tokenStream->rewind(index);                goto update_pos;            }            advance();  // skip ')'            AST *constant = 0;            parseCvQualify(constant);            ast->setConstant(constant);            AST *except = 0;            if (parseExceptionSpecification(except)) {                ast->setExceptionSpecification(except);            }        }        if (skipParen) {            if (tokenStream->lookAhead() != ')') {                reportError(i18n("')' expected"));            } else                advance();        }    }update_pos:    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseAbstractDeclarator(DeclaratorAST *&node){    int start = tokenStream->cursor();    DeclaratorAST *ast = CreateNode<DeclaratorAST>(m_pool);    DeclaratorAST *decl = 0;    AST *ptrOp = 0;    while (parsePtrOperator(ptrOp)) {        ast->addPtrOp(ptrOp);    }    int index = tokenStream->cursor();    if (tokenStream->lookAhead() == '(') {        advance();        if (!parseAbstractDeclarator(decl)) {            tokenStream->rewind(index);            goto label1;        }        ast->setSubDeclarator(decl);        if (tokenStream->lookAhead() != ')'){            tokenStream->rewind(start);            return false;        }        advance();    } else if (tokenStream->lookAhead() == ':') {        advance();        AbstractExpressionAST *expr = 0;        if (!parseConstantExpression(expr)) {            reportError(i18n("Constant expression expected"));        }        goto update_pos;    }label1:    {        bool isVector = true;        while (tokenStream->lookAhead() == '[') {            int startArray = tokenStream->cursor();            advance();            AbstractExpressionAST *expr = 0;            parseCommaExpression(expr);            ADVANCE(']', "]");            AST *array = CreateNode<AST>(m_pool);            UPDATE_POS(array, startArray, tokenStream->cursor());            ast->addArrayDimension(array);            isVector = true;        }        int tok = tokenStream->lookAhead();        if (ast->subDeclarator() && !(isVector || tok == '(' || tok == ',' || tok == ';' || tok == '=')) {            tokenStream->rewind(start);            return false;        }        int index = tokenStream->cursor();        if (tokenStream->lookAhead() == '(') {            advance();            ParameterDeclarationClauseAST *params = 0;            if (!parseParameterDeclarationClause(params)) {                tokenStream->rewind(index);                goto update_pos;            }            ast->setParameterDeclarationClause(params);            if (tokenStream->lookAhead() != ')') {                tokenStream->rewind(index);                goto update_pos;            }            advance();  // skip ')'            AST *constant = 0;            parseCvQualify(constant);            ast->setConstant(constant);            AST *except = 0;            if (parseExceptionSpecification(except)) {                ast->setExceptionSpecification(except);            }        }    }update_pos:    if (tokenStream->cursor() == start)        return false;    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseEnumSpecifier(TypeSpecifierAST *&node){    int start = tokenStream->cursor();    if (tokenStream->lookAhead() != Token_enum) {        return false;    }    advance();    NameAST *name = 0;    parseName(name);    if (tokenStream->lookAhead() != '{') {        tokenStream->rewind(start);        return false;    }    advance();    EnumSpecifierAST *ast = CreateNode<EnumSpecifierAST>(m_pool);    ast->setName(name);    EnumeratorAST *enumerator = 0;    if (parseEnumerator(enumerator)) {        ast->addEnumerator(enumerator);        while (tokenStream->lookAhead() == ',') {            advance();            if (!parseEnumerator(enumerator)) {                //reportError(i18n("Enumerator expected"));                break;            }            ast->addEnumerator(enumerator);        }    }    if (tokenStream->lookAhead() != '}')        reportError(i18n("} missing"));    else        advance();    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseTemplateParameterList(TemplateParameterListAST *&node){    int start = tokenStream->cursor();    TemplateParameterListAST *ast = CreateNode<TemplateParameterListAST>(m_pool);    TemplateParameterAST *param = 0;    if (!parseTemplateParameter(param)) {        return false;    }    ast->addTemplateParameter(param);    while (tokenStream->lookAhead() == ',') {        advance();        if (!parseTemplateParameter(param)) {            syntaxError();            break;        } else {            ast->addTemplateParameter(param);        }    }    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseTemplateParameter(TemplateParameterAST *&node){    int start = tokenStream->cursor();    TemplateParameterAST *ast = CreateNode<TemplateParameterAST>(m_pool);    TypeParameterAST *typeParameter = 0;    ParameterDeclarationAST *param = 0;    int tk = tokenStream->lookAhead();    if ((tk == Token_class || tk == Token_typename || tk == Token_template) && parseTypeParameter(typeParameter)) {        ast->setTypeParameter(typeParameter);        goto ok;    }    if (!parseParameterDeclaration(param))        return false;    ast->setTypeValueParameter(param);ok:    UPDATE_POS(ast, start, tokenStream->cursor());    node = ast;    return true;}bool Parser::parseTypeParameter(TypeParameterAST *&node){    int start = tokenStream->cursor();    TypeParameterAST *ast = CreateNode<TypeParameterAST>(m_pool);    AST_FROM_TOKEN(kind, tokenStream->cursor());    ast->setKind(kind);    switch(tokenStream->lookAhead()) {    case Token_class:    case Token_typename:        {            advance(); // skip class            // parse optional name            NameAST *name = 0;            if(parseName(name)){                ast->setName(name);                if (tokenStream->lookAhead() == '='){                    advance();                    TypeIdAST *typeId = 0;                    if(!parseTypeId(typeId)){                        //syntaxError();                        tokenStream->rewind(start);                        return false;                    }                    ast->setTypeId(typeId);                } else if (!(tokenStream->lookAhead() == ',' || tokenStream->lookAhead() == '>')) {                    tokenStream->rewind(start);                    return false;                }            }        }        break;    case Token_template:        {            advance(); // skip template            ADVANCE('<', '<');            TemplateParameterListAST *params = 0;            if (!parseTemplateParameterList(params)) {                return false;            }            ast->setTemplateParameterList(params);            ADVANCE('>', ">");            if (tokenStream->lookAhead() == Token_class)                advance();            // parse optional name            NameAST *name = 0;            if (parseName(name)) {

⌨️ 快捷键说明

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