5252#include  < iostream> 
5353#include  < vector> 
5454
55+ #if  defined(_MSC_VER) || defined(__GNUC__)
56+ #include  < sstream> 
57+ 
58+ std::string _joinLocation (const  char * name, int  line)
59+ {
60+   std::stringstream ss;
61+   ss << name << " :"   << line;
62+   return  ss.str ();
63+ }
64+ 
65+ #define  PARSER_METHOD_NAME  _joinLocation (__FUNCTION__, __LINE__).c_str()
66+ #else  
67+ #define  PARSER_METHOD_NAME  " " 
68+ #endif  
69+ 
70+ 
71+ #define  SYNTAX_ERROR () syntaxError(PARSER_METHOD_NAME)
72+ 
5573#define  ADVANCE (tk, descr ) \
5674{ \
5775  if  (token_stream.lookAhead () != tk) { \
58-       tokenRequiredError (tk); \
76+       tokenRequiredError (tk, PARSER_METHOD_NAME ); \
5977      return  false ; \
6078  } \
6179  nextToken (); \
6482#define  ADVANCE_NR (tk, descr ) \
6583  do  { \
6684    if  (token_stream.lookAhead () != tk) { \
67-       tokenRequiredError (tk); \
85+       tokenRequiredError (tk, PARSER_METHOD_NAME ); \
6886    } \
6987    else  \
7088        nextToken (); \
@@ -165,7 +183,7 @@ bool Parser::parseWinDeclSpec(WinDeclSpecAST *&node)
165183  return  true ;
166184}
167185
168- void  Parser::tokenRequiredError (int  token)
186+ void  Parser::tokenRequiredError (int  token,  const   char * functionName )
169187{
170188  QString err;
171189
@@ -176,11 +194,10 @@ void Parser::tokenRequiredError(int token)
176194  err += token_name (token_stream.lookAhead ());
177195  err += " ''"  ;
178196
179- 
180-   reportError (err);
197+   reportError (err, functionName);
181198}
182199
183- void  Parser::syntaxError ()
200+ void  Parser::syntaxError (const   char * functionName )
184201{
185202  QString err;
186203
@@ -189,10 +206,10 @@ void Parser::syntaxError()
189206  err += token_name (token_stream.lookAhead ());
190207  err += " ''"  ;
191208
192-   reportError (err);
209+   reportError (err, functionName );
193210}
194211
195- void  Parser::reportError (const  QString& msg)
212+ void  Parser::reportError (const  QString& msg,  const   char * functionName )
196213{
197214    if  (!_M_block_errors)
198215    {
@@ -208,6 +225,10 @@ void Parser::reportError(const QString& msg)
208225        errmsg.setColumn (column);
209226        errmsg.setFileName (fileName);
210227        errmsg.setMessage (QLatin1String (" ** PARSER ERROR "  ) + msg);
228+         if  (functionName && *functionName) {
229+           errmsg.setMessage (errmsg.message () + "  in "   + functionName);
230+         }
231+ 
211232        control->reportError (errmsg);
212233    }
213234}
@@ -852,7 +873,7 @@ bool Parser::parseOperatorFunctionId(OperatorFunctionIdAST *&node)
852873
853874      if  (!parseSimpleTypeSpecifier (ast->type_specifier ))
854875        {
855-           syntaxError ();
876+           SYNTAX_ERROR ();
856877          return  false ;
857878        }
858879
@@ -886,7 +907,7 @@ bool Parser::parseTemplateArgumentList(const ListNode<TemplateArgumentAST*> *&no
886907        {
887908          if  (reportError)
888909            {
889-               syntaxError ();
910+               SYNTAX_ERROR ();
890911              break ;
891912            }
892913
@@ -1642,7 +1663,7 @@ bool Parser::parseTemplateParameterList(const ListNode<TemplateParameterAST*> *&
16421663
16431664      if  (!parseTemplateParameter (param))
16441665        {
1645-           syntaxError ();
1666+           SYNTAX_ERROR ();
16461667          break ;
16471668        }
16481669      else 
@@ -1721,7 +1742,7 @@ bool Parser::parseTypeParameter(TypeParameterAST *&node)
17211742
17221743                if (!parseTypeId (ast->type_id ))
17231744                  {
1724-                     // syntaxError ();
1745+                     // SYNTAX_ERROR ();
17251746                    rewind (start);
17261747                    return  false ;
17271748                  }
@@ -1758,7 +1779,7 @@ bool Parser::parseTypeParameter(TypeParameterAST *&node)
17581779
17591780                if  (!parseTypeId (ast->type_id ))
17601781                  {
1761-                     syntaxError ();
1782+                     SYNTAX_ERROR ();
17621783                    return  false ;
17631784                  }
17641785              }
@@ -1857,7 +1878,7 @@ bool Parser::parseInitDeclaratorList(const ListNode<InitDeclaratorAST*> *&node)
18571878
18581879      if  (!parseInitDeclarator (decl))
18591880        {
1860-           syntaxError ();
1881+           SYNTAX_ERROR ();
18611882          break ;
18621883        }
18631884      node = snoc (node, decl, _M_pool);
@@ -2933,7 +2954,7 @@ bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
29332954  block_errors (blocked);
29342955
29352956  if  (!node)
2936-     syntaxError ();
2957+     SYNTAX_ERROR ();
29372958
29382959  return  node != 0 ;
29392960}
@@ -3203,7 +3224,7 @@ bool Parser::parseSwitchStatement(StatementAST *&node)
32033224  StatementAST *stmt = 0 ;
32043225  if  (!parseCompoundStatement (stmt))
32053226    {
3206-       syntaxError ();
3227+       SYNTAX_ERROR ();
32073228      return  false ;
32083229    }
32093230
@@ -3490,7 +3511,7 @@ bool Parser::parseDeclarationInternal(DeclarationAST *&node)
34903511      const  ListNode<InitDeclaratorAST*> *declarators = 0 ;
34913512      if  (!parseInitDeclaratorList (declarators))
34923513        {
3493-           syntaxError ();
3514+           SYNTAX_ERROR ();
34943515          return  false ;
34953516        }
34963517
@@ -3534,7 +3555,7 @@ bool Parser::parseDeclarationInternal(DeclarationAST *&node)
35343555              rewind (startDeclarator);
35353556              if  (!parseInitDeclaratorList (declarators))
35363557                {
3537-                   syntaxError ();
3558+                   SYNTAX_ERROR ();
35383559                  return  false ;
35393560                }
35403561            }
@@ -3546,7 +3567,7 @@ bool Parser::parseDeclarationInternal(DeclarationAST *&node)
35463567        TypeSpecifierAST* trailingReturnTypeSpec = 0 ;
35473568        if  (!parseTypeSpecifier (trailingReturnTypeSpec)) {
35483569          //  todo: replace "auto" return type? But I doubt we can handle these return types anyway.
3549-           syntaxError ();
3570+           SYNTAX_ERROR ();
35503571          return  false ;
35513572        }
35523573        maybeFunctionDefinition = true ;
@@ -3575,7 +3596,7 @@ bool Parser::parseDeclarationInternal(DeclarationAST *&node)
35753596          {
35763597            if  (!maybeFunctionDefinition)
35773598              {
3578-                 syntaxError ();
3599+                 SYNTAX_ERROR ();
35793600                return  false ;
35803601              }
35813602
@@ -3602,7 +3623,7 @@ bool Parser::parseDeclarationInternal(DeclarationAST *&node)
36023623        } //  end switch
36033624    }
36043625
3605-   syntaxError ();
3626+   SYNTAX_ERROR ();
36063627  return  false ;
36073628}
36083629
@@ -3670,7 +3691,7 @@ bool Parser::parseTryBlockStatement(StatementAST *&node)
36703691  StatementAST *stmt = 0 ;
36713692  if  (!parseCompoundStatement (stmt))
36723693    {
3673-       syntaxError ();
3694+       SYNTAX_ERROR ();
36743695      return  false ;
36753696    }
36763697
@@ -3699,7 +3720,7 @@ bool Parser::parseTryBlockStatement(StatementAST *&node)
36993720      StatementAST *body = 0 ;
37003721      if  (!parseCompoundStatement (body))
37013722        {
3702-           syntaxError ();
3723+           SYNTAX_ERROR ();
37033724          return  false ;
37043725        }
37053726    }
@@ -3758,6 +3779,8 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node)
37583779      CHECK (' }'  );
37593780      break ;
37603781
3782+     //  case '[': // TODO: parse lambda expression
3783+ 
37613784    default :
37623785      if  (!parseName (ast->name , true ))   //  this can also be a template
37633786        return  false ;
0 commit comments