📄 parser.cpp
字号:
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 + -