diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 319d1f65f212185d497dbbe8baee2c0fff6467ab..dece2dbe53b8af09090d44054e01aba9c07a99b5 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -86,67 +86,86 @@ public:
 
 int DebugRule::depth = 0;
 
+inline bool lookAtAssignmentOperator(int tokenKind)
+{
+    switch (tokenKind) {
+    case T_EQUAL:
+    case T_AMPER_EQUAL:
+    case T_CARET_EQUAL:
+    case T_SLASH_EQUAL:
+    case T_GREATER_GREATER_EQUAL:
+    case T_LESS_LESS_EQUAL:
+    case T_MINUS_EQUAL:
+    case T_PERCENT_EQUAL:
+    case T_PIPE_EQUAL:
+    case T_PLUS_EQUAL:
+    case T_STAR_EQUAL:
+    case T_TILDE_EQUAL:
+        return true;
+    default:
+        return false;
+    } // switch
+}
+
+namespace Prec { // operator-precedence
+
+enum {
+    Unknown         = 0,
+    Comma           = 1,
+    Assignment      = 2,
+    Conditional     = 3,
+    LogicalOr       = 4,
+    LogicalAnd      = 5,
+    InclusiveOr     = 6,
+    ExclusiveOr     = 7,
+    And             = 8,
+    Equality        = 9,
+    Relational      = 10,
+    Shift           = 11,
+    Additive        = 12,
+    Multiplicative  = 13,
+    PointerToMember = 14
+};
+
 inline int precedence(int tokenKind, bool templateArguments)
 {
     if (templateArguments && tokenKind == T_GREATER)
         return -1;
 
+    if (lookAtAssignmentOperator(tokenKind))
+        return Assignment;
+
     switch (tokenKind) {
-    case T_PIPE_PIPE:       return 0;
-    case T_AMPER_AMPER:     return 1;
-    case T_PIPE:            return 2;
-    case T_CARET:           return 3;
-    case T_AMPER:           return 4;
+    case T_COMMA:           return Comma;
+    case T_QUESTION:        return Conditional;
+    case T_PIPE_PIPE:       return LogicalOr;
+    case T_AMPER_AMPER:     return LogicalAnd;
+    case T_PIPE:            return InclusiveOr;
+    case T_CARET:           return ExclusiveOr;
+    case T_AMPER:           return And;
     case T_EQUAL_EQUAL:
-    case T_EXCLAIM_EQUAL:   return 5;
+    case T_EXCLAIM_EQUAL:   return Equality;
     case T_GREATER:
     case T_LESS:
     case T_LESS_EQUAL:
-    case T_GREATER_EQUAL:   return 6;
+    case T_GREATER_EQUAL:   return Relational;
     case T_LESS_LESS:
-    case T_GREATER_GREATER: return 7;
+    case T_GREATER_GREATER: return ExclusiveOr;
     case T_PLUS:
-    case T_MINUS:           return 8;
+    case T_MINUS:           return Additive;
     case T_STAR:
     case T_SLASH:
-    case T_PERCENT:         return 9;
+    case T_PERCENT:         return Multiplicative;
     case T_ARROW_STAR:
-    case T_DOT_STAR:        return 10;
-
-    default:
-        return -1;
+    case T_DOT_STAR:        return PointerToMember;
+    default:                return Unknown;
     }
 }
 
-inline bool isBinaryOperator(int tokenKind)
-{
-    switch (tokenKind) {
-    case T_PIPE_PIPE:
-    case T_AMPER_AMPER:
-    case T_PIPE:
-    case T_CARET:
-    case T_AMPER:
-    case T_EQUAL_EQUAL:
-    case T_EXCLAIM_EQUAL:
-    case T_GREATER:
-    case T_LESS:
-    case T_LESS_EQUAL:
-    case T_GREATER_EQUAL:
-    case T_LESS_LESS:
-    case T_GREATER_GREATER:
-    case T_PLUS:
-    case T_MINUS:
-    case T_STAR:
-    case T_SLASH:
-    case T_PERCENT:
-    case T_ARROW_STAR:
-    case T_DOT_STAR:
-        return true;
+} // end of namespace Precedece
 
-    default:
-        return false;
-    }
-}
+inline bool isBinaryOperator(int tokenKind)
+{ return Prec::precedence(tokenKind, false) != Prec::Unknown; }
 
 } // end of anonymous namespace
 
@@ -4231,57 +4250,57 @@ bool Parser::parseCastExpression(ExpressionAST *&node)
 
 bool Parser::parsePmExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_ARROW_STAR, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_ARROW_STAR, _templateArguments))
 }
 
 bool Parser::parseMultiplicativeExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_STAR, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_STAR, _templateArguments))
 }
 
 bool Parser::parseAdditiveExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_PLUS, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_PLUS, _templateArguments))
 }
 
 bool Parser::parseShiftExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_LESS_LESS, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_LESS_LESS, _templateArguments))
 }
 
 bool Parser::parseRelationalExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_LESS, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_LESS, _templateArguments))
 }
 
 bool Parser::parseEqualityExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_EQUAL_EQUAL, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_EQUAL_EQUAL, _templateArguments))
 }
 
 bool Parser::parseAndExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_AMPER, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_AMPER, _templateArguments))
 }
 
 bool Parser::parseExclusiveOrExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_CARET, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_CARET, _templateArguments))
 }
 
 bool Parser::parseInclusiveOrExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_PIPE, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_PIPE, _templateArguments))
 }
 
 bool Parser::parseLogicalAndExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_AMPER_AMPER, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_AMPER_AMPER, _templateArguments))
 }
 
 bool Parser::parseLogicalOrExpression(ExpressionAST *&node)
 {
-    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, precedence(T_PIPE_PIPE, _templateArguments))
+    PARSE_EXPRESSION_WITH_OPERATOR_PRECEDENCE(node, Prec::precedence(T_PIPE_PIPE, _templateArguments))
 }
 
 bool Parser::parseConditionalExpression(ExpressionAST *&node)
@@ -4303,27 +4322,6 @@ bool Parser::parseConditionalExpression(ExpressionAST *&node)
     return true;
 }
 
-bool Parser::lookAtAssignmentOperator() const
-{
-    switch (LA()) {
-    case T_EQUAL:
-    case T_AMPER_EQUAL:
-    case T_CARET_EQUAL:
-    case T_SLASH_EQUAL:
-    case T_GREATER_GREATER_EQUAL:
-    case T_LESS_LESS_EQUAL:
-    case T_MINUS_EQUAL:
-    case T_PERCENT_EQUAL:
-    case T_PIPE_EQUAL:
-    case T_PLUS_EQUAL:
-    case T_STAR_EQUAL:
-    case T_TILDE_EQUAL:
-        return true;
-    default:
-        return false;
-    } // switch
-}
-
 bool Parser::parseAssignmentExpression(ExpressionAST *&node)
 {
     DEBUG_THIS_RULE();
@@ -4332,7 +4330,7 @@ bool Parser::parseAssignmentExpression(ExpressionAST *&node)
     else if (! parseConditionalExpression(node))
         return false;
 
-    if (lookAtAssignmentOperator()) {
+    if (lookAtAssignmentOperator(LA())) {
         unsigned op = consumeToken();
 
         ExpressionAST *rightExpr = 0;
@@ -4392,16 +4390,16 @@ void Parser::parseExpressionWithOperatorPrecedence(ExpressionAST *&lhs, int minP
 {
     DEBUG_THIS_RULE();
 
-    while (precedence(tok().kind(), _templateArguments) >= minPrecedence) {
-        const int operPrecedence = precedence(tok().kind(), _templateArguments);
+    while (Prec::precedence(tok().kind(), _templateArguments) >= minPrecedence) {
+        const int operPrecedence = Prec::precedence(tok().kind(), _templateArguments);
         const int oper = consumeToken();
         ExpressionAST *rhs = 0;
         if (!parseCastExpression(rhs))
             return;
 
-        for (int tokenKindAhead = tok().kind(), precedenceAhead = precedence(tokenKindAhead, _templateArguments);
+        for (int tokenKindAhead = tok().kind(), precedenceAhead = Prec::precedence(tokenKindAhead, _templateArguments);
                 precedenceAhead > operPrecedence && isBinaryOperator(tokenKindAhead);
-                tokenKindAhead = tok().kind(), precedenceAhead = precedence(tokenKindAhead, _templateArguments)) {
+                tokenKindAhead = tok().kind(), precedenceAhead = Prec::precedence(tokenKindAhead, _templateArguments)) {
             parseExpressionWithOperatorPrecedence(rhs, precedenceAhead);
         }
 
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 0c48ab9c545ab91706670180d223f517e223e096..c31b9c1e7fbf586922352db40c8a0077ae8f2636 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -267,7 +267,6 @@ public:
     bool lookAtStorageClassSpecifier() const;
     bool lookAtBuiltinTypeSpecifier() const;
     bool lookAtClassKey() const;
-    bool lookAtAssignmentOperator() const;
 
     void match(int kind, unsigned *token);