diff --git a/shared/cplusplus/Parser.cpp b/shared/cplusplus/Parser.cpp index eefa3d5b9fe978bdcc6ecc7b4c1fcfcfa8c174e7..f1b057d31cae7d9202de3a0862f73246eb56490e 100644 --- a/shared/cplusplus/Parser.cpp +++ b/shared/cplusplus/Parser.cpp @@ -2556,24 +2556,12 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node) return parseQtMethod(node); default: { - unsigned startOfName = cursor(); NameAST *name = 0; - if (parseName(name)) { - if (LA() == T_IDENTIFIER || tok().isLiteral() || (tok().isOperator() && LA() != T_LPAREN && - LA() != T_LBRACKET)) { - rewind(startOfName); - parseName(name, false); - } - // literal - // identifier <unop> ? - // identifier <binop> - // identifier <access> - // identifier rparen - // lparen type rparen identifier [[cast-expression]] - + if (parseNameId(name)) { node = name; return true; } + break; } // default } // switch @@ -2581,6 +2569,23 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node) return false; } +bool Parser::parseNameId(NameAST *&name) +{ + unsigned start = cursor(); + if (! parseName(name)) + return false; + + if (LA() == T_IDENTIFIER || + tok().isLiteral() || + (tok().isOperator() && LA() != T_LPAREN && LA() != T_LBRACKET)) + { + rewind(start); + return parseName(name, false); + } + + return false; +} + bool Parser::parseNestedExpression(ExpressionAST *&node) { if (LA() == T_LPAREN) { @@ -2763,7 +2768,7 @@ bool Parser::parsePostfixExpression(ExpressionAST *&node) ast->access_token = consumeToken(); if (LA() == T_TEMPLATE) ast->template_token = consumeToken(); - if (! parseName(ast->member_name)) + if (! parseNameId(ast->member_name)) _translationUnit->error(cursor(), "expected unqualified-id before token `%s'", tok().spell()); *postfix_ptr = ast; diff --git a/shared/cplusplus/Parser.h b/shared/cplusplus/Parser.h index 75fad457fad38efb7fb173f4496e169adeca7bcd..d99d8d27fc0a395344cb6287138d986561b24f13 100644 --- a/shared/cplusplus/Parser.h +++ b/shared/cplusplus/Parser.h @@ -141,6 +141,7 @@ public: bool parseMultiplicativeExpression(ExpressionAST *&node); bool parseTemplateId(NameAST *&node); bool parseClassOrNamespaceName(NameAST *&node); + bool parseNameId(NameAST *&node); bool parseName(NameAST *&node, bool acceptTemplateId = true); bool parseNestedNameSpecifier(NestedNameSpecifierAST *&node, bool acceptTemplateId); bool parseNestedNameSpecifierOpt(NestedNameSpecifierAST *&name, bool acceptTemplateId);