diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 89d540b6d16da70f182285d13e8e17babbac818c..fcddd740a6b3fb3c8c0e935216a2ddc2bb05d16f 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2583,7 +2583,7 @@ bool Parser::parseObjCExpression(ExpressionAST *&node)
         return parseObjCEncodeExpression(node);
 
     case T_AT_PROTOCOL:
-        break;
+        return parseObjCProtocolExpression(node);
 
     case T_AT_SELECTOR:
         break;
@@ -2610,6 +2610,19 @@ bool Parser::parseObjCEncodeExpression(ExpressionAST *&)
     return true;
 }
 
+bool Parser::parseObjCProtocolExpression(ExpressionAST *&)
+{
+    if (LA() != T_AT_PROTOCOL)
+        return false;
+
+    /*unsigned protocol_token = */ consumeToken();
+    unsigned lparen_token = 0, identifier_token = 0, rparen_token = 0;
+    match(T_LPAREN, &lparen_token);
+    match(T_IDENTIFIER, &identifier_token);
+    match(T_RPAREN, &rparen_token);
+    return true;
+}
+
 bool Parser::parseNameId(NameAST *&name)
 {
     unsigned start = cursor();
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index ba591b96d09cdb3f07193ecda1859e635da5f66f..17e6752110bce67f8ef4eaa1c0696c209391af99 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -219,6 +219,7 @@ public:
                            SpecifierAST *attributes = 0);
 
     bool parseObjCEncodeExpression(ExpressionAST *&node);
+    bool parseObjCProtocolExpression(ExpressionAST *&node);
 
     bool parseObjCProtocolRefs();
     bool parseObjClassInstanceVariables();