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