1
/****************************************************************************
3
** Copyright (C) 2004-2005 Trolltech AS. All rights reserved.
4
** Copyright (C) 2001-2004 Roberto Raggi
6
** This file is part of the porting application of the Qt Toolkit.
8
** This file may be distributed under the terms of the Q Public License
9
** as defined by Trolltech AS of Norway and appearing in the file
10
** LICENSE.QPL included in the packaging of this file.
12
** This file may be distributed and/or modified under the terms of the
13
** GNU General Public License version 2 as published by the Free Software
14
** Foundation and appearing in the file LICENSE.GPL included in the
15
** packaging of this file.
17
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
18
** information about Qt Commercial License Agreements.
19
** See http://www.trolltech.com/qpl/ for QPL licensing information.
20
** See http://www.trolltech.com/gpl/ for GPL licensing information.
22
** Contact info@trolltech.com if any conditions of this licensing are
25
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
26
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
28
****************************************************************************/
37
#include <qstringlist.h>
38
#include <qdatetime.h>
40
#define TT (tokenStream->currentTokenText().data())
42
#define ADVANCE(tk, descr) \
44
if (tokenStream->lookAhead() != tk) { \
45
reportError(QString("'%1' expected found '%2'").arg(QString(descr)).arg(QString(tokenStream->currentTokenText()))); \
51
#define ADVANCE_NR(tk, descr) \
53
if (tokenStream->lookAhead() != tk) { \
54
reportError(i18n("'%1' expected found '%2'").arg(QString(descr)).arg(QString(tokenStream->currentTokenText()))); \
60
#define CHECK(tk, descr) \
62
if (tokenStream->lookAhead() != tk) { \
68
#define MATCH(tk, descr) \
70
if (tokenStream->lookAhead() != tk) { \
71
reportError(Errors::SyntaxError); \
76
#define UPDATE_POS(_node, start, end) \
78
(_node)->setPosition(start, end); \
81
#define AST_FROM_TOKEN(node, tk) \
82
AST *node = CreateNode<AST>(m_pool); \
83
UPDATE_POS(node, (tk), (tk)+1);
85
#define DUMP_AST(node) \
87
fprintf(stderr, "\n=================================================\n"); \
88
for (int i=node->startToken(); i<node->endToken(); ++i) \
89
fprintf(stderr, "%s", tokenStream->tokenText(i).constData()); \
90
fprintf(stderr, "\n=================================================\n"); \
95
QString i18n(QString arg)
119
TranslationUnitAST *Parser::parse(TokenStreamAdapter::TokenStream *p_tokenStream, pool *p)
121
//tokenStream->rewind(0);
123
tokenStream = p_tokenStream;
124
TranslationUnitAST *ast = 0;
125
parseTranslationUnit(ast);
130
Parses a part of the translation unit given by tokenStream. When the number
131
of nodes in the AST exeeds targetMaxASTnodes, this function will return as
132
soon as possible. The progress is stored by updating the cursor inside
133
tokenStream. done is set to true if the parser finished parsing the
134
tokenStream, and to false otherwise.
136
TranslationUnitAST *Parser::parse(TokenStreamAdapter::TokenStream *p_tokenStream, pool *p, int targetMaxASTNodes, bool &done)
139
tokenStream = p_tokenStream;
140
TranslationUnitAST *ast = 0;
141
// we always create one node, so target max nodes cannot be < 2.
142
if (targetMaxASTNodes < 2)
143
targetMaxASTNodes = 2;
145
// Advance past whitespace and comment tokens at the start.
146
while (tokenStream->isHidden(tokenStream->cursor())) {
147
tokenStream->nextToken();
149
int start = tokenStream->cursor();
153
ast = CreateNode<TranslationUnitAST>(m_pool);
154
while (tokenStream->lookAhead() && AST::N < targetMaxASTNodes) {
155
DeclarationAST *def = 0;
156
int startDecl = tokenStream->cursor();
157
if (!parseDeclaration(def)) {
159
if (startDecl == tokenStream->cursor())
160
advance(); // skip at least one token
161
skipUntilDeclaration();
163
ast->addDeclaration(def);
166
UPDATE_POS(ast, start, tokenStream->cursor());
168
done = tokenStream->tokenAtEnd();
173
bool Parser::reportError(const Error& err)
177
if (m_problems < m_maxProblems) {
181
tokenStream->getTokenStartPosition(tokenStream->cursor(), &line, &col, &fileName);
183
QString s = tokenStream->currentTokenText();
184
s = s.left(30).trimmed();
188
if (fileName.isEmpty())
189
//fileName = m_file->fileName;
190
fileName = "implement me";
192
// m_driver->addProblem(m_driver->currentFileName(), Problem(err.text.arg(s), line, col));
193
fprintf(stderr, "%s: error %s at line %d column %d\n",
194
fileName.constData(),
195
err.text.arg(s).toLatin1().constData(), line, col);
197
#endif // RXX_NO_ERROR
201
bool Parser::reportError(const QString& msg)
205
if (m_problems < m_maxProblems) {
209
tokenStream->getTokenStartPosition(tokenStream->cursor(), &line, &col, &fileName);
211
if (fileName.isEmpty())
212
//fileName = m_file->fileName;
213
fileName = "implement me";
215
// m_driver->addProblem(m_driver->currentFileName(), Problem(msg, line, col));
216
fprintf(stderr, "%s: error %s at line %d column %d\n",
217
fileName.constData(),
218
msg.toLatin1().constData(), line, col);
220
#endif // RXX_NO_ERROR
224
void Parser::syntaxError()
226
(void) reportError(Errors::SyntaxError);
229
bool Parser::skipUntil(int token)
231
while (tokenStream->lookAhead()) {
232
if (tokenStream->lookAhead() == token)
241
bool Parser::skipUntilDeclaration()
243
while (tokenStream->lookAhead()) {
245
switch(tokenStream->lookAhead()) {
249
case Token_identifier:
263
case Token_namespace:
270
case Token_const: // cv
271
case Token_volatile: // cv
274
case Token_protected:
276
case Token_signals: // Qt
277
case Token_slots: // Qt
288
bool Parser::skipUntilStatement()
290
while (tokenStream->lookAhead()) {
291
switch(tokenStream->lookAhead()) {
297
case Token_identifier:
340
bool Parser::skip(int l, int r)
343
while (tokenStream->lookAhead()) {
344
int tk = tokenStream->lookAhead();
350
else if (l != '{' && (tk == '{' || tk == '}' || tk == ';'))
362
bool Parser::skipCommaExpression(AbstractExpressionAST *&node)
364
#ifndef RXX_NO_PARSE_EXPRESSION
365
return parseCommaExpression(node);
367
int start = tokenStream->cursor();
369
AbstractExpressionAST *expr = 0;
370
if (!skipExpression(expr))
373
while (tokenStream->lookAhead() == ',') {
376
if (!skipExpression(expr)) {
377
reportError(i18n("expression expected"));
382
AbstractExpressionAST *ast = CreateNode<AbstractExpressionAST>(m_pool);
383
UPDATE_POS(ast, start, tokenStream->cursor());
387
#endif // RXX_NO_PARSE_EXPRESSION
390
bool Parser::skipExpression(AbstractExpressionAST *&node)
392
#ifndef RXX_NO_PARSE_EXPRESSION
393
return parseExpression(node);
395
int start = tokenStream->cursor();
398
while (tokenStream->lookAhead()) {
399
int tk = tokenStream->lookAhead();
413
AbstractExpressionAST *ast = CreateNode<AbstractExpressionAST>(m_pool);
414
UPDATE_POS(ast, start, tokenStream->cursor());
425
int c = tokenStream->cursor();
426
TypeSpecifierAST *spec = 0;
427
if (!parseClassSpecifier(spec))
428
tokenStream->rewind(c + 1);
445
if ((tk == ',' || tk == ';') && count > 0) {
450
AbstractExpressionAST *ast = CreateNode<AbstractExpressionAST>(m_pool);
451
UPDATE_POS(ast, start, tokenStream->cursor());
462
#endif // RXX_NO_PARSE_EXPRESSION
465
bool Parser::parseName(NameAST *&node, bool parseTemplateId)
467
AST *winDeclSpec = 0;
468
parseWinDeclSpec(winDeclSpec);
470
int start = tokenStream->cursor();
472
NameAST *ast = CreateNode<NameAST>(m_pool);
474
if (tokenStream->lookAhead() == Token_scope) {
475
ast->setGlobal(true);
479
int idx = tokenStream->cursor();
482
ClassOrNamespaceNameAST *n = 0;
483
if (!parseUnqualifiedName(n))
486
if (tokenStream->lookAhead() == Token_scope) {
488
ast->addClassOrNamespaceName(n);
489
if (tokenStream->lookAhead() == Token_template)
490
advance(); /// skip optional template #### @todo CHECK
491
} else if (!parseTemplateId && n) {
492
tokenStream->rewind(n->startToken());
493
parseUnqualifiedName(n, parseTemplateId);
494
ast->setUnqualifiedName(n);
497
ast->setUnqualifiedName(n);
502
if (idx == tokenStream->cursor())
505
UPDATE_POS(ast, start, tokenStream->cursor());
511
bool Parser::parseTranslationUnit(TranslationUnitAST *&node)
517
int start = tokenStream->cursor();
520
TranslationUnitAST *tun = CreateNode<TranslationUnitAST>(m_pool);
522
while (tokenStream->lookAhead()) {
523
DeclarationAST *def = 0;
524
int startDecl = tokenStream->cursor();
525
if (!parseDeclaration(def)) {
527
if (startDecl == tokenStream->cursor())
528
advance(); // skip at least one token
529
skipUntilDeclaration();
531
node->addDeclaration(def);
534
UPDATE_POS(node, start, tokenStream->cursor());
536
return m_problems == 0;
539
bool Parser::parseDeclaration(DeclarationAST *&node)
541
int start = tokenStream->cursor();
543
switch(tokenStream->lookAhead()) {
550
return parseLinkageSpecification(node);
552
case Token_namespace:
553
return parseNamespace(node);
556
return parseUsing(node);
559
return parseTypedef(node);
562
return parseAsmDefinition(node);
566
return parseTemplateDeclaration(node);
570
// tokenStream->rewind(start);
572
if (objcp && parseObjcDef(node))
575
tokenStream->rewind(start);
577
AST *storageSpec = 0;
578
parseStorageClassSpecifier(storageSpec);
583
TypeSpecifierAST *spec = 0;
584
if (parseEnumSpecifier(spec) || parseClassSpecifier(spec)) {
585
spec->setCvQualify(cv);
589
spec->setCv2Qualify(cv2);
591
InitDeclaratorListAST *declarators = 0;
592
parseInitDeclaratorList(declarators);
595
SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
596
ast->setStorageSpecifier(storageSpec);
597
ast->setTypeSpec(spec);
598
ast->setInitDeclaratorList(declarators);
599
UPDATE_POS(ast, start, tokenStream->cursor());
605
tokenStream->rewind(start);
606
return parseDeclarationInternal(node);
612
bool Parser::parseLinkageSpecification(DeclarationAST *&node)
614
int start = tokenStream->cursor();
616
if (tokenStream->lookAhead() != Token_extern) {
621
LinkageSpecificationAST *ast = CreateNode<LinkageSpecificationAST>(m_pool);
623
int startExternType = tokenStream->cursor();
624
if (tokenStream->lookAhead() == Token_string_literal) {
626
AST *externType = CreateNode<AST>(m_pool);
627
UPDATE_POS(externType, startExternType, tokenStream->cursor());
629
ast->setExternType(externType);
632
if (tokenStream->lookAhead() == '{') {
633
LinkageBodyAST *linkageBody = 0;
634
parseLinkageBody(linkageBody);
635
ast->setLinkageBody(linkageBody);
637
DeclarationAST *decl = 0;
638
if (!parseDeclaration(decl)) {
639
reportError(i18n("Declaration syntax error"));
641
ast->setDeclaration(decl);
644
UPDATE_POS(ast, start, tokenStream->cursor());
651
bool Parser::parseLinkageBody(LinkageBodyAST *&node)
654
int start = tokenStream->cursor();
656
if (tokenStream->lookAhead() != '{') {
661
LinkageBodyAST *lba = CreateNode<LinkageBodyAST>(m_pool);
664
while (tokenStream->lookAhead()) {
665
int tk = tokenStream->lookAhead();
670
DeclarationAST *def = 0;
671
int startDecl = tokenStream->cursor();
672
if (parseDeclaration(def)) {
673
node->addDeclaration(def);
676
if (startDecl == tokenStream->cursor())
677
advance(); // skip at least one token
678
skipUntilDeclaration();
682
if (tokenStream->lookAhead() != '}') {
683
reportError(i18n("} expected"));
687
UPDATE_POS(node, start, tokenStream->cursor());
691
bool Parser::parseNamespace(DeclarationAST *&node)
693
int start = tokenStream->cursor();
695
if (tokenStream->lookAhead() != Token_namespace) {
700
int startNamespaceName = tokenStream->cursor();
701
if (tokenStream->lookAhead() == Token_identifier) {
704
AST *namespaceName = CreateNode<AST>(m_pool);
705
UPDATE_POS(namespaceName, startNamespaceName, tokenStream->cursor());
707
if (tokenStream->lookAhead() == '=') {
712
if (parseName(name)) {
715
NamespaceAliasAST *ast = CreateNode<NamespaceAliasAST>(m_pool);
716
ast->setNamespaceName(namespaceName);
717
ast->setAliasName(name);
718
UPDATE_POS(ast, start, tokenStream->cursor());
722
reportError(i18n("namespace expected"));
725
} else if (tokenStream->lookAhead() != '{') {
726
reportError(i18n("{ expected"));
730
NamespaceAST *ast = CreateNode<NamespaceAST>(m_pool);
731
ast->setNamespaceName(namespaceName);
733
LinkageBodyAST *linkageBody = 0;
734
parseLinkageBody(linkageBody);
736
ast->setLinkageBody(linkageBody);
737
UPDATE_POS(ast, start, tokenStream->cursor());
743
bool Parser::parseUsing(DeclarationAST *&node)
745
int start = tokenStream->cursor();
747
if (tokenStream->lookAhead() != Token_using) {
752
if (tokenStream->lookAhead() == Token_namespace) {
753
if (!parseUsingDirective(node)) {
756
UPDATE_POS(node, start, tokenStream->cursor());
760
UsingAST *ast = CreateNode<UsingAST>(m_pool);
762
int startTypeName = tokenStream->cursor();
763
if (tokenStream->lookAhead() == Token_typename) {
765
AST *tn = CreateNode<AST>(m_pool);
766
UPDATE_POS(tn, startTypeName, tokenStream->cursor());
767
ast->setTypeName(tn);
771
if (!parseName(name))
778
UPDATE_POS(ast, start, tokenStream->cursor());
784
bool Parser::parseUsingDirective(DeclarationAST *&node)
786
int start = tokenStream->cursor();
788
if (tokenStream->lookAhead() != Token_namespace) {
794
if (!parseName(name)) {
795
reportError(i18n("Namespace name expected"));
801
UsingDirectiveAST *ast = CreateNode<UsingDirectiveAST>(m_pool);
803
UPDATE_POS(ast, start, tokenStream->cursor());
810
bool Parser::parseOperatorFunctionId(AST *&node)
812
int start = tokenStream->cursor();
814
if (tokenStream->lookAhead() != Token_operator) {
820
if (parseOperator(op)) {
821
AST *asn = CreateNode<AST>(m_pool);
823
UPDATE_POS(node, start, tokenStream->cursor());
826
// parse cast operator
830
TypeSpecifierAST *spec = 0;
831
if (!parseSimpleTypeSpecifier(spec)) {
835
spec->setCvQualify(cv);
839
spec->setCv2Qualify(cv2);
842
while (parsePtrOperator(ptrOp))
845
AST *asn = CreateNode<AST>(m_pool);
847
UPDATE_POS(node, start, tokenStream->cursor());
852
bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node, bool reportError)
854
int start = tokenStream->cursor();
856
TemplateArgumentListAST *ast = CreateNode<TemplateArgumentListAST>(m_pool);
859
if (!parseTemplateArgument(templArg))
861
ast->addArgument(templArg);
863
while (tokenStream->lookAhead() == ',') {
866
if (!parseTemplateArgument(templArg)) {
873
ast->addArgument(templArg);
876
UPDATE_POS(ast, start, tokenStream->cursor());
882
bool Parser::parseTypedef(DeclarationAST *&node)
884
int start = tokenStream->cursor();
886
if (tokenStream->lookAhead() != Token_typedef) {
891
TypeSpecifierAST *spec = 0;
892
if (!parseTypeSpecifierOrClassSpec(spec)) {
893
reportError(i18n("Need a type specifier to declare"));
897
InitDeclaratorListAST *declarators = 0;
898
if (!parseInitDeclaratorList(declarators)) {
899
//reportError(i18n("Need an identifier to declare"));
905
TypedefAST *ast = CreateNode<TypedefAST>(m_pool);
906
ast->setTypeSpec(spec);
907
ast->setInitDeclaratorList(declarators);
908
UPDATE_POS(ast, start, tokenStream->cursor());
914
bool Parser::parseAsmDefinition(DeclarationAST *&node)
916
int start = tokenStream->cursor();
918
ADVANCE(Token_asm, "asm");
927
DeclarationAST *ast = CreateNode<DeclarationAST>(m_pool);
928
UPDATE_POS(ast, start, tokenStream->cursor());
934
bool Parser::parseTemplateDeclaration(DeclarationAST *&node)
936
int start = tokenStream->cursor();
940
int startExport = tokenStream->cursor();
941
if (tokenStream->lookAhead() == Token_export) {
943
AST *n = CreateNode<AST>(m_pool);
944
UPDATE_POS(n, startExport, tokenStream->cursor());
948
if (tokenStream->lookAhead() != Token_template) {
953
TemplateParameterListAST *params = 0;
954
if (tokenStream->lookAhead() == '<') {
956
parseTemplateParameterList(params);
961
DeclarationAST *def = 0;
962
if (!parseDeclaration(def)) {
963
reportError(i18n("expected a declaration"));
966
TemplateDeclarationAST *ast = CreateNode<TemplateDeclarationAST>(m_pool);
967
ast->setExported(exp);
968
ast->setTemplateParameterList(params);
969
ast->setDeclaration(def);
970
UPDATE_POS(ast, start, tokenStream->cursor());
976
bool Parser::parseOperator(AST *&/*node*/)
978
QString text = tokenStream->currentTokenText();
980
switch(tokenStream->lookAhead()) {
984
if (tokenStream->lookAhead() == '[' && tokenStream->lookAhead(1) == ']') {
1021
if (tokenStream->lookAhead() == '(' && tokenStream->lookAhead(1) == ')') {
1025
} else if (tokenStream->lookAhead() == '[' && tokenStream->lookAhead(1) == ']') {
1035
bool Parser::parseCvQualify(AST *&node)
1037
int start = tokenStream->cursor();
1039
AST *ast = CreateNode<AST>(m_pool);
1042
while (tokenStream->lookAhead()) {
1043
int tk = tokenStream->lookAhead();
1044
if (tk == Token_const || tk == Token_volatile) {
1046
int startWord = tokenStream->cursor();
1048
AST *word = CreateNode<AST>(m_pool);
1049
UPDATE_POS(word, startWord, tokenStream->cursor());
1050
word->setParent(ast);
1059
UPDATE_POS(ast, start, tokenStream->cursor());
1065
bool Parser::parseSimpleTypeSpecifier(TypeSpecifierAST *&node, bool onlyIntegral)
1067
int start = tokenStream->cursor();
1068
bool isIntegral = false;
1072
switch(tokenStream->lookAhead()) {
1080
case Token_unsigned:
1093
TypeSpecifierAST *ast = CreateNode<TypeSpecifierAST>(m_pool);
1095
ClassOrNamespaceNameAST *cl = CreateNode<ClassOrNamespaceNameAST>(m_pool);
1097
AST *n = CreateNode<AST>(m_pool);
1098
UPDATE_POS(n, start, tokenStream->cursor());
1100
UPDATE_POS(cl, start, tokenStream->cursor());
1102
NameAST *name = CreateNode<NameAST>(m_pool);
1103
name->setUnqualifiedName(cl);
1104
UPDATE_POS(name, start, tokenStream->cursor());
1106
} else if (tokenStream->lookAhead() == Token___typeof) {
1108
if (tokenStream->lookAhead() == '(') {
1110
TypeIdAST *typeId = 0;
1111
parseTypeId(typeId);
1114
AbstractExpressionAST *e = 0;
1115
parseUnaryExpression(e);
1117
} else if (onlyIntegral) {
1118
tokenStream->rewind(start);
1122
if (!parseName(name)) {
1123
tokenStream->rewind(start);
1129
UPDATE_POS(ast, start, tokenStream->cursor());
1134
bool Parser::parsePtrOperator(AST *&node)
1136
int start = tokenStream->cursor();
1137
int tok = tokenStream->lookAhead();
1147
case Token_identifier:
1148
if (!parsePtrToMember(memPtr)) {
1149
tokenStream->rewind(start);
1161
AST *ast = CreateNode<AST>(m_pool);
1162
UPDATE_POS(ast, start, tokenStream->cursor());
1169
bool Parser::parseTemplateArgument(AST *&node)
1171
int start = tokenStream->cursor();
1173
TypeIdAST *typeId = 0;
1174
if (parseTypeId(typeId)) {
1175
if (tokenStream->lookAhead() == ',' || tokenStream->lookAhead() == '>') {
1181
tokenStream->rewind(start);
1182
AbstractExpressionAST *expr = 0;
1183
if (!parseLogicalOrExpression(expr, true)) {
1191
bool Parser::parseTypeSpecifier(TypeSpecifierAST *&spec)
1196
if (parseElaboratedTypeSpecifier(spec) || parseSimpleTypeSpecifier(spec)) {
1197
spec->setCvQualify(cv);
1200
parseCvQualify(cv2);
1201
spec->setCv2Qualify(cv2);
1209
bool Parser::parseDeclarator(DeclaratorAST *&node)
1211
int start = tokenStream->cursor();
1213
DeclaratorAST *ast = CreateNode<DeclaratorAST>(m_pool);
1215
DeclaratorAST *decl = 0;
1216
NameAST *declId = 0;
1219
while (parsePtrOperator(ptrOp)) {
1220
ast->addPtrOp(ptrOp);
1223
if (tokenStream->lookAhead() == '(') {
1226
if (!parseDeclarator(decl)) {
1229
ast->setSubDeclarator(decl);
1231
if (tokenStream->lookAhead() != ')') {
1236
if (tokenStream->lookAhead() == ':') {
1238
} else if (parseDeclaratorId(declId)) {
1239
ast->setDeclaratorId(declId);
1241
tokenStream->rewind(start);
1245
if (tokenStream->lookAhead() == ':') {
1247
AbstractExpressionAST *expr = 0;
1248
if (!parseConstantExpression(expr)) {
1249
reportError(i18n("Constant expression expected"));
1256
bool isVector = true;
1258
while (tokenStream->lookAhead() == '[') {
1259
int startArray = tokenStream->cursor();
1261
AbstractExpressionAST *expr = 0;
1262
parseCommaExpression(expr);
1265
AST *array = CreateNode<AST>(m_pool);
1266
UPDATE_POS(array, startArray, tokenStream->cursor());
1267
ast->addArrayDimension(array);
1271
bool skipParen = false;
1272
if (tokenStream->lookAhead() == Token_identifier
1273
&& tokenStream->lookAhead(1) == '('
1274
&& tokenStream->lookAhead(2) == '(') {
1280
int tok = tokenStream->lookAhead();
1281
if (ast->subDeclarator() && !(isVector || tok == '(' || tok == ',' || tok == ';' || tok == '=')) {
1282
tokenStream->rewind(start);
1286
int index = tokenStream->cursor();
1287
if (tokenStream->lookAhead() == '(') {
1290
ParameterDeclarationClauseAST *params = 0;
1291
if (!parseParameterDeclarationClause(params)) {
1292
tokenStream->rewind(index);
1295
ast->setParameterDeclarationClause(params);
1297
if (tokenStream->lookAhead() != ')') {
1298
tokenStream->rewind(index);
1302
advance(); // skip ')'
1305
parseCvQualify(constant);
1306
ast->setConstant(constant);
1309
if (parseExceptionSpecification(except)) {
1310
ast->setExceptionSpecification(except);
1315
if (tokenStream->lookAhead() != ')') {
1316
reportError(i18n("')' expected"));
1323
UPDATE_POS(ast, start, tokenStream->cursor());
1329
bool Parser::parseAbstractDeclarator(DeclaratorAST *&node)
1331
int start = tokenStream->cursor();
1333
DeclaratorAST *ast = CreateNode<DeclaratorAST>(m_pool);
1334
DeclaratorAST *decl = 0;
1337
while (parsePtrOperator(ptrOp)) {
1338
ast->addPtrOp(ptrOp);
1341
int index = tokenStream->cursor();
1342
if (tokenStream->lookAhead() == '(') {
1345
if (!parseAbstractDeclarator(decl)) {
1346
tokenStream->rewind(index);
1350
ast->setSubDeclarator(decl);
1352
if (tokenStream->lookAhead() != ')'){
1353
tokenStream->rewind(start);
1357
} else if (tokenStream->lookAhead() == ':') {
1359
AbstractExpressionAST *expr = 0;
1360
if (!parseConstantExpression(expr)) {
1361
reportError(i18n("Constant expression expected"));
1368
bool isVector = true;
1370
while (tokenStream->lookAhead() == '[') {
1371
int startArray = tokenStream->cursor();
1373
AbstractExpressionAST *expr = 0;
1374
parseCommaExpression(expr);
1377
AST *array = CreateNode<AST>(m_pool);
1378
UPDATE_POS(array, startArray, tokenStream->cursor());
1379
ast->addArrayDimension(array);
1383
int tok = tokenStream->lookAhead();
1384
if (ast->subDeclarator() && !(isVector || tok == '(' || tok == ',' || tok == ';' || tok == '=')) {
1385
tokenStream->rewind(start);
1389
int index = tokenStream->cursor();
1390
if (tokenStream->lookAhead() == '(') {
1393
ParameterDeclarationClauseAST *params = 0;
1394
if (!parseParameterDeclarationClause(params)) {
1395
tokenStream->rewind(index);
1398
ast->setParameterDeclarationClause(params);
1400
if (tokenStream->lookAhead() != ')') {
1401
tokenStream->rewind(index);
1405
advance(); // skip ')'
1408
parseCvQualify(constant);
1409
ast->setConstant(constant);
1412
if (parseExceptionSpecification(except)) {
1413
ast->setExceptionSpecification(except);
1419
if (tokenStream->cursor() == start)
1422
UPDATE_POS(ast, start, tokenStream->cursor());
1428
bool Parser::parseEnumSpecifier(TypeSpecifierAST *&node)
1430
int start = tokenStream->cursor();
1432
if (tokenStream->lookAhead() != Token_enum) {
1441
if (tokenStream->lookAhead() != '{') {
1442
tokenStream->rewind(start);
1447
EnumSpecifierAST *ast = CreateNode<EnumSpecifierAST>(m_pool);
1450
EnumeratorAST *enumerator = 0;
1451
if (parseEnumerator(enumerator)) {
1452
ast->addEnumerator(enumerator);
1454
while (tokenStream->lookAhead() == ',') {
1457
if (!parseEnumerator(enumerator)) {
1458
//reportError(i18n("Enumerator expected"));
1462
ast->addEnumerator(enumerator);
1466
if (tokenStream->lookAhead() != '}')
1467
reportError(i18n("} missing"));
1471
UPDATE_POS(ast, start, tokenStream->cursor());
1477
bool Parser::parseTemplateParameterList(TemplateParameterListAST *&node)
1479
int start = tokenStream->cursor();
1481
TemplateParameterListAST *ast = CreateNode<TemplateParameterListAST>(m_pool);
1483
TemplateParameterAST *param = 0;
1484
if (!parseTemplateParameter(param)) {
1487
ast->addTemplateParameter(param);
1489
while (tokenStream->lookAhead() == ',') {
1492
if (!parseTemplateParameter(param)) {
1496
ast->addTemplateParameter(param);
1500
UPDATE_POS(ast, start, tokenStream->cursor());
1506
bool Parser::parseTemplateParameter(TemplateParameterAST *&node)
1508
int start = tokenStream->cursor();
1509
TemplateParameterAST *ast = CreateNode<TemplateParameterAST>(m_pool);
1511
TypeParameterAST *typeParameter = 0;
1512
ParameterDeclarationAST *param = 0;
1514
int tk = tokenStream->lookAhead();
1516
if ((tk == Token_class || tk == Token_typename || tk == Token_template) && parseTypeParameter(typeParameter)) {
1517
ast->setTypeParameter(typeParameter);
1521
if (!parseParameterDeclaration(param))
1523
ast->setTypeValueParameter(param);
1526
UPDATE_POS(ast, start, tokenStream->cursor());
1532
bool Parser::parseTypeParameter(TypeParameterAST *&node)
1534
int start = tokenStream->cursor();
1535
TypeParameterAST *ast = CreateNode<TypeParameterAST>(m_pool);
1537
AST_FROM_TOKEN(kind, tokenStream->cursor());
1540
switch(tokenStream->lookAhead()) {
1543
case Token_typename:
1545
advance(); // skip class
1547
// parse optional name
1549
if(parseName(name)){
1552
if (tokenStream->lookAhead() == '='){
1555
TypeIdAST *typeId = 0;
1556
if(!parseTypeId(typeId)){
1558
tokenStream->rewind(start);
1561
ast->setTypeId(typeId);
1562
} else if (!(tokenStream->lookAhead() == ',' || tokenStream->lookAhead() == '>')) {
1563
tokenStream->rewind(start);
1570
case Token_template:
1572
advance(); // skip template
1575
TemplateParameterListAST *params = 0;
1576
if (!parseTemplateParameterList(params)) {
1579
ast->setTemplateParameterList(params);
1583
if (tokenStream->lookAhead() == Token_class)
1586
// parse optional name
1588
if (parseName(name)) {
1590
if (tokenStream->lookAhead() == '=') {
1593
TypeIdAST *typeId = 0;
1594
if (!parseTypeId(typeId)) {
1598
ast->setTypeId(typeId);
1602
if (tokenStream->lookAhead() == '=') {
1605
NameAST *templ_name = 0;
1606
parseName(templ_name);
1617
UPDATE_POS(ast, start, tokenStream->cursor());
1622
bool Parser::parseStorageClassSpecifier(AST *&node)
1624
int start = tokenStream->cursor();
1625
AST *ast = CreateNode<AST>(m_pool);
1627
while (tokenStream->lookAhead()) {
1628
int tk = tokenStream->lookAhead();
1629
if (tk == Token_friend || tk == Token_auto || tk == Token_register || tk == Token_static ||
1630
tk == Token_extern || tk == Token_mutable) {
1631
int startNode = tokenStream->cursor();
1634
AST *n = CreateNode<AST>(m_pool);
1635
UPDATE_POS(n, startNode, tokenStream->cursor());
1641
if (length(ast->children()) == 0)
1644
UPDATE_POS(ast, start, tokenStream->cursor());
1649
bool Parser::parseFunctionSpecifier(AST *&node)
1651
int start = tokenStream->cursor();
1652
AST *ast = CreateNode<AST>(m_pool);
1654
while (tokenStream->lookAhead()) {
1655
int tk = tokenStream->lookAhead();
1656
if (tk == Token_inline || tk == Token_virtual || tk == Token_explicit) {
1657
int startNode = tokenStream->cursor();
1660
AST *n = CreateNode<AST>(m_pool);
1661
UPDATE_POS(n, startNode, tokenStream->cursor());
1668
if (length(ast->children()) == 0)
1671
UPDATE_POS(ast, start, tokenStream->cursor());
1676
bool Parser::parseTypeId(TypeIdAST *&node)
1678
/// @todo implement the AST for typeId
1679
int start = tokenStream->cursor();
1681
TypeSpecifierAST *spec = 0;
1682
if (!parseTypeSpecifier(spec)) {
1683
tokenStream->rewind(start);
1687
DeclaratorAST *decl = 0;
1688
parseAbstractDeclarator(decl);
1690
TypeIdAST *ast = CreateNode<TypeIdAST>(m_pool);
1691
ast->setTypeSpecifier(spec);
1692
ast->setDeclarator(decl);
1694
UPDATE_POS(ast, start, tokenStream->cursor());
1700
bool Parser::parseInitDeclaratorList(InitDeclaratorListAST *&node)
1702
int start = tokenStream->cursor();
1704
InitDeclaratorListAST *ast = CreateNode<InitDeclaratorListAST>(m_pool);
1705
InitDeclaratorAST *decl = 0;
1707
if (!parseInitDeclarator(decl)) {
1710
ast->addInitDeclarator(decl);
1712
while (tokenStream->lookAhead() == ',') {
1715
if (!parseInitDeclarator(decl)) {
1719
ast->addInitDeclarator(decl);
1722
UPDATE_POS(ast, start, tokenStream->cursor());
1728
bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node)
1730
int start = tokenStream->cursor();
1732
ParameterDeclarationClauseAST *ast = CreateNode<ParameterDeclarationClauseAST>(m_pool);
1734
ParameterDeclarationListAST *params = 0;
1735
if (!parseParameterDeclarationList(params)) {
1737
if (tokenStream->lookAhead() == ')')
1740
if (tokenStream->lookAhead() == Token_ellipsis && tokenStream->lookAhead(1) == ')') {
1741
AST_FROM_TOKEN(ellipsis, tokenStream->cursor());
1742
ast->setEllipsis(ellipsis);
1749
if (tokenStream->lookAhead() == Token_ellipsis) {
1750
AST_FROM_TOKEN(ellipsis, tokenStream->cursor());
1751
ast->setEllipsis(ellipsis);
1756
ast->setParameterDeclarationList(params);
1758
/// @todo add ellipsis
1759
UPDATE_POS(ast, start, tokenStream->cursor());
1765
bool Parser::parseParameterDeclarationList(ParameterDeclarationListAST *&node)
1767
int start = tokenStream->cursor();
1769
ParameterDeclarationListAST *ast = CreateNode<ParameterDeclarationListAST>(m_pool);
1771
ParameterDeclarationAST *param = 0;
1772
if (!parseParameterDeclaration(param)) {
1773
tokenStream->rewind(start);
1776
ast->addParameter(param);
1778
while (tokenStream->lookAhead() == ',') {
1781
if (tokenStream->lookAhead() == Token_ellipsis)
1784
if (!parseParameterDeclaration(param)) {
1785
tokenStream->rewind(start);
1788
ast->addParameter(param);
1791
UPDATE_POS(ast, start, tokenStream->cursor());
1797
bool Parser::parseParameterDeclaration(ParameterDeclarationAST *&node)
1799
int start = tokenStream->cursor();
1802
parseStorageClassSpecifier(storage);
1805
TypeSpecifierAST *spec = 0;
1806
if (!parseTypeSpecifier(spec)) {
1807
tokenStream->rewind(start);
1811
int index = tokenStream->cursor();
1813
DeclaratorAST *decl = 0;
1814
if (!parseDeclarator(decl)) {
1815
tokenStream->rewind(index);
1817
// try with abstract declarator
1818
parseAbstractDeclarator(decl);
1821
AbstractExpressionAST *expr = 0;
1822
if (tokenStream->lookAhead() == '=') {
1824
if (!parseLogicalOrExpression(expr,true)) {
1825
//reportError(i18n("Expression expected"));
1829
ParameterDeclarationAST *ast = CreateNode<ParameterDeclarationAST>(m_pool);
1830
ast->setTypeSpec(spec);
1831
ast->setDeclarator(decl);
1832
ast->setExpression(expr);
1834
UPDATE_POS(ast, start, tokenStream->cursor());
1840
bool Parser::parseClassSpecifier(TypeSpecifierAST *&node)
1842
int start = tokenStream->cursor();
1845
int classKeyStart = tokenStream->cursor();
1847
int kind = tokenStream->lookAhead();
1848
if (kind == Token_class || kind == Token_struct || kind == Token_union) {
1849
AST *asn = CreateNode<AST>(m_pool);
1852
UPDATE_POS(classKey, classKeyStart, tokenStream->cursor());
1857
AST *winDeclSpec = 0;
1858
parseWinDeclSpec(winDeclSpec);
1860
while (tokenStream->lookAhead() == Token_identifier && tokenStream->lookAhead(1) == Token_identifier)
1866
BaseClauseAST *bases = 0;
1867
if (tokenStream->lookAhead() == ':') {
1868
if (!parseBaseClause(bases)) {
1873
if (tokenStream->lookAhead() != '{') {
1874
tokenStream->rewind(start);
1880
ClassSpecifierAST *ast = CreateNode<ClassSpecifierAST>(m_pool);
1881
ast->setWinDeclSpec(winDeclSpec);
1882
ast->setClassKey(classKey);
1884
ast->setBaseClause(bases);
1886
while (tokenStream->lookAhead()) {
1887
if (tokenStream->lookAhead() == '}')
1890
DeclarationAST *memSpec = 0;
1891
int startDecl = tokenStream->cursor();
1892
if (!parseMemberSpecification(memSpec)) {
1893
if (startDecl == tokenStream->cursor())
1894
advance(); // skip at least one token
1895
skipUntilDeclaration();
1897
ast->addDeclaration(memSpec);
1900
if (tokenStream->lookAhead() != '}') {
1901
reportError(i18n("} missing"));
1905
UPDATE_POS(ast, start, tokenStream->cursor());
1911
bool Parser::parseAccessSpecifier(AST *&node)
1913
int start = tokenStream->cursor();
1915
switch(tokenStream->lookAhead()) {
1917
case Token_protected:
1918
case Token_private: {
1919
AST *asn = CreateNode<AST>(m_pool);
1922
UPDATE_POS(node, start, tokenStream->cursor());
1930
bool Parser::parseMemberSpecification(DeclarationAST *&node)
1932
int start = tokenStream->cursor();
1936
if (tokenStream->lookAhead() == ';') {
1939
} else if (tokenStream->lookAhead() == Token_Q_OBJECT || tokenStream->lookAhead() == Token_K_DCOP) {
1942
} else if (tokenStream->lookAhead() == Token_signals
1943
|| tokenStream->lookAhead() == Token_k_dcop
1944
|| tokenStream->lookAhead() == Token_k_dcop_signals) {
1945
AccessDeclarationAST *ast = CreateNode<AccessDeclarationAST>(m_pool);
1947
AST *n = CreateNode<AST>(m_pool);
1948
UPDATE_POS(n, start, tokenStream->cursor());
1951
UPDATE_POS(ast, start, tokenStream->cursor());
1954
} else if (parseTypedef(node)) {
1956
} else if (parseUsing(node)) {
1958
} else if (parseTemplateDeclaration(node)) {
1960
} else if (parseAccessSpecifier(access)) {
1961
AccessDeclarationAST *ast = CreateNode<AccessDeclarationAST>(m_pool);
1962
ast->addAccess(access);
1964
int startSlot = tokenStream->cursor();
1965
if (tokenStream->lookAhead() == Token_slots) {
1967
AST *sl = CreateNode<AST>(m_pool);
1968
UPDATE_POS(sl, startSlot, tokenStream->cursor());
1972
UPDATE_POS(ast, start, tokenStream->cursor());
1977
tokenStream->rewind(start);
1979
AST *storageSpec = 0;
1980
parseStorageClassSpecifier(storageSpec);
1985
TypeSpecifierAST *spec = 0;
1986
if (parseEnumSpecifier(spec) || parseClassSpecifier(spec)) {
1987
spec->setCvQualify(cv);
1990
parseCvQualify(cv2);
1991
spec->setCv2Qualify(cv2);
1993
InitDeclaratorListAST *declarators = 0;
1994
parseInitDeclaratorList(declarators);
1997
SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
1998
ast->setTypeSpec(spec);
1999
ast->setInitDeclaratorList(declarators);
2000
UPDATE_POS(ast, start, tokenStream->cursor());
2006
tokenStream->rewind(start);
2007
return parseDeclarationInternal(node);
2010
bool Parser::parseCtorInitializer(AST *&/*node*/)
2012
if (tokenStream->lookAhead() != ':') {
2018
if (!parseMemInitializerList(inits)) {
2019
reportError(i18n("Member initializers expected"));
2025
bool Parser::parseElaboratedTypeSpecifier(TypeSpecifierAST *&node)
2027
int start = tokenStream->cursor();
2029
int tk = tokenStream->lookAhead();
2030
if (tk == Token_class ||
2031
tk == Token_struct ||
2032
tk == Token_union ||
2034
tk == Token_typename)
2036
AST *kind = CreateNode<AST>(m_pool);
2038
UPDATE_POS(kind, start, tokenStream->cursor());
2042
if (parseName(name)) {
2043
ElaboratedTypeSpecifierAST *ast = CreateNode<ElaboratedTypeSpecifierAST>(m_pool);
2046
UPDATE_POS(ast, start, tokenStream->cursor());
2053
tokenStream->rewind(start);
2057
bool Parser::parseDeclaratorId(NameAST *&node)
2059
return parseName(node);
2062
bool Parser::parseExceptionSpecification(AST *&node)
2064
if (tokenStream->lookAhead() != Token_throw) {
2070
if (tokenStream->lookAhead() == Token_ellipsis) {
2071
// extension found in MSVC++ 7.x headers
2072
int start = tokenStream->cursor();
2073
AST *ast = CreateNode<AST>(m_pool);
2074
AST_FROM_TOKEN(ellipsis, tokenStream->cursor());
2075
ellipsis->setParent(ast);
2077
UPDATE_POS(ast, start, tokenStream->cursor());
2080
parseTypeIdList(node);
2087
bool Parser::parseEnumerator(EnumeratorAST *&node)
2089
int start = tokenStream->cursor();
2091
if (tokenStream->lookAhead() != Token_identifier) {
2096
EnumeratorAST *ena = CreateNode<EnumeratorAST>(m_pool);
2099
AST *id = CreateNode<AST>(m_pool);
2100
UPDATE_POS(id, start, tokenStream->cursor());
2103
if (tokenStream->lookAhead() == '=') {
2106
AbstractExpressionAST *expr = 0;
2107
if (!parseConstantExpression(expr)) {
2108
reportError(i18n("Constant expression expected"));
2110
node->setExpression(expr);
2113
UPDATE_POS(node, start, tokenStream->cursor());
2118
bool Parser::parseInitDeclarator(InitDeclaratorAST *&node)
2120
int start = tokenStream->cursor();
2122
DeclaratorAST *decl = 0;
2124
if (!parseDeclarator(decl)) {
2128
parseInitializer(init);
2130
InitDeclaratorAST *ast = CreateNode<InitDeclaratorAST>(m_pool);
2131
ast->setDeclarator(decl);
2132
ast->setInitializer(init);
2133
UPDATE_POS(ast, start, tokenStream->cursor());
2141
bool Parser::parseBaseClause(BaseClauseAST *&node)
2143
int start = tokenStream->cursor();
2144
if (tokenStream->lookAhead() != ':') {
2149
BaseClauseAST *bca = CreateNode<BaseClauseAST>(m_pool);
2151
BaseSpecifierAST *baseSpec = 0;
2152
if (parseBaseSpecifier(baseSpec)) {
2153
bca->addBaseSpecifier(baseSpec);
2155
while (tokenStream->lookAhead() == ',') {
2158
if (!parseBaseSpecifier(baseSpec)) {
2159
reportError(i18n("Base class specifier expected"));
2162
bca->addBaseSpecifier(baseSpec);
2167
UPDATE_POS(bca, start, tokenStream->cursor());
2173
bool Parser::parseInitializer(AST *&node)
2175
if (tokenStream->lookAhead() == '=') {
2178
if (!parseInitializerClause(node)) {
2179
reportError(i18n("Initializer clause expected"));
2183
} else if (tokenStream->lookAhead() == '(') {
2185
AbstractExpressionAST *expr = 0;
2186
skipCommaExpression(expr);
2195
bool Parser::parseMemInitializerList(AST *&/*node*/)
2198
if (!parseMemInitializer(init)) {
2202
while (tokenStream->lookAhead() == ',') {
2205
if (!parseMemInitializer(init)) {
2213
bool Parser::parseMemInitializer(AST *&/*node*/)
2215
NameAST *initId = 0;
2216
if (!parseMemInitializerId(initId)) {
2217
reportError(i18n("Identifier expected"));
2221
AbstractExpressionAST *expr = 0;
2222
skipCommaExpression(expr);
2228
bool Parser::parseTypeIdList(AST *&node)
2231
int start = tokenStream->cursor();
2233
TypeIdAST *typeId = 0;
2234
if (!parseTypeId(typeId)) {
2238
AST *ast = CreateNode<AST>(m_pool);
2239
typeId->setParent(ast);
2241
while (tokenStream->lookAhead() == ',') {
2243
if (parseTypeId(typeId)) {
2244
typeId->setParent(ast);
2246
reportError(i18n("Type id expected"));
2251
UPDATE_POS(ast, start, tokenStream->cursor());
2256
bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node)
2258
int start = tokenStream->cursor();
2259
BaseSpecifierAST *ast = CreateNode<BaseSpecifierAST>(m_pool);
2262
if (tokenStream->lookAhead() == Token_virtual) {
2263
AST_FROM_TOKEN(virt, tokenStream->cursor());
2264
ast->setIsVirtual(virt);
2268
parseAccessSpecifier(access);
2270
parseAccessSpecifier(access);
2272
if (tokenStream->lookAhead() == Token_virtual) {
2273
AST_FROM_TOKEN(virt, tokenStream->cursor());
2274
ast->setIsVirtual(virt);
2280
if (!parseName(name)) {
2281
reportError(i18n("Class name expected"));
2284
ast->setAccess(access);
2286
UPDATE_POS(ast, start, tokenStream->cursor());
2293
bool Parser::parseInitializerClause(AST *&node)
2295
if (tokenStream->lookAhead() == '{') {
2296
if (!skip('{','}')) {
2297
reportError(i18n("} missing"));
2301
AbstractExpressionAST *expr = 0;
2302
if (!parseAssignmentExpression(expr)) {
2303
//reportError(i18n("Expression expected"));
2311
bool Parser::parseMemInitializerId(NameAST *&node)
2314
return parseName(node);
2317
bool Parser::parsePtrToMember(AST *&/*node*/) /// ### create the AST node
2319
int start = tokenStream->cursor();
2321
if (tokenStream->lookAhead() == Token_scope)
2324
ClassOrNamespaceNameAST *name = 0;
2325
while (tokenStream->lookAhead() == Token_identifier) {
2327
if (!parseUnqualifiedName(name))
2330
if (tokenStream->lookAhead() == Token_scope
2331
&& tokenStream->lookAhead(1) == '*') {
2337
if (tokenStream->lookAhead() == Token_scope)
2341
tokenStream->rewind(start);
2345
bool Parser::parseUnqualifiedName(ClassOrNamespaceNameAST *&node, bool parseTemplateId)
2347
int start = tokenStream->cursor();
2348
bool isDestructor = false;
2350
ClassOrNamespaceNameAST *ast = CreateNode<ClassOrNamespaceNameAST>(m_pool);
2352
if (tokenStream->lookAhead() == Token_identifier) {
2353
int startName = tokenStream->cursor();
2354
AST *n = CreateNode<AST>(m_pool);
2356
UPDATE_POS(n, startName, tokenStream->cursor());
2358
} else if (tokenStream->lookAhead() == '~' && tokenStream->lookAhead(1) == Token_identifier) {
2359
int startName = tokenStream->cursor();
2360
AST *n = CreateNode<AST>(m_pool);
2361
advance(); // skip ~
2362
advance(); // skip classname
2363
UPDATE_POS(n, startName, tokenStream->cursor());
2365
isDestructor = true;
2366
} else if (tokenStream->lookAhead() == Token_operator) {
2368
if (!parseOperatorFunctionId(n))
2375
if (parseTemplateId && !isDestructor) {
2377
int index = tokenStream->cursor();
2379
if (tokenStream->lookAhead() == '<') {
2382
// optional template arguments
2383
TemplateArgumentListAST *args = 0;
2384
parseTemplateArgumentList(args);
2386
if (tokenStream->lookAhead() != '>') {
2387
tokenStream->rewind(index);
2390
ast->setTemplateArgumentList(args);
2395
UPDATE_POS(ast, start, tokenStream->cursor());
2401
bool Parser::parseStringLiteral(AST *&node)
2403
int start = tokenStream->cursor();
2405
while (tokenStream->lookAhead()) {
2406
if (tokenStream->lookAhead() == Token_identifier &&
2407
tokenStream->currentTokenText() == "L" && tokenStream->lookAhead(1) == Token_string_literal) {
2411
} else if (tokenStream->lookAhead() == Token_string_literal) {
2417
AST *ast = CreateNode<AST>(m_pool);
2418
UPDATE_POS(ast, start, tokenStream->cursor());
2423
bool Parser::skipExpressionStatement(StatementAST *&node)
2425
int start = tokenStream->cursor();
2427
AbstractExpressionAST *expr = 0;
2428
skipCommaExpression(expr);
2432
ExpressionStatementAST *ast = CreateNode<ExpressionStatementAST>(m_pool);
2433
ast->setExpression(expr);
2434
UPDATE_POS(ast, start, tokenStream->cursor());
2440
bool Parser::parseStatement(StatementAST *&node)
2442
int start = tokenStream->cursor();
2444
switch(tokenStream->lookAhead()) {
2447
return parseWhileStatement(node);
2450
return parseDoStatement(node);
2453
return parseForStatement(node);
2456
return parseIfStatement(node);
2459
return parseSwitchStatement(node);
2462
return parseTryBlockStatement(node);
2466
return parseLabeledStatement(node);
2469
case Token_continue:
2476
ADVANCE(Token_identifier, "identifier");
2483
AbstractExpressionAST *expr = 0;
2484
skipCommaExpression(expr);
2488
ReturnStatementAST *ast = CreateNode<ReturnStatementAST>(m_pool);
2489
ast->setExpression(expr);
2490
UPDATE_POS(ast, start, tokenStream->cursor());
2496
return parseCompoundStatement(node);
2498
case Token_identifier:
2499
if (parseLabeledStatement(node))
2504
if (parseDeclarationStatement(node))
2507
return skipExpressionStatement(node);
2510
bool Parser::parseCondition(ConditionAST *&node)
2512
int start = tokenStream->cursor();
2514
ConditionAST *ast = CreateNode<ConditionAST>(m_pool);
2515
TypeSpecifierAST *spec = 0;
2517
if (parseTypeSpecifier(spec)) {
2518
DeclaratorAST *decl = 0;
2519
if (parseDeclarator(decl) && tokenStream->lookAhead() == '=') {
2522
AbstractExpressionAST *expr = 0;
2523
if (parseExpression(expr)) {
2524
ast->setTypeSpec(spec);
2525
ast->setDeclarator(decl);
2526
ast->setExpression(expr);
2528
UPDATE_POS(ast, start, tokenStream->cursor());
2536
tokenStream->rewind(start);
2538
AbstractExpressionAST *expr = 0;
2539
if (!skipCommaExpression(expr)) {
2543
ast->setExpression(expr);
2544
UPDATE_POS(ast, start, tokenStream->cursor());
2550
bool Parser::parseWhileStatement(StatementAST *&node)
2552
int start = tokenStream->cursor();
2554
ADVANCE(Token_while, "while");
2557
ConditionAST *cond = 0;
2558
if (!parseCondition(cond)) {
2559
reportError(i18n("condition expected"));
2564
StatementAST *body = 0;
2565
if (!parseStatement(body)) {
2566
reportError(i18n("statement expected"));
2570
WhileStatementAST *ast = CreateNode<WhileStatementAST>(m_pool);
2571
ast->setCondition(cond);
2572
ast->setStatement(body);
2573
UPDATE_POS(ast, start, tokenStream->cursor());
2579
bool Parser::parseDoStatement(StatementAST *&node)
2581
int start = tokenStream->cursor();
2583
ADVANCE(Token_do, "do");
2585
StatementAST *body = 0;
2586
if (!parseStatement(body)) {
2587
reportError(i18n("statement expected"));
2591
ADVANCE_NR(Token_while, "while");
2592
ADVANCE_NR('(' , "(");
2594
AbstractExpressionAST *expr = 0;
2595
if (!skipCommaExpression(expr)) {
2596
reportError(i18n("expression expected"));
2600
ADVANCE_NR(')', ")");
2601
ADVANCE_NR(';', ";");
2603
DoStatementAST *ast = CreateNode<DoStatementAST>(m_pool);
2604
ast->setStatement(body);
2605
//ast->setCondition(condition);
2606
UPDATE_POS(ast, start, tokenStream->cursor());
2612
bool Parser::parseForStatement(StatementAST *&node)
2614
int start = tokenStream->cursor();
2616
ADVANCE(Token_for, "for");
2619
StatementAST *init = 0;
2620
if (!parseForInitStatement(init)) {
2621
reportError(i18n("for initialization expected"));
2625
ConditionAST *cond = 0;
2626
parseCondition(cond);
2629
AbstractExpressionAST *expr = 0;
2630
skipCommaExpression(expr);
2633
StatementAST *body = 0;
2634
if (!parseStatement(body))
2637
ForStatementAST *ast = CreateNode<ForStatementAST>(m_pool);
2638
ast->setInitStatement(init);
2639
ast->setCondition(cond);
2640
// ast->setExpression(expression);
2641
ast->setStatement(body);
2642
UPDATE_POS(ast, start, tokenStream->cursor());
2648
bool Parser::parseForInitStatement(StatementAST *&node)
2650
if (parseDeclarationStatement(node))
2653
return skipExpressionStatement(node);
2656
bool Parser::parseCompoundStatement(StatementAST *&node)
2658
int start = tokenStream->cursor();
2660
if (tokenStream->lookAhead() != '{') {
2665
StatementListAST *ast = CreateNode<StatementListAST>(m_pool);
2667
while (tokenStream->lookAhead()) {
2668
if (tokenStream->lookAhead() == '}')
2671
StatementAST *stmt = 0;
2672
int startStmt = tokenStream->cursor();
2673
if (!parseStatement(stmt)) {
2674
if (startStmt == tokenStream->cursor())
2676
skipUntilStatement();
2678
ast->addStatement(stmt);
2682
if (tokenStream->lookAhead() != '}') {
2683
reportError(i18n("} expected"));
2688
UPDATE_POS(ast, start, tokenStream->cursor());
2694
bool Parser::parseIfStatement(StatementAST *&node)
2696
int start = tokenStream->cursor();
2698
ADVANCE(Token_if, "if");
2702
IfStatementAST *ast = CreateNode<IfStatementAST>(m_pool);
2704
ConditionAST *cond = 0;
2705
if (!parseCondition(cond)) {
2706
reportError(i18n("condition expected"));
2711
StatementAST *stmt = 0;
2712
if (!parseStatement(stmt)) {
2713
reportError(i18n("statement expected"));
2717
ast->setCondition(cond);
2718
ast->setStatement(stmt);
2720
if (tokenStream->lookAhead() == Token_else) {
2722
StatementAST *elseStmt = 0;
2723
if (!parseStatement(elseStmt)) {
2724
reportError(i18n("statement expected"));
2727
ast->setElseStatement(elseStmt);
2730
UPDATE_POS(ast, start, tokenStream->cursor());
2736
bool Parser::parseSwitchStatement(StatementAST *&node)
2738
int start = tokenStream->cursor();
2739
ADVANCE(Token_switch, "switch");
2743
ConditionAST *cond = 0;
2744
if (!parseCondition(cond)) {
2745
reportError(i18n("condition expected"));
2750
StatementAST *stmt = 0;
2751
if (!parseCompoundStatement(stmt)) {
2756
SwitchStatementAST *ast = CreateNode<SwitchStatementAST>(m_pool);
2757
ast->setCondition(cond);
2758
ast->setStatement(stmt);
2759
UPDATE_POS(ast, start, tokenStream->cursor());
2765
bool Parser::parseLabeledStatement(StatementAST *&node)
2767
switch(tokenStream->lookAhead()) {
2768
case Token_identifier:
2770
if (tokenStream->lookAhead(1) == ':') {
2774
StatementAST *stmt = 0;
2775
if (parseStatement(stmt)) {
2785
AbstractExpressionAST *expr = 0;
2786
if (!parseConstantExpression(expr)) {
2787
reportError(i18n("expression expected"));
2788
} else if (tokenStream->lookAhead() == Token_ellipsis) {
2791
AbstractExpressionAST *expr2 = 0;
2792
if (!parseConstantExpression(expr2)) {
2793
reportError(i18n("expression expected"));
2798
StatementAST *stmt = 0;
2799
if (parseStatement(stmt)) {
2811
bool Parser::parseBlockDeclaration(DeclarationAST *&node)
2813
switch(tokenStream->lookAhead()) {
2815
return parseTypedef(node);
2817
return parseUsing(node);
2819
return parseAsmDefinition(node);
2820
case Token_namespace:
2821
return parseNamespaceAliasDefinition(node);
2824
int start = tokenStream->cursor();
2826
AST *storageSpec = 0;
2827
parseStorageClassSpecifier(storageSpec);
2832
TypeSpecifierAST *spec = 0;
2833
if (!parseTypeSpecifierOrClassSpec(spec)) { // replace with simpleTypeSpecifier?!?!
2834
tokenStream->rewind(start);
2837
spec->setCvQualify(cv);
2840
parseCvQualify(cv2);
2841
spec->setCv2Qualify(cv2);
2843
InitDeclaratorListAST *declarators = 0;
2844
parseInitDeclaratorList(declarators);
2846
if (tokenStream->lookAhead() != ';') {
2847
tokenStream->rewind(start);
2852
SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
2853
ast->setTypeSpec(spec);
2854
ast->setInitDeclaratorList(declarators);
2855
UPDATE_POS(ast, start, tokenStream->cursor());
2861
bool Parser::parseNamespaceAliasDefinition(DeclarationAST *&/*node*/)
2863
if (tokenStream->lookAhead() != Token_namespace) {
2868
ADVANCE(Token_identifier, "identifier");
2872
if (!parseName(name)) {
2873
reportError(i18n("Namespace name expected"));
2882
bool Parser::parseDeclarationStatement(StatementAST *&node)
2884
int start = tokenStream->cursor();
2886
DeclarationAST *decl = 0;
2887
if (!parseBlockDeclaration(decl))
2890
DeclarationStatementAST *ast = CreateNode<DeclarationStatementAST>(m_pool);
2891
ast->setDeclaration(decl);
2892
UPDATE_POS(ast, start, tokenStream->cursor());
2898
bool Parser::parseDeclarationInternal(DeclarationAST *&node)
2900
int start = tokenStream->cursor();
2902
// that is for the case '__declspec(dllexport) int ...' or
2903
// '__declspec(dllexport) inline int ...', etc.
2904
AST *winDeclSpec = 0;
2905
parseWinDeclSpec(winDeclSpec);
2908
bool hasFunSpec = parseFunctionSpecifier(funSpec);
2910
AST *storageSpec = 0;
2911
bool hasStorageSpec = parseStorageClassSpecifier(storageSpec);
2913
if (hasStorageSpec && !hasFunSpec)
2914
hasFunSpec = parseFunctionSpecifier(funSpec);
2916
// that is for the case 'friend __declspec(dllexport) ....'
2917
AST *winDeclSpec2 = 0;
2918
parseWinDeclSpec(winDeclSpec2);
2923
int index = tokenStream->cursor();
2925
if (parseName(name) && tokenStream->lookAhead() == '(') {
2926
// no type specifier, maybe a constructor or a cast operator??
2928
tokenStream->rewind(index);
2930
InitDeclaratorAST *declarator = 0;
2931
if (parseInitDeclarator(declarator)) {
2932
switch(tokenStream->lookAhead()) {
2937
InitDeclaratorListAST *declarators = CreateNode<InitDeclaratorListAST>(m_pool);
2939
// update declarators position
2941
declarators->setPosition(declarator->startToken(), declarator->endToken());
2942
declarators->addInitDeclarator(declarator);
2944
SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
2945
ast->setInitDeclaratorList(declarators);
2947
UPDATE_POS(node, start, tokenStream->cursor());
2956
StatementListAST *funBody = 0;
2957
if (parseCtorInitializer(ctorInit) && parseFunctionBody(funBody)) {
2958
FunctionDefinitionAST *ast = CreateNode<FunctionDefinitionAST>(m_pool);
2959
ast->setStorageSpecifier(storageSpec);
2960
ast->setFunctionSpecifier(funSpec);
2961
ast->setInitDeclarator(declarator);
2962
ast->setFunctionBody(funBody);
2964
UPDATE_POS(node, start, tokenStream->cursor());
2972
StatementListAST *funBody = 0;
2973
if (parseFunctionBody(funBody)) {
2974
FunctionDefinitionAST *ast = CreateNode<FunctionDefinitionAST>(m_pool);
2975
ast->setStorageSpecifier(storageSpec);
2976
ast->setFunctionSpecifier(funSpec);
2977
ast->setInitDeclarator(declarator);
2978
ast->setFunctionBody(funBody);
2980
UPDATE_POS(node, start, tokenStream->cursor());
2988
// ops!! it seems a declarator
2997
tokenStream->rewind(index);
2999
if (tokenStream->lookAhead() == Token_const && tokenStream->lookAhead(1) == Token_identifier && tokenStream->lookAhead(2) == '=') {
3000
// constant definition
3002
InitDeclaratorListAST *declarators = 0;
3003
if (parseInitDeclaratorList(declarators)) {
3005
DeclarationAST *ast = CreateNode<DeclarationAST>(m_pool);
3007
UPDATE_POS(node, start, tokenStream->cursor());
3014
TypeSpecifierAST *spec = 0;
3015
if (parseTypeSpecifier(spec)) {
3017
parseFunctionSpecifier(funSpec); // e.g. "void inline"
3018
spec->setCvQualify(cv);
3020
InitDeclaratorListAST *declarators = 0;
3022
InitDeclaratorAST *decl = 0;
3023
int startDeclarator = tokenStream->cursor();
3024
bool maybeFunctionDefinition = false;
3026
if (tokenStream->lookAhead() != ';') {
3027
if (parseInitDeclarator(decl) && tokenStream->lookAhead() == '{') {
3028
// function definition
3029
maybeFunctionDefinition = true;
3031
tokenStream->rewind(startDeclarator);
3032
if (!parseInitDeclaratorList(declarators)) {
3039
switch(tokenStream->lookAhead()) {
3043
SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(m_pool);
3044
ast->setStorageSpecifier(storageSpec);
3045
ast->setFunctionSpecifier(funSpec);
3046
ast->setTypeSpec(spec);
3047
ast->setWinDeclSpec(winDeclSpec);
3048
ast->setInitDeclaratorList(declarators);
3050
UPDATE_POS(node, start, tokenStream->cursor());
3056
if (!maybeFunctionDefinition) {
3060
StatementListAST *funBody = 0;
3061
if (parseFunctionBody(funBody)) {
3062
FunctionDefinitionAST *ast = CreateNode<FunctionDefinitionAST>(m_pool);
3063
ast->setWinDeclSpec(winDeclSpec);
3064
ast->setStorageSpecifier(storageSpec);
3065
ast->setFunctionSpecifier(funSpec);
3066
ast->setTypeSpec(spec);
3067
ast->setInitDeclarator(decl);
3068
ast->setFunctionBody(funBody);
3070
UPDATE_POS(node, start, tokenStream->cursor());
3083
bool Parser::parseFunctionBody(StatementListAST *&node)
3085
int start = tokenStream->cursor();
3086
if (tokenStream->lookAhead() != '{') {
3091
StatementListAST *ast = CreateNode<StatementListAST>(m_pool);
3093
while (tokenStream->lookAhead()) {
3094
if (tokenStream->lookAhead() == '}')
3097
StatementAST *stmt = 0;
3098
int startStmt = tokenStream->cursor();
3099
if (!parseStatement(stmt)) {
3101
if (startStmt == tokenStream->cursor())
3103
skipUntilStatement();
3105
ast->addStatement(stmt);
3108
if (tokenStream->lookAhead() != '}') {
3109
reportError(i18n("} expected"));
3113
UPDATE_POS(ast, start, tokenStream->cursor());
3119
bool Parser::parseTypeSpecifierOrClassSpec(TypeSpecifierAST *&node)
3121
if (parseClassSpecifier(node))
3123
else if (parseEnumSpecifier(node))
3125
else if (parseTypeSpecifier(node))
3131
bool Parser::parseTryBlockStatement(StatementAST *&node)
3133
if (tokenStream->lookAhead() != Token_try) {
3138
StatementAST *stmt = 0;
3139
if (!parseCompoundStatement(stmt)) {
3144
if (tokenStream->lookAhead() != Token_catch) {
3145
reportError(i18n("catch expected"));
3149
while (tokenStream->lookAhead() == Token_catch) {
3152
ConditionAST *cond = 0;
3153
if (tokenStream->lookAhead() == Token_ellipsis) {
3155
} else if (!parseCondition(cond)) {
3156
reportError(i18n("condition expected"));
3161
StatementAST *body = 0;
3162
if (!parseCompoundStatement(body)) {
3172
bool Parser::parsePrimaryExpression(AbstractExpressionAST *&node)
3174
int start = tokenStream->cursor();
3176
AbstractExpressionAST *ast = CreateExpression<NodeType_PrimaryExpression>(m_pool);
3178
switch(tokenStream->lookAhead()) {
3179
case Token_string_literal:
3182
parseStringLiteral(lit);
3184
lit->setParent(ast);
3188
case Token_number_literal:
3189
case Token_char_literal:
3194
AST_FROM_TOKEN(opNode, tokenStream->cursor());
3195
opNode->setParent(ast);
3204
if (tokenStream->lookAhead() == '{') {
3205
StatementAST *stmt = 0;
3206
if (!parseCompoundStatement(stmt))
3209
stmt->setParent(ast);
3211
AbstractExpressionAST *expr = 0;
3212
if (!parseExpression(expr)) {
3216
expr->setParent(ast);
3225
TypeSpecifierAST *typeSpec = 0;
3226
if (parseSimpleTypeSpecifier(typeSpec) && tokenStream->lookAhead() == '(') {
3229
AbstractExpressionAST *expr = 0;
3230
parseCommaExpression(expr);
3235
typeSpec->setParent(ast);
3238
expr->setParent(ast);
3241
tokenStream->rewind(start);
3245
if (!parseName(name, false))
3249
name->setParent(ast);
3255
UPDATE_POS(ast, start, tokenStream->cursor());
3262
postfix-expression-internal:
3264
( expression-list [opt] )
3265
(.|->) template [opt] id-expression
3266
(.|->) pseudo-destructor-name
3270
bool Parser::parsePostfixExpressionInternal(AbstractExpressionAST *postfixExpr, AbstractExpressionAST *&node)
3272
Q_ASSERT (postfixExpr);
3274
int start = tokenStream->cursor();
3276
switch (tokenStream->lookAhead()) {
3280
AbstractExpressionAST *expr = 0;
3281
parseExpression(expr);
3284
SubscriptingAST *ast = CreateNode<SubscriptingAST>(m_pool);
3285
ast->setExpression(postfixExpr);
3286
ast->setSubscript(expr);
3287
UPDATE_POS(ast, start, tokenStream->cursor());
3295
AbstractExpressionAST *expr = 0;
3296
parseExpression(expr);
3299
FunctionCallAST *ast = CreateNode<FunctionCallAST>(m_pool);
3300
ast->setExpression(postfixExpr);
3301
ast->setArguments(expr);
3302
UPDATE_POS(ast, start, tokenStream->cursor());
3310
AST_FROM_TOKEN(op, tokenStream->cursor());
3313
if (tokenStream->lookAhead() == Token_template)
3317
if (!parseName(name))
3320
ClassMemberAccessAST *ast = CreateNode<ClassMemberAccessAST>(m_pool);
3322
ast->setExpression(postfixExpr);
3324
UPDATE_POS(ast, start, tokenStream->cursor());
3332
AST_FROM_TOKEN(op, tokenStream->cursor());
3335
IncrDecrAST *ast = CreateNode<IncrDecrAST>(m_pool);
3336
ast->setExpression(postfixExpr);
3338
UPDATE_POS(ast, start, tokenStream->cursor());
3350
simple-type-specifier ( expression-list [opt] )
3351
primary-expression postfix-expression-internal*
3353
bool Parser::parsePostfixExpression(AbstractExpressionAST *&node)
3355
int start = tokenStream->cursor();
3357
switch (tokenStream->lookAhead()) {
3358
case Token_dynamic_cast:
3359
case Token_static_cast:
3360
case Token_reinterpret_cast:
3361
case Token_const_cast:
3363
AST_FROM_TOKEN(castOp, tokenStream->cursor());
3367
TypeIdAST *typeId = 0;
3368
parseTypeId(typeId);
3372
AbstractExpressionAST *expr = 0;
3373
parseCommaExpression(expr);
3376
CppCastExpressionAST *tmp = CreateNode<CppCastExpressionAST>(m_pool);
3377
tmp->setCastOp(castOp);
3378
tmp->setTypeId(typeId);
3379
tmp->setExpression(expr);
3381
AbstractExpressionAST *ast = tmp;
3382
AbstractExpressionAST *e = 0;
3383
while (parsePostfixExpressionInternal(ast, e)) {
3387
UPDATE_POS(ast, start, tokenStream->cursor());
3392
case Token_typename:
3397
if (!parseName(name))
3401
AbstractExpressionAST *expr = 0;
3402
parseCommaExpression(expr);
3414
AbstractExpressionAST *expr = 0;
3415
parseCommaExpression(expr);
3426
TypeSpecifierAST *typeSpec = 0;
3427
AbstractExpressionAST *expr = 0;
3429
if (parseSimpleTypeSpecifier(typeSpec/*, true*/) && tokenStream->lookAhead() == '(') {
3430
advance(); // skip '('
3431
parseCommaExpression(expr);
3434
tokenStream->rewind(start);
3436
if (!parsePrimaryExpression(expr))
3440
AbstractExpressionAST *ast = CreateExpression<NodeType_PostfixExpression>(m_pool);
3442
typeSpec->setParent(ast);
3445
expr->setParent(ast);
3447
AbstractExpressionAST *e = 0;
3448
while (parsePostfixExpressionInternal(ast, e)) {
3452
UPDATE_POS(ast, start, tokenStream->cursor());
3457
bool Parser::parseUnaryExpression(AbstractExpressionAST *&node)
3459
int start = tokenStream->cursor();
3461
switch(tokenStream->lookAhead()) {
3471
AST_FROM_TOKEN(opNode, tokenStream->cursor());
3474
AbstractExpressionAST *expr = 0;
3475
if (!parseCastExpression(expr))
3478
AbstractExpressionAST *ast = CreateExpression<NodeType_UnaryExpression>(m_pool);
3480
opNode->setParent(ast);
3482
expr->setParent(ast);
3484
UPDATE_POS(ast, start, tokenStream->cursor());
3491
AbstractExpressionAST *ast = CreateExpression<NodeType_UnaryExpression>(m_pool);
3493
AST_FROM_TOKEN(opNode, tokenStream->cursor());
3494
opNode->setParent(ast);
3497
int index = tokenStream->cursor();
3498
if (tokenStream->lookAhead() == '(') {
3500
TypeIdAST *typeId = 0;
3501
if (parseTypeId(typeId) && tokenStream->lookAhead() == ')') {
3503
typeId->setParent(ast);
3507
UPDATE_POS(ast, start, tokenStream->cursor());
3511
tokenStream->rewind(index);
3513
AbstractExpressionAST *expr = 0;
3514
if (!parseUnaryExpression(expr))
3517
UPDATE_POS(ast, start, tokenStream->cursor());
3523
return parseNewExpression(node);
3526
return parseDeleteExpression(node);
3529
return parsePostfixExpression(node);
3532
bool Parser::parseNewExpression(AbstractExpressionAST *&node)
3534
int start = tokenStream->cursor();
3536
AbstractExpressionAST *ast = CreateExpression<NodeType_NewExpression>(m_pool);
3538
if (tokenStream->lookAhead() == Token_scope && tokenStream->lookAhead(1) == Token_new) {
3539
AST_FROM_TOKEN(scopeNode, tokenStream->cursor());
3540
scopeNode->setParent(ast);
3544
AST_FROM_TOKEN(newNode, tokenStream->cursor());
3545
newNode->setParent(ast);
3547
CHECK(Token_new, "new");
3549
if (tokenStream->lookAhead() == '(') {
3551
AbstractExpressionAST *expr = 0;
3552
parseCommaExpression(expr);
3554
expr->setParent(ast);
3558
if (tokenStream->lookAhead() == '(') {
3560
TypeIdAST *typeId = 0;
3561
parseTypeId(typeId);
3563
typeId->setParent(ast);
3566
AbstractExpressionAST *typeId = 0;
3567
parseNewTypeId(typeId);
3569
typeId->setParent(ast);
3572
AbstractExpressionAST *init = 0;
3573
parseNewInitializer(init);
3575
init->setParent(ast);
3577
UPDATE_POS(ast, start, tokenStream->cursor());
3582
bool Parser::parseNewTypeId(AbstractExpressionAST *&node)
3584
int start = tokenStream->cursor();
3586
TypeSpecifierAST *typeSpec = 0;
3587
if (!parseTypeSpecifier(typeSpec))
3590
AbstractExpressionAST *ast = CreateExpression<NodeType_NewTypeId>(m_pool);
3593
typeSpec->setParent(ast);
3595
AbstractExpressionAST *declarator = 0;
3596
parseNewDeclarator(declarator);
3598
declarator->setParent(ast);
3600
UPDATE_POS(ast, start, tokenStream->cursor());
3605
bool Parser::parseNewDeclarator(AbstractExpressionAST *&node)
3607
int start = tokenStream->cursor();
3609
AbstractExpressionAST *ast = CreateExpression<NodeType_NewInitializer>(m_pool);
3612
if (parsePtrOperator(ptrOp)) {
3614
ptrOp->setParent(ast);
3616
AbstractExpressionAST *declarator = 0;
3617
parseNewDeclarator(declarator);
3620
declarator->setParent(ast);
3623
while (tokenStream->lookAhead() == '[') {
3625
AbstractExpressionAST *expr = 0;
3626
parseExpression(expr);
3630
expr->setParent(ast);
3633
UPDATE_POS(ast, start, tokenStream->cursor());
3638
bool Parser::parseNewInitializer(AbstractExpressionAST *&node)
3640
int start = tokenStream->cursor();
3642
if (tokenStream->lookAhead() != '(')
3645
AbstractExpressionAST *ast = CreateExpression<NodeType_NewInitializer>(m_pool);
3648
AbstractExpressionAST *expr = 0;
3649
parseCommaExpression(expr);
3652
expr->setParent(ast);
3656
UPDATE_POS(ast, start, tokenStream->cursor());
3661
bool Parser::parseDeleteExpression(AbstractExpressionAST *&node)
3663
int start = tokenStream->cursor();
3665
AbstractExpressionAST *ast = CreateExpression<NodeType_DeleteExpression>(m_pool);
3667
if (tokenStream->lookAhead() == Token_scope && tokenStream->lookAhead(1) == Token_delete) {
3668
AST_FROM_TOKEN(scopeNode, tokenStream->cursor());
3669
scopeNode->setParent(ast);
3673
AST_FROM_TOKEN(deleteNode, tokenStream->cursor());
3674
deleteNode->setParent(ast);
3676
CHECK(Token_delete, "delete");
3678
if (tokenStream->lookAhead() == '[') {
3679
int beg = tokenStream->cursor();
3683
AST *n = CreateNode<AST>(m_pool);
3684
UPDATE_POS(n, beg, tokenStream->cursor());
3688
AbstractExpressionAST *expr = 0;
3689
if (!parseCastExpression(expr))
3693
expr->setParent(ast);
3695
UPDATE_POS(ast, start, tokenStream->cursor());
3700
bool Parser::parseCastExpression(AbstractExpressionAST *&node)
3702
int start = tokenStream->cursor();
3704
if (tokenStream->lookAhead() == '(') {
3705
AbstractExpressionAST *ast = CreateExpression<NodeType_CastExpression>(m_pool);
3708
TypeIdAST *typeId = 0;
3709
if (parseTypeId(typeId)) {
3712
typeId->setParent(ast);
3714
if (tokenStream->lookAhead() == ')') {
3717
AbstractExpressionAST *expr = 0;
3718
if (parseCastExpression(expr)) {
3720
expr->setParent(ast);
3722
UPDATE_POS(ast, start, tokenStream->cursor());
3730
tokenStream->rewind(start);
3731
return parseUnaryExpression(node);
3734
bool Parser::parsePmExpression(AbstractExpressionAST *&node)
3736
int start = tokenStream->cursor();
3738
AbstractExpressionAST *ast = 0;
3739
if (!parseCastExpression(ast) || !ast) // ### fixme
3742
while (tokenStream->lookAhead() == Token_ptrmem) {
3743
int startOp = tokenStream->cursor();
3744
AST_FROM_TOKEN(op, startOp);
3747
AbstractExpressionAST *rightExpr = 0;
3748
if (!parseCastExpression(rightExpr))
3751
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
3753
tmp->setLeftExpression(ast);
3754
tmp->setRightExpression(rightExpr);
3755
UPDATE_POS(tmp, startOp, tokenStream->cursor());
3759
UPDATE_POS(ast, start, tokenStream->cursor());
3764
bool Parser::parseMultiplicativeExpression(AbstractExpressionAST *&node)
3766
int start = tokenStream->cursor();
3768
AbstractExpressionAST *ast = 0;
3769
if (!parsePmExpression(ast))
3772
while (tokenStream->lookAhead() == '*' || tokenStream->lookAhead() == '/' || tokenStream->lookAhead() == '%') {
3773
int startOp = tokenStream->cursor();
3774
AST_FROM_TOKEN(op, startOp);
3777
AbstractExpressionAST *rightExpr = 0;
3778
if (!parsePmExpression(rightExpr))
3781
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
3783
tmp->setLeftExpression(ast);
3784
tmp->setRightExpression(rightExpr);
3785
UPDATE_POS(tmp, startOp, tokenStream->cursor());
3789
UPDATE_POS(ast, start, tokenStream->cursor());
3795
bool Parser::parseAdditiveExpression(AbstractExpressionAST *&node)
3797
int start = tokenStream->cursor();
3799
AbstractExpressionAST *ast = 0;
3800
if (!parseMultiplicativeExpression(ast))
3803
while (tokenStream->lookAhead() == '+' || tokenStream->lookAhead() == '-') {
3804
int startOp = tokenStream->cursor();
3805
AST_FROM_TOKEN(op, startOp);
3808
AbstractExpressionAST *rightExpr = 0;
3809
if (!parseMultiplicativeExpression(rightExpr))
3812
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
3814
tmp->setLeftExpression(ast);
3815
tmp->setRightExpression(rightExpr);
3816
UPDATE_POS(tmp, startOp, tokenStream->cursor());
3820
UPDATE_POS(ast, start, tokenStream->cursor());
3825
bool Parser::parseShiftExpression(AbstractExpressionAST *&node)
3827
int start = tokenStream->cursor();
3829
AbstractExpressionAST *ast = 0;
3830
if (!parseAdditiveExpression(ast))
3833
while (tokenStream->lookAhead() == Token_shift) {
3834
int startOp = tokenStream->cursor();
3835
AST_FROM_TOKEN(op, startOp);
3838
AbstractExpressionAST *rightExpr = 0;
3839
if (!parseAdditiveExpression(rightExpr))
3842
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
3844
tmp->setLeftExpression(ast);
3845
tmp->setRightExpression(rightExpr);
3846
UPDATE_POS(tmp, startOp, tokenStream->cursor());
3850
UPDATE_POS(ast, start, tokenStream->cursor());
3855
bool Parser::parseRelationalExpression(AbstractExpressionAST *&node, bool templArgs)
3857
int start = tokenStream->cursor();
3859
AbstractExpressionAST *ast = 0;
3860
if (!parseShiftExpression(ast))
3863
while (tokenStream->lookAhead() == '<' || (tokenStream->lookAhead() == '>' && !templArgs) ||
3864
tokenStream->lookAhead() == Token_leq || tokenStream->lookAhead() == Token_geq) {
3865
int startOp = tokenStream->cursor();
3866
AST_FROM_TOKEN(op, startOp);
3869
AbstractExpressionAST *rightExpr = 0;
3870
if (!parseShiftExpression(rightExpr))
3873
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
3875
tmp->setLeftExpression(ast);
3876
tmp->setRightExpression(rightExpr);
3877
UPDATE_POS(tmp, startOp, tokenStream->cursor());
3881
UPDATE_POS(ast, start, tokenStream->cursor());
3886
bool Parser::parseEqualityExpression(AbstractExpressionAST *&node, bool templArgs)
3888
int start = tokenStream->cursor();
3890
AbstractExpressionAST *ast = 0;
3891
if (!parseRelationalExpression(ast, templArgs))
3894
while (tokenStream->lookAhead() == Token_eq || tokenStream->lookAhead() == Token_not_eq) {
3895
int startOp = tokenStream->cursor();
3896
AST_FROM_TOKEN(op, startOp);
3899
AbstractExpressionAST *rightExpr = 0;
3900
if (!parseRelationalExpression(rightExpr, templArgs))
3903
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
3905
tmp->setLeftExpression(ast);
3906
tmp->setRightExpression(rightExpr);
3907
UPDATE_POS(tmp, startOp, tokenStream->cursor());
3911
UPDATE_POS(ast, start, tokenStream->cursor());
3916
bool Parser::parseAndExpression(AbstractExpressionAST *&node, bool templArgs)
3918
int start = tokenStream->cursor();
3920
AbstractExpressionAST *ast = 0;
3921
if (!parseEqualityExpression(ast, templArgs))
3924
while (tokenStream->lookAhead() == '&') {
3925
int startOp = tokenStream->cursor();
3926
AST_FROM_TOKEN(op, startOp);
3929
AbstractExpressionAST *rightExpr = 0;
3930
if (!parseEqualityExpression(rightExpr, templArgs))
3933
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
3935
tmp->setLeftExpression(ast);
3936
tmp->setRightExpression(rightExpr);
3937
UPDATE_POS(tmp, startOp, tokenStream->cursor());
3941
UPDATE_POS(ast, start, tokenStream->cursor());
3946
bool Parser::parseExclusiveOrExpression(AbstractExpressionAST *&node, bool templArgs)
3948
int start = tokenStream->cursor();
3950
AbstractExpressionAST *ast = 0;
3951
if (!parseAndExpression(ast, templArgs))
3954
while (tokenStream->lookAhead() == '^') {
3955
int startOp = tokenStream->cursor();
3956
AST_FROM_TOKEN(op, startOp);
3959
AbstractExpressionAST *rightExpr = 0;
3960
if (!parseAndExpression(rightExpr, templArgs))
3963
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
3965
tmp->setLeftExpression(ast);
3966
tmp->setRightExpression(rightExpr);
3967
UPDATE_POS(tmp, startOp, tokenStream->cursor());
3971
UPDATE_POS(ast, start, tokenStream->cursor());
3976
bool Parser::parseInclusiveOrExpression(AbstractExpressionAST *&node, bool templArgs)
3978
int start = tokenStream->cursor();
3980
AbstractExpressionAST *ast = 0;
3981
if (!parseExclusiveOrExpression(ast, templArgs))
3984
while (tokenStream->lookAhead() == '|') {
3985
int startOp = tokenStream->cursor();
3986
AST_FROM_TOKEN(op, startOp);
3989
AbstractExpressionAST *rightExpr = 0;
3990
if (!parseExclusiveOrExpression(rightExpr, templArgs))
3993
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
3995
tmp->setLeftExpression(ast);
3996
tmp->setRightExpression(rightExpr);
3997
UPDATE_POS(tmp, startOp, tokenStream->cursor());
4001
UPDATE_POS(ast, start, tokenStream->cursor());
4006
bool Parser::parseLogicalAndExpression(AbstractExpressionAST *&node, bool templArgs)
4008
int start = tokenStream->cursor();
4010
AbstractExpressionAST *ast = 0;
4011
if (!parseInclusiveOrExpression(ast, templArgs))
4014
while (tokenStream->lookAhead() == Token_and) {
4015
int startOp = tokenStream->cursor();
4016
AST_FROM_TOKEN(op, startOp);
4019
AbstractExpressionAST *rightExpr = 0;
4020
if (!parseInclusiveOrExpression(rightExpr, templArgs))
4023
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
4025
tmp->setLeftExpression(ast);
4026
tmp->setRightExpression(rightExpr);
4027
UPDATE_POS(tmp, startOp, tokenStream->cursor());
4031
UPDATE_POS(ast, start, tokenStream->cursor());
4036
bool Parser::parseLogicalOrExpression(AbstractExpressionAST *&node, bool templArgs)
4038
int start = tokenStream->cursor();
4040
AbstractExpressionAST *ast = 0;
4041
if (!parseLogicalAndExpression(ast, templArgs))
4044
while (tokenStream->lookAhead() == Token_or) {
4045
int startOp = tokenStream->cursor();
4046
AST_FROM_TOKEN(op, startOp);
4049
AbstractExpressionAST *rightExpr = 0;
4050
if (!parseLogicalAndExpression(rightExpr, templArgs))
4053
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
4055
tmp->setLeftExpression(ast);
4056
tmp->setRightExpression(rightExpr);
4057
UPDATE_POS(tmp, startOp, tokenStream->cursor());
4061
UPDATE_POS(ast, start, tokenStream->cursor());
4066
bool Parser::parseConditionalExpression(AbstractExpressionAST *&node)
4068
int start = tokenStream->cursor();
4070
AbstractExpressionAST *ast = 0;
4071
if (!parseLogicalOrExpression(ast))
4074
if (tokenStream->lookAhead() == '?') {
4077
AbstractExpressionAST *leftExpr = 0;
4078
if (!parseExpression(leftExpr))
4083
AbstractExpressionAST *rightExpr = 0;
4084
if (!parseAssignmentExpression(rightExpr))
4087
ConditionalExpressionAST *tmp = CreateNode<ConditionalExpressionAST>(m_pool);
4088
tmp->setCondition(ast);
4089
tmp->setLeftExpression(leftExpr);
4090
tmp->setRightExpression(rightExpr);
4094
UPDATE_POS(ast, start, tokenStream->cursor());
4099
bool Parser::parseAssignmentExpression(AbstractExpressionAST *&node)
4101
int start = tokenStream->cursor();
4103
AbstractExpressionAST *ast = 0;
4104
if (tokenStream->lookAhead() == Token_throw && !parseThrowExpression(ast))
4106
else if (!parseConditionalExpression(ast))
4109
while (tokenStream->lookAhead() == Token_assign || tokenStream->lookAhead() == '=') {
4110
int startOp = tokenStream->cursor();
4111
AST_FROM_TOKEN(op, startOp);
4114
AbstractExpressionAST *rightExpr = 0;
4115
if (!parseConditionalExpression(rightExpr))
4118
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
4120
tmp->setLeftExpression(ast);
4121
tmp->setRightExpression(rightExpr);
4122
UPDATE_POS(tmp, startOp, tokenStream->cursor());
4126
UPDATE_POS(ast, start, tokenStream->cursor());
4131
bool Parser::parseConstantExpression(AbstractExpressionAST *&node)
4133
return parseConditionalExpression(node);
4136
bool Parser::parseExpression(AbstractExpressionAST *&node)
4138
return parseCommaExpression(node);
4141
bool Parser::parseCommaExpression(AbstractExpressionAST *&node)
4143
int start = tokenStream->cursor();
4145
AbstractExpressionAST *ast = 0;
4146
if (!parseAssignmentExpression(ast))
4149
while (tokenStream->lookAhead() == ',') {
4150
int startOp = tokenStream->cursor();
4151
AST_FROM_TOKEN(op, startOp);
4154
AbstractExpressionAST *rightExpr = 0;
4155
if (!parseAssignmentExpression(rightExpr))
4158
BinaryExpressionAST *tmp = CreateNode<BinaryExpressionAST>(m_pool);
4160
tmp->setLeftExpression(ast);
4161
tmp->setRightExpression(rightExpr);
4162
UPDATE_POS(tmp, startOp, tokenStream->cursor());
4166
UPDATE_POS(ast, start, tokenStream->cursor());
4171
bool Parser::parseThrowExpression(AbstractExpressionAST *&node)
4173
if (tokenStream->lookAhead() != Token_throw)
4176
int start = tokenStream->cursor();
4178
AST_FROM_TOKEN(throwNode, tokenStream->cursor());
4179
CHECK(Token_throw, "throw");
4180
AbstractExpressionAST *expr = 0;
4181
if (!parseAssignmentExpression(expr))
4184
AbstractExpressionAST *ast = CreateExpression<NodeType_ThrowExpression>(m_pool);
4185
throwNode->setParent(ast);
4187
expr->setParent(ast);
4189
UPDATE_POS(ast, start, tokenStream->cursor());
4196
// ### Objective C++
4197
bool Parser::parseIvarDeclList(AST *& node)
4203
bool Parser::parseIvarDecls(AST *& node)
4209
bool Parser::parseIvarDecl(AST *& node)
4215
bool Parser::parseIvars(AST *& node)
4221
bool Parser::parseIvarDeclarator(AST *& node)
4227
bool Parser::parseMethodDecl(AST *& node)
4233
bool Parser::parseUnarySelector(AST *& node)
4239
bool Parser::parseKeywordSelector(AST *& node)
4245
bool Parser::parseSelector(AST *& node)
4251
bool Parser::parseKeywordDecl(AST *& node)
4257
bool Parser::parseReceiver(AST *& node)
4263
bool Parser::parseObjcMessageExpr(AST *& node)
4269
bool Parser::parseMessageArgs(AST *& node)
4275
bool Parser::parseKeywordExpr(AST *& node)
4281
bool Parser::parseKeywordArgList(AST *& node)
4287
bool Parser::parseKeywordArg(AST *& node)
4293
bool Parser::parseReservedWord(AST *& node)
4299
bool Parser::parseMyParms(AST *& node)
4305
bool Parser::parseMyParm(AST *& node)
4311
bool Parser::parseOptParmList(AST *& node)
4317
bool Parser::parseObjcSelectorExpr(AST *& node)
4323
bool Parser::parseSelectorArg(AST *& node)
4329
bool Parser::parseKeywordNameList(AST *& node)
4335
bool Parser::parseKeywordName(AST *& node)
4341
bool Parser::parseObjcEncodeExpr(AST *& node)
4347
bool Parser::parseObjcString(AST *& node)
4353
bool Parser::parseProtocolRefs(AST *& node)
4359
bool Parser::parseIdentifierList(AST *& node)
4361
int start = tokenStream->cursor();
4363
if (tokenStream->lookAhead() != Token_identifier)
4366
AST *ast = CreateNode<AST>(m_pool);
4368
AST_FROM_TOKEN(tk, tokenStream->cursor());
4372
while (tokenStream->lookAhead() == ',') {
4374
if (tokenStream->lookAhead() == Token_identifier) {
4375
AST_FROM_TOKEN(tk, tokenStream->cursor());
4379
ADVANCE(Token_identifier, "identifier");
4383
UPDATE_POS(node, start, tokenStream->cursor());
4387
bool Parser::parseIdentifierColon(AST *& node)
4391
if (tokenStream->lookAhead() == Token_identifier && tokenStream->lookAhead(1) == ':') {
4395
} // ### else if PTYPENAME -> return true ;
4400
bool Parser::parseObjcProtocolExpr(AST *& node)
4406
bool Parser::parseObjcOpenBracketExpr(AST *& node)
4412
bool Parser::parseObjcCloseBracket(AST *& node)
4418
bool Parser::parseObjcDef(DeclarationAST *& node)
4424
bool Parser::parseObjcClassDef(DeclarationAST *& node)
4430
bool Parser::parseObjcClassDecl(DeclarationAST *& node)
4434
ADVANCE(OBJC_CLASS, "@class");
4437
parseIdentifierList(idList);
4443
bool Parser::parseObjcProtocolDecl(DeclarationAST *& node)
4447
ADVANCE(OBJC_PROTOCOL, "@protocol");
4450
parseIdentifierList(idList);
4456
bool Parser::parseObjcAliasDecl(DeclarationAST *& node)
4460
ADVANCE(OBJC_ALIAS, "@alias");
4463
parseIdentifierList(idList);
4469
bool Parser::parseObjcProtocolDef(DeclarationAST *& node)
4475
bool Parser::parseObjcMethodDef(DeclarationAST *& node)
4481
bool Parser::parseWinDeclSpec(AST *& node)
4483
if (tokenStream->lookAhead() == Token_identifier
4484
&& tokenStream->lookAhead(1) == '('
4485
&& tokenStream->currentTokenText() == "__declspec") {
4486
int start = tokenStream->cursor();
4488
advance(); // skip '('
4490
parseIdentifierList(node);
4493
UPDATE_POS(node, start, tokenStream->cursor());
4500
void Parser::advance()
4503
tokenStream->nextToken();
4504
if (!tokenStream->isHidden(tokenStream->cursor()))