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