tools/porting/src/parser.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2001-2004 Roberto Raggi
       
     4 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     5 ** All rights reserved.
       
     6 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     7 **
       
     8 ** This file is part of the qt3to4 porting application of the Qt Toolkit.
       
     9 **
       
    10 ** $QT_BEGIN_LICENSE:LGPL$
       
    11 ** No Commercial Usage
       
    12 ** This file contains pre-release code and may not be distributed.
       
    13 ** You may use this file in accordance with the terms and conditions
       
    14 ** contained in the Technology Preview License Agreement accompanying
       
    15 ** this package.
       
    16 **
       
    17 ** GNU Lesser General Public License Usage
       
    18 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    19 ** General Public License version 2.1 as published by the Free Software
       
    20 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    21 ** packaging of this file.  Please review the following information to
       
    22 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    24 **
       
    25 ** In addition, as a special exception, Nokia gives you certain additional
       
    26 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    28 **
       
    29 ** If you have questions regarding the use of this file, please contact
       
    30 ** Nokia at qt-info@nokia.com.
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 **
       
    39 ** $QT_END_LICENSE$
       
    40 **
       
    41 ****************************************************************************/
       
    42 
       
    43 #include "parser.h"
       
    44 #include "tokens.h"
       
    45 #include "errors.h"
       
    46 
       
    47 #include <QString>
       
    48 #include <QStringList>
       
    49 #include <QDateTime>
       
    50 
       
    51 QT_BEGIN_NAMESPACE
       
    52 
       
    53 #define TT (tokenStream->currentTokenText().data())
       
    54 
       
    55 #define ADVANCE(tk, descr) \
       
    56 { \
       
    57   if (tokenStream->lookAhead() != tk) { \
       
    58     reportError(QString::fromLatin1("'%1' expected found '%2'").arg(QLatin1String(descr)).arg(QString::fromLatin1((tokenStream->currentTokenText().constData())))); \
       
    59       return false; \
       
    60   } \
       
    61   advance(); \
       
    62 }
       
    63 
       
    64 #define ADVANCE_NR(tk, descr) \
       
    65   do { \
       
    66     if (tokenStream->lookAhead() != tk) { \
       
    67         reportError(i18n("'%1' expected found '%2'").arg(QLatin1String(descr)).arg(QString::fromLatin1(tokenStream->currentTokenText().constData()))); \
       
    68     } \
       
    69     else \
       
    70         advance(); \
       
    71   } while (0)
       
    72 
       
    73 #define CHECK(tk, descr) \
       
    74   do { \
       
    75     if (tokenStream->lookAhead() != tk) { \
       
    76         return false; \
       
    77     } \
       
    78     advance(); \
       
    79   } while (0)
       
    80 
       
    81 #define MATCH(tk, descr) \
       
    82   do { \
       
    83     if (tokenStream->lookAhead() != tk) { \
       
    84         reportError(Errors::SyntaxError); \
       
    85         return false; \
       
    86     } \
       
    87   } while (0)
       
    88 
       
    89 #define UPDATE_POS(_node, start, end) \
       
    90   do { \
       
    91       (_node)->setPosition(start, end); \
       
    92   } while (0)
       
    93 
       
    94 #define AST_FROM_TOKEN(node, tk) \
       
    95     AST *node = CreateNode<AST>(m_pool); \
       
    96     UPDATE_POS(node, (tk), (tk)+1);
       
    97 
       
    98 #define DUMP_AST(node) \
       
    99   do { \
       
   100     fprintf(stderr, "\n=================================================\n"); \
       
   101     for (int i=node->startToken(); i<node->endToken(); ++i) \
       
   102        fprintf(stderr, "%s", tokenStream->tokenText(i).constData()); \
       
   103     fprintf(stderr, "\n=================================================\n"); \
       
   104   } while (0)
       
   105 
       
   106 #define RXX_NO_ERROR
       
   107 
       
   108 QString i18n(const char *arg)
       
   109 {
       
   110     return QLatin1String(arg);
       
   111 }
       
   112 
       
   113 
       
   114 //@todo remove me
       
   115 enum
       
   116 {
       
   117     OBJC_CLASS,
       
   118     OBJC_PROTOCOL,
       
   119     OBJC_ALIAS
       
   120 };
       
   121 
       
   122 Parser::Parser()
       
   123 {
       
   124     m_maxProblems = 5;
       
   125     objcp = false;
       
   126 }
       
   127 
       
   128 Parser::~Parser()
       
   129 {
       
   130 }
       
   131 
       
   132 TranslationUnitAST *Parser::parse(TokenStreamAdapter::TokenStream *p_tokenStream, pool *p)
       
   133 {
       
   134    //tokenStream->rewind(0);
       
   135     m_pool = p;
       
   136     tokenStream = p_tokenStream;
       
   137     TranslationUnitAST *ast = 0;
       
   138     parseTranslationUnit(ast);
       
   139     return ast;
       
   140 }
       
   141 
       
   142 /*
       
   143     Parses a part of the translation unit given by tokenStream. When the number
       
   144     of nodes in the AST exeeds targetMaxASTnodes, this function will return as
       
   145     soon as possible. The progress is stored by updating the cursor inside
       
   146     tokenStream. done is set to true if the parser finished parsing the
       
   147     tokenStream, and to false otherwise.
       
   148 */
       
   149 TranslationUnitAST *Parser::parse(TokenStreamAdapter::TokenStream *p_tokenStream, pool *p, int targetMaxASTNodes, bool &done)
       
   150 {
       
   151     m_pool = p;
       
   152     tokenStream = p_tokenStream;
       
   153     TranslationUnitAST *ast = 0;
       
   154     // we always create one node, so target max nodes cannot be < 2.
       
   155     if (targetMaxASTNodes < 2)
       
   156         targetMaxASTNodes = 2;
       
   157 
       
   158     // Advance past whitespace and comment tokens at the start.
       
   159     while (tokenStream->isHidden(tokenStream->cursor())) {
       
   160         tokenStream->nextToken();
       
   161     }
       
   162     int start = tokenStream->cursor();
       
   163 
       
   164     AST::N = 0;
       
   165     m_problems = 0;
       
   166     ast = CreateNode<TranslationUnitAST>(m_pool);
       
   167     while (tokenStream->lookAhead() && AST::N < targetMaxASTNodes) {
       
   168         DeclarationAST *def = 0;
       
   169         int startDecl = tokenStream->cursor();
       
   170         if (!parseDeclaration(def)) {
       
   171             // error recovery
       
   172             if (startDecl == tokenStream->cursor())
       
   173                 advance(); // skip at least one token
       
   174             skipUntilDeclaration();
       
   175         }
       
   176         ast->addDeclaration(def);
       
   177     }
       
   178 
       
   179     UPDATE_POS(ast, start, tokenStream->cursor());
       
   180 
       
   181     done = tokenStream->tokenAtEnd();
       
   182     return ast;
       
   183 }
       
   184 
       
   185 
       
   186 bool Parser::reportError(const Error& err)
       
   187 {
       
   188 Q_UNUSED(err);
       
   189 #ifndef RXX_NO_ERROR
       
   190     if (m_problems < m_maxProblems) {
       
   191         ++m_problems;
       
   192         int line=0, col=0;
       
   193         QByteArray fileName;
       
   194         tokenStream->getTokenStartPosition(tokenStream->cursor(), &line, &col, &fileName);
       
   195 
       
   196         QString s = tokenStream->currentTokenText();
       
   197         s = s.left(30).trimmed();
       
   198         if (s.isEmpty())
       
   199             s = i18n("<eof>");
       
   200 
       
   201         if (fileName.isEmpty())
       
   202             //fileName = m_file->fileName;
       
   203             fileName = "implement me";
       
   204 
       
   205         //        m_driver->addProblem(m_driver->currentFileName(), Problem(err.text.arg(s), line, col));
       
   206         fprintf(stderr, "%s: error %s at line %d column %d\n",
       
   207                 fileName.constData(),
       
   208                 err.text.arg(s).toLatin1().constData(), line, col);
       
   209     }
       
   210 #endif // RXX_NO_ERROR
       
   211     return true;
       
   212 }
       
   213 
       
   214 bool Parser::reportError(const QString& msg)
       
   215 {
       
   216 Q_UNUSED(msg);
       
   217 #ifndef RXX_NO_ERROR
       
   218     if (m_problems < m_maxProblems) {
       
   219         ++m_problems;
       
   220         int line=0, col=0;
       
   221         QByteArray fileName;
       
   222         tokenStream->getTokenStartPosition(tokenStream->cursor(), &line, &col, &fileName);
       
   223 
       
   224         if (fileName.isEmpty())
       
   225             //fileName = m_file->fileName;
       
   226             fileName = "implement me";
       
   227 
       
   228         //        m_driver->addProblem(m_driver->currentFileName(), Problem(msg, line, col));
       
   229         fprintf(stderr, "%s: error %s at line %d column %d\n",
       
   230                 fileName.constData(),
       
   231                 msg.toLatin1().constData(), line, col);
       
   232     }
       
   233 #endif // RXX_NO_ERROR
       
   234     return true;
       
   235 }
       
   236 
       
   237 void Parser::syntaxError()
       
   238 {
       
   239     (void) reportError(Errors::SyntaxError);
       
   240 }
       
   241 
       
   242 bool Parser::skipUntil(int token)
       
   243 {
       
   244     while (tokenStream->lookAhead()) {
       
   245         if (tokenStream->lookAhead() == token)
       
   246             return true;
       
   247 
       
   248         advance();
       
   249     }
       
   250 
       
   251     return false;
       
   252 }
       
   253 
       
   254 bool Parser::skipUntilDeclaration()
       
   255 {
       
   256     while (tokenStream->lookAhead()) {
       
   257 
       
   258         switch(tokenStream->lookAhead()) {
       
   259         case ';':
       
   260         case '~':
       
   261         case Token_scope:
       
   262         case Token_identifier:
       
   263         case Token_operator:
       
   264         case Token_char:
       
   265         case Token_wchar_t:
       
   266         case Token_bool:
       
   267         case Token_short:
       
   268         case Token_int:
       
   269         case Token_long:
       
   270         case Token_signed:
       
   271         case Token_unsigned:
       
   272         case Token_float:
       
   273         case Token_double:
       
   274         case Token_void:
       
   275         case Token_extern:
       
   276         case Token_namespace:
       
   277         case Token_using:
       
   278         case Token_typedef:
       
   279         case Token_asm:
       
   280         case Token_template:
       
   281         case Token_export:
       
   282 
       
   283         case Token_const:       // cv
       
   284         case Token_volatile:    // cv
       
   285 
       
   286         case Token_public:
       
   287         case Token_protected:
       
   288         case Token_private:
       
   289         case Token_signals:      // Qt
       
   290         case Token_slots:        // Qt
       
   291               return true;
       
   292 
       
   293         default:
       
   294             advance();
       
   295         }
       
   296     }
       
   297 
       
   298     return false;
       
   299 }
       
   300 
       
   301 bool Parser::skipUntilStatement()
       
   302 {
       
   303     while (tokenStream->lookAhead()) {
       
   304         switch(tokenStream->lookAhead()) {
       
   305                 case ';':
       
   306                 case '{':
       
   307                 case '}':
       
   308                 case Token_const:
       
   309                 case Token_volatile:
       
   310                 case Token_identifier:
       
   311                 case Token_case:
       
   312                 case Token_default:
       
   313                 case Token_if:
       
   314                 case Token_switch:
       
   315                 case Token_while:
       
   316                 case Token_do:
       
   317                 case Token_for:
       
   318                 case Token_break:
       
   319                 case Token_continue:
       
   320                 case Token_return:
       
   321                 case Token_goto:
       
   322                 case Token_try:
       
   323                 case Token_catch:
       
   324                 case Token_throw:
       
   325                 case Token_char:
       
   326                 case Token_wchar_t:
       
   327                 case Token_bool:
       
   328                 case Token_short:
       
   329                 case Token_int:
       
   330                 case Token_long:
       
   331                 case Token_signed:
       
   332                 case Token_unsigned:
       
   333                 case Token_float:
       
   334                 case Token_double:
       
   335                 case Token_void:
       
   336                 case Token_class:
       
   337                 case Token_struct:
       
   338                 case Token_union:
       
   339                 case Token_enum:
       
   340                 case Token_scope:
       
   341                 case Token_template:
       
   342                 case Token_using:
       
   343                     return true;
       
   344 
       
   345             default:
       
   346                   advance();
       
   347         }
       
   348     }
       
   349 
       
   350     return false;
       
   351 }
       
   352 
       
   353 bool Parser::skip(int l, int r)
       
   354 {
       
   355     int count = 0;
       
   356     while (tokenStream->lookAhead()) {
       
   357         int tk = tokenStream->lookAhead();
       
   358 
       
   359         if (tk == l)
       
   360             ++count;
       
   361         else if (tk == r)
       
   362             --count;
       
   363         else if (l != '{' && (tk == '{' || tk == '}' || tk == ';'))
       
   364             return false;
       
   365 
       
   366         if (count == 0)
       
   367             return true;
       
   368 
       
   369         advance();
       
   370     }
       
   371 
       
   372     return false;
       
   373 }
       
   374 
       
   375 bool Parser::skipCommaExpression(AbstractExpressionAST *&node)
       
   376 {
       
   377 #ifndef RXX_NO_PARSE_EXPRESSION
       
   378     return parseCommaExpression(node);
       
   379 #else
       
   380     int start = tokenStream->cursor();
       
   381 
       
   382     AbstractExpressionAST *expr = 0;
       
   383     if (!skipExpression(expr))
       
   384         return false;
       
   385 
       
   386     while (tokenStream->lookAhead() == ',') {
       
   387         advance();
       
   388 
       
   389         if (!skipExpression(expr)) {
       
   390             reportError(i18n("expression expected"));
       
   391             return false;
       
   392         }
       
   393     }
       
   394 
       
   395     AbstractExpressionAST *ast = CreateNode<AbstractExpressionAST>(m_pool);
       
   396     UPDATE_POS(ast, start, tokenStream->cursor());
       
   397     node = ast;
       
   398 
       
   399     return true;
       
   400 #endif // RXX_NO_PARSE_EXPRESSION
       
   401 }
       
   402 
       
   403 bool Parser::skipExpression(AbstractExpressionAST *&node)
       
   404 {
       
   405 #ifndef RXX_NO_PARSE_EXPRESSION
       
   406     return parseExpression(node);
       
   407 #else
       
   408     int start = tokenStream->cursor();
       
   409     int count = 0;
       
   410 
       
   411     while (tokenStream->lookAhead()) {
       
   412         int tk = tokenStream->lookAhead();
       
   413 
       
   414         switch(tk) {
       
   415         case '(':
       
   416         case '[':
       
   417         case '{':
       
   418             ++count;
       
   419             advance();
       
   420             break;
       
   421 
       
   422         case ']':
       
   423         case ')':
       
   424         case '}':
       
   425             if (count == 0) {
       
   426                 AbstractExpressionAST *ast = CreateNode<AbstractExpressionAST>(m_pool);
       
   427                 UPDATE_POS(ast, start, tokenStream->cursor());
       
   428                 node = ast;
       
   429                 return true;
       
   430             }
       
   431             --count;
       
   432             advance();
       
   433             break;
       
   434 
       
   435         case Token_struct:
       
   436         case Token_union:
       
   437         case Token_class: {
       
   438             int c = tokenStream->cursor();
       
   439             TypeSpecifierAST *spec = 0;
       
   440             if (!parseClassSpecifier(spec))
       
   441                 tokenStream->rewind(c + 1);
       
   442         }
       
   443         break;
       
   444 
       
   445         case ',':
       
   446         case ';':
       
   447         case Token_case:
       
   448         case Token_default:
       
   449         case Token_if:
       
   450         case Token_while:
       
   451         case Token_do:
       
   452         case Token_for:
       
   453         case Token_break:
       
   454         case Token_continue:
       
   455         case Token_return:
       
   456         case Token_goto:
       
   457         {
       
   458             if ((tk == ',' || tk == ';') && count > 0) {
       
   459                 advance();
       
   460                 break;
       
   461             }
       
   462 
       
   463             AbstractExpressionAST *ast = CreateNode<AbstractExpressionAST>(m_pool);
       
   464             UPDATE_POS(ast, start, tokenStream->cursor());
       
   465             node = ast;
       
   466         }
       
   467         return true;
       
   468 
       
   469         default:
       
   470             advance();
       
   471         }
       
   472     }
       
   473 
       
   474     return false;
       
   475 #endif // RXX_NO_PARSE_EXPRESSION
       
   476 }
       
   477 
       
   478 bool Parser::parseName(NameAST *&node, bool parseTemplateId)
       
   479 {
       
   480     AST *winDeclSpec = 0;
       
   481     parseWinDeclSpec(winDeclSpec);
       
   482 
       
   483     int start = tokenStream->cursor();
       
   484 
       
   485     NameAST *ast = CreateNode<NameAST>(m_pool);
       
   486 
       
   487     if (tokenStream->lookAhead() == Token_scope) {
       
   488         ast->setGlobal(true);
       
   489         advance();
       
   490     }
       
   491 
       
   492     int idx = tokenStream->cursor();
       
   493 
       
   494     while (true) {
       
   495         ClassOrNamespaceNameAST *n = 0;
       
   496         if (!parseUnqualifiedName(n))
       
   497             return false;
       
   498 
       
   499         if (tokenStream->lookAhead() == Token_scope) {
       
   500             advance();
       
   501             ast->addClassOrNamespaceName(n);
       
   502             if (tokenStream->lookAhead() == Token_template)
       
   503                 advance(); /// skip optional template     #### @todo CHECK
       
   504         } else if (!parseTemplateId && n) {
       
   505             tokenStream->rewind(n->startToken());
       
   506             parseUnqualifiedName(n, parseTemplateId);
       
   507             ast->setUnqualifiedName(n);
       
   508             break;
       
   509         } else {
       
   510             ast->setUnqualifiedName(n);
       
   511             break;
       
   512         }
       
   513     }
       
   514 
       
   515     if (idx == tokenStream->cursor())
       
   516         return false;
       
   517 
       
   518     UPDATE_POS(ast, start, tokenStream->cursor());
       
   519     node = ast;
       
   520 
       
   521     return true;
       
   522 }
       
   523 
       
   524 bool Parser::parseTranslationUnit(TranslationUnitAST *&node)
       
   525 {
       
   526     QTime t;
       
   527     t.start();
       
   528 
       
   529     advance();
       
   530     int start = tokenStream->cursor();
       
   531 
       
   532     m_problems = 0;
       
   533     TranslationUnitAST *tun = CreateNode<TranslationUnitAST>(m_pool);
       
   534     node = tun;
       
   535     while (tokenStream->lookAhead()) {
       
   536         DeclarationAST *def = 0;
       
   537         int startDecl = tokenStream->cursor();
       
   538         if (!parseDeclaration(def)) {
       
   539             // error recovery
       
   540             if (startDecl == tokenStream->cursor())
       
   541                 advance(); // skip at least one token
       
   542             skipUntilDeclaration();
       
   543         }
       
   544         node->addDeclaration(def);
       
   545     }
       
   546 
       
   547     UPDATE_POS(node, start, tokenStream->cursor());
       
   548 
       
   549     return m_problems == 0;
       
   550 }
       
   551 
       
   552 bool Parser::parseDeclaration(DeclarationAST *&node)
       
   553 {
       
   554     int start = tokenStream->cursor();
       
   555 
       
   556     switch(tokenStream->lookAhead()) {
       
   557 
       
   558     case ';':
       
   559         advance();
       
   560         return true;
       
   561 
       
   562     case Token_extern:
       
   563         return parseLinkageSpecification(node);
       
   564 
       
   565     case Token_namespace:
       
   566         return parseNamespace(node);
       
   567 
       
   568     case Token_using:
       
   569         return parseUsing(node);
       
   570 
       
   571     case Token_typedef:
       
   572         return parseTypedef(node);
       
   573 
       
   574     case Token_asm:
       
   575         return parseAsmDefinition(node);
       
   576 
       
   577     case Token_template:
       
   578     case Token_export:
       
   579         return parseTemplateDeclaration(node);
       
   580 
       
   581     default:
       
   582         {
       
   583             // tokenStream->rewind(start);
       
   584 
       
   585             if (objcp && parseObjcDef(node))
       
   586                 return true;
       
   587 
       
   588             tokenStream->rewind(start);
       
   589 
       
   590             AST *storageSpec = 0;
       
   591             parseStorageClassSpecifier(storageSpec);
       
   592 
       
   593             AST *cv = 0;
       
   594             parseCvQualify(cv);
       
   595 
       
   596             TypeSpecifierAST *spec = 0;
       
   597             if (parseEnumSpecifier(spec) || parseClassSpecifier(spec)) {
       
   598                 spec->setCvQualify(cv);
       
   599 
       
   600                 AST *cv2 = 0;
       
   601                 parseCvQualify(cv2);
       
   602                 spec->setCv2Qualify(cv2);
       
   603 
       
   604                 InitDeclaratorListAST *declarators = 0;
       
   605                 parseInitDeclaratorList(declarators);
       
   606                 ADVANCE(';', ";");
       
   607 
       
   608                 SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
       
   609                 ast->setStorageSpecifier(storageSpec);
       
   610                 ast->setTypeSpec(spec);
       
   611                 ast->setInitDeclaratorList(declarators);
       
   612                 UPDATE_POS(ast, start, tokenStream->cursor());
       
   613                 node = ast;
       
   614 
       
   615                 return true;
       
   616             }
       
   617 
       
   618             tokenStream->rewind(start);
       
   619             return parseDeclarationInternal(node);
       
   620         }
       
   621 
       
   622     } // end switch
       
   623 }
       
   624 
       
   625 bool Parser::parseLinkageSpecification(DeclarationAST *&node)
       
   626 {
       
   627     int start = tokenStream->cursor();
       
   628 
       
   629     if (tokenStream->lookAhead() != Token_extern) {
       
   630         return false;
       
   631     }
       
   632     advance();
       
   633 
       
   634     LinkageSpecificationAST *ast = CreateNode<LinkageSpecificationAST>(m_pool);
       
   635 
       
   636     int startExternType = tokenStream->cursor();
       
   637     if (tokenStream->lookAhead() == Token_string_literal) {
       
   638         advance();
       
   639         AST *externType = CreateNode<AST>(m_pool);
       
   640         UPDATE_POS(externType, startExternType, tokenStream->cursor());
       
   641 
       
   642         ast->setExternType(externType);
       
   643     }
       
   644 
       
   645     if (tokenStream->lookAhead() == '{') {
       
   646         LinkageBodyAST *linkageBody = 0;
       
   647         parseLinkageBody(linkageBody);
       
   648         ast->setLinkageBody(linkageBody);
       
   649     } else {
       
   650         DeclarationAST *decl = 0;
       
   651         if (!parseDeclaration(decl)) {
       
   652             reportError(i18n("Declaration syntax error"));
       
   653         }
       
   654         ast->setDeclaration(decl);
       
   655     }
       
   656 
       
   657     UPDATE_POS(ast, start, tokenStream->cursor());
       
   658 
       
   659     node = ast;
       
   660 
       
   661     return true;
       
   662 }
       
   663 
       
   664 bool Parser::parseLinkageBody(LinkageBodyAST *&node)
       
   665 {
       
   666 
       
   667     int start = tokenStream->cursor();
       
   668 
       
   669     if (tokenStream->lookAhead() != '{') {
       
   670         return false;
       
   671     }
       
   672     advance();
       
   673 
       
   674     LinkageBodyAST *lba = CreateNode<LinkageBodyAST>(m_pool);
       
   675     node = lba;
       
   676 
       
   677     while (tokenStream->lookAhead()) {
       
   678         int tk = tokenStream->lookAhead();
       
   679 
       
   680         if (tk == '}')
       
   681             break;
       
   682 
       
   683         DeclarationAST *def = 0;
       
   684         int startDecl = tokenStream->cursor();
       
   685         if (parseDeclaration(def)) {
       
   686             node->addDeclaration(def);
       
   687         } else {
       
   688             // error recovery
       
   689             if (startDecl == tokenStream->cursor())
       
   690                 advance(); // skip at least one token
       
   691             skipUntilDeclaration();
       
   692         }
       
   693     }
       
   694 
       
   695     if (tokenStream->lookAhead() != '}') {
       
   696         reportError(i18n("} expected"));
       
   697     } else
       
   698         advance();
       
   699 
       
   700     UPDATE_POS(node, start, tokenStream->cursor());
       
   701     return true;
       
   702 }
       
   703 
       
   704 bool Parser::parseNamespace(DeclarationAST *&node)
       
   705 {
       
   706     int start = tokenStream->cursor();
       
   707 
       
   708     if (tokenStream->lookAhead() != Token_namespace) {
       
   709         return false;
       
   710     }
       
   711     advance();
       
   712 
       
   713     int startNamespaceName = tokenStream->cursor();
       
   714     if (tokenStream->lookAhead() == Token_identifier) {
       
   715         advance();
       
   716     }
       
   717     AST *namespaceName = CreateNode<AST>(m_pool);
       
   718     UPDATE_POS(namespaceName, startNamespaceName, tokenStream->cursor());
       
   719 
       
   720     if (tokenStream->lookAhead() == '=') {
       
   721         // namespace alias
       
   722         advance();
       
   723 
       
   724         NameAST *name = 0;
       
   725         if (parseName(name)) {
       
   726             ADVANCE(';', ";");
       
   727 
       
   728             NamespaceAliasAST *ast = CreateNode<NamespaceAliasAST>(m_pool);
       
   729             ast->setNamespaceName(namespaceName);
       
   730             ast->setAliasName(name);
       
   731             UPDATE_POS(ast, start, tokenStream->cursor());
       
   732             node = ast;
       
   733             return true;
       
   734         } else {
       
   735             reportError(i18n("namespace expected"));
       
   736             return false;
       
   737         }
       
   738     } else if (tokenStream->lookAhead() != '{') {
       
   739         reportError(i18n("{ expected"));
       
   740         return false;
       
   741     }
       
   742 
       
   743     NamespaceAST *ast = CreateNode<NamespaceAST>(m_pool);
       
   744     ast->setNamespaceName(namespaceName);
       
   745 
       
   746     LinkageBodyAST *linkageBody = 0;
       
   747     parseLinkageBody(linkageBody);
       
   748 
       
   749     ast->setLinkageBody(linkageBody);
       
   750     UPDATE_POS(ast, start, tokenStream->cursor());
       
   751     node = ast;
       
   752 
       
   753     return true;
       
   754 }
       
   755 
       
   756 bool Parser::parseUsing(DeclarationAST *&node)
       
   757 {
       
   758     int start = tokenStream->cursor();
       
   759 
       
   760     if (tokenStream->lookAhead() != Token_using) {
       
   761         return false;
       
   762     }
       
   763     advance();
       
   764 
       
   765     if (tokenStream->lookAhead() == Token_namespace) {
       
   766         if (!parseUsingDirective(node)) {
       
   767             return false;
       
   768         }
       
   769         UPDATE_POS(node, start, tokenStream->cursor());
       
   770         return true;
       
   771     }
       
   772 
       
   773     UsingAST *ast = CreateNode<UsingAST>(m_pool);
       
   774 
       
   775     int startTypeName = tokenStream->cursor();
       
   776     if (tokenStream->lookAhead() == Token_typename) {
       
   777         advance();
       
   778         AST *tn = CreateNode<AST>(m_pool);
       
   779         UPDATE_POS(tn, startTypeName, tokenStream->cursor());
       
   780         ast->setTypeName(tn);
       
   781     }
       
   782 
       
   783     NameAST *name = 0;
       
   784     if (!parseName(name))
       
   785         return false;
       
   786 
       
   787     ast->setName(name);
       
   788 
       
   789     ADVANCE(';', ";");
       
   790 
       
   791     UPDATE_POS(ast, start, tokenStream->cursor());
       
   792     node = ast;
       
   793 
       
   794     return true;
       
   795 }
       
   796 
       
   797 bool Parser::parseUsingDirective(DeclarationAST *&node)
       
   798 {
       
   799     int start = tokenStream->cursor();
       
   800 
       
   801     if (tokenStream->lookAhead() != Token_namespace) {
       
   802         return false;
       
   803     }
       
   804     advance();
       
   805 
       
   806     NameAST *name = 0;
       
   807     if (!parseName(name)) {
       
   808         reportError(i18n("Namespace name expected"));
       
   809         return false;
       
   810     }
       
   811 
       
   812     ADVANCE(';', ";");
       
   813 
       
   814     UsingDirectiveAST *ast = CreateNode<UsingDirectiveAST>(m_pool);
       
   815     ast->setName(name);
       
   816     UPDATE_POS(ast, start, tokenStream->cursor());
       
   817     node = ast;
       
   818 
       
   819     return true;
       
   820 }
       
   821 
       
   822 
       
   823 bool Parser::parseOperatorFunctionId(AST *&node)
       
   824 {
       
   825     int start = tokenStream->cursor();
       
   826 
       
   827     if (tokenStream->lookAhead() != Token_operator) {
       
   828         return false;
       
   829     }
       
   830     advance();
       
   831 
       
   832     AST *op = 0;
       
   833     if (parseOperator(op)) {
       
   834         AST *asn = CreateNode<AST>(m_pool);
       
   835         node = asn;
       
   836         UPDATE_POS(node, start, tokenStream->cursor());
       
   837         return true;
       
   838     } else {
       
   839         // parse cast operator
       
   840         AST *cv = 0;
       
   841         parseCvQualify(cv);
       
   842 
       
   843         TypeSpecifierAST *spec = 0;
       
   844         if (!parseSimpleTypeSpecifier(spec)) {
       
   845             syntaxError();
       
   846             return false;
       
   847         }
       
   848         spec->setCvQualify(cv);
       
   849 
       
   850         AST *cv2 = 0;
       
   851         parseCvQualify(cv2);
       
   852         spec->setCv2Qualify(cv2);
       
   853 
       
   854         AST *ptrOp = 0;
       
   855         while (parsePtrOperator(ptrOp))
       
   856               ;
       
   857 
       
   858         AST *asn = CreateNode<AST>(m_pool);
       
   859         node = asn;
       
   860         UPDATE_POS(node, start, tokenStream->cursor());
       
   861         return true;
       
   862     }
       
   863 }
       
   864 
       
   865 bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node, bool reportError)
       
   866 {
       
   867     int start = tokenStream->cursor();
       
   868 
       
   869     TemplateArgumentListAST *ast = CreateNode<TemplateArgumentListAST>(m_pool);
       
   870 
       
   871     AST *templArg = 0;
       
   872     if (!parseTemplateArgument(templArg))
       
   873         return false;
       
   874     ast->addArgument(templArg);
       
   875 
       
   876     while (tokenStream->lookAhead() == ',') {
       
   877         advance();
       
   878 
       
   879         if (!parseTemplateArgument(templArg)) {
       
   880             if (reportError) {
       
   881                syntaxError();
       
   882                break;
       
   883             } else
       
   884                return false;
       
   885         }
       
   886         ast->addArgument(templArg);
       
   887     }
       
   888 
       
   889     UPDATE_POS(ast, start, tokenStream->cursor());
       
   890     node = ast;
       
   891 
       
   892     return true;
       
   893 }
       
   894 
       
   895 bool Parser::parseTypedef(DeclarationAST *&node)
       
   896 {
       
   897     int start = tokenStream->cursor();
       
   898 
       
   899     if (tokenStream->lookAhead() != Token_typedef) {
       
   900         return false;
       
   901     }
       
   902     advance();
       
   903 
       
   904     TypeSpecifierAST *spec = 0;
       
   905     if (!parseTypeSpecifierOrClassSpec(spec)) {
       
   906         reportError(i18n("Need a type specifier to declare"));
       
   907         return false;
       
   908     }
       
   909 
       
   910     InitDeclaratorListAST *declarators = 0;
       
   911     if (!parseInitDeclaratorList(declarators)) {
       
   912         //reportError(i18n("Need an identifier to declare"));
       
   913         //return false;
       
   914     }
       
   915 
       
   916     ADVANCE(';', ";");
       
   917 
       
   918     TypedefAST *ast = CreateNode<TypedefAST>(m_pool);
       
   919     ast->setTypeSpec(spec);
       
   920     ast->setInitDeclaratorList(declarators);
       
   921     UPDATE_POS(ast, start, tokenStream->cursor());
       
   922     node = ast;
       
   923 
       
   924     return true;
       
   925 }
       
   926 
       
   927 bool Parser::parseAsmDefinition(DeclarationAST *&node)
       
   928 {
       
   929     int start = tokenStream->cursor();
       
   930 
       
   931     ADVANCE(Token_asm, "asm");
       
   932 
       
   933     AST *cv = 0;
       
   934     parseCvQualify(cv);
       
   935 
       
   936     skip('(', ')');
       
   937     advance();
       
   938     ADVANCE(';', ";");
       
   939 
       
   940     DeclarationAST *ast = CreateNode<DeclarationAST>(m_pool);
       
   941     UPDATE_POS(ast, start, tokenStream->cursor());
       
   942     node = ast;
       
   943 
       
   944     return true;
       
   945 }
       
   946 
       
   947 bool Parser::parseTemplateDeclaration(DeclarationAST *&node)
       
   948 {
       
   949     int start = tokenStream->cursor();
       
   950 
       
   951     AST *exp = 0;
       
   952 
       
   953     int startExport = tokenStream->cursor();
       
   954     if (tokenStream->lookAhead() == Token_export) {
       
   955         advance();
       
   956         AST *n = CreateNode<AST>(m_pool);
       
   957         UPDATE_POS(n, startExport, tokenStream->cursor());
       
   958         exp = n;
       
   959     }
       
   960 
       
   961     if (tokenStream->lookAhead() != Token_template) {
       
   962         return false;
       
   963     }
       
   964     advance();
       
   965 
       
   966     TemplateParameterListAST *params = 0;
       
   967     if (tokenStream->lookAhead() == '<') {
       
   968         advance();
       
   969         parseTemplateParameterList(params);
       
   970 
       
   971         ADVANCE('>', ">");
       
   972     }
       
   973 
       
   974     DeclarationAST *def = 0;
       
   975     if (!parseDeclaration(def)) {
       
   976         reportError(i18n("expected a declaration"));
       
   977     }
       
   978 
       
   979     TemplateDeclarationAST *ast = CreateNode<TemplateDeclarationAST>(m_pool);
       
   980     ast->setExported(exp);
       
   981     ast->setTemplateParameterList(params);
       
   982     ast->setDeclaration(def);
       
   983     UPDATE_POS(ast, start, tokenStream->cursor());
       
   984     node = ast;
       
   985 
       
   986     return true;
       
   987 }
       
   988 
       
   989 bool Parser::parseOperator(AST *&/*node*/)
       
   990 {
       
   991     QString text(QString::fromLatin1(tokenStream->currentTokenText().constData()));
       
   992 
       
   993     switch(tokenStream->lookAhead()) {
       
   994     case Token_new:
       
   995     case Token_delete:
       
   996         advance();
       
   997         if (tokenStream->lookAhead() == '[' && tokenStream->lookAhead(1) == ']') {
       
   998             advance();
       
   999             advance();
       
  1000             text += QLatin1String("[]");
       
  1001         }
       
  1002         return true;
       
  1003 
       
  1004     case '+':
       
  1005     case '-':
       
  1006     case '*':
       
  1007     case '/':
       
  1008     case '%':
       
  1009     case '^':
       
  1010     case '&':
       
  1011     case '|':
       
  1012     case '~':
       
  1013     case '!':
       
  1014     case '=':
       
  1015     case '<':
       
  1016     case '>':
       
  1017     case ',':
       
  1018     case Token_assign:
       
  1019     case Token_shift:
       
  1020     case Token_eq:
       
  1021     case Token_not_eq:
       
  1022     case Token_leq:
       
  1023     case Token_geq:
       
  1024     case Token_and:
       
  1025     case Token_or:
       
  1026     case Token_incr:
       
  1027     case Token_decr:
       
  1028     case Token_ptrmem:
       
  1029     case Token_arrow:
       
  1030         advance();
       
  1031         return true;
       
  1032 
       
  1033     default:
       
  1034         if (tokenStream->lookAhead() == '(' && tokenStream->lookAhead(1) == ')') {
       
  1035             advance();
       
  1036             advance();
       
  1037             return true;
       
  1038         } else if (tokenStream->lookAhead() == '[' && tokenStream->lookAhead(1) == ']') {
       
  1039             advance();
       
  1040             advance();
       
  1041             return true;
       
  1042         }
       
  1043     }
       
  1044 
       
  1045     return false;
       
  1046 }
       
  1047 
       
  1048 bool Parser::parseCvQualify(AST *&node)
       
  1049 {
       
  1050     int start = tokenStream->cursor();
       
  1051 
       
  1052     AST *ast = CreateNode<AST>(m_pool);
       
  1053 
       
  1054     int n = 0;
       
  1055     while (tokenStream->lookAhead()) {
       
  1056         int tk = tokenStream->lookAhead();
       
  1057         if (tk == Token_const || tk == Token_volatile) {
       
  1058             ++n;
       
  1059             int startWord = tokenStream->cursor();
       
  1060             advance();
       
  1061             AST *word = CreateNode<AST>(m_pool);
       
  1062             UPDATE_POS(word, startWord, tokenStream->cursor());
       
  1063             word->setParent(ast);
       
  1064         } else
       
  1065             break;
       
  1066     }
       
  1067 
       
  1068     if (n == 0)
       
  1069         return false;
       
  1070 
       
  1071 
       
  1072     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1073 
       
  1074     node = ast;
       
  1075     return true;
       
  1076 }
       
  1077 
       
  1078 bool Parser::parseSimpleTypeSpecifier(TypeSpecifierAST *&node, bool onlyIntegral)
       
  1079 {
       
  1080     int start = tokenStream->cursor();
       
  1081     bool isIntegral = false;
       
  1082     bool done = false;
       
  1083 
       
  1084     while (!done) {
       
  1085         switch(tokenStream->lookAhead()) {
       
  1086             case Token_char:
       
  1087             case Token_wchar_t:
       
  1088             case Token_bool:
       
  1089             case Token_short:
       
  1090             case Token_int:
       
  1091             case Token_long:
       
  1092             case Token_signed:
       
  1093             case Token_unsigned:
       
  1094             case Token_float:
       
  1095             case Token_double:
       
  1096             case Token_void:
       
  1097                 isIntegral = true;
       
  1098                 advance();
       
  1099                 break;
       
  1100 
       
  1101             default:
       
  1102                 done = true;
       
  1103         }
       
  1104     }
       
  1105 
       
  1106     TypeSpecifierAST *ast = CreateNode<TypeSpecifierAST>(m_pool);
       
  1107     if (isIntegral) {
       
  1108         ClassOrNamespaceNameAST *cl = CreateNode<ClassOrNamespaceNameAST>(m_pool);
       
  1109 
       
  1110         AST *n = CreateNode<AST>(m_pool);
       
  1111         UPDATE_POS(n, start, tokenStream->cursor());
       
  1112         cl->setName(n);
       
  1113         UPDATE_POS(cl, start, tokenStream->cursor());
       
  1114 
       
  1115         NameAST *name = CreateNode<NameAST>(m_pool);
       
  1116         name->setUnqualifiedName(cl);
       
  1117         UPDATE_POS(name, start, tokenStream->cursor());
       
  1118         ast->setName(name);
       
  1119     } else if (tokenStream->lookAhead() == Token___typeof) {
       
  1120         advance();
       
  1121         if (tokenStream->lookAhead() == '(') {
       
  1122             advance();
       
  1123             TypeIdAST *typeId = 0;
       
  1124             parseTypeId(typeId);
       
  1125             ADVANCE(')', ")");
       
  1126         } else {
       
  1127             AbstractExpressionAST *e = 0;
       
  1128             parseUnaryExpression(e);
       
  1129         }
       
  1130     } else if (onlyIntegral) {
       
  1131         tokenStream->rewind(start);
       
  1132         return false;
       
  1133     } else {
       
  1134         NameAST *name = 0;
       
  1135         if (!parseName(name)) {
       
  1136             tokenStream->rewind(start);
       
  1137             return false;
       
  1138         }
       
  1139         ast->setName(name);
       
  1140     }
       
  1141 
       
  1142     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1143     node = ast;
       
  1144     return true;
       
  1145 }
       
  1146 
       
  1147 bool Parser::parsePtrOperator(AST *&node)
       
  1148 {
       
  1149     int start = tokenStream->cursor();
       
  1150     int tok = tokenStream->lookAhead();
       
  1151     AST *memPtr = 0;
       
  1152 
       
  1153     switch (tok) {
       
  1154         case '&':
       
  1155         case '*':
       
  1156             advance();
       
  1157             break;
       
  1158 
       
  1159         case Token_scope:
       
  1160         case Token_identifier:
       
  1161             if (!parsePtrToMember(memPtr)) {
       
  1162                 tokenStream->rewind(start);
       
  1163                 return false;
       
  1164             }
       
  1165             break;
       
  1166 
       
  1167         default:
       
  1168             return false;
       
  1169     }
       
  1170 
       
  1171     AST *cv = 0;
       
  1172     parseCvQualify(cv);
       
  1173 
       
  1174     AST *ast = CreateNode<AST>(m_pool);
       
  1175     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1176     node = ast;
       
  1177 
       
  1178     return true;
       
  1179 }
       
  1180 
       
  1181 
       
  1182 bool Parser::parseTemplateArgument(AST *&node)
       
  1183 {
       
  1184     int start = tokenStream->cursor();
       
  1185 
       
  1186     TypeIdAST *typeId = 0;
       
  1187     if (parseTypeId(typeId)) {
       
  1188         if (tokenStream->lookAhead() == ',' || tokenStream->lookAhead() == '>') {
       
  1189             node = typeId;
       
  1190             return true;
       
  1191         }
       
  1192     }
       
  1193 
       
  1194     tokenStream->rewind(start);
       
  1195     AbstractExpressionAST *expr = 0;
       
  1196     if (!parseLogicalOrExpression(expr, true)) {
       
  1197         return false;
       
  1198     }
       
  1199     node = expr;
       
  1200 
       
  1201     return true;
       
  1202 }
       
  1203 
       
  1204 bool Parser::parseTypeSpecifier(TypeSpecifierAST *&spec)
       
  1205 {
       
  1206     AST *cv = 0;
       
  1207     parseCvQualify(cv);
       
  1208 
       
  1209     if (parseElaboratedTypeSpecifier(spec) || parseSimpleTypeSpecifier(spec)) {
       
  1210         spec->setCvQualify(cv);
       
  1211 
       
  1212         AST *cv2 = 0;
       
  1213         parseCvQualify(cv2);
       
  1214         spec->setCv2Qualify(cv2);
       
  1215 
       
  1216         return true;
       
  1217     }
       
  1218 
       
  1219     return false;
       
  1220 }
       
  1221 
       
  1222 bool Parser::parseDeclarator(DeclaratorAST *&node)
       
  1223 {
       
  1224     int start = tokenStream->cursor();
       
  1225 
       
  1226     DeclaratorAST *ast = CreateNode<DeclaratorAST>(m_pool);
       
  1227 
       
  1228     DeclaratorAST *decl = 0;
       
  1229     NameAST *declId = 0;
       
  1230 
       
  1231     AST *ptrOp = 0;
       
  1232     while (parsePtrOperator(ptrOp)) {
       
  1233         ast->addPtrOp(ptrOp);
       
  1234     }
       
  1235 
       
  1236     if (tokenStream->lookAhead() == '(') {
       
  1237         advance();
       
  1238 
       
  1239         if (!parseDeclarator(decl)) {
       
  1240             return false;
       
  1241         }
       
  1242         ast->setSubDeclarator(decl);
       
  1243 
       
  1244         if (tokenStream->lookAhead() != ')') {
       
  1245             return false;
       
  1246         }
       
  1247         advance();
       
  1248     } else {
       
  1249         if (tokenStream->lookAhead() == ':') {
       
  1250              // unnamed bitfield
       
  1251         } else if (parseDeclaratorId(declId)) {
       
  1252             ast->setDeclaratorId(declId);
       
  1253         } else {
       
  1254             tokenStream->rewind(start);
       
  1255             return false;
       
  1256         }
       
  1257 
       
  1258         if (tokenStream->lookAhead() == ':') {
       
  1259             advance();
       
  1260             AbstractExpressionAST *expr = 0;
       
  1261             if (!parseConstantExpression(expr)) {
       
  1262                 reportError(i18n("Constant expression expected"));
       
  1263             }
       
  1264             goto update_pos;
       
  1265         }
       
  1266     }
       
  1267 
       
  1268     {
       
  1269         bool isVector = false;
       
  1270 
       
  1271         while (tokenStream->lookAhead() == '[') {
       
  1272             int startArray = tokenStream->cursor();
       
  1273             advance();
       
  1274             AbstractExpressionAST *expr = 0;
       
  1275             parseCommaExpression(expr);
       
  1276 
       
  1277             ADVANCE(']', "]");
       
  1278             AST *array = CreateNode<AST>(m_pool);
       
  1279             UPDATE_POS(array, startArray, tokenStream->cursor());
       
  1280             ast->addArrayDimension(array);
       
  1281             isVector = true;
       
  1282         }
       
  1283 
       
  1284         bool skipParen = false;
       
  1285         if (tokenStream->lookAhead() == Token_identifier
       
  1286                 && tokenStream->lookAhead(1) == '('
       
  1287                 && tokenStream->lookAhead(2) == '(') {
       
  1288             advance();
       
  1289             advance();
       
  1290             skipParen = true;
       
  1291         }
       
  1292 
       
  1293         int tok = tokenStream->lookAhead();
       
  1294         if (ast->subDeclarator() && !(isVector || tok == '(' || tok == ',' || tok == ';' || tok == '=')) {
       
  1295             tokenStream->rewind(start);
       
  1296             return false;
       
  1297         }
       
  1298 
       
  1299         int index = tokenStream->cursor();
       
  1300         if (tokenStream->lookAhead() == '(') {
       
  1301             advance();
       
  1302 
       
  1303             ParameterDeclarationClauseAST *params = 0;
       
  1304             if (!parseParameterDeclarationClause(params)) {
       
  1305                 tokenStream->rewind(index);
       
  1306                 goto update_pos;
       
  1307             }
       
  1308             ast->setParameterDeclarationClause(params);
       
  1309 
       
  1310             if (tokenStream->lookAhead() != ')') {
       
  1311                 tokenStream->rewind(index);
       
  1312                 goto update_pos;
       
  1313             }
       
  1314 
       
  1315             advance();  // skip ')'
       
  1316 
       
  1317             AST *constant = 0;
       
  1318             parseCvQualify(constant);
       
  1319             ast->setConstant(constant);
       
  1320 
       
  1321             AST *except = 0;
       
  1322             if (parseExceptionSpecification(except)) {
       
  1323                 ast->setExceptionSpecification(except);
       
  1324             }
       
  1325         }
       
  1326 
       
  1327         if (skipParen) {
       
  1328             if (tokenStream->lookAhead() != ')') {
       
  1329                 reportError(i18n("')' expected"));
       
  1330             } else
       
  1331                 advance();
       
  1332         }
       
  1333     }
       
  1334 
       
  1335 update_pos:
       
  1336     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1337     node = ast;
       
  1338 
       
  1339     return true;
       
  1340 }
       
  1341 
       
  1342 bool Parser::parseAbstractDeclarator(DeclaratorAST *&node)
       
  1343 {
       
  1344     int start = tokenStream->cursor();
       
  1345 
       
  1346     DeclaratorAST *ast = CreateNode<DeclaratorAST>(m_pool);
       
  1347     DeclaratorAST *decl = 0;
       
  1348 
       
  1349     AST *ptrOp = 0;
       
  1350     while (parsePtrOperator(ptrOp)) {
       
  1351         ast->addPtrOp(ptrOp);
       
  1352     }
       
  1353 
       
  1354     int index = tokenStream->cursor();
       
  1355     if (tokenStream->lookAhead() == '(') {
       
  1356         advance();
       
  1357 
       
  1358         if (!parseAbstractDeclarator(decl)) {
       
  1359             tokenStream->rewind(index);
       
  1360             goto label1;
       
  1361         }
       
  1362 
       
  1363         ast->setSubDeclarator(decl);
       
  1364 
       
  1365         if (tokenStream->lookAhead() != ')'){
       
  1366             tokenStream->rewind(start);
       
  1367             return false;
       
  1368         }
       
  1369         advance();
       
  1370     } else if (tokenStream->lookAhead() == ':') {
       
  1371         advance();
       
  1372         AbstractExpressionAST *expr = 0;
       
  1373         if (!parseConstantExpression(expr)) {
       
  1374             reportError(i18n("Constant expression expected"));
       
  1375         }
       
  1376         goto update_pos;
       
  1377     }
       
  1378 
       
  1379 label1:
       
  1380     {
       
  1381         bool isVector = false;
       
  1382 
       
  1383         while (tokenStream->lookAhead() == '[') {
       
  1384             int startArray = tokenStream->cursor();
       
  1385             advance();
       
  1386             AbstractExpressionAST *expr = 0;
       
  1387             parseCommaExpression(expr);
       
  1388 
       
  1389             ADVANCE(']', "]");
       
  1390             AST *array = CreateNode<AST>(m_pool);
       
  1391             UPDATE_POS(array, startArray, tokenStream->cursor());
       
  1392             ast->addArrayDimension(array);
       
  1393             isVector = true;
       
  1394         }
       
  1395 
       
  1396         int tok = tokenStream->lookAhead();
       
  1397         if (ast->subDeclarator() && !(isVector || tok == '(' || tok == ',' || tok == ';' || tok == '=')) {
       
  1398             tokenStream->rewind(start);
       
  1399             return false;
       
  1400         }
       
  1401 
       
  1402         int index = tokenStream->cursor();
       
  1403         if (tokenStream->lookAhead() == '(') {
       
  1404             advance();
       
  1405 
       
  1406             ParameterDeclarationClauseAST *params = 0;
       
  1407             if (!parseParameterDeclarationClause(params)) {
       
  1408                 tokenStream->rewind(index);
       
  1409                 goto update_pos;
       
  1410             }
       
  1411             ast->setParameterDeclarationClause(params);
       
  1412 
       
  1413             if (tokenStream->lookAhead() != ')') {
       
  1414                 tokenStream->rewind(index);
       
  1415                 goto update_pos;
       
  1416             }
       
  1417 
       
  1418             advance();  // skip ')'
       
  1419 
       
  1420             AST *constant = 0;
       
  1421             parseCvQualify(constant);
       
  1422             ast->setConstant(constant);
       
  1423 
       
  1424             AST *except = 0;
       
  1425             if (parseExceptionSpecification(except)) {
       
  1426                 ast->setExceptionSpecification(except);
       
  1427             }
       
  1428         }
       
  1429     }
       
  1430 
       
  1431 update_pos:
       
  1432     if (tokenStream->cursor() == start)
       
  1433         return false;
       
  1434 
       
  1435     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1436     node = ast;
       
  1437 
       
  1438     return true;
       
  1439 }
       
  1440 
       
  1441 bool Parser::parseEnumSpecifier(TypeSpecifierAST *&node)
       
  1442 {
       
  1443     int start = tokenStream->cursor();
       
  1444 
       
  1445     if (tokenStream->lookAhead() != Token_enum) {
       
  1446         return false;
       
  1447     }
       
  1448 
       
  1449     advance();
       
  1450 
       
  1451     NameAST *name = 0;
       
  1452     parseName(name);
       
  1453 
       
  1454     if (tokenStream->lookAhead() != '{') {
       
  1455         tokenStream->rewind(start);
       
  1456         return false;
       
  1457     }
       
  1458     advance();
       
  1459 
       
  1460     EnumSpecifierAST *ast = CreateNode<EnumSpecifierAST>(m_pool);
       
  1461     ast->setName(name);
       
  1462 
       
  1463     EnumeratorAST *enumerator = 0;
       
  1464     if (parseEnumerator(enumerator)) {
       
  1465         ast->addEnumerator(enumerator);
       
  1466 
       
  1467         while (tokenStream->lookAhead() == ',') {
       
  1468             advance();
       
  1469 
       
  1470             if (!parseEnumerator(enumerator)) {
       
  1471                 //reportError(i18n("Enumerator expected"));
       
  1472                 break;
       
  1473             }
       
  1474 
       
  1475             ast->addEnumerator(enumerator);
       
  1476         }
       
  1477     }
       
  1478 
       
  1479     if (tokenStream->lookAhead() != '}')
       
  1480         reportError(i18n("} missing"));
       
  1481     else
       
  1482         advance();
       
  1483 
       
  1484     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1485     node = ast;
       
  1486 
       
  1487     return true;
       
  1488 }
       
  1489 
       
  1490 bool Parser::parseTemplateParameterList(TemplateParameterListAST *&node)
       
  1491 {
       
  1492     int start = tokenStream->cursor();
       
  1493 
       
  1494     TemplateParameterListAST *ast = CreateNode<TemplateParameterListAST>(m_pool);
       
  1495 
       
  1496     TemplateParameterAST *param = 0;
       
  1497     if (!parseTemplateParameter(param)) {
       
  1498         return false;
       
  1499     }
       
  1500     ast->addTemplateParameter(param);
       
  1501 
       
  1502     while (tokenStream->lookAhead() == ',') {
       
  1503         advance();
       
  1504 
       
  1505         if (!parseTemplateParameter(param)) {
       
  1506             syntaxError();
       
  1507             break;
       
  1508         } else {
       
  1509             ast->addTemplateParameter(param);
       
  1510         }
       
  1511     }
       
  1512 
       
  1513     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1514     node = ast;
       
  1515 
       
  1516     return true;
       
  1517 }
       
  1518 
       
  1519 bool Parser::parseTemplateParameter(TemplateParameterAST *&node)
       
  1520 {
       
  1521     int start = tokenStream->cursor();
       
  1522     TemplateParameterAST *ast = CreateNode<TemplateParameterAST>(m_pool);
       
  1523 
       
  1524     TypeParameterAST *typeParameter = 0;
       
  1525     ParameterDeclarationAST *param = 0;
       
  1526 
       
  1527     int tk = tokenStream->lookAhead();
       
  1528 
       
  1529     if ((tk == Token_class || tk == Token_typename || tk == Token_template) && parseTypeParameter(typeParameter)) {
       
  1530         ast->setTypeParameter(typeParameter);
       
  1531         goto ok;
       
  1532     }
       
  1533 
       
  1534     if (!parseParameterDeclaration(param))
       
  1535         return false;
       
  1536     ast->setTypeValueParameter(param);
       
  1537 
       
  1538 ok:
       
  1539     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1540     node = ast;
       
  1541 
       
  1542     return true;
       
  1543 }
       
  1544 
       
  1545 bool Parser::parseTypeParameter(TypeParameterAST *&node)
       
  1546 {
       
  1547     int start = tokenStream->cursor();
       
  1548     TypeParameterAST *ast = CreateNode<TypeParameterAST>(m_pool);
       
  1549 
       
  1550     AST_FROM_TOKEN(kind, tokenStream->cursor());
       
  1551     ast->setKind(kind);
       
  1552 
       
  1553     switch(tokenStream->lookAhead()) {
       
  1554 
       
  1555     case Token_class:
       
  1556     case Token_typename:
       
  1557         {
       
  1558             advance(); // skip class
       
  1559 
       
  1560             // parse optional name
       
  1561             NameAST *name = 0;
       
  1562             if(parseName(name)){
       
  1563                 ast->setName(name);
       
  1564 
       
  1565                 if (tokenStream->lookAhead() == '='){
       
  1566                     advance();
       
  1567 
       
  1568                     TypeIdAST *typeId = 0;
       
  1569                     if(!parseTypeId(typeId)){
       
  1570                         //syntaxError();
       
  1571                         tokenStream->rewind(start);
       
  1572                         return false;
       
  1573                     }
       
  1574                     ast->setTypeId(typeId);
       
  1575                 } else if (!(tokenStream->lookAhead() == ',' || tokenStream->lookAhead() == '>')) {
       
  1576                     tokenStream->rewind(start);
       
  1577                     return false;
       
  1578                 }
       
  1579             }
       
  1580         }
       
  1581         break;
       
  1582 
       
  1583     case Token_template:
       
  1584         {
       
  1585             advance(); // skip template
       
  1586             ADVANCE('<', "<");
       
  1587 
       
  1588             TemplateParameterListAST *params = 0;
       
  1589             if (!parseTemplateParameterList(params)) {
       
  1590                 return false;
       
  1591             }
       
  1592             ast->setTemplateParameterList(params);
       
  1593 
       
  1594             ADVANCE('>', ">");
       
  1595 
       
  1596             if (tokenStream->lookAhead() == Token_class)
       
  1597                 advance();
       
  1598 
       
  1599             // parse optional name
       
  1600             NameAST *name = 0;
       
  1601             if (parseName(name)) {
       
  1602                 ast->setName(name);
       
  1603                 if (tokenStream->lookAhead() == '=') {
       
  1604                     advance();
       
  1605 
       
  1606                     TypeIdAST *typeId = 0;
       
  1607                     if (!parseTypeId(typeId)) {
       
  1608                         syntaxError();
       
  1609                         return false;
       
  1610                     }
       
  1611                     ast->setTypeId(typeId);
       
  1612                 }
       
  1613             }
       
  1614 
       
  1615             if (tokenStream->lookAhead() == '=') {
       
  1616                 advance();
       
  1617 
       
  1618                 NameAST *templ_name = 0;
       
  1619                 parseName(templ_name);
       
  1620             }
       
  1621         }
       
  1622         break;
       
  1623 
       
  1624     default:
       
  1625         return false;
       
  1626 
       
  1627     } // end switch
       
  1628 
       
  1629 
       
  1630     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1631     node = ast;
       
  1632     return true;
       
  1633 }
       
  1634 
       
  1635 bool Parser::parseStorageClassSpecifier(AST *&node)
       
  1636 {
       
  1637     int start = tokenStream->cursor();
       
  1638     AST *ast = CreateNode<AST>(m_pool);
       
  1639 
       
  1640     while (tokenStream->lookAhead()) {
       
  1641         int tk = tokenStream->lookAhead();
       
  1642         if (tk == Token_friend || tk == Token_auto || tk == Token_register || tk == Token_static ||
       
  1643                 tk == Token_extern || tk == Token_mutable) {
       
  1644             int startNode = tokenStream->cursor();
       
  1645             advance();
       
  1646 
       
  1647             AST *n = CreateNode<AST>(m_pool);
       
  1648             UPDATE_POS(n, startNode, tokenStream->cursor());
       
  1649             n->setParent(ast);
       
  1650         } else
       
  1651             break;
       
  1652     }
       
  1653 
       
  1654     if (length(ast->children()) == 0)
       
  1655        return false;
       
  1656 
       
  1657     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1658     node = ast;
       
  1659     return true;
       
  1660 }
       
  1661 
       
  1662 bool Parser::parseFunctionSpecifier(AST *&node)
       
  1663 {
       
  1664     int start = tokenStream->cursor();
       
  1665     AST *ast = CreateNode<AST>(m_pool);
       
  1666 
       
  1667     while (tokenStream->lookAhead()) {
       
  1668         int tk = tokenStream->lookAhead();
       
  1669         if (tk == Token_inline || tk == Token_virtual || tk == Token_explicit) {
       
  1670             int startNode = tokenStream->cursor();
       
  1671             advance();
       
  1672 
       
  1673             AST *n = CreateNode<AST>(m_pool);
       
  1674             UPDATE_POS(n, startNode, tokenStream->cursor());
       
  1675             n->setParent(ast);
       
  1676         } else {
       
  1677             break;
       
  1678     }
       
  1679     }
       
  1680 
       
  1681     if (length(ast->children()) == 0)
       
  1682        return false;
       
  1683 
       
  1684     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1685     node = ast;
       
  1686     return true;
       
  1687 }
       
  1688 
       
  1689 bool Parser::parseTypeId(TypeIdAST *&node)
       
  1690 {
       
  1691     /// @todo implement the AST for typeId
       
  1692     int start = tokenStream->cursor();
       
  1693 
       
  1694     TypeSpecifierAST *spec = 0;
       
  1695     if (!parseTypeSpecifier(spec)) {
       
  1696         tokenStream->rewind(start);
       
  1697         return false;
       
  1698     }
       
  1699 
       
  1700     DeclaratorAST *decl = 0;
       
  1701     parseAbstractDeclarator(decl);
       
  1702 
       
  1703     TypeIdAST *ast = CreateNode<TypeIdAST>(m_pool);
       
  1704     ast->setTypeSpecifier(spec);
       
  1705     ast->setDeclarator(decl);
       
  1706 
       
  1707     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1708     node = ast;
       
  1709 
       
  1710     return true;
       
  1711 }
       
  1712 
       
  1713 bool Parser::parseInitDeclaratorList(InitDeclaratorListAST *&node)
       
  1714 {
       
  1715     int start = tokenStream->cursor();
       
  1716 
       
  1717     InitDeclaratorListAST *ast = CreateNode<InitDeclaratorListAST>(m_pool);
       
  1718     InitDeclaratorAST *decl = 0;
       
  1719 
       
  1720     if (!parseInitDeclarator(decl)) {
       
  1721         return false;
       
  1722     }
       
  1723     ast->addInitDeclarator(decl);
       
  1724 
       
  1725     while (tokenStream->lookAhead() == ',') {
       
  1726         advance();
       
  1727 
       
  1728         if (!parseInitDeclarator(decl)) {
       
  1729             syntaxError();
       
  1730             break;
       
  1731         }
       
  1732         ast->addInitDeclarator(decl);
       
  1733     }
       
  1734 
       
  1735     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1736     node = ast;
       
  1737 
       
  1738     return true;
       
  1739 }
       
  1740 
       
  1741 bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node)
       
  1742 {
       
  1743     int start = tokenStream->cursor();
       
  1744 
       
  1745     ParameterDeclarationClauseAST *ast = CreateNode<ParameterDeclarationClauseAST>(m_pool);
       
  1746 
       
  1747     ParameterDeclarationListAST *params = 0;
       
  1748     if (!parseParameterDeclarationList(params)) {
       
  1749 
       
  1750         if (tokenStream->lookAhead() == ')')
       
  1751             goto good;
       
  1752 
       
  1753         if (tokenStream->lookAhead() == Token_ellipsis && tokenStream->lookAhead(1) == ')') {
       
  1754             AST_FROM_TOKEN(ellipsis, tokenStream->cursor());
       
  1755             ast->setEllipsis(ellipsis);
       
  1756             advance();
       
  1757             goto good;
       
  1758         }
       
  1759         return false;
       
  1760     }
       
  1761 
       
  1762     if (tokenStream->lookAhead() == Token_ellipsis) {
       
  1763         AST_FROM_TOKEN(ellipsis, tokenStream->cursor());
       
  1764         ast->setEllipsis(ellipsis);
       
  1765         advance();
       
  1766     }
       
  1767 
       
  1768 good:
       
  1769     ast->setParameterDeclarationList(params);
       
  1770 
       
  1771     /// @todo add ellipsis
       
  1772     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1773     node = ast;
       
  1774 
       
  1775     return true;
       
  1776 }
       
  1777 
       
  1778 bool Parser::parseParameterDeclarationList(ParameterDeclarationListAST *&node)
       
  1779 {
       
  1780     int start = tokenStream->cursor();
       
  1781 
       
  1782     ParameterDeclarationListAST *ast = CreateNode<ParameterDeclarationListAST>(m_pool);
       
  1783 
       
  1784     ParameterDeclarationAST *param = 0;
       
  1785     if (!parseParameterDeclaration(param)) {
       
  1786         tokenStream->rewind(start);
       
  1787         return false;
       
  1788     }
       
  1789     ast->addParameter(param);
       
  1790 
       
  1791     while (tokenStream->lookAhead() == ',') {
       
  1792         advance();
       
  1793 
       
  1794         if (tokenStream->lookAhead() == Token_ellipsis)
       
  1795             break;
       
  1796 
       
  1797         if (!parseParameterDeclaration(param)) {
       
  1798             tokenStream->rewind(start);
       
  1799             return false;
       
  1800         }
       
  1801         ast->addParameter(param);
       
  1802     }
       
  1803 
       
  1804     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1805     node = ast;
       
  1806 
       
  1807     return true;
       
  1808 }
       
  1809 
       
  1810 bool Parser::parseParameterDeclaration(ParameterDeclarationAST *&node)
       
  1811 {
       
  1812     int start = tokenStream->cursor();
       
  1813 
       
  1814     AST *storage = 0;
       
  1815     parseStorageClassSpecifier(storage);
       
  1816 
       
  1817     // parse decl spec
       
  1818     TypeSpecifierAST *spec = 0;
       
  1819     if (!parseTypeSpecifier(spec)) {
       
  1820         tokenStream->rewind(start);
       
  1821         return false;
       
  1822     }
       
  1823 
       
  1824     int index = tokenStream->cursor();
       
  1825 
       
  1826     DeclaratorAST *decl = 0;
       
  1827     if (!parseDeclarator(decl)) {
       
  1828         tokenStream->rewind(index);
       
  1829 
       
  1830         // try with abstract declarator
       
  1831         parseAbstractDeclarator(decl);
       
  1832     }
       
  1833 
       
  1834     AbstractExpressionAST *expr = 0;
       
  1835     if (tokenStream->lookAhead() == '=') {
       
  1836         advance();
       
  1837         if (!parseLogicalOrExpression(expr,true)) {
       
  1838             //reportError(i18n("Expression expected"));
       
  1839         }
       
  1840     }
       
  1841 
       
  1842     ParameterDeclarationAST *ast = CreateNode<ParameterDeclarationAST>(m_pool);
       
  1843     ast->setTypeSpec(spec);
       
  1844     ast->setDeclarator(decl);
       
  1845     ast->setExpression(expr);
       
  1846 
       
  1847     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1848     node = ast;
       
  1849 
       
  1850     return true;
       
  1851 }
       
  1852 
       
  1853 bool Parser::parseClassSpecifier(TypeSpecifierAST *&node)
       
  1854 {
       
  1855     int start = tokenStream->cursor();
       
  1856 
       
  1857     AST *classKey = 0;
       
  1858     int classKeyStart = tokenStream->cursor();
       
  1859 
       
  1860     int kind = tokenStream->lookAhead();
       
  1861     if (kind == Token_class || kind == Token_struct || kind == Token_union) {
       
  1862         AST *asn = CreateNode<AST>(m_pool);
       
  1863         classKey = asn;
       
  1864         advance();
       
  1865         UPDATE_POS(classKey, classKeyStart, tokenStream->cursor());
       
  1866     } else {
       
  1867         return false;
       
  1868     }
       
  1869 
       
  1870     AST *winDeclSpec = 0;
       
  1871     parseWinDeclSpec(winDeclSpec);
       
  1872 
       
  1873     while (tokenStream->lookAhead() == Token_identifier && tokenStream->lookAhead(1) == Token_identifier)
       
  1874             advance();
       
  1875 
       
  1876     NameAST *name = 0;
       
  1877     parseName(name);
       
  1878 
       
  1879     BaseClauseAST *bases = 0;
       
  1880     if (tokenStream->lookAhead() == ':') {
       
  1881         if (!parseBaseClause(bases)) {
       
  1882             skipUntil('{');
       
  1883         }
       
  1884     }
       
  1885 
       
  1886     if (tokenStream->lookAhead() != '{') {
       
  1887         tokenStream->rewind(start);
       
  1888         return false;
       
  1889     }
       
  1890 
       
  1891     ADVANCE('{', "{");
       
  1892 
       
  1893     ClassSpecifierAST *ast = CreateNode<ClassSpecifierAST>(m_pool);
       
  1894     ast->setWinDeclSpec(winDeclSpec);
       
  1895     ast->setClassKey(classKey);
       
  1896     ast->setName(name);
       
  1897     ast->setBaseClause(bases);
       
  1898 
       
  1899     while (tokenStream->lookAhead()) {
       
  1900         if (tokenStream->lookAhead() == '}')
       
  1901             break;
       
  1902 
       
  1903         DeclarationAST *memSpec = 0;
       
  1904         int startDecl = tokenStream->cursor();
       
  1905         if (!parseMemberSpecification(memSpec)) {
       
  1906             if (startDecl == tokenStream->cursor())
       
  1907                 advance(); // skip at least one token
       
  1908             skipUntilDeclaration();
       
  1909         } else
       
  1910             ast->addDeclaration(memSpec);
       
  1911     }
       
  1912 
       
  1913     if (tokenStream->lookAhead() != '}') {
       
  1914         reportError(i18n("} missing"));
       
  1915     } else
       
  1916         advance();
       
  1917 
       
  1918     UPDATE_POS(ast, start, tokenStream->cursor());
       
  1919     node = ast;
       
  1920 
       
  1921     return true;
       
  1922 }
       
  1923 
       
  1924 bool Parser::parseAccessSpecifier(AST *&node)
       
  1925 {
       
  1926     int start = tokenStream->cursor();
       
  1927 
       
  1928     switch(tokenStream->lookAhead()) {
       
  1929     case Token_public:
       
  1930     case Token_protected:
       
  1931     case Token_private: {
       
  1932         AST *asn = CreateNode<AST>(m_pool);
       
  1933         node = asn;
       
  1934         advance();
       
  1935         UPDATE_POS(node, start, tokenStream->cursor());
       
  1936         return true;
       
  1937         }
       
  1938     }
       
  1939 
       
  1940     return false;
       
  1941 }
       
  1942 
       
  1943 bool Parser::parseMemberSpecification(DeclarationAST *&node)
       
  1944 {
       
  1945     int start = tokenStream->cursor();
       
  1946 
       
  1947     AST *access = 0;
       
  1948 
       
  1949     if (tokenStream->lookAhead() == ';') {
       
  1950         advance();
       
  1951         return true;
       
  1952     } else if (tokenStream->lookAhead() == Token_Q_OBJECT || tokenStream->lookAhead() == Token_K_DCOP) {
       
  1953         advance();
       
  1954         return true;
       
  1955     } else if (tokenStream->lookAhead() == Token_signals
       
  1956             || tokenStream->lookAhead() == Token_k_dcop
       
  1957             || tokenStream->lookAhead() == Token_k_dcop_signals) {
       
  1958         AccessDeclarationAST *ast = CreateNode<AccessDeclarationAST>(m_pool);
       
  1959         advance();
       
  1960         AST *n = CreateNode<AST>(m_pool);
       
  1961         UPDATE_POS(n, start, tokenStream->cursor());
       
  1962         ast->addAccess(n);
       
  1963         ADVANCE(':', ":");
       
  1964         UPDATE_POS(ast, start, tokenStream->cursor());
       
  1965         node = ast;
       
  1966         return true;
       
  1967     } else if (parseTypedef(node)) {
       
  1968         return true;
       
  1969     } else if (parseUsing(node)) {
       
  1970         return true;
       
  1971     } else if (parseTemplateDeclaration(node)) {
       
  1972         return true;
       
  1973     } else if (parseAccessSpecifier(access)) {
       
  1974         AccessDeclarationAST *ast = CreateNode<AccessDeclarationAST>(m_pool);
       
  1975         ast->addAccess(access);
       
  1976 
       
  1977         int startSlot = tokenStream->cursor();
       
  1978         if (tokenStream->lookAhead() == Token_slots) {
       
  1979             advance();
       
  1980             AST *sl = CreateNode<AST>(m_pool);
       
  1981             UPDATE_POS(sl, startSlot, tokenStream->cursor());
       
  1982             ast->addAccess(sl);
       
  1983         }
       
  1984         ADVANCE(':', ":");
       
  1985         UPDATE_POS(ast, start, tokenStream->cursor());
       
  1986         node = ast;
       
  1987         return true;
       
  1988     }
       
  1989 
       
  1990     tokenStream->rewind(start);
       
  1991 
       
  1992     AST *storageSpec = 0;
       
  1993     parseStorageClassSpecifier(storageSpec);
       
  1994 
       
  1995     AST *cv = 0;
       
  1996     parseCvQualify(cv);
       
  1997 
       
  1998     TypeSpecifierAST *spec = 0;
       
  1999     if (parseEnumSpecifier(spec) || parseClassSpecifier(spec)) {
       
  2000         spec->setCvQualify(cv);
       
  2001 
       
  2002         AST *cv2 = 0;
       
  2003         parseCvQualify(cv2);
       
  2004         spec->setCv2Qualify(cv2);
       
  2005 
       
  2006             InitDeclaratorListAST *declarators = 0;
       
  2007         parseInitDeclaratorList(declarators);
       
  2008         ADVANCE(';', ";");
       
  2009 
       
  2010         SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
       
  2011         ast->setTypeSpec(spec);
       
  2012         ast->setInitDeclaratorList(declarators);
       
  2013         UPDATE_POS(ast, start, tokenStream->cursor());
       
  2014         node = ast;
       
  2015 
       
  2016         return true;
       
  2017     }
       
  2018 
       
  2019     tokenStream->rewind(start);
       
  2020     return parseDeclarationInternal(node);
       
  2021 }
       
  2022 
       
  2023 bool Parser::parseCtorInitializer(AST *&/*node*/)
       
  2024 {
       
  2025     if (tokenStream->lookAhead() != ':') {
       
  2026         return false;
       
  2027     }
       
  2028     advance();
       
  2029 
       
  2030     AST *inits = 0;
       
  2031     if (!parseMemInitializerList(inits)) {
       
  2032         reportError(i18n("Member initializers expected"));
       
  2033     }
       
  2034 
       
  2035     return true;
       
  2036 }
       
  2037 
       
  2038 bool Parser::parseElaboratedTypeSpecifier(TypeSpecifierAST *&node)
       
  2039 {
       
  2040     int start = tokenStream->cursor();
       
  2041 
       
  2042     int tk = tokenStream->lookAhead();
       
  2043     if (tk == Token_class  ||
       
  2044         tk == Token_struct ||
       
  2045         tk == Token_union  ||
       
  2046         tk == Token_enum   ||
       
  2047         tk == Token_typename)
       
  2048     {
       
  2049         AST *kind = CreateNode<AST>(m_pool);
       
  2050         advance();
       
  2051         UPDATE_POS(kind, start, tokenStream->cursor());
       
  2052 
       
  2053         NameAST *name = 0;
       
  2054 
       
  2055         if (parseName(name)) {
       
  2056             ElaboratedTypeSpecifierAST *ast = CreateNode<ElaboratedTypeSpecifierAST>(m_pool);
       
  2057             ast->setKind(kind);
       
  2058             ast->setName(name);
       
  2059             UPDATE_POS(ast, start, tokenStream->cursor());
       
  2060             node = ast;
       
  2061 
       
  2062             return true;
       
  2063         }
       
  2064     }
       
  2065 
       
  2066     tokenStream->rewind(start);
       
  2067     return false;
       
  2068 }
       
  2069 
       
  2070 bool Parser::parseDeclaratorId(NameAST *&node)
       
  2071 {
       
  2072     return parseName(node);
       
  2073 }
       
  2074 
       
  2075 bool Parser::parseExceptionSpecification(AST *&node)
       
  2076 {
       
  2077     if (tokenStream->lookAhead() != Token_throw) {
       
  2078         return false;
       
  2079     }
       
  2080     advance();
       
  2081 
       
  2082     ADVANCE('(', "(");
       
  2083     if (tokenStream->lookAhead() == Token_ellipsis) {
       
  2084         // extension found in MSVC++ 7.x headers
       
  2085         int start = tokenStream->cursor();
       
  2086         AST *ast = CreateNode<AST>(m_pool);
       
  2087         AST_FROM_TOKEN(ellipsis, tokenStream->cursor());
       
  2088         ellipsis->setParent(ast);
       
  2089         advance();
       
  2090         UPDATE_POS(ast, start, tokenStream->cursor());
       
  2091         node = ast;
       
  2092     } else {
       
  2093         parseTypeIdList(node);
       
  2094     }
       
  2095     ADVANCE(')', ")");
       
  2096 
       
  2097     return true;
       
  2098 }
       
  2099 
       
  2100 bool Parser::parseEnumerator(EnumeratorAST *&node)
       
  2101 {
       
  2102     int start = tokenStream->cursor();
       
  2103 
       
  2104     if (tokenStream->lookAhead() != Token_identifier) {
       
  2105         return false;
       
  2106     }
       
  2107     advance();
       
  2108 
       
  2109     EnumeratorAST *ena = CreateNode<EnumeratorAST>(m_pool);
       
  2110     node = ena;
       
  2111 
       
  2112     AST *id = CreateNode<AST>(m_pool);
       
  2113     UPDATE_POS(id, start, tokenStream->cursor());
       
  2114     node->setId(id);
       
  2115 
       
  2116     if (tokenStream->lookAhead() == '=') {
       
  2117         advance();
       
  2118 
       
  2119         AbstractExpressionAST *expr = 0;
       
  2120         if (!parseConstantExpression(expr)) {
       
  2121             reportError(i18n("Constant expression expected"));
       
  2122         }
       
  2123         node->setExpression(expr);
       
  2124     }
       
  2125 
       
  2126     UPDATE_POS(node, start, tokenStream->cursor());
       
  2127 
       
  2128     return true;
       
  2129 }
       
  2130 
       
  2131 bool Parser::parseInitDeclarator(InitDeclaratorAST *&node)
       
  2132 {
       
  2133     int start = tokenStream->cursor();
       
  2134 
       
  2135     DeclaratorAST *decl = 0;
       
  2136     AST *init = 0;
       
  2137     if (!parseDeclarator(decl)) {
       
  2138         return false;
       
  2139     }
       
  2140 
       
  2141     parseInitializer(init);
       
  2142 
       
  2143     InitDeclaratorAST *ast = CreateNode<InitDeclaratorAST>(m_pool);
       
  2144     ast->setDeclarator(decl);
       
  2145     ast->setInitializer(init);
       
  2146     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2147     node = ast;
       
  2148 
       
  2149     return true;
       
  2150 }
       
  2151 
       
  2152 
       
  2153 
       
  2154 bool Parser::parseBaseClause(BaseClauseAST *&node)
       
  2155 {
       
  2156     int start = tokenStream->cursor();
       
  2157     if (tokenStream->lookAhead() != ':') {
       
  2158         return false;
       
  2159     }
       
  2160     advance();
       
  2161 
       
  2162     BaseClauseAST *bca = CreateNode<BaseClauseAST>(m_pool);
       
  2163 
       
  2164     BaseSpecifierAST *baseSpec = 0;
       
  2165     if (parseBaseSpecifier(baseSpec)) {
       
  2166         bca->addBaseSpecifier(baseSpec);
       
  2167 
       
  2168         while (tokenStream->lookAhead() == ',') {
       
  2169             advance();
       
  2170 
       
  2171             if (!parseBaseSpecifier(baseSpec)) {
       
  2172                 reportError(i18n("Base class specifier expected"));
       
  2173                 return false;
       
  2174             }
       
  2175             bca->addBaseSpecifier(baseSpec);
       
  2176         }
       
  2177     } else
       
  2178         return false;
       
  2179 
       
  2180     UPDATE_POS(bca, start, tokenStream->cursor());
       
  2181     node = bca;
       
  2182 
       
  2183     return true;
       
  2184 }
       
  2185 
       
  2186 bool Parser::parseInitializer(AST *&node)
       
  2187 {
       
  2188     if (tokenStream->lookAhead() == '=') {
       
  2189         advance();
       
  2190 
       
  2191         if (!parseInitializerClause(node)) {
       
  2192             reportError(i18n("Initializer clause expected"));
       
  2193             return false;
       
  2194         }
       
  2195         return true;
       
  2196     } else if (tokenStream->lookAhead() == '(') {
       
  2197         advance();
       
  2198         AbstractExpressionAST *expr = 0;
       
  2199         skipCommaExpression(expr);
       
  2200         CHECK(')', ")");
       
  2201         node = expr;
       
  2202         return true;
       
  2203     }
       
  2204 
       
  2205     return false;
       
  2206 }
       
  2207 
       
  2208 bool Parser::parseMemInitializerList(AST *&/*node*/)
       
  2209 {
       
  2210     AST *init = 0;
       
  2211     if (!parseMemInitializer(init)) {
       
  2212         return false;
       
  2213     }
       
  2214 
       
  2215     while (tokenStream->lookAhead() == ',') {
       
  2216         advance();
       
  2217 
       
  2218         if (!parseMemInitializer(init)) {
       
  2219             break;
       
  2220         }
       
  2221     }
       
  2222 
       
  2223     return true;
       
  2224 }
       
  2225 
       
  2226 bool Parser::parseMemInitializer(AST *&/*node*/)
       
  2227 {
       
  2228     NameAST *initId = 0;
       
  2229     if (!parseMemInitializerId(initId)) {
       
  2230         reportError(i18n("Identifier expected"));
       
  2231         return false;
       
  2232     }
       
  2233     ADVANCE('(', "(");
       
  2234     AbstractExpressionAST *expr = 0;
       
  2235     skipCommaExpression(expr);
       
  2236     ADVANCE(')', ")");
       
  2237 
       
  2238     return true;
       
  2239 }
       
  2240 
       
  2241 bool Parser::parseTypeIdList(AST *&node)
       
  2242 {
       
  2243 
       
  2244     int start = tokenStream->cursor();
       
  2245 
       
  2246     TypeIdAST *typeId = 0;
       
  2247     if (!parseTypeId(typeId)) {
       
  2248         return false;
       
  2249     }
       
  2250 
       
  2251     AST *ast = CreateNode<AST>(m_pool);
       
  2252     typeId->setParent(ast);
       
  2253 
       
  2254     while (tokenStream->lookAhead() == ',') {
       
  2255         advance();
       
  2256         if (parseTypeId(typeId)) {
       
  2257             typeId->setParent(ast);
       
  2258         } else {
       
  2259             reportError(i18n("Type id expected"));
       
  2260             break;
       
  2261         }
       
  2262     }
       
  2263 
       
  2264     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2265     node = ast;
       
  2266     return true;
       
  2267 }
       
  2268 
       
  2269 bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node)
       
  2270 {
       
  2271     int start = tokenStream->cursor();
       
  2272     BaseSpecifierAST *ast = CreateNode<BaseSpecifierAST>(m_pool);
       
  2273 
       
  2274     AST *access = 0;
       
  2275     if (tokenStream->lookAhead() == Token_virtual) {
       
  2276         AST_FROM_TOKEN(virt, tokenStream->cursor());
       
  2277         ast->setIsVirtual(virt);
       
  2278 
       
  2279         advance();
       
  2280 
       
  2281         parseAccessSpecifier(access);
       
  2282     } else {
       
  2283         parseAccessSpecifier(access);
       
  2284 
       
  2285         if (tokenStream->lookAhead() == Token_virtual) {
       
  2286             AST_FROM_TOKEN(virt, tokenStream->cursor());
       
  2287             ast->setIsVirtual(virt);
       
  2288             advance();
       
  2289         }
       
  2290     }
       
  2291 
       
  2292     NameAST *name = 0;
       
  2293     if (!parseName(name)) {
       
  2294         reportError(i18n("Class name expected"));
       
  2295     }
       
  2296 
       
  2297     ast->setAccess(access);
       
  2298     ast->setName(name);
       
  2299     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2300     node = ast;
       
  2301 
       
  2302     return true;
       
  2303 }
       
  2304 
       
  2305 
       
  2306 bool Parser::parseInitializerClause(AST *&node)
       
  2307 {
       
  2308     if (tokenStream->lookAhead() == '{') {
       
  2309         if (!skip('{','}')) {
       
  2310             reportError(i18n("} missing"));
       
  2311         } else
       
  2312             advance();
       
  2313     } else {
       
  2314         AbstractExpressionAST *expr = 0;
       
  2315         if (!parseAssignmentExpression(expr)) {
       
  2316             //reportError(i18n("Expression expected"));
       
  2317         }
       
  2318         node = expr;
       
  2319     }
       
  2320 
       
  2321     return true;
       
  2322 }
       
  2323 
       
  2324 bool Parser::parseMemInitializerId(NameAST *&node)
       
  2325 {
       
  2326 
       
  2327     return parseName(node);
       
  2328 }
       
  2329 
       
  2330 bool Parser::parsePtrToMember(AST *&/*node*/)     /// ### create the AST node
       
  2331 {
       
  2332     int start = tokenStream->cursor();
       
  2333 
       
  2334     if (tokenStream->lookAhead() == Token_scope)
       
  2335         advance();
       
  2336 
       
  2337     ClassOrNamespaceNameAST *name = 0;
       
  2338     while (tokenStream->lookAhead() == Token_identifier) {
       
  2339 
       
  2340         if (!parseUnqualifiedName(name))
       
  2341             break;
       
  2342 
       
  2343         if (tokenStream->lookAhead() == Token_scope
       
  2344                 && tokenStream->lookAhead(1) == '*') {
       
  2345             advance();
       
  2346             advance();
       
  2347             return true;
       
  2348         }
       
  2349 
       
  2350         if (tokenStream->lookAhead() == Token_scope)
       
  2351             advance();
       
  2352     }
       
  2353 
       
  2354     tokenStream->rewind(start);
       
  2355     return false;
       
  2356 }
       
  2357 
       
  2358 bool Parser::parseUnqualifiedName(ClassOrNamespaceNameAST *&node, bool parseTemplateId)
       
  2359 {
       
  2360     int start = tokenStream->cursor();
       
  2361     bool isDestructor = false;
       
  2362 
       
  2363     ClassOrNamespaceNameAST *ast = CreateNode<ClassOrNamespaceNameAST>(m_pool);
       
  2364 
       
  2365     if (tokenStream->lookAhead() == Token_identifier) {
       
  2366         int startName = tokenStream->cursor();
       
  2367         AST *n = CreateNode<AST>(m_pool);
       
  2368         advance();
       
  2369         UPDATE_POS(n, startName, tokenStream->cursor());
       
  2370         ast->setName(n);
       
  2371     } else if (tokenStream->lookAhead() == '~' && tokenStream->lookAhead(1) == Token_identifier) {
       
  2372         int startName = tokenStream->cursor();
       
  2373         AST *n = CreateNode<AST>(m_pool);
       
  2374         advance(); // skip ~
       
  2375         advance(); // skip classname
       
  2376         UPDATE_POS(n, startName, tokenStream->cursor());
       
  2377         ast->setName(n);
       
  2378         isDestructor = true;
       
  2379     } else if (tokenStream->lookAhead() == Token_operator) {
       
  2380         AST *n = 0;
       
  2381         if (!parseOperatorFunctionId(n))
       
  2382             return false;
       
  2383         ast->setName(n);
       
  2384     } else {
       
  2385         return false;
       
  2386     }
       
  2387 
       
  2388     if (parseTemplateId && !isDestructor) {
       
  2389 
       
  2390         int index = tokenStream->cursor();
       
  2391 
       
  2392         if (tokenStream->lookAhead() == '<') {
       
  2393             advance();
       
  2394 
       
  2395             // optional template arguments
       
  2396             TemplateArgumentListAST *args = 0;
       
  2397             parseTemplateArgumentList(args);
       
  2398 
       
  2399             if (tokenStream->lookAhead() != '>') {
       
  2400                 tokenStream->rewind(index);
       
  2401             } else {
       
  2402                 advance();
       
  2403                 ast->setTemplateArgumentList(args);
       
  2404             }
       
  2405         }
       
  2406     }
       
  2407 
       
  2408     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2409     node = ast;
       
  2410 
       
  2411     return true;
       
  2412 }
       
  2413 
       
  2414 bool Parser::parseStringLiteral(AST *&node)
       
  2415 {
       
  2416     int start = tokenStream->cursor();
       
  2417 
       
  2418     while (tokenStream->lookAhead()) {
       
  2419         if (tokenStream->lookAhead() == Token_identifier &&
       
  2420             tokenStream->currentTokenText() == "L" && tokenStream->lookAhead(1) == Token_string_literal) {
       
  2421 
       
  2422             advance();
       
  2423             advance();
       
  2424         } else if (tokenStream->lookAhead() == Token_string_literal) {
       
  2425             advance();
       
  2426         } else
       
  2427             return false;
       
  2428     }
       
  2429 
       
  2430     AST *ast = CreateNode<AST>(m_pool);
       
  2431     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2432     node = ast;
       
  2433     return true;
       
  2434 }
       
  2435 
       
  2436 bool Parser::skipExpressionStatement(StatementAST *&node)
       
  2437 {
       
  2438     int start = tokenStream->cursor();
       
  2439 
       
  2440     AbstractExpressionAST *expr = 0;
       
  2441     skipCommaExpression(expr);
       
  2442 
       
  2443     ADVANCE(';', ";");
       
  2444 
       
  2445     ExpressionStatementAST *ast = CreateNode<ExpressionStatementAST>(m_pool);
       
  2446     ast->setExpression(expr);
       
  2447     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2448     node = ast;
       
  2449 
       
  2450     return true;
       
  2451 }
       
  2452 
       
  2453 bool Parser::parseStatement(StatementAST *&node)
       
  2454 {
       
  2455     int start = tokenStream->cursor();
       
  2456 
       
  2457     switch(tokenStream->lookAhead()) {
       
  2458 
       
  2459     case Token_while:
       
  2460         return parseWhileStatement(node);
       
  2461 
       
  2462     case Token_do:
       
  2463         return parseDoStatement(node);
       
  2464 
       
  2465     case Token_for:
       
  2466         return parseForStatement(node);
       
  2467 
       
  2468     case Token_if:
       
  2469         return parseIfStatement(node);
       
  2470 
       
  2471     case Token_switch:
       
  2472         return parseSwitchStatement(node);
       
  2473 
       
  2474     case Token_try:
       
  2475         return parseTryBlockStatement(node);
       
  2476 
       
  2477     case Token_case:
       
  2478     case Token_default:
       
  2479         return parseLabeledStatement(node);
       
  2480 
       
  2481     case Token_break:
       
  2482     case Token_continue:
       
  2483         advance();
       
  2484         ADVANCE(';', ";");
       
  2485         return true;
       
  2486 
       
  2487     case Token_goto:
       
  2488         advance();
       
  2489         ADVANCE(Token_identifier, "identifier");
       
  2490         ADVANCE(';', ";");
       
  2491         return true;
       
  2492 
       
  2493     case Token_return:
       
  2494     {
       
  2495         advance();
       
  2496         AbstractExpressionAST *expr = 0;
       
  2497         skipCommaExpression(expr);
       
  2498 
       
  2499         ADVANCE(';', ";");
       
  2500 
       
  2501         ReturnStatementAST *ast = CreateNode<ReturnStatementAST>(m_pool);
       
  2502         ast->setExpression(expr);
       
  2503         UPDATE_POS(ast, start, tokenStream->cursor());
       
  2504         node = ast;
       
  2505     }
       
  2506     return true;
       
  2507 
       
  2508     case '{':
       
  2509         return parseCompoundStatement(node);
       
  2510 
       
  2511     case Token_identifier:
       
  2512         if (parseLabeledStatement(node))
       
  2513             return true;
       
  2514         break;
       
  2515     }
       
  2516 
       
  2517     if (parseDeclarationStatement(node))
       
  2518         return true;
       
  2519 
       
  2520     return skipExpressionStatement(node);
       
  2521 }
       
  2522 
       
  2523 bool Parser::parseCondition(ConditionAST *&node)
       
  2524 {
       
  2525     int start = tokenStream->cursor();
       
  2526 
       
  2527     ConditionAST *ast = CreateNode<ConditionAST>(m_pool);
       
  2528     TypeSpecifierAST *spec = 0;
       
  2529 
       
  2530     if (parseTypeSpecifier(spec)) {
       
  2531         DeclaratorAST *decl = 0;
       
  2532         if (parseDeclarator(decl) && tokenStream->lookAhead() == '=') {
       
  2533             advance();
       
  2534 
       
  2535             AbstractExpressionAST *expr = 0;
       
  2536             if (parseExpression(expr)) {
       
  2537                 ast->setTypeSpec(spec);
       
  2538                 ast->setDeclarator(decl);
       
  2539                 ast->setExpression(expr);
       
  2540 
       
  2541                 UPDATE_POS(ast, start, tokenStream->cursor());
       
  2542                 node = ast;
       
  2543 
       
  2544                 return true;
       
  2545             }
       
  2546         }
       
  2547     }
       
  2548 
       
  2549     tokenStream->rewind(start);
       
  2550 
       
  2551     AbstractExpressionAST *expr = 0;
       
  2552     if (!skipCommaExpression(expr)) {
       
  2553         return false;
       
  2554     }
       
  2555 
       
  2556     ast->setExpression(expr);
       
  2557     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2558     node = ast;
       
  2559     return true;
       
  2560 }
       
  2561 
       
  2562 
       
  2563 bool Parser::parseWhileStatement(StatementAST *&node)
       
  2564 {
       
  2565     int start = tokenStream->cursor();
       
  2566 
       
  2567     ADVANCE(Token_while, "while");
       
  2568     ADVANCE('(' , "(");
       
  2569 
       
  2570     ConditionAST *cond = 0;
       
  2571     if (!parseCondition(cond)) {
       
  2572         reportError(i18n("condition expected"));
       
  2573         return false;
       
  2574     }
       
  2575     ADVANCE(')', ")");
       
  2576 
       
  2577     StatementAST *body = 0;
       
  2578     if (!parseStatement(body)) {
       
  2579         reportError(i18n("statement expected"));
       
  2580         return false;
       
  2581     }
       
  2582 
       
  2583     WhileStatementAST *ast = CreateNode<WhileStatementAST>(m_pool);
       
  2584     ast->setCondition(cond);
       
  2585     ast->setStatement(body);
       
  2586     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2587     node = ast;
       
  2588 
       
  2589     return true;
       
  2590 }
       
  2591 
       
  2592 bool Parser::parseDoStatement(StatementAST *&node)
       
  2593 {
       
  2594     int start = tokenStream->cursor();
       
  2595 
       
  2596     ADVANCE(Token_do, "do");
       
  2597 
       
  2598     StatementAST *body = 0;
       
  2599     if (!parseStatement(body)) {
       
  2600         reportError(i18n("statement expected"));
       
  2601         //return false;
       
  2602     }
       
  2603 
       
  2604     ADVANCE_NR(Token_while, "while");
       
  2605     ADVANCE_NR('(' , "(");
       
  2606 
       
  2607     AbstractExpressionAST *expr = 0;
       
  2608     if (!skipCommaExpression(expr)) {
       
  2609         reportError(i18n("expression expected"));
       
  2610         //return false;
       
  2611     }
       
  2612 
       
  2613     ADVANCE_NR(')', ")");
       
  2614     ADVANCE_NR(';', ";");
       
  2615 
       
  2616     DoStatementAST *ast = CreateNode<DoStatementAST>(m_pool);
       
  2617     ast->setStatement(body);
       
  2618     //ast->setCondition(condition);
       
  2619     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2620     node = ast;
       
  2621 
       
  2622     return true;
       
  2623 }
       
  2624 
       
  2625 bool Parser::parseForStatement(StatementAST *&node)
       
  2626 {
       
  2627     int start = tokenStream->cursor();
       
  2628 
       
  2629     ADVANCE(Token_for, "for");
       
  2630     ADVANCE('(', "(");
       
  2631 
       
  2632     StatementAST *init = 0;
       
  2633     if (!parseForInitStatement(init)) {
       
  2634         reportError(i18n("for initialization expected"));
       
  2635         return false;
       
  2636     }
       
  2637 
       
  2638     ConditionAST *cond = 0;
       
  2639     parseCondition(cond);
       
  2640     ADVANCE(';', ";");
       
  2641 
       
  2642     AbstractExpressionAST *expr = 0;
       
  2643     skipCommaExpression(expr);
       
  2644     ADVANCE(')', ")");
       
  2645 
       
  2646     StatementAST *body = 0;
       
  2647     if (!parseStatement(body))
       
  2648         return false;
       
  2649 
       
  2650     ForStatementAST *ast = CreateNode<ForStatementAST>(m_pool);
       
  2651     ast->setInitStatement(init);
       
  2652     ast->setCondition(cond);
       
  2653     // ast->setExpression(expression);
       
  2654     ast->setStatement(body);
       
  2655     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2656     node = ast;
       
  2657 
       
  2658     return true;
       
  2659 }
       
  2660 
       
  2661 bool Parser::parseForInitStatement(StatementAST *&node)
       
  2662 {
       
  2663     if (parseDeclarationStatement(node))
       
  2664         return true;
       
  2665 
       
  2666     return skipExpressionStatement(node);
       
  2667 }
       
  2668 
       
  2669 bool Parser::parseCompoundStatement(StatementAST *&node)
       
  2670 {
       
  2671     int start = tokenStream->cursor();
       
  2672 
       
  2673     if (tokenStream->lookAhead() != '{') {
       
  2674         return false;
       
  2675     }
       
  2676     advance();
       
  2677 
       
  2678     StatementListAST *ast = CreateNode<StatementListAST>(m_pool);
       
  2679 
       
  2680     while (tokenStream->lookAhead()) {
       
  2681         if (tokenStream->lookAhead() == '}')
       
  2682             break;
       
  2683 
       
  2684         StatementAST *stmt = 0;
       
  2685         int startStmt = tokenStream->cursor();
       
  2686         if (!parseStatement(stmt)) {
       
  2687             if (startStmt == tokenStream->cursor())
       
  2688                 advance();
       
  2689             skipUntilStatement();
       
  2690         } else {
       
  2691             ast->addStatement(stmt);
       
  2692         }
       
  2693     }
       
  2694 
       
  2695     if (tokenStream->lookAhead() != '}') {
       
  2696         reportError(i18n("} expected"));
       
  2697     } else {
       
  2698         advance();
       
  2699     }
       
  2700 
       
  2701     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2702     node = ast;
       
  2703 
       
  2704     return true;
       
  2705 }
       
  2706 
       
  2707 bool Parser::parseIfStatement(StatementAST *&node)
       
  2708 {
       
  2709     int start = tokenStream->cursor();
       
  2710 
       
  2711     ADVANCE(Token_if, "if");
       
  2712 
       
  2713     ADVANCE('(' , "(");
       
  2714 
       
  2715     IfStatementAST *ast = CreateNode<IfStatementAST>(m_pool);
       
  2716 
       
  2717     ConditionAST *cond = 0;
       
  2718     if (!parseCondition(cond)) {
       
  2719         reportError(i18n("condition expected"));
       
  2720         return false;
       
  2721     }
       
  2722     ADVANCE(')', ")");
       
  2723 
       
  2724     StatementAST *stmt = 0;
       
  2725     if (!parseStatement(stmt)) {
       
  2726         reportError(i18n("statement expected"));
       
  2727         return false;
       
  2728     }
       
  2729 
       
  2730     ast->setCondition(cond);
       
  2731     ast->setStatement(stmt);
       
  2732 
       
  2733     if (tokenStream->lookAhead() == Token_else) {
       
  2734         advance();
       
  2735         StatementAST *elseStmt = 0;
       
  2736         if (!parseStatement(elseStmt)) {
       
  2737             reportError(i18n("statement expected"));
       
  2738             return false;
       
  2739         }
       
  2740         ast->setElseStatement(elseStmt);
       
  2741     }
       
  2742 
       
  2743     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2744     node = ast;
       
  2745 
       
  2746     return true;
       
  2747 }
       
  2748 
       
  2749 bool Parser::parseSwitchStatement(StatementAST *&node)
       
  2750 {
       
  2751     int start = tokenStream->cursor();
       
  2752     ADVANCE(Token_switch, "switch");
       
  2753 
       
  2754     ADVANCE('(' , "(");
       
  2755 
       
  2756     ConditionAST *cond = 0;
       
  2757     if (!parseCondition(cond)) {
       
  2758         reportError(i18n("condition expected"));
       
  2759         return false;
       
  2760     }
       
  2761     ADVANCE(')', ")");
       
  2762 
       
  2763     StatementAST *stmt = 0;
       
  2764     if (!parseStatement(stmt)) {
       
  2765           syntaxError();
       
  2766         return false;
       
  2767     }
       
  2768 
       
  2769     SwitchStatementAST *ast = CreateNode<SwitchStatementAST>(m_pool);
       
  2770     ast->setCondition(cond);
       
  2771     ast->setStatement(stmt);
       
  2772     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2773     node = ast;
       
  2774 
       
  2775     return true;
       
  2776 }
       
  2777 
       
  2778 bool Parser::parseLabeledStatement(StatementAST *&node)
       
  2779 {
       
  2780     switch(tokenStream->lookAhead()) {
       
  2781     case Token_identifier:
       
  2782     case Token_default:
       
  2783         if (tokenStream->lookAhead(1) == ':') {
       
  2784             advance();
       
  2785             advance();
       
  2786 
       
  2787             StatementAST *stmt = 0;
       
  2788             LabeledStatementAST *ast = CreateNode<LabeledStatementAST>(m_pool);
       
  2789             node = ast;
       
  2790             if (parseStatement(stmt)) {
       
  2791                 ast->setStatement(stmt);
       
  2792                 return true;
       
  2793             }
       
  2794         }
       
  2795         break;
       
  2796 
       
  2797     case Token_case:
       
  2798     {
       
  2799         advance();
       
  2800         AbstractExpressionAST *expr = 0;
       
  2801         if (!parseConstantExpression(expr)) {
       
  2802             reportError(i18n("expression expected"));
       
  2803         } else if (tokenStream->lookAhead() == Token_ellipsis) {
       
  2804             advance();
       
  2805 
       
  2806             AbstractExpressionAST *expr2 = 0;
       
  2807             if (!parseConstantExpression(expr2)) {
       
  2808                 reportError(i18n("expression expected"));
       
  2809             }
       
  2810         }
       
  2811         ADVANCE(':', ":");
       
  2812 
       
  2813         StatementAST *stmt = 0;
       
  2814         LabeledStatementAST *ast = CreateNode<LabeledStatementAST>(m_pool);
       
  2815         node = ast;
       
  2816         ast->setExpression(expr);
       
  2817 
       
  2818         if (parseStatement(stmt)) {
       
  2819             ast->setStatement(stmt);
       
  2820             return true;
       
  2821         }
       
  2822     }
       
  2823     break;
       
  2824 
       
  2825     }
       
  2826     return false;
       
  2827 }
       
  2828 
       
  2829 bool Parser::parseBlockDeclaration(DeclarationAST *&node)
       
  2830 {
       
  2831     switch(tokenStream->lookAhead()) {
       
  2832     case Token_typedef:
       
  2833         return parseTypedef(node);
       
  2834     case Token_using:
       
  2835         return parseUsing(node);
       
  2836     case Token_asm:
       
  2837         return parseAsmDefinition(node);
       
  2838     case Token_namespace:
       
  2839         return parseNamespaceAliasDefinition(node);
       
  2840     }
       
  2841 
       
  2842     int start = tokenStream->cursor();
       
  2843 
       
  2844     AST *storageSpec = 0;
       
  2845     parseStorageClassSpecifier(storageSpec);
       
  2846 
       
  2847     AST *cv = 0;
       
  2848     parseCvQualify(cv);
       
  2849 
       
  2850     TypeSpecifierAST *spec = 0;
       
  2851     if (!parseTypeSpecifierOrClassSpec(spec)) { // replace with simpleTypeSpecifier?!?!
       
  2852         tokenStream->rewind(start);
       
  2853         return false;
       
  2854     }
       
  2855     spec->setCvQualify(cv);
       
  2856 
       
  2857     AST *cv2 = 0;
       
  2858     parseCvQualify(cv2);
       
  2859     spec->setCv2Qualify(cv2);
       
  2860 
       
  2861     InitDeclaratorListAST *declarators = 0;
       
  2862     parseInitDeclaratorList(declarators);
       
  2863 
       
  2864     if (tokenStream->lookAhead() != ';') {
       
  2865         tokenStream->rewind(start);
       
  2866         return false;
       
  2867     }
       
  2868     advance();
       
  2869 
       
  2870     SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
       
  2871     ast->setTypeSpec(spec);
       
  2872     ast->setInitDeclaratorList(declarators);
       
  2873     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2874     node = ast;
       
  2875 
       
  2876     return true;
       
  2877 }
       
  2878 
       
  2879 bool Parser::parseNamespaceAliasDefinition(DeclarationAST *&/*node*/)
       
  2880 {
       
  2881     if (tokenStream->lookAhead() != Token_namespace) {
       
  2882         return false;
       
  2883     }
       
  2884     advance();
       
  2885 
       
  2886     ADVANCE(Token_identifier,  "identifier");
       
  2887     ADVANCE('=', "=");
       
  2888 
       
  2889     NameAST *name = 0;
       
  2890     if (!parseName(name)) {
       
  2891         reportError(i18n("Namespace name expected"));
       
  2892     }
       
  2893 
       
  2894     ADVANCE(';', ";");
       
  2895 
       
  2896     return true;
       
  2897 
       
  2898 }
       
  2899 
       
  2900 bool Parser::parseDeclarationStatement(StatementAST *&node)
       
  2901 {
       
  2902     int start = tokenStream->cursor();
       
  2903 
       
  2904     DeclarationAST *decl = 0;
       
  2905     if (!parseBlockDeclaration(decl))
       
  2906         return false;
       
  2907 
       
  2908     DeclarationStatementAST *ast = CreateNode<DeclarationStatementAST>(m_pool);
       
  2909     ast->setDeclaration(decl);
       
  2910     UPDATE_POS(ast, start, tokenStream->cursor());
       
  2911     node = ast;
       
  2912 
       
  2913     return true;
       
  2914 }
       
  2915 
       
  2916 bool Parser::parseDeclarationInternal(DeclarationAST *&node)
       
  2917 {
       
  2918     int start = tokenStream->cursor();
       
  2919 
       
  2920     // that is for the case '__declspec(dllexport) int ...' or
       
  2921     // '__declspec(dllexport) inline int ...', etc.
       
  2922     AST *winDeclSpec = 0;
       
  2923     parseWinDeclSpec(winDeclSpec);
       
  2924 
       
  2925     AST *funSpec = 0;
       
  2926     bool hasFunSpec = parseFunctionSpecifier(funSpec);
       
  2927 
       
  2928     AST *storageSpec = 0;
       
  2929     bool hasStorageSpec = parseStorageClassSpecifier(storageSpec);
       
  2930 
       
  2931     if (hasStorageSpec && !hasFunSpec)
       
  2932         hasFunSpec = parseFunctionSpecifier(funSpec);
       
  2933 
       
  2934     // that is for the case 'friend __declspec(dllexport) ....'
       
  2935     AST *winDeclSpec2 = 0;
       
  2936     parseWinDeclSpec(winDeclSpec2);
       
  2937 
       
  2938     AST *cv = 0;
       
  2939     parseCvQualify(cv);
       
  2940 
       
  2941     int index = tokenStream->cursor();
       
  2942     NameAST *name = 0;
       
  2943     if (parseName(name) && tokenStream->lookAhead() == '(') {
       
  2944         // no type specifier, maybe a constructor or a cast operator??
       
  2945 
       
  2946         tokenStream->rewind(index);
       
  2947 
       
  2948         InitDeclaratorAST *declarator = 0;
       
  2949         if (parseInitDeclarator(declarator)) {
       
  2950             switch(tokenStream->lookAhead()) {
       
  2951             case ';':
       
  2952                 {
       
  2953                     advance();
       
  2954 
       
  2955                     InitDeclaratorListAST *declarators = CreateNode<InitDeclaratorListAST>(m_pool);
       
  2956 
       
  2957                     // update declarators position
       
  2958                     if (declarator)
       
  2959                         declarators->setPosition(declarator->startToken(), declarator->endToken());
       
  2960                     declarators->addInitDeclarator(declarator);
       
  2961 
       
  2962                     SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
       
  2963                     ast->setInitDeclaratorList(declarators);
       
  2964                     node = ast;
       
  2965                     UPDATE_POS(node, start, tokenStream->cursor());
       
  2966                     return true;
       
  2967 
       
  2968                 }
       
  2969                 break;
       
  2970 
       
  2971             case ':':
       
  2972                 {
       
  2973                     AST *ctorInit = 0;
       
  2974                     StatementListAST *funBody = 0;
       
  2975                     if (parseCtorInitializer(ctorInit) && parseFunctionBody(funBody)) {
       
  2976                         FunctionDefinitionAST *ast = CreateNode<FunctionDefinitionAST>(m_pool);
       
  2977                         ast->setStorageSpecifier(storageSpec);
       
  2978                         ast->setFunctionSpecifier(funSpec);
       
  2979                         ast->setInitDeclarator(declarator);
       
  2980                         ast->setFunctionBody(funBody);
       
  2981                         node = ast;
       
  2982                         UPDATE_POS(node, start, tokenStream->cursor());
       
  2983                         return true;
       
  2984                     }
       
  2985                 }
       
  2986                 break;
       
  2987 
       
  2988             case '{':
       
  2989                 {
       
  2990                     StatementListAST *funBody = 0;
       
  2991                     if (parseFunctionBody(funBody)) {
       
  2992                         FunctionDefinitionAST *ast = CreateNode<FunctionDefinitionAST>(m_pool);
       
  2993                         ast->setStorageSpecifier(storageSpec);
       
  2994                         ast->setFunctionSpecifier(funSpec);
       
  2995                         ast->setInitDeclarator(declarator);
       
  2996                         ast->setFunctionBody(funBody);
       
  2997                         node = ast;
       
  2998                         UPDATE_POS(node, start, tokenStream->cursor());
       
  2999                         return true;
       
  3000                     }
       
  3001                 }
       
  3002                 break;
       
  3003 
       
  3004             case '(':
       
  3005             case '[':
       
  3006                 // ops!! it seems a declarator
       
  3007                 goto start_decl;
       
  3008                 break;
       
  3009             }
       
  3010 
       
  3011         }
       
  3012     }
       
  3013 
       
  3014 start_decl:
       
  3015     tokenStream->rewind(index);
       
  3016 
       
  3017     if (tokenStream->lookAhead() == Token_const && tokenStream->lookAhead(1) == Token_identifier && tokenStream->lookAhead(2) == '=') {
       
  3018         // constant definition
       
  3019         advance();
       
  3020         InitDeclaratorListAST *declarators = 0;
       
  3021         if (parseInitDeclaratorList(declarators)) {
       
  3022             ADVANCE(';', ";");
       
  3023             DeclarationAST *ast = CreateNode<DeclarationAST>(m_pool);
       
  3024             node = ast;
       
  3025             UPDATE_POS(node, start, tokenStream->cursor());
       
  3026             return true;
       
  3027         }
       
  3028         syntaxError();
       
  3029         return false;
       
  3030     }
       
  3031 
       
  3032     TypeSpecifierAST *spec = 0;
       
  3033     if (parseTypeSpecifier(spec)) {
       
  3034         if (!hasFunSpec)
       
  3035             parseFunctionSpecifier(funSpec);         // e.g. "void inline"
       
  3036         spec->setCvQualify(cv);
       
  3037 
       
  3038         InitDeclaratorListAST *declarators = 0;
       
  3039 
       
  3040         InitDeclaratorAST *decl = 0;
       
  3041         int startDeclarator = tokenStream->cursor();
       
  3042         bool maybeFunctionDefinition = false;
       
  3043 
       
  3044         if (tokenStream->lookAhead() != ';') {
       
  3045             if (parseInitDeclarator(decl) && tokenStream->lookAhead() == '{') {
       
  3046                 // function definition
       
  3047                 maybeFunctionDefinition = true;
       
  3048             } else {
       
  3049                 tokenStream->rewind(startDeclarator);
       
  3050                 if (!parseInitDeclaratorList(declarators)) {
       
  3051                     syntaxError();
       
  3052                     return false;
       
  3053                 }
       
  3054             }
       
  3055         }
       
  3056 
       
  3057         switch(tokenStream->lookAhead()) {
       
  3058         case ';':
       
  3059             {
       
  3060                 advance();
       
  3061                 SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
       
  3062                 ast->setStorageSpecifier(storageSpec);
       
  3063                 ast->setFunctionSpecifier(funSpec);
       
  3064                 ast->setTypeSpec(spec);
       
  3065                 ast->setWinDeclSpec(winDeclSpec);
       
  3066                 ast->setInitDeclaratorList(declarators);
       
  3067                 node = ast;
       
  3068                 UPDATE_POS(node, start, tokenStream->cursor());
       
  3069             }
       
  3070             return true;
       
  3071 
       
  3072         case '{':
       
  3073             {
       
  3074                 if (!maybeFunctionDefinition) {
       
  3075                     syntaxError();
       
  3076                     return false;
       
  3077                 }
       
  3078                 StatementListAST *funBody = 0;
       
  3079                 if (parseFunctionBody(funBody)) {
       
  3080                     FunctionDefinitionAST *ast = CreateNode<FunctionDefinitionAST>(m_pool);
       
  3081                     ast->setWinDeclSpec(winDeclSpec);
       
  3082                     ast->setStorageSpecifier(storageSpec);
       
  3083                     ast->setFunctionSpecifier(funSpec);
       
  3084                     ast->setTypeSpec(spec);
       
  3085                     ast->setInitDeclarator(decl);
       
  3086                     ast->setFunctionBody(funBody);
       
  3087                     node = ast;
       
  3088                     UPDATE_POS(node, start, tokenStream->cursor());
       
  3089                     return true;
       
  3090                 }
       
  3091             }
       
  3092             break;
       
  3093 
       
  3094         }
       
  3095     }
       
  3096 
       
  3097     syntaxError();
       
  3098     return false;
       
  3099 }
       
  3100 
       
  3101 bool Parser::parseFunctionBody(StatementListAST *&node)
       
  3102 {
       
  3103     int start = tokenStream->cursor();
       
  3104     if (tokenStream->lookAhead() != '{') {
       
  3105         return false;
       
  3106     }
       
  3107     advance();
       
  3108 
       
  3109     StatementListAST *ast = CreateNode<StatementListAST>(m_pool);
       
  3110 
       
  3111     while (tokenStream->lookAhead()) {
       
  3112         if (tokenStream->lookAhead() == '}')
       
  3113             break;
       
  3114 
       
  3115         StatementAST *stmt = 0;
       
  3116         int startStmt = tokenStream->cursor();
       
  3117         if (!parseStatement(stmt)) {
       
  3118             syntaxError();
       
  3119             if (startStmt == tokenStream->cursor())
       
  3120                 advance();
       
  3121             skipUntilStatement();
       
  3122         } else
       
  3123             ast->addStatement(stmt);
       
  3124     }
       
  3125 
       
  3126     if (tokenStream->lookAhead() != '}') {
       
  3127         reportError(i18n("} expected"));
       
  3128     } else
       
  3129         advance();
       
  3130 
       
  3131     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3132     node = ast;
       
  3133 
       
  3134     return true;
       
  3135 }
       
  3136 
       
  3137 bool Parser::parseTypeSpecifierOrClassSpec(TypeSpecifierAST *&node)
       
  3138 {
       
  3139     if (parseClassSpecifier(node))
       
  3140         return true;
       
  3141     else if (parseEnumSpecifier(node))
       
  3142         return true;
       
  3143     else if (parseTypeSpecifier(node))
       
  3144         return true;
       
  3145 
       
  3146     return false;
       
  3147 }
       
  3148 
       
  3149 bool Parser::parseTryBlockStatement(StatementAST *&node)
       
  3150 {
       
  3151     if (tokenStream->lookAhead() != Token_try) {
       
  3152         return false;
       
  3153     }
       
  3154     advance();
       
  3155 
       
  3156     StatementAST *stmt = 0;
       
  3157     if (!parseCompoundStatement(stmt)) {
       
  3158         syntaxError();
       
  3159         return false;
       
  3160     }
       
  3161 
       
  3162     if (tokenStream->lookAhead() != Token_catch) {
       
  3163         reportError(i18n("catch expected"));
       
  3164         return false;
       
  3165     }
       
  3166 
       
  3167     while (tokenStream->lookAhead() == Token_catch) {
       
  3168         advance();
       
  3169         ADVANCE('(', "(");
       
  3170         ConditionAST *cond = 0;
       
  3171         if (tokenStream->lookAhead() == Token_ellipsis) {
       
  3172             advance();
       
  3173         } else if (!parseCondition(cond)) {
       
  3174             reportError(i18n("condition expected"));
       
  3175             return false;
       
  3176         }
       
  3177         ADVANCE(')', ")");
       
  3178 
       
  3179         StatementAST *body = 0;
       
  3180         if (!parseCompoundStatement(body)) {
       
  3181             syntaxError();
       
  3182             return false;
       
  3183         }
       
  3184     }
       
  3185 
       
  3186     node = stmt;
       
  3187     return true;
       
  3188 }
       
  3189 
       
  3190 bool Parser::parsePrimaryExpression(AbstractExpressionAST *&node)
       
  3191 {
       
  3192     int start = tokenStream->cursor();
       
  3193 
       
  3194     AbstractExpressionAST *ast = CreateExpression<NodeType_PrimaryExpression>(m_pool);
       
  3195 
       
  3196     switch(tokenStream->lookAhead()) {
       
  3197         case Token_string_literal:
       
  3198         {
       
  3199             AST *lit = 0;
       
  3200             parseStringLiteral(lit);
       
  3201             if (lit)
       
  3202                 lit->setParent(ast);
       
  3203         }
       
  3204         break;
       
  3205 
       
  3206         case Token_number_literal:
       
  3207         case Token_char_literal:
       
  3208         case Token_true:
       
  3209         case Token_false:
       
  3210         case Token_this:
       
  3211             {
       
  3212                 AST_FROM_TOKEN(opNode, tokenStream->cursor());
       
  3213                 opNode->setParent(ast);
       
  3214                 advance();
       
  3215             }
       
  3216             break;
       
  3217 
       
  3218         case '(':
       
  3219             {
       
  3220                 advance();
       
  3221 
       
  3222                 if (tokenStream->lookAhead() == '{') {
       
  3223                     StatementAST *stmt = 0;
       
  3224                     if (!parseCompoundStatement(stmt))
       
  3225                         return false;
       
  3226                     if (stmt)
       
  3227                         stmt->setParent(ast);
       
  3228                 } else {
       
  3229                     AbstractExpressionAST *expr = 0;
       
  3230                     if (!parseExpression(expr)) {
       
  3231                         return false;
       
  3232                     }
       
  3233                     if (expr)
       
  3234                         expr->setParent(ast);
       
  3235                 }
       
  3236                 CHECK(')', ")");
       
  3237             }
       
  3238             break;
       
  3239 
       
  3240         default:
       
  3241             {
       
  3242 /*  ### reenable me
       
  3243                 TypeSpecifierAST *typeSpec = 0;
       
  3244                 if (parseSimpleTypeSpecifier(typeSpec) && tokenStream->lookAhead() == '(') {
       
  3245                     Q_ASSERT (0);
       
  3246                     advance();
       
  3247                     AbstractExpressionAST *expr = 0;
       
  3248                     parseCommaExpression(expr);
       
  3249                     CHECK(')', ")");
       
  3250                     break;
       
  3251 
       
  3252                     if (typeSpec)
       
  3253                         typeSpec->setParent(ast);
       
  3254 
       
  3255                     if (expr)
       
  3256                         expr->setParent(ast);
       
  3257                 }
       
  3258 
       
  3259                 tokenStream->rewind(start);
       
  3260 */
       
  3261 
       
  3262                 NameAST *name = 0;
       
  3263                 if (!parseName(name, false))
       
  3264                     return false;
       
  3265 
       
  3266                 if (name)
       
  3267                     name->setParent(ast);
       
  3268 
       
  3269                 break;
       
  3270             }
       
  3271     }
       
  3272 
       
  3273     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3274     node = ast;
       
  3275     return true;
       
  3276 }
       
  3277 
       
  3278 
       
  3279 /*
       
  3280    postfix-expression-internal:
       
  3281      [ expression ]
       
  3282      ( expression-list [opt] )
       
  3283      (.|->) template [opt] id-expression
       
  3284      (.|->) pseudo-destructor-name
       
  3285      ++
       
  3286      --
       
  3287 */
       
  3288 bool Parser::parsePostfixExpressionInternal(AbstractExpressionAST *postfixExpr, AbstractExpressionAST *&node)
       
  3289 {
       
  3290     Q_ASSERT (postfixExpr);
       
  3291 
       
  3292     int start = tokenStream->cursor();
       
  3293 
       
  3294     switch (tokenStream->lookAhead()) {
       
  3295         case '[':
       
  3296         {
       
  3297             advance();
       
  3298             AbstractExpressionAST *expr = 0;
       
  3299             parseExpression(expr);
       
  3300             CHECK(']', "]");
       
  3301 
       
  3302             SubscriptingAST *ast = CreateNode<SubscriptingAST>(m_pool);
       
  3303             ast->setExpression(postfixExpr);
       
  3304             ast->setSubscript(expr);
       
  3305             UPDATE_POS(ast, start, tokenStream->cursor());
       
  3306             node = ast;
       
  3307         }
       
  3308         return true;
       
  3309 
       
  3310         case '(':
       
  3311         {
       
  3312             advance();
       
  3313             AbstractExpressionAST *expr = 0;
       
  3314             parseExpression(expr);
       
  3315             CHECK(')', ")");
       
  3316 
       
  3317             FunctionCallAST *ast = CreateNode<FunctionCallAST>(m_pool);
       
  3318             ast->setExpression(postfixExpr);
       
  3319             ast->setArguments(expr);
       
  3320             UPDATE_POS(ast, start, tokenStream->cursor());
       
  3321             node = ast;
       
  3322         }
       
  3323         return true;
       
  3324 
       
  3325         case '.':
       
  3326         case Token_arrow:
       
  3327         {
       
  3328             AST_FROM_TOKEN(op, tokenStream->cursor());
       
  3329 
       
  3330             advance();
       
  3331             if (tokenStream->lookAhead() == Token_template)
       
  3332                 advance();
       
  3333 
       
  3334             NameAST *name = 0;
       
  3335             if (!parseName(name))
       
  3336                 return false;
       
  3337 
       
  3338             ClassMemberAccessAST *ast = CreateNode<ClassMemberAccessAST>(m_pool);
       
  3339             ast->setOp(op);
       
  3340             ast->setExpression(postfixExpr);
       
  3341             ast->setName(name);
       
  3342             UPDATE_POS(ast, start, tokenStream->cursor());
       
  3343             node = ast;
       
  3344         }
       
  3345         return true;
       
  3346 
       
  3347         case Token_incr:
       
  3348         case Token_decr:
       
  3349         {
       
  3350             AST_FROM_TOKEN(op, tokenStream->cursor());
       
  3351             advance();
       
  3352 
       
  3353             IncrDecrAST *ast = CreateNode<IncrDecrAST>(m_pool);
       
  3354             ast->setExpression(postfixExpr);
       
  3355             ast->setOp(op);
       
  3356             UPDATE_POS(ast, start, tokenStream->cursor());
       
  3357             node = ast;
       
  3358         }
       
  3359         return true;
       
  3360 
       
  3361         default:
       
  3362             return false;
       
  3363     }
       
  3364 }
       
  3365 
       
  3366 /*
       
  3367    postfix-expression:
       
  3368      simple-type-specifier ( expression-list [opt] )
       
  3369      primary-expression postfix-expression-internal*
       
  3370 */
       
  3371 bool Parser::parsePostfixExpression(AbstractExpressionAST *&node)
       
  3372 {
       
  3373     int start = tokenStream->cursor();
       
  3374 
       
  3375     switch (tokenStream->lookAhead()) {
       
  3376         case Token_dynamic_cast:
       
  3377         case Token_static_cast:
       
  3378         case Token_reinterpret_cast:
       
  3379         case Token_const_cast:
       
  3380         {
       
  3381             AST_FROM_TOKEN(castOp, tokenStream->cursor());
       
  3382 
       
  3383             advance();
       
  3384             CHECK('<', "<");
       
  3385             TypeIdAST *typeId = 0;
       
  3386             parseTypeId(typeId);
       
  3387             CHECK('>', ">");
       
  3388 
       
  3389             CHECK('(', ")");
       
  3390             AbstractExpressionAST *expr = 0;
       
  3391             parseCommaExpression(expr);
       
  3392             CHECK(')', ")");
       
  3393 
       
  3394             CppCastExpressionAST *tmp = CreateNode<CppCastExpressionAST>(m_pool);
       
  3395             tmp->setCastOp(castOp);
       
  3396             tmp->setTypeId(typeId);
       
  3397             tmp->setExpression(expr);
       
  3398 
       
  3399             AbstractExpressionAST *ast = tmp;
       
  3400             AbstractExpressionAST *e = 0;
       
  3401             while (parsePostfixExpressionInternal(ast, e)) {
       
  3402                 ast = e;
       
  3403             }
       
  3404 
       
  3405             UPDATE_POS(ast, start, tokenStream->cursor());
       
  3406             node = ast;
       
  3407         }
       
  3408         return true;
       
  3409 
       
  3410         case Token_typename:
       
  3411         {
       
  3412             advance();
       
  3413 
       
  3414             NameAST* name = 0;
       
  3415             if (!parseName(name))
       
  3416                 return false;
       
  3417 
       
  3418             CHECK('(', "(");
       
  3419             AbstractExpressionAST *expr = 0;
       
  3420             parseCommaExpression(expr);
       
  3421             CHECK(')', ")");
       
  3422 
       
  3423             // ### AST
       
  3424         }
       
  3425         return true;
       
  3426 
       
  3427         case Token_typeid:
       
  3428         {
       
  3429             advance();
       
  3430 
       
  3431             CHECK('(', "(");
       
  3432             AbstractExpressionAST *expr = 0;
       
  3433             parseCommaExpression(expr);
       
  3434             CHECK(')', ")");
       
  3435 
       
  3436             // ### AST
       
  3437         }
       
  3438         return true;
       
  3439 
       
  3440         default:
       
  3441             break;
       
  3442     }
       
  3443 
       
  3444     TypeSpecifierAST *typeSpec = 0;
       
  3445     AbstractExpressionAST *expr = 0;
       
  3446 
       
  3447     if (parseSimpleTypeSpecifier(typeSpec/*, true*/) && tokenStream->lookAhead() == '(') {
       
  3448         advance(); // skip '('
       
  3449         parseCommaExpression(expr);
       
  3450         CHECK(')', ")");
       
  3451     } else {
       
  3452         tokenStream->rewind(start);
       
  3453 
       
  3454         if (!parsePrimaryExpression(expr))
       
  3455             return false;
       
  3456     }
       
  3457 
       
  3458     AbstractExpressionAST *ast = CreateExpression<NodeType_PostfixExpression>(m_pool);
       
  3459     if (typeSpec)
       
  3460         typeSpec->setParent(ast);
       
  3461 
       
  3462     if (expr)
       
  3463         expr->setParent(ast);
       
  3464 
       
  3465     AbstractExpressionAST *e = 0;
       
  3466     while (parsePostfixExpressionInternal(ast, e)) {
       
  3467         ast = e;
       
  3468     }
       
  3469 
       
  3470     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3471     node = ast;
       
  3472     return true;
       
  3473 }
       
  3474 
       
  3475 bool Parser::parseUnaryExpression(AbstractExpressionAST *&node)
       
  3476 {
       
  3477     int start = tokenStream->cursor();
       
  3478 
       
  3479     switch(tokenStream->lookAhead()) {
       
  3480         case Token_incr:
       
  3481         case Token_decr:
       
  3482         case '*':
       
  3483         case '&':
       
  3484         case '+':
       
  3485         case '-':
       
  3486         case '!':
       
  3487         case '~':
       
  3488         {
       
  3489             AST_FROM_TOKEN(opNode, tokenStream->cursor());
       
  3490 
       
  3491             advance();
       
  3492             AbstractExpressionAST *expr = 0;
       
  3493             if (!parseCastExpression(expr))
       
  3494                 return false;
       
  3495 
       
  3496             AbstractExpressionAST *ast = CreateExpression<NodeType_UnaryExpression>(m_pool);
       
  3497 
       
  3498             opNode->setParent(ast);
       
  3499             if (expr)
       
  3500                 expr->setParent(ast);
       
  3501 
       
  3502             UPDATE_POS(ast, start, tokenStream->cursor());
       
  3503             node = ast;
       
  3504             return true;
       
  3505         }
       
  3506 
       
  3507         case Token_sizeof:
       
  3508         {
       
  3509             AbstractExpressionAST *ast = CreateExpression<NodeType_UnaryExpression>(m_pool);
       
  3510 
       
  3511             AST_FROM_TOKEN(opNode, tokenStream->cursor());
       
  3512             opNode->setParent(ast);
       
  3513 
       
  3514             advance();
       
  3515             int index = tokenStream->cursor();
       
  3516             if (tokenStream->lookAhead() == '(') {
       
  3517                 advance();
       
  3518                 TypeIdAST *typeId = 0;
       
  3519                 if (parseTypeId(typeId) && tokenStream->lookAhead() == ')') {
       
  3520                     if (typeId)
       
  3521                         typeId->setParent(ast);
       
  3522 
       
  3523                     advance();
       
  3524 
       
  3525                     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3526                     node = ast;
       
  3527                     return true;
       
  3528                 }
       
  3529                 tokenStream->rewind(index);
       
  3530             }
       
  3531             AbstractExpressionAST *expr = 0;
       
  3532             if (!parseUnaryExpression(expr))
       
  3533                 return false;
       
  3534 
       
  3535             UPDATE_POS(ast, start, tokenStream->cursor());
       
  3536             node = ast;
       
  3537             return true;
       
  3538         }
       
  3539 
       
  3540         case Token_new:
       
  3541             return parseNewExpression(node);
       
  3542 
       
  3543         case Token_delete:
       
  3544             return parseDeleteExpression(node);
       
  3545     }
       
  3546 
       
  3547     return parsePostfixExpression(node);
       
  3548 }
       
  3549 
       
  3550 bool Parser::parseNewExpression(AbstractExpressionAST *&node)
       
  3551 {
       
  3552     int start = tokenStream->cursor();
       
  3553 
       
  3554     AbstractExpressionAST *ast = CreateExpression<NodeType_NewExpression>(m_pool);
       
  3555 
       
  3556     if (tokenStream->lookAhead() == Token_scope && tokenStream->lookAhead(1) == Token_new) {
       
  3557         AST_FROM_TOKEN(scopeNode, tokenStream->cursor());
       
  3558         scopeNode->setParent(ast);
       
  3559         advance();
       
  3560     }
       
  3561 
       
  3562     AST_FROM_TOKEN(newNode, tokenStream->cursor());
       
  3563     newNode->setParent(ast);
       
  3564 
       
  3565     CHECK(Token_new, "new");
       
  3566 
       
  3567     if (tokenStream->lookAhead() == '(') {
       
  3568         advance();
       
  3569         AbstractExpressionAST *expr = 0;
       
  3570         parseCommaExpression(expr);
       
  3571         if (expr)
       
  3572             expr->setParent(ast);
       
  3573         CHECK(')', ")");
       
  3574     }
       
  3575 
       
  3576     if (tokenStream->lookAhead() == '(') {
       
  3577         advance();
       
  3578         TypeIdAST *typeId = 0;
       
  3579         parseTypeId(typeId);
       
  3580         if (typeId)
       
  3581             typeId->setParent(ast);
       
  3582         CHECK(')', ")");
       
  3583     } else {
       
  3584         AbstractExpressionAST *typeId = 0;
       
  3585         parseNewTypeId(typeId);
       
  3586         if (typeId)
       
  3587             typeId->setParent(ast);
       
  3588     }
       
  3589 
       
  3590     AbstractExpressionAST *init = 0;
       
  3591     parseNewInitializer(init);
       
  3592     if (init)
       
  3593         init->setParent(ast);
       
  3594 
       
  3595     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3596     node = ast;
       
  3597     return true;
       
  3598 }
       
  3599 
       
  3600 bool Parser::parseNewTypeId(AbstractExpressionAST *&node)
       
  3601 {
       
  3602     int start = tokenStream->cursor();
       
  3603 
       
  3604     TypeSpecifierAST *typeSpec = 0;
       
  3605     if (!parseTypeSpecifier(typeSpec))
       
  3606         return false;
       
  3607 
       
  3608     AbstractExpressionAST *ast = CreateExpression<NodeType_NewTypeId>(m_pool);
       
  3609 
       
  3610     if (typeSpec)
       
  3611         typeSpec->setParent(ast);
       
  3612 
       
  3613     AbstractExpressionAST *declarator = 0;
       
  3614     parseNewDeclarator(declarator);
       
  3615     if (declarator)
       
  3616         declarator->setParent(ast);
       
  3617 
       
  3618     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3619     node = ast;
       
  3620     return true;
       
  3621 }
       
  3622 
       
  3623 bool Parser::parseNewDeclarator(AbstractExpressionAST *&node)
       
  3624 {
       
  3625     int start = tokenStream->cursor();
       
  3626 
       
  3627     AbstractExpressionAST *ast = CreateExpression<NodeType_NewInitializer>(m_pool);
       
  3628 
       
  3629     AST *ptrOp = 0;
       
  3630     if (parsePtrOperator(ptrOp)) {
       
  3631         if (ptrOp)
       
  3632             ptrOp->setParent(ast);
       
  3633 
       
  3634         AbstractExpressionAST *declarator = 0;
       
  3635         parseNewDeclarator(declarator);
       
  3636 
       
  3637         if (declarator)
       
  3638             declarator->setParent(ast);
       
  3639     }
       
  3640 
       
  3641     while (tokenStream->lookAhead() == '[') {
       
  3642         advance();
       
  3643         AbstractExpressionAST *expr = 0;
       
  3644         parseExpression(expr);
       
  3645         ADVANCE(']', "]");
       
  3646 
       
  3647         if (expr)
       
  3648             expr->setParent(ast);
       
  3649     }
       
  3650 
       
  3651     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3652     node = ast;
       
  3653     return true;
       
  3654 }
       
  3655 
       
  3656 bool Parser::parseNewInitializer(AbstractExpressionAST *&node)
       
  3657 {
       
  3658     int start = tokenStream->cursor();
       
  3659 
       
  3660     if (tokenStream->lookAhead() != '(')
       
  3661         return false;
       
  3662 
       
  3663     AbstractExpressionAST *ast = CreateExpression<NodeType_NewInitializer>(m_pool);
       
  3664 
       
  3665     advance();
       
  3666     AbstractExpressionAST *expr = 0;
       
  3667     parseCommaExpression(expr);
       
  3668 
       
  3669     if (expr)
       
  3670         expr->setParent(ast);
       
  3671 
       
  3672     CHECK(')', ")");
       
  3673 
       
  3674     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3675     node = ast;
       
  3676     return true;
       
  3677 }
       
  3678 
       
  3679 bool Parser::parseDeleteExpression(AbstractExpressionAST *&node)
       
  3680 {
       
  3681     int start = tokenStream->cursor();
       
  3682 
       
  3683     AbstractExpressionAST *ast = CreateExpression<NodeType_DeleteExpression>(m_pool);
       
  3684 
       
  3685     if (tokenStream->lookAhead() == Token_scope && tokenStream->lookAhead(1) == Token_delete) {
       
  3686         AST_FROM_TOKEN(scopeNode, tokenStream->cursor());
       
  3687         scopeNode->setParent(ast);
       
  3688         advance();
       
  3689     }
       
  3690 
       
  3691     AST_FROM_TOKEN(deleteNode, tokenStream->cursor());
       
  3692     deleteNode->setParent(ast);
       
  3693 
       
  3694     CHECK(Token_delete, "delete");
       
  3695 
       
  3696     if (tokenStream->lookAhead() == '[') {
       
  3697         int beg = tokenStream->cursor();
       
  3698         advance();
       
  3699         CHECK(']', "]");
       
  3700 
       
  3701         AST *n = CreateNode<AST>(m_pool);
       
  3702         UPDATE_POS(n, beg, tokenStream->cursor());
       
  3703         n->setParent(ast);
       
  3704     }
       
  3705 
       
  3706     AbstractExpressionAST *expr = 0;
       
  3707     if (!parseCastExpression(expr))
       
  3708         return false;
       
  3709 
       
  3710     if (expr)
       
  3711         expr->setParent(ast);
       
  3712 
       
  3713     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3714     node = ast;
       
  3715     return true;
       
  3716 }
       
  3717 
       
  3718 bool Parser::parseCastExpression(AbstractExpressionAST *&node)
       
  3719 {
       
  3720     int start = tokenStream->cursor();
       
  3721 
       
  3722     if (tokenStream->lookAhead() == '(') {
       
  3723         AbstractExpressionAST *ast = CreateExpression<NodeType_CastExpression>(m_pool);
       
  3724 
       
  3725         advance();
       
  3726         TypeIdAST *typeId = 0;
       
  3727         if (parseTypeId(typeId)) {
       
  3728 
       
  3729             if (typeId)
       
  3730                 typeId->setParent(ast);
       
  3731 
       
  3732             if (tokenStream->lookAhead() == ')') {
       
  3733                 advance();
       
  3734 
       
  3735                 AbstractExpressionAST *expr = 0;
       
  3736                 if (parseCastExpression(expr)) {
       
  3737                     if (expr)
       
  3738                         expr->setParent(ast);
       
  3739 
       
  3740                     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3741                     node = ast;
       
  3742                     return true;
       
  3743                 }
       
  3744             }
       
  3745         }
       
  3746     }
       
  3747 
       
  3748     tokenStream->rewind(start);
       
  3749     return parseUnaryExpression(node);
       
  3750 }
       
  3751 
       
  3752 bool Parser::parsePmExpression(AbstractExpressionAST *&node)
       
  3753 {
       
  3754     int start = tokenStream->cursor();
       
  3755 
       
  3756     AbstractExpressionAST *ast = 0;
       
  3757     if (!parseCastExpression(ast) || !ast) // ### fixme
       
  3758         return false;
       
  3759 
       
  3760     while (tokenStream->lookAhead() == Token_ptrmem) {
       
  3761         int startOp = tokenStream->cursor();
       
  3762         AST_FROM_TOKEN(op, startOp);
       
  3763         advance();
       
  3764 
       
  3765         AbstractExpressionAST *rightExpr = 0;
       
  3766         if (!parseCastExpression(rightExpr))
       
  3767             return false;
       
  3768 
       
  3769         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  3770         tmp->setOp(op);
       
  3771         tmp->setLeftExpression(ast);
       
  3772         tmp->setRightExpression(rightExpr);
       
  3773         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  3774         ast = tmp;
       
  3775     }
       
  3776 
       
  3777     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3778     node = ast;
       
  3779     return true;
       
  3780 }
       
  3781 
       
  3782 bool Parser::parseMultiplicativeExpression(AbstractExpressionAST *&node)
       
  3783 {
       
  3784     int start = tokenStream->cursor();
       
  3785 
       
  3786     AbstractExpressionAST *ast = 0;
       
  3787     if (!parsePmExpression(ast))
       
  3788         return false;
       
  3789 
       
  3790     while (tokenStream->lookAhead() == '*' || tokenStream->lookAhead() == '/' || tokenStream->lookAhead() == '%') {
       
  3791         int startOp = tokenStream->cursor();
       
  3792         AST_FROM_TOKEN(op, startOp);
       
  3793         advance();
       
  3794 
       
  3795         AbstractExpressionAST *rightExpr = 0;
       
  3796         if (!parsePmExpression(rightExpr))
       
  3797             return false;
       
  3798 
       
  3799         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  3800         tmp->setOp(op);
       
  3801         tmp->setLeftExpression(ast);
       
  3802         tmp->setRightExpression(rightExpr);
       
  3803         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  3804         ast = tmp;
       
  3805     }
       
  3806 
       
  3807     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3808     node = ast;
       
  3809     return true;
       
  3810 }
       
  3811 
       
  3812 
       
  3813 bool Parser::parseAdditiveExpression(AbstractExpressionAST *&node)
       
  3814 {
       
  3815     int start = tokenStream->cursor();
       
  3816 
       
  3817     AbstractExpressionAST *ast = 0;
       
  3818     if (!parseMultiplicativeExpression(ast))
       
  3819         return false;
       
  3820 
       
  3821     while (tokenStream->lookAhead() == '+' || tokenStream->lookAhead() == '-') {
       
  3822         int startOp = tokenStream->cursor();
       
  3823         AST_FROM_TOKEN(op, startOp);
       
  3824         advance();
       
  3825 
       
  3826         AbstractExpressionAST *rightExpr = 0;
       
  3827         if (!parseMultiplicativeExpression(rightExpr))
       
  3828             return false;
       
  3829 
       
  3830         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  3831         tmp->setOp(op);
       
  3832         tmp->setLeftExpression(ast);
       
  3833         tmp->setRightExpression(rightExpr);
       
  3834         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  3835         ast = tmp;
       
  3836     }
       
  3837 
       
  3838     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3839     node = ast;
       
  3840     return true;
       
  3841 }
       
  3842 
       
  3843 bool Parser::parseShiftExpression(AbstractExpressionAST *&node)
       
  3844 {
       
  3845     int start = tokenStream->cursor();
       
  3846 
       
  3847     AbstractExpressionAST *ast = 0;
       
  3848     if (!parseAdditiveExpression(ast))
       
  3849         return false;
       
  3850 
       
  3851     while (tokenStream->lookAhead() == Token_shift) {
       
  3852         int startOp = tokenStream->cursor();
       
  3853         AST_FROM_TOKEN(op, startOp);
       
  3854         advance();
       
  3855 
       
  3856         AbstractExpressionAST *rightExpr = 0;
       
  3857         if (!parseAdditiveExpression(rightExpr))
       
  3858             return false;
       
  3859 
       
  3860         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  3861         tmp->setOp(op);
       
  3862         tmp->setLeftExpression(ast);
       
  3863         tmp->setRightExpression(rightExpr);
       
  3864         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  3865         ast = tmp;
       
  3866     }
       
  3867 
       
  3868     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3869     node = ast;
       
  3870     return true;
       
  3871 }
       
  3872 
       
  3873 bool Parser::parseRelationalExpression(AbstractExpressionAST *&node, bool templArgs)
       
  3874 {
       
  3875     int start = tokenStream->cursor();
       
  3876 
       
  3877     AbstractExpressionAST *ast = 0;
       
  3878     if (!parseShiftExpression(ast))
       
  3879         return false;
       
  3880 
       
  3881     while (tokenStream->lookAhead() == '<' || (tokenStream->lookAhead() == '>' && !templArgs) ||
       
  3882            tokenStream->lookAhead() == Token_leq || tokenStream->lookAhead() == Token_geq) {
       
  3883         int startOp = tokenStream->cursor();
       
  3884         AST_FROM_TOKEN(op, startOp);
       
  3885         advance();
       
  3886 
       
  3887         AbstractExpressionAST *rightExpr = 0;
       
  3888         if (!parseShiftExpression(rightExpr))
       
  3889             return false;
       
  3890 
       
  3891         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  3892         tmp->setOp(op);
       
  3893         tmp->setLeftExpression(ast);
       
  3894         tmp->setRightExpression(rightExpr);
       
  3895         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  3896         ast = tmp;
       
  3897     }
       
  3898 
       
  3899     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3900     node = ast;
       
  3901     return true;
       
  3902 }
       
  3903 
       
  3904 bool Parser::parseEqualityExpression(AbstractExpressionAST *&node, bool templArgs)
       
  3905 {
       
  3906     int start = tokenStream->cursor();
       
  3907 
       
  3908     AbstractExpressionAST *ast = 0;
       
  3909     if (!parseRelationalExpression(ast, templArgs))
       
  3910         return false;
       
  3911 
       
  3912     while (tokenStream->lookAhead() == Token_eq || tokenStream->lookAhead() == Token_not_eq) {
       
  3913         int startOp = tokenStream->cursor();
       
  3914         AST_FROM_TOKEN(op, startOp);
       
  3915         advance();
       
  3916 
       
  3917         AbstractExpressionAST *rightExpr = 0;
       
  3918         if (!parseRelationalExpression(rightExpr, templArgs))
       
  3919             return false;
       
  3920 
       
  3921         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  3922         tmp->setOp(op);
       
  3923         tmp->setLeftExpression(ast);
       
  3924         tmp->setRightExpression(rightExpr);
       
  3925         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  3926         ast = tmp;
       
  3927     }
       
  3928 
       
  3929     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3930     node = ast;
       
  3931     return true;
       
  3932 }
       
  3933 
       
  3934 bool Parser::parseAndExpression(AbstractExpressionAST *&node, bool templArgs)
       
  3935 {
       
  3936     int start = tokenStream->cursor();
       
  3937 
       
  3938     AbstractExpressionAST *ast = 0;
       
  3939     if (!parseEqualityExpression(ast, templArgs))
       
  3940         return false;
       
  3941 
       
  3942     while (tokenStream->lookAhead() == '&') {
       
  3943         int startOp = tokenStream->cursor();
       
  3944         AST_FROM_TOKEN(op, startOp);
       
  3945         advance();
       
  3946 
       
  3947         AbstractExpressionAST *rightExpr = 0;
       
  3948         if (!parseEqualityExpression(rightExpr, templArgs))
       
  3949             return false;
       
  3950 
       
  3951         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  3952         tmp->setOp(op);
       
  3953         tmp->setLeftExpression(ast);
       
  3954         tmp->setRightExpression(rightExpr);
       
  3955         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  3956         ast = tmp;
       
  3957     }
       
  3958 
       
  3959     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3960     node = ast;
       
  3961     return true;
       
  3962 }
       
  3963 
       
  3964 bool Parser::parseExclusiveOrExpression(AbstractExpressionAST *&node, bool templArgs)
       
  3965 {
       
  3966     int start = tokenStream->cursor();
       
  3967 
       
  3968     AbstractExpressionAST *ast = 0;
       
  3969     if (!parseAndExpression(ast, templArgs))
       
  3970         return false;
       
  3971 
       
  3972     while (tokenStream->lookAhead() == '^') {
       
  3973         int startOp = tokenStream->cursor();
       
  3974         AST_FROM_TOKEN(op, startOp);
       
  3975         advance();
       
  3976 
       
  3977         AbstractExpressionAST *rightExpr = 0;
       
  3978         if (!parseAndExpression(rightExpr, templArgs))
       
  3979             return false;
       
  3980 
       
  3981         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  3982         tmp->setOp(op);
       
  3983         tmp->setLeftExpression(ast);
       
  3984         tmp->setRightExpression(rightExpr);
       
  3985         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  3986         ast = tmp;
       
  3987     }
       
  3988 
       
  3989     UPDATE_POS(ast, start, tokenStream->cursor());
       
  3990     node = ast;
       
  3991     return true;
       
  3992 }
       
  3993 
       
  3994 bool Parser::parseInclusiveOrExpression(AbstractExpressionAST *&node, bool templArgs)
       
  3995 {
       
  3996     int start = tokenStream->cursor();
       
  3997 
       
  3998     AbstractExpressionAST *ast = 0;
       
  3999     if (!parseExclusiveOrExpression(ast, templArgs))
       
  4000         return false;
       
  4001 
       
  4002     while (tokenStream->lookAhead() == '|') {
       
  4003         int startOp = tokenStream->cursor();
       
  4004         AST_FROM_TOKEN(op, startOp);
       
  4005         advance();
       
  4006 
       
  4007         AbstractExpressionAST *rightExpr = 0;
       
  4008         if (!parseExclusiveOrExpression(rightExpr, templArgs))
       
  4009             return false;
       
  4010 
       
  4011         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  4012         tmp->setOp(op);
       
  4013         tmp->setLeftExpression(ast);
       
  4014         tmp->setRightExpression(rightExpr);
       
  4015         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  4016         ast = tmp;
       
  4017     }
       
  4018 
       
  4019     UPDATE_POS(ast, start, tokenStream->cursor());
       
  4020     node = ast;
       
  4021     return true;
       
  4022 }
       
  4023 
       
  4024 bool Parser::parseLogicalAndExpression(AbstractExpressionAST *&node, bool templArgs)
       
  4025 {
       
  4026     int start = tokenStream->cursor();
       
  4027 
       
  4028     AbstractExpressionAST *ast = 0;
       
  4029     if (!parseInclusiveOrExpression(ast, templArgs))
       
  4030         return false;
       
  4031 
       
  4032     while (tokenStream->lookAhead() == Token_and) {
       
  4033         int startOp = tokenStream->cursor();
       
  4034         AST_FROM_TOKEN(op, startOp);
       
  4035         advance();
       
  4036 
       
  4037         AbstractExpressionAST *rightExpr = 0;
       
  4038         if (!parseInclusiveOrExpression(rightExpr, templArgs))
       
  4039             return false;
       
  4040 
       
  4041         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  4042         tmp->setOp(op);
       
  4043         tmp->setLeftExpression(ast);
       
  4044         tmp->setRightExpression(rightExpr);
       
  4045         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  4046         ast = tmp;
       
  4047     }
       
  4048 
       
  4049     UPDATE_POS(ast, start, tokenStream->cursor());
       
  4050     node = ast;
       
  4051     return true;
       
  4052 }
       
  4053 
       
  4054 bool Parser::parseLogicalOrExpression(AbstractExpressionAST *&node, bool templArgs)
       
  4055 {
       
  4056     int start = tokenStream->cursor();
       
  4057 
       
  4058     AbstractExpressionAST *ast = 0;
       
  4059     if (!parseLogicalAndExpression(ast, templArgs))
       
  4060         return false;
       
  4061 
       
  4062     while (tokenStream->lookAhead() == Token_or) {
       
  4063         int startOp = tokenStream->cursor();
       
  4064         AST_FROM_TOKEN(op, startOp);
       
  4065         advance();
       
  4066 
       
  4067         AbstractExpressionAST *rightExpr = 0;
       
  4068         if (!parseLogicalAndExpression(rightExpr, templArgs))
       
  4069             return false;
       
  4070 
       
  4071         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  4072         tmp->setOp(op);
       
  4073         tmp->setLeftExpression(ast);
       
  4074         tmp->setRightExpression(rightExpr);
       
  4075         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  4076         ast = tmp;
       
  4077     }
       
  4078 
       
  4079     UPDATE_POS(ast, start, tokenStream->cursor());
       
  4080     node = ast;
       
  4081     return true;
       
  4082 }
       
  4083 
       
  4084 bool Parser::parseConditionalExpression(AbstractExpressionAST *&node)
       
  4085 {
       
  4086     int start = tokenStream->cursor();
       
  4087     AbstractExpressionAST *ast = 0;
       
  4088     if (!parseLogicalOrExpression(ast))
       
  4089         return false;
       
  4090 
       
  4091     if (tokenStream->lookAhead() == '?') {
       
  4092         advance();
       
  4093 
       
  4094         AbstractExpressionAST *leftExpr = 0;
       
  4095         if (!parseExpression(leftExpr))
       
  4096             return false;
       
  4097 
       
  4098         CHECK(':', ":");
       
  4099 
       
  4100         AbstractExpressionAST *rightExpr = 0;
       
  4101         if (!parseAssignmentExpression(rightExpr))
       
  4102             return false;
       
  4103 
       
  4104         ConditionalExpressionAST *tmp = CreateNode<ConditionalExpressionAST>(m_pool);
       
  4105         tmp->setCondition(ast);
       
  4106         tmp->setLeftExpression(leftExpr);
       
  4107         tmp->setRightExpression(rightExpr);
       
  4108         ast = tmp;
       
  4109     }
       
  4110 
       
  4111     UPDATE_POS(ast, start, tokenStream->cursor());
       
  4112     node = ast;
       
  4113     return true;
       
  4114 }
       
  4115 
       
  4116 bool Parser::parseAssignmentExpression(AbstractExpressionAST *&node)
       
  4117 {
       
  4118     int start = tokenStream->cursor();
       
  4119 
       
  4120     AbstractExpressionAST *ast = 0;
       
  4121     if (tokenStream->lookAhead() == Token_throw && !parseThrowExpression(ast))
       
  4122         return false;
       
  4123     else if (!parseConditionalExpression(ast))
       
  4124         return false;
       
  4125 
       
  4126     while (tokenStream->lookAhead() == Token_assign || tokenStream->lookAhead() == '=') {
       
  4127         int startOp = tokenStream->cursor();
       
  4128         AST_FROM_TOKEN(op, startOp);
       
  4129         advance();
       
  4130 
       
  4131         AbstractExpressionAST *rightExpr = 0;
       
  4132         if (!parseConditionalExpression(rightExpr))
       
  4133             return false;
       
  4134 
       
  4135         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  4136         tmp->setOp(op);
       
  4137         tmp->setLeftExpression(ast);
       
  4138         tmp->setRightExpression(rightExpr);
       
  4139         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  4140         ast = tmp;
       
  4141     }
       
  4142 
       
  4143     UPDATE_POS(ast, start, tokenStream->cursor());
       
  4144     node = ast;
       
  4145     return true;
       
  4146 }
       
  4147 
       
  4148 bool Parser::parseConstantExpression(AbstractExpressionAST *&node)
       
  4149 {
       
  4150     return parseConditionalExpression(node);
       
  4151 }
       
  4152 
       
  4153 bool Parser::parseExpression(AbstractExpressionAST *&node)
       
  4154 {
       
  4155     return parseCommaExpression(node);
       
  4156 }
       
  4157 
       
  4158 bool Parser::parseCommaExpression(AbstractExpressionAST *&node)
       
  4159 {
       
  4160     int start = tokenStream->cursor();
       
  4161 
       
  4162     AbstractExpressionAST *ast = 0;
       
  4163     if (!parseAssignmentExpression(ast))
       
  4164         return false;
       
  4165 
       
  4166     while (tokenStream->lookAhead() == ',') {
       
  4167         int startOp = tokenStream->cursor();
       
  4168         AST_FROM_TOKEN(op, startOp);
       
  4169         advance();
       
  4170 
       
  4171         AbstractExpressionAST *rightExpr = 0;
       
  4172         if (!parseAssignmentExpression(rightExpr))
       
  4173             return false;
       
  4174 
       
  4175         BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
       
  4176         tmp->setOp(op);
       
  4177         tmp->setLeftExpression(ast);
       
  4178         tmp->setRightExpression(rightExpr);
       
  4179         UPDATE_POS(tmp, startOp, tokenStream->cursor());
       
  4180         ast = tmp;
       
  4181     }
       
  4182 
       
  4183     UPDATE_POS(ast, start, tokenStream->cursor());
       
  4184     node = ast;
       
  4185     return true;
       
  4186 }
       
  4187 
       
  4188 bool Parser::parseThrowExpression(AbstractExpressionAST *&node)
       
  4189 {
       
  4190     if (tokenStream->lookAhead() != Token_throw)
       
  4191         return false;
       
  4192 
       
  4193     int start = tokenStream->cursor();
       
  4194 
       
  4195     AST_FROM_TOKEN(throwNode, tokenStream->cursor());
       
  4196     CHECK(Token_throw, "throw");
       
  4197     AbstractExpressionAST *expr = 0;
       
  4198     if (!parseAssignmentExpression(expr))
       
  4199         return false;
       
  4200 
       
  4201     AbstractExpressionAST *ast = CreateExpression<NodeType_ThrowExpression>(m_pool);
       
  4202     throwNode->setParent(ast);
       
  4203     if (expr)
       
  4204         expr->setParent(ast);
       
  4205 
       
  4206     UPDATE_POS(ast, start, tokenStream->cursor());
       
  4207     node = ast;
       
  4208 
       
  4209     return true;
       
  4210 }
       
  4211 
       
  4212 
       
  4213 // ### Objective C++
       
  4214 bool Parser::parseIvarDeclList(AST *& node)
       
  4215 {
       
  4216     Q_UNUSED(node);
       
  4217     return false;
       
  4218 }
       
  4219 
       
  4220 bool Parser::parseIvarDecls(AST *& node)
       
  4221 {
       
  4222     Q_UNUSED(node);
       
  4223     return false;
       
  4224 }
       
  4225 
       
  4226 bool Parser::parseIvarDecl(AST *& node)
       
  4227 {
       
  4228     Q_UNUSED(node);
       
  4229     return false;
       
  4230 }
       
  4231 
       
  4232 bool Parser::parseIvars(AST *& node)
       
  4233 {
       
  4234     Q_UNUSED(node);
       
  4235     return false;
       
  4236 }
       
  4237 
       
  4238 bool Parser::parseIvarDeclarator(AST *& node)
       
  4239 {
       
  4240     Q_UNUSED(node);
       
  4241     return false;
       
  4242 }
       
  4243 
       
  4244 bool Parser::parseMethodDecl(AST *& node)
       
  4245 {
       
  4246     Q_UNUSED(node);
       
  4247     return false;
       
  4248 }
       
  4249 
       
  4250 bool Parser::parseUnarySelector(AST *& node)
       
  4251 {
       
  4252     Q_UNUSED(node);
       
  4253     return false;
       
  4254 }
       
  4255 
       
  4256 bool Parser::parseKeywordSelector(AST *& node)
       
  4257 {
       
  4258     Q_UNUSED(node);
       
  4259     return false;
       
  4260 }
       
  4261 
       
  4262 bool Parser::parseSelector(AST *& node)
       
  4263 {
       
  4264     Q_UNUSED(node);
       
  4265     return false;
       
  4266 }
       
  4267 
       
  4268 bool Parser::parseKeywordDecl(AST *& node)
       
  4269 {
       
  4270     Q_UNUSED(node);
       
  4271     return false;
       
  4272 }
       
  4273 
       
  4274 bool Parser::parseReceiver(AST *& node)
       
  4275 {
       
  4276     Q_UNUSED(node);
       
  4277     return false;
       
  4278 }
       
  4279 
       
  4280 bool Parser::parseObjcMessageExpr(AST *& node)
       
  4281 {
       
  4282     Q_UNUSED(node);
       
  4283     return false;
       
  4284 }
       
  4285 
       
  4286 bool Parser::parseMessageArgs(AST *& node)
       
  4287 {
       
  4288     Q_UNUSED(node);
       
  4289     return false;
       
  4290 }
       
  4291 
       
  4292 bool Parser::parseKeywordExpr(AST *& node)
       
  4293 {
       
  4294     Q_UNUSED(node);
       
  4295     return false;
       
  4296 }
       
  4297 
       
  4298 bool Parser::parseKeywordArgList(AST *& node)
       
  4299 {
       
  4300     Q_UNUSED(node);
       
  4301     return false;
       
  4302 }
       
  4303 
       
  4304 bool Parser::parseKeywordArg(AST *& node)
       
  4305 {
       
  4306     Q_UNUSED(node);
       
  4307     return false;
       
  4308 }
       
  4309 
       
  4310 bool Parser::parseReservedWord(AST *& node)
       
  4311 {
       
  4312     Q_UNUSED(node);
       
  4313     return false;
       
  4314 }
       
  4315 
       
  4316 bool Parser::parseMyParms(AST *& node)
       
  4317 {
       
  4318     Q_UNUSED(node);
       
  4319     return false;
       
  4320 }
       
  4321 
       
  4322 bool Parser::parseMyParm(AST *& node)
       
  4323 {
       
  4324     Q_UNUSED(node);
       
  4325     return false;
       
  4326 }
       
  4327 
       
  4328 bool Parser::parseOptParmList(AST *& node)
       
  4329 {
       
  4330     Q_UNUSED(node);
       
  4331     return false;
       
  4332 }
       
  4333 
       
  4334 bool Parser::parseObjcSelectorExpr(AST *& node)
       
  4335 {
       
  4336     Q_UNUSED(node);
       
  4337     return false;
       
  4338 }
       
  4339 
       
  4340 bool Parser::parseSelectorArg(AST *& node)
       
  4341 {
       
  4342     Q_UNUSED(node);
       
  4343     return false;
       
  4344 }
       
  4345 
       
  4346 bool Parser::parseKeywordNameList(AST *& node)
       
  4347 {
       
  4348     Q_UNUSED(node);
       
  4349     return false;
       
  4350 }
       
  4351 
       
  4352 bool Parser::parseKeywordName(AST *& node)
       
  4353 {
       
  4354     Q_UNUSED(node);
       
  4355     return false;
       
  4356 }
       
  4357 
       
  4358 bool Parser::parseObjcEncodeExpr(AST *& node)
       
  4359 {
       
  4360     Q_UNUSED(node);
       
  4361     return false;
       
  4362 }
       
  4363 
       
  4364 bool Parser::parseObjcString(AST *& node)
       
  4365 {
       
  4366     Q_UNUSED(node);
       
  4367     return false;
       
  4368 }
       
  4369 
       
  4370 bool Parser::parseProtocolRefs(AST *& node)
       
  4371 {
       
  4372     Q_UNUSED(node);
       
  4373     return false;
       
  4374 }
       
  4375 
       
  4376 bool Parser::parseIdentifierList(AST *& node)
       
  4377 {
       
  4378     int start = tokenStream->cursor();
       
  4379 
       
  4380     if (tokenStream->lookAhead() != Token_identifier)
       
  4381         return false;
       
  4382 
       
  4383     AST *ast = CreateNode<AST>(m_pool);
       
  4384 
       
  4385     AST_FROM_TOKEN(tk, tokenStream->cursor());
       
  4386     tk->setParent(ast);
       
  4387     advance();
       
  4388 
       
  4389     while (tokenStream->lookAhead() == ',') {
       
  4390         advance();
       
  4391         if (tokenStream->lookAhead() == Token_identifier) {
       
  4392             AST_FROM_TOKEN(tk, tokenStream->cursor());
       
  4393             tk->setParent(ast);
       
  4394             advance();
       
  4395         }
       
  4396         ADVANCE(Token_identifier, "identifier");
       
  4397     }
       
  4398 
       
  4399     node = ast;
       
  4400     UPDATE_POS(node, start, tokenStream->cursor());
       
  4401     return true;
       
  4402 }
       
  4403 
       
  4404 bool Parser::parseIdentifierColon(AST *& node)
       
  4405 {
       
  4406     Q_UNUSED(node);
       
  4407 
       
  4408     if (tokenStream->lookAhead() == Token_identifier && tokenStream->lookAhead(1) == ':') {
       
  4409         advance();
       
  4410         advance();
       
  4411         return true;
       
  4412     } // ### else if PTYPENAME -> return true ;
       
  4413 
       
  4414     return false;
       
  4415 }
       
  4416 
       
  4417 bool Parser::parseObjcProtocolExpr(AST *& node)
       
  4418 {
       
  4419     Q_UNUSED(node);
       
  4420     return false;
       
  4421 }
       
  4422 
       
  4423 bool Parser::parseObjcOpenBracketExpr(AST *& node)
       
  4424 {
       
  4425     Q_UNUSED(node);
       
  4426     return false;
       
  4427 }
       
  4428 
       
  4429 bool Parser::parseObjcCloseBracket(AST *& node)
       
  4430 {
       
  4431     Q_UNUSED(node);
       
  4432     return false;
       
  4433 }
       
  4434 
       
  4435 bool Parser::parseObjcDef(DeclarationAST *& node)
       
  4436 {
       
  4437     Q_UNUSED(node);
       
  4438     return false;
       
  4439 }
       
  4440 
       
  4441 bool Parser::parseObjcClassDef(DeclarationAST *& node)
       
  4442 {
       
  4443     Q_UNUSED(node);
       
  4444     return false;
       
  4445 }
       
  4446 
       
  4447 bool Parser::parseObjcClassDecl(DeclarationAST *& node)
       
  4448 {
       
  4449     Q_UNUSED(node);
       
  4450 
       
  4451     ADVANCE(OBJC_CLASS, "@class");
       
  4452 
       
  4453     AST *idList = 0;
       
  4454     parseIdentifierList(idList);
       
  4455     ADVANCE(';', ";");
       
  4456 
       
  4457     return true;
       
  4458 }
       
  4459 
       
  4460 bool Parser::parseObjcProtocolDecl(DeclarationAST *& node)
       
  4461 {
       
  4462     Q_UNUSED(node);
       
  4463 
       
  4464     ADVANCE(OBJC_PROTOCOL, "@protocol");
       
  4465 
       
  4466     AST *idList = 0;
       
  4467     parseIdentifierList(idList);
       
  4468     ADVANCE(';', ";");
       
  4469 
       
  4470     return true;
       
  4471 }
       
  4472 
       
  4473 bool Parser::parseObjcAliasDecl(DeclarationAST *& node)
       
  4474 {
       
  4475     Q_UNUSED(node);
       
  4476 
       
  4477     ADVANCE(OBJC_ALIAS, "@alias");
       
  4478 
       
  4479     AST *idList = 0;
       
  4480     parseIdentifierList(idList);
       
  4481     ADVANCE(';', ";");
       
  4482 
       
  4483     return true;
       
  4484 }
       
  4485 
       
  4486 bool Parser::parseObjcProtocolDef(DeclarationAST *& node)
       
  4487 {
       
  4488     Q_UNUSED(node);
       
  4489     return false;
       
  4490 }
       
  4491 
       
  4492 bool Parser::parseObjcMethodDef(DeclarationAST *& node)
       
  4493 {
       
  4494     Q_UNUSED(node);
       
  4495     return false;
       
  4496 }
       
  4497 
       
  4498 bool Parser::parseWinDeclSpec(AST *& node)
       
  4499 {
       
  4500     if (tokenStream->lookAhead() == Token_identifier
       
  4501             && tokenStream->lookAhead(1) == '('
       
  4502             && tokenStream->currentTokenText() == "__declspec") {
       
  4503         int start = tokenStream->cursor();
       
  4504         advance();
       
  4505         advance(); // skip '('
       
  4506 
       
  4507         parseIdentifierList(node);
       
  4508         ADVANCE(')', ")");
       
  4509 
       
  4510         UPDATE_POS(node, start, tokenStream->cursor());
       
  4511         return true;
       
  4512     }
       
  4513 
       
  4514     return false;
       
  4515 }
       
  4516 
       
  4517 void Parser::advance()
       
  4518 {
       
  4519     for (;;) {
       
  4520         tokenStream->nextToken();
       
  4521         if (!tokenStream->isHidden(tokenStream->cursor()))
       
  4522             break;
       
  4523     }
       
  4524 }
       
  4525 
       
  4526 QT_END_NAMESPACE