1
/* This file is part of KDevelop
2
Copyright (C) 2002, 2003 Roberto Raggi <roberto@kdevelop.org>
4
This library is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Library General Public
6
License as published by the Free Software Foundation; either
7
version 2 of the License, or (at your option) any later version.
9
This library is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
Library General Public License for more details.
14
You should have received a copy of the GNU Library General Public License
15
along with this library; see the file COPYING.LIB. If not, write to
16
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
Boston, MA 02110-1301, USA.
25
#include "debug_utils.h"
32
#include <QStringList>
34
bool Parser::advance(int tk, char const* descr)
36
const Token& token = (*m_tokenIt);
38
reportError(i18n("'%1' expected found '%2'", QString(descr),
46
bool Parser::check(int tk)
48
const Token& token = (*m_tokenIt);
63
struct ParserPrivateData {
64
ParserPrivateData() {}
67
Parser::Parser(Driver* driver, Lexer* lexer)
71
d = new ParserPrivateData();
82
bool Parser::reportError(const Error& err)
84
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::reportError()";
85
if (m_problems < m_maxProblems) {
87
const Token& token = (*m_tokenIt);
88
Position position = lex->getTokenPosition(token);
90
QString s = (*m_tokenIt).text();
91
s = s.left(30).trimmed();
95
m_driver->addProblem(m_driver->currentFileName(), Problem(err.text.subs(s).toString(), position));
101
bool Parser::reportError(const QString& msg)
103
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::reportError()";
104
if (m_problems < m_maxProblems) {
106
const Token& token = (*m_tokenIt);
107
Position position = lex->getTokenPosition(token);
109
m_driver->addProblem(m_driver->currentFileName(), Problem(msg, position));
115
void Parser::syntaxError()
117
(void) reportError(Errors::SyntaxError);
120
bool Parser::skipUntil(int token)
122
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::skipUntil()";
123
while (!(*m_tokenIt).isNull()) {
124
if ((*m_tokenIt) == token)
133
bool Parser::skipUntilDeclaration()
135
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::skipUntilDeclaration()";
137
while (!(*m_tokenIt).isNull()) {
139
switch ((*m_tokenIt)) {
143
case Token_identifier:
157
case Token_namespace:
164
case Token_const: // cv
165
case Token_volatile: // cv
168
case Token_protected:
170
case Token_signals: // Qt
171
case Token_slots: // Qt
185
bool Parser::skipUntilStatement()
187
//uDebug()<< "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::skipUntilStatement() -- token = " << (*m_tokenIt).text();
189
while (!(*m_tokenIt).isNull()) {
190
switch ((*m_tokenIt)) {
196
case Token_identifier:
239
bool Parser::skip(int l, int r)
242
while (!(*m_tokenIt).isNull()) {
243
int tk = (*m_tokenIt);
249
else if (l != '{' && (tk == '{' || tk == '}' || tk == ';'))
261
bool Parser::skipCommaExpression(AST::Node& node)
263
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::skipCommaExpression()";
265
TokenIterator start = m_tokenIt;
268
if (!skipExpression(expr))
272
while ((*m_tokenIt) == ',') {
274
advanceAndCheckTrailingComment(comment);
276
if (!skipExpression(expr)) {
277
reportError(i18n("expression expected"));
282
AST::Node ast = CreateNode<AST>();
283
update_pos(ast, start, m_tokenIt);
289
bool Parser::skipExpression(AST::Node& node)
291
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::skipExpression()";
293
TokenIterator start = m_tokenIt;
295
while (!(*m_tokenIt).isNull()) {
296
int tk = (*m_tokenIt);
310
case Token_identifier:
312
if ((*m_tokenIt) == Token_identifier)
333
AST::Node ast = CreateNode<AST>();
334
update_pos(ast, start, m_tokenIt);
347
bool Parser::parseName(NameAST::Node& node)
349
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseName()";
351
GroupAST::Node winDeclSpec;
352
parseWinDeclSpec(winDeclSpec);
354
TokenIterator start = m_tokenIt;
356
NameAST::Node ast = CreateNode<NameAST>();
358
if ((*m_tokenIt) == Token_scope) {
359
ast->setGlobal(true);
363
TokenIterator idx = m_tokenIt;
366
ClassOrNamespaceNameAST::Node n;
367
if (!parseUnqualifiedName(n)) {
371
if ((*m_tokenIt) == Token_scope) {
373
ast->addClassOrNamespaceName(n);
374
if ((*m_tokenIt) == Token_template)
375
++m_tokenIt; /// skip optional template #### @todo CHECK
377
ast->setUnqualifiedName(n);
382
if (idx == m_tokenIt)
385
update_pos(ast, start, m_tokenIt);
391
bool Parser::parseTranslationUnit(TranslationUnitAST::Node& node)
393
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTranslationUnit()";
395
TokenIterator start = m_tokenIt = lex->tokenBegin();
398
TranslationUnitAST::Node tun = CreateNode<TranslationUnitAST>();
400
while (!(*m_tokenIt).isNull()) {
401
DeclarationAST::Node def;
402
TokenIterator startDecl = m_tokenIt;
403
if (!parseDeclaration(def)) {
405
if (startDecl == m_tokenIt)
406
++m_tokenIt; // skip at least one token
407
skipUntilDeclaration();
409
node->addDeclaration(def);
412
update_pos(node, start, m_tokenIt);
414
// force (0, 0) as start position
415
node->setStartPosition(Position());
417
return m_problems == 0;
420
bool Parser::parseDeclaration(DeclarationAST::Node& node)
422
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseDeclaration()";
424
// catch first comment
425
Position ps = m_tokenIt->getStartPosition();
426
if (ps.line == 1 && ps.column == 1 && (*m_tokenIt) == Token_comment)
428
FileAST::Node ast = CreateNode<FileAST>();
429
ast->setFileName(m_driver->currentFileName());
430
QString comment = (*m_tokenIt).text();
432
if ((*m_tokenIt) == Token_comment) {
433
ast->setComment(comment);
436
//uDebug() << m_driver->currentFileName() << comment;
442
while ((*m_tokenIt) == Token_comment) {
443
comment += (*m_tokenIt).text();
447
if ((*m_tokenIt).isNull()) {
448
// FIXME: add fetched comment to FileAST
452
TokenIterator start = m_tokenIt;
453
bool success = false;
455
switch ((*m_tokenIt)) {
462
success = parseLinkageSpecification(node);
465
case Token_namespace:
466
success = parseNamespace(node);
470
success = parseUsing(node);
474
success = parseTypedef(node);
478
success = parseAsmDefinition(node);
483
success = parseTemplateDeclaration(node);
487
// m_tokenIt = start;
489
if (objcp && parseObjcDef(node))
494
GroupAST::Node storageSpec;
495
parseStorageClassSpecifier(storageSpec);
500
TypeSpecifierAST::Node spec;
501
AST::Node declarator;
502
if (parseEnumSpecifier(spec) || parseClassSpecifier(spec)) {
503
spec->setCvQualify(cv);
507
spec->setCv2Qualify(cv2);
509
InitDeclaratorListAST::Node declarators;
510
parseInitDeclaratorList(declarators);
512
if (!advance(';', ";"))
515
if (!comment.isEmpty()) {
516
//uDebug() << "Parser::parseDeclaration(spec): comment is " << comment;
517
spec->setComment(comment);
520
SimpleDeclarationAST::Node ast = CreateNode<SimpleDeclarationAST>();
521
ast->setStorageSpecifier(storageSpec);
522
ast->setTypeSpec(spec);
523
ast->setInitDeclaratorList(declarators);
524
update_pos(ast, start, m_tokenIt);
531
success = parseDeclarationInternal(node, comment);
536
if (success && !comment.isEmpty()) {
537
//uDebug() << "Parser::parseDeclaration(): comment is " << comment;
538
node->setComment(comment);
543
bool Parser::parseLinkageSpecification(DeclarationAST::Node& node)
545
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseLinkageSpecification()";
547
TokenIterator start = m_tokenIt;
549
if ((*m_tokenIt) != Token_extern) {
554
LinkageSpecificationAST::Node ast = CreateNode<LinkageSpecificationAST>();
556
TokenIterator startExternType = m_tokenIt;
557
if ((*m_tokenIt) == Token_string_literal) {
559
AST::Node externType = CreateNode<AST>();
560
update_pos(externType, startExternType, m_tokenIt);
562
ast->setExternType(externType);
565
if ((*m_tokenIt) == '{') {
566
LinkageBodyAST::Node linkageBody;
567
parseLinkageBody(linkageBody);
568
ast->setLinkageBody(linkageBody);
570
DeclarationAST::Node decl;
571
if (!parseDeclaration(decl)) {
572
reportError(i18n("Declaration syntax error"));
574
ast->setDeclaration(decl);
577
update_pos(ast, start, m_tokenIt);
584
bool Parser::parseLinkageBody(LinkageBodyAST::Node& node)
586
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseLinkageBody()";
588
TokenIterator start = m_tokenIt;
590
if ((*m_tokenIt) != '{') {
595
LinkageBodyAST::Node lba = CreateNode<LinkageBodyAST>();
598
while (!(*m_tokenIt).isNull()) {
599
int tk = (*m_tokenIt);
604
DeclarationAST::Node def;
605
TokenIterator startDecl = m_tokenIt;
606
if (parseDeclaration(def)) {
607
node->addDeclaration(def);
610
if (startDecl == m_tokenIt)
611
++m_tokenIt; // skip at least one token
612
skipUntilDeclaration();
616
if ((*m_tokenIt) != '}') {
617
reportError(i18n("} expected"));
621
update_pos(node, start, m_tokenIt);
625
bool Parser::parseNamespace(DeclarationAST::Node& node)
627
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseNamespace()";
629
TokenIterator start = m_tokenIt;
631
if ((*m_tokenIt) != Token_namespace) {
636
TokenIterator startNamespaceName = m_tokenIt;
637
if ((*m_tokenIt) == Token_identifier) {
640
AST::Node namespaceName = CreateNode<AST>();
641
update_pos(namespaceName, startNamespaceName, m_tokenIt);
643
if ((*m_tokenIt) == '=') {
648
if (parseName(name)) {
649
if (!advance(';', ";"))
652
NamespaceAliasAST::Node ast = CreateNode<NamespaceAliasAST>();
653
ast->setNamespaceName(namespaceName);
654
ast->setAliasName(name);
655
update_pos(ast, start, m_tokenIt);
659
reportError(i18n("namespace expected"));
662
} else if ((*m_tokenIt) != '{') {
663
reportError(i18n("{ expected"));
667
NamespaceAST::Node ast = CreateNode<NamespaceAST>();
668
ast->setNamespaceName(namespaceName);
670
LinkageBodyAST::Node linkageBody;
671
parseLinkageBody(linkageBody);
673
ast->setLinkageBody(linkageBody);
674
update_pos(ast, start, m_tokenIt);
680
bool Parser::parseUsing(DeclarationAST::Node& node)
682
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseUsing()";
684
TokenIterator start = m_tokenIt;
686
if ((*m_tokenIt) != Token_using) {
691
if ((*m_tokenIt) == Token_namespace) {
692
if (!parseUsingDirective(node)) {
695
update_pos(node, start, m_tokenIt);
699
UsingAST::Node ast = CreateNode<UsingAST>();
701
TokenIterator startTypeName = m_tokenIt;
702
if ((*m_tokenIt) == Token_typename) {
704
AST::Node tn = CreateNode<AST>();
705
update_pos(tn, startTypeName, m_tokenIt);
706
ast->setTypeName(tn);
710
if (!parseName(name))
715
if (!advance(';', ";"))
718
update_pos(ast, start, m_tokenIt);
724
bool Parser::parseUsingDirective(DeclarationAST::Node& node)
726
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseUsingDirective()";
728
TokenIterator start = m_tokenIt;
730
if ((*m_tokenIt) != Token_namespace) {
736
if (!parseName(name)) {
737
reportError(i18n("Namespace name expected"));
741
if (!advance(';', ";"))
744
UsingDirectiveAST::Node ast = CreateNode<UsingDirectiveAST>();
746
update_pos(ast, start, m_tokenIt);
752
bool Parser::parseOperatorFunctionId(AST::Node& node)
754
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseOperatorFunctionId()";
756
TokenIterator start = m_tokenIt;
758
if ((*m_tokenIt) != Token_operator) {
764
if (parseOperator(op)) {
765
AST::Node asn = CreateNode<AST>();
767
update_pos(node, start, m_tokenIt);
770
// parse cast operator
774
TypeSpecifierAST::Node spec;
775
if (!parseSimpleTypeSpecifier(spec)) {
779
spec->setCvQualify(cv);
783
spec->setCv2Qualify(cv2);
786
while (parsePtrOperator(ptrOp))
789
AST::Node asn = CreateNode<AST>();
791
update_pos(node, start, m_tokenIt);
796
bool Parser::parseTemplateArgumentList(TemplateArgumentListAST::Node& node, bool reportError)
798
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTemplateArgumentList()";
800
TokenIterator start = m_tokenIt;
802
TemplateArgumentListAST::Node ast = CreateNode<TemplateArgumentListAST>();
805
if (!parseTemplateArgument(templArg))
807
ast->addArgument(templArg);
810
while ((*m_tokenIt) == ',') {
812
advanceAndCheckTrailingComment(comment);
814
if (!parseTemplateArgument(templArg)) {
821
if (!comment.isEmpty())
822
templArg->setComment(comment);
823
ast->addArgument(templArg);
826
update_pos(ast, start, m_tokenIt);
832
bool Parser::parseTypedef(DeclarationAST::Node& node)
834
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTypedef()";
836
TokenIterator start = m_tokenIt;
838
if ((*m_tokenIt) != Token_typedef) {
843
TypeSpecifierAST::Node spec;
844
if (!parseTypeSpecifierOrClassSpec(spec)) {
845
reportError(i18n("Need a type specifier to declare"));
849
InitDeclaratorListAST::Node declarators;
850
if (!parseInitDeclaratorList(declarators)) {
851
//reportError(i18n("Need an identifier to declare"));
855
if (!advance(';', ";"))
858
TypedefAST::Node ast = CreateNode<TypedefAST>();
859
ast->setTypeSpec(spec);
860
ast->setInitDeclaratorList(declarators);
861
update_pos(ast, start, m_tokenIt);
867
bool Parser::parseAsmDefinition(DeclarationAST::Node& /*node*/)
869
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseAsmDefinition()";
871
if (!advance(Token_asm, "asm"))
878
if (!advance(')', ")"))
880
if (!advance(';', ";"))
886
bool Parser::parseTemplateDeclaration(DeclarationAST::Node& node)
888
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTemplateDeclaration()";
890
TokenIterator start = m_tokenIt;
894
TokenIterator startExport = m_tokenIt;
895
if ((*m_tokenIt) == Token_export) {
897
AST::Node n = CreateNode<AST>();
898
update_pos(n, startExport, m_tokenIt);
902
if ((*m_tokenIt) != Token_template) {
907
TemplateParameterListAST::Node params;
908
if ((*m_tokenIt) == '<') {
910
if ((*m_tokenIt) != '>')
911
parseTemplateParameterList(params);
913
if (!advance('>', ">"))
917
DeclarationAST::Node def;
918
if (!parseDeclaration(def)) {
919
reportError(i18n("expected a declaration"));
922
TemplateDeclarationAST::Node ast = CreateNode<TemplateDeclarationAST>();
923
ast->setExported(exp);
924
ast->setTemplateParameterList(params);
925
ast->setDeclaration(def);
926
update_pos(ast, start, m_tokenIt);
932
bool Parser::parseOperator(AST::Node& /*node*/)
934
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseOperator()";
935
QString text = (*m_tokenIt).text();
937
switch ((*m_tokenIt)) {
941
if ((*m_tokenIt) == '[' && lex->lookAhead(m_tokenIt, 1) == ']') {
963
case Token_left_shift:
978
if ((*m_tokenIt) == '(' && lex->lookAhead(m_tokenIt, 1) == ')') {
982
} else if ((*m_tokenIt) == '[' && lex->lookAhead(m_tokenIt, 1) == ']') {
992
bool Parser::parseCvQualify(GroupAST::Node& node)
994
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseCvQualify()";
996
TokenIterator start = m_tokenIt;
998
GroupAST::Node ast = CreateNode<GroupAST>();
1001
while (!(*m_tokenIt).isNull()) {
1002
int tk = (*m_tokenIt);
1003
if (tk == Token_const || tk == Token_volatile) {
1005
TokenIterator startWord = m_tokenIt;
1007
AST::Node word = CreateNode<AST>();
1008
update_pos(word, startWord, m_tokenIt);
1018
//uDebug() << "-----------------> token = " << (*m_tokenIt).text();
1019
update_pos(ast, start, m_tokenIt);
1025
bool Parser::parseSimpleTypeSpecifier(TypeSpecifierAST::Node& node)
1027
TokenIterator start = m_tokenIt;
1028
bool isIntegral = false;
1033
switch ((*m_tokenIt)) {
1041
case Token_unsigned:
1054
TypeSpecifierAST::Node ast = CreateNode<TypeSpecifierAST>();
1056
ClassOrNamespaceNameAST::Node cl = CreateNode<ClassOrNamespaceNameAST>();
1058
AST::Node n = CreateNode<AST>();
1059
update_pos(n, start, m_tokenIt);
1061
update_pos(cl, start, m_tokenIt);
1063
NameAST::Node name = CreateNode<NameAST>();
1064
name->setUnqualifiedName(cl);
1065
update_pos(name, start, m_tokenIt);
1070
if (!parseName(name)) {
1077
update_pos(ast, start, m_tokenIt);
1082
bool Parser::parsePtrOperator(AST::Node& node)
1084
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parsePtrOperator()";
1086
TokenIterator start = m_tokenIt;
1088
if ((*m_tokenIt) == '&') {
1090
} else if ((*m_tokenIt) == '*') {
1093
TokenIterator index = m_tokenIt;
1095
if (!parsePtrToMember(memPtr)) {
1104
AST::Node ast = CreateNode<AST>();
1105
update_pos(ast, start, m_tokenIt);
1111
bool Parser::parseTemplateArgument(AST::Node& node)
1113
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTemplateArgument()";
1115
TokenIterator start = m_tokenIt;
1116
if (parseTypeId(node)) {
1117
if ((*m_tokenIt) == ',' || (*m_tokenIt) == '>')
1122
if (!parseLogicalOrExpression(node, true)) {
1129
bool Parser::parseTypeSpecifier(TypeSpecifierAST::Node& spec)
1131
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTypeSpecifier()";
1136
if (parseElaboratedTypeSpecifier(spec) || parseSimpleTypeSpecifier(spec)) {
1137
spec->setCvQualify(cv);
1140
parseCvQualify(cv2);
1141
spec->setCv2Qualify(cv2);
1149
bool Parser::parseDeclarator(DeclaratorAST::Node& node)
1151
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseDeclarator()";
1153
TokenIterator start = m_tokenIt;
1155
DeclaratorAST::Node ast = CreateNode<DeclaratorAST>();
1157
DeclaratorAST::Node decl;
1158
NameAST::Node declId;
1161
while (parsePtrOperator(ptrOp)) {
1162
ast->addPtrOp(ptrOp);
1165
if ((*m_tokenIt) == '(') {
1168
if (!parseDeclarator(decl)) {
1171
ast->setSubDeclarator(decl);
1173
if ((*m_tokenIt) != ')') {
1179
if ((*m_tokenIt) == ':') {
1181
} else if (parseDeclaratorId(declId)) {
1182
ast->setDeclaratorId(declId);
1188
if ((*m_tokenIt) == ':') {
1191
if (!parseConstantExpression(expr)) {
1192
reportError(i18n("Constant expression expected"));
1199
bool isVector = true;
1201
while ((*m_tokenIt) == '[') {
1202
TokenIterator startArray = m_tokenIt;
1205
parseCommaExpression(expr);
1207
if (!advance(']', "]"))
1209
AST::Node array = CreateNode<AST>();
1210
update_pos(array, startArray, m_tokenIt);
1211
ast->addArrayDimension(array);
1215
bool skipParen = false;
1216
if ((*m_tokenIt) == Token_identifier && lex->lookAhead(m_tokenIt, 1) == '(' && lex->lookAhead(m_tokenIt, 2) == '(') {
1222
if (ast->subDeclarator() && (!isVector || (*m_tokenIt) != '(')) {
1227
TokenIterator index = m_tokenIt;
1228
if ((*m_tokenIt) == '(') {
1231
ParameterDeclarationClauseAST::Node params;
1232
if (!parseParameterDeclarationClause(params)) {
1233
//uDebug() << "----------------------> not a parameter declaration, maybe an initializer!?";
1237
ast->setParameterDeclarationClause(params);
1239
if ((*m_tokenIt) != ')') {
1244
++m_tokenIt; // skip ')'
1246
TokenIterator startConstant = m_tokenIt;
1247
if ((*m_tokenIt) == Token_const) {
1249
AST::Node constant = CreateNode<AST>();
1250
update_pos(constant, startConstant, m_tokenIt);
1251
ast->setConstant(constant);
1254
GroupAST::Node except;
1255
if (parseExceptionSpecification(except)) {
1256
ast->setExceptionSpecification(except);
1261
if ((*m_tokenIt) != ')') {
1262
reportError(i18n("')' expected"));
1269
update_pos(ast, start, m_tokenIt);
1275
bool Parser::parseAbstractDeclarator(DeclaratorAST::Node& node)
1277
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseDeclarator()";
1278
TokenIterator start = m_tokenIt;
1280
DeclaratorAST::Node ast = CreateNode<DeclaratorAST>();
1282
DeclaratorAST::Node decl;
1283
NameAST::Node declId;
1286
while (parsePtrOperator(ptrOp)) {
1287
ast->addPtrOp(ptrOp);
1290
if ((*m_tokenIt) == '(') {
1293
if (!parseAbstractDeclarator(decl)) {
1296
ast->setSubDeclarator(decl);
1298
if ((*m_tokenIt) != ')') {
1305
while ((*m_tokenIt) == '[') {
1306
TokenIterator startArray = m_tokenIt;
1309
skipCommaExpression(expr);
1311
if (!advance(']', "]"))
1313
AST::Node array = CreateNode<AST>();
1314
update_pos(array, startArray, m_tokenIt);
1315
ast->addArrayDimension(array);
1318
bool skipParen = false;
1319
if ((*m_tokenIt) == Token_identifier && lex->lookAhead(m_tokenIt, 1) == '(' && lex->lookAhead(m_tokenIt, 2) == '(') {
1325
TokenIterator index = m_tokenIt;
1326
if ((*m_tokenIt) == '(') {
1329
ParameterDeclarationClauseAST::Node params;
1330
if (!parseParameterDeclarationClause(params)) {
1334
ast->setParameterDeclarationClause(params);
1336
if ((*m_tokenIt) != ')') {
1342
TokenIterator startConstant = m_tokenIt;
1343
if ((*m_tokenIt) == Token_const) {
1345
AST::Node constant = CreateNode<AST>();
1346
update_pos(constant, startConstant, m_tokenIt);
1347
ast->setConstant(constant);
1350
GroupAST::Node except;
1351
if (parseExceptionSpecification(except)) {
1352
ast->setExceptionSpecification(except);
1357
if ((*m_tokenIt) != ')') {
1358
reportError(i18n("')' expected"));
1366
update_pos(ast, start, m_tokenIt);
1372
bool Parser::parseEnumSpecifier(TypeSpecifierAST::Node& node)
1374
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseEnumSpecifier()";
1377
while ((*m_tokenIt) == Token_comment) {
1378
comment += (*m_tokenIt).text();
1381
if ((*m_tokenIt).isNull())
1384
TokenIterator start = m_tokenIt;
1386
if ((*m_tokenIt) != Token_enum) {
1395
if ((*m_tokenIt) != '{') {
1401
EnumSpecifierAST::Node ast = CreateNode<EnumSpecifierAST>();
1404
EnumeratorAST::Node enumerator;
1405
if (parseEnumerator(enumerator)) {
1406
ast->addEnumerator(enumerator);
1409
while ((*m_tokenIt) == ',') {
1411
advanceAndCheckTrailingComment(comment);
1412
if (!comment.isEmpty()) {
1413
EnumeratorAST *lastLit = ast->enumeratorList().last();
1415
lastLit->setComment(comment);
1418
if (!parseEnumerator(enumerator)) {
1419
//reportError(i18n("Enumerator expected"));
1423
ast->addEnumerator(enumerator);
1427
if ((*m_tokenIt) == Token_comment)
1429
if ((*m_tokenIt) != '}')
1430
reportError(i18n("} missing"));
1434
update_pos(ast, start, m_tokenIt);
1440
bool Parser::parseTemplateParameterList(TemplateParameterListAST::Node& node)
1442
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTemplateParameterList()";
1444
TokenIterator start = m_tokenIt;
1446
TemplateParameterListAST::Node ast = CreateNode<TemplateParameterListAST>();
1448
TemplateParameterAST::Node param;
1449
if (!parseTemplateParameter(param)) {
1452
ast->addTemplateParameter(param);
1455
while ((*m_tokenIt) == ',') {
1457
advanceAndCheckTrailingComment(comment);
1459
if (!parseTemplateParameter(param)) {
1463
if (!comment.isEmpty())
1464
param->setComment(comment);
1465
ast->addTemplateParameter(param);
1469
update_pos(ast, start, m_tokenIt);
1475
bool Parser::parseTemplateParameter(TemplateParameterAST::Node& node)
1477
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTemplateParameter()";
1479
TokenIterator start = m_tokenIt;
1480
TemplateParameterAST::Node ast = CreateNode<TemplateParameterAST>();
1482
TypeParameterAST::Node typeParameter;
1483
ParameterDeclarationAST::Node param;
1485
int tk = (*m_tokenIt);
1487
if ((tk == Token_class || tk == Token_typename || tk == Token_template) && parseTypeParameter(typeParameter)) {
1488
ast->setTypeParameter(typeParameter);
1492
if (!parseParameterDeclaration(param))
1494
ast->setTypeValueParameter(param);
1497
update_pos(ast, start, m_tokenIt);
1503
bool Parser::parseTypeParameter(TypeParameterAST::Node& node)
1505
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTypeParameter()";
1507
TokenIterator start = m_tokenIt;
1508
TypeParameterAST::Node ast = CreateNode<TypeParameterAST>();
1510
AST::Node kind = ast_from_token(m_tokenIt);
1513
switch ((*m_tokenIt)) {
1516
case Token_typename: {
1517
++m_tokenIt; // skip class
1519
// parse optional name
1521
if (parseName(name)) {
1523
if ((*m_tokenIt) == '=') {
1527
if (!parseTypeId(typeId)) {
1531
ast->setTypeId(typeId);
1537
case Token_template: {
1538
++m_tokenIt; // skip template
1539
if (!advance('<', "<"))
1542
TemplateParameterListAST::Node params;
1543
if (!parseTemplateParameterList(params)) {
1546
ast->setTemplateParameterList(params);
1548
if (!advance('>', ">"))
1551
if ((*m_tokenIt) == Token_class)
1554
// parse optional name
1556
if (parseName(name)) {
1558
if ((*m_tokenIt) == '=') {
1562
if (!parseTypeId(typeId)) {
1566
ast->setTypeId(typeId);
1570
if ((*m_tokenIt) == '=') {
1573
NameAST::Node templ_name;
1574
parseName(templ_name);
1585
update_pos(ast, start, m_tokenIt);
1590
bool Parser::parseStorageClassSpecifier(GroupAST::Node& node)
1592
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseStorageClassSpecifier()";
1594
TokenIterator start = m_tokenIt;
1595
GroupAST::Node ast = CreateNode<GroupAST>();
1597
while (!(*m_tokenIt).isNull()) {
1598
int tk = (*m_tokenIt);
1599
if (tk == Token_friend || tk == Token_auto || tk == Token_register || tk == Token_static ||
1600
tk == Token_extern || tk == Token_mutable) {
1601
TokenIterator startNode = m_tokenIt;
1604
AST::Node n = CreateNode<AST>();
1605
update_pos(n, startNode, m_tokenIt);
1611
if (ast->nodeList().count() == 0)
1614
update_pos(ast, start, m_tokenIt);
1619
bool Parser::parseFunctionSpecifier(GroupAST::Node& node)
1621
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseFunctionSpecifier()";
1623
TokenIterator start = m_tokenIt;
1624
GroupAST::Node ast = CreateNode<GroupAST>();
1626
while (!(*m_tokenIt).isNull()) {
1627
int tk = (*m_tokenIt);
1628
if (tk == Token_inline || tk == Token_virtual || tk == Token_explicit) {
1629
TokenIterator startNode = m_tokenIt;
1632
AST::Node n = CreateNode<AST>();
1633
update_pos(n, startNode, m_tokenIt);
1640
if (ast->nodeList().count() == 0)
1643
update_pos(ast, start, m_tokenIt);
1648
bool Parser::parseTypeId(AST::Node& node)
1650
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTypeId()";
1652
/// @todo implement the AST for typeId
1653
TokenIterator start = m_tokenIt;
1654
AST::Node ast = CreateNode<AST>();
1656
TypeSpecifierAST::Node spec;
1657
if (!parseTypeSpecifier(spec)) {
1661
DeclaratorAST::Node decl;
1662
parseAbstractDeclarator(decl);
1664
update_pos(ast, start, m_tokenIt);
1670
bool Parser::parseInitDeclaratorList(InitDeclaratorListAST::Node& node)
1672
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseInitDeclaratorList()";
1674
TokenIterator start = m_tokenIt;
1676
InitDeclaratorListAST::Node ast = CreateNode<InitDeclaratorListAST>();
1677
InitDeclaratorAST::Node decl;
1679
if (!parseInitDeclarator(decl)) {
1682
ast->addInitDeclarator(decl);
1685
while ((*m_tokenIt) == ',') {
1687
advanceAndCheckTrailingComment(comment);
1689
if (!parseInitDeclarator(decl)) {
1693
if (!comment.isEmpty())
1694
decl->setComment(comment);
1695
ast->addInitDeclarator(decl);
1697
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseInitDeclaratorList() -- end";
1699
update_pos(ast, start, m_tokenIt);
1705
bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST::Node& node)
1707
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseParameterDeclarationClause()";
1709
TokenIterator start = m_tokenIt;
1711
ParameterDeclarationClauseAST::Node ast = CreateNode<ParameterDeclarationClauseAST>();
1713
ParameterDeclarationListAST::Node params;
1714
if (!parseParameterDeclarationList(params)) {
1716
if ((*m_tokenIt) == ')')
1719
if ((*m_tokenIt) == Token_ellipsis && lex->lookAhead(m_tokenIt, 1) == ')') {
1720
AST::Node ellipsis = ast_from_token(m_tokenIt);
1721
ast->setEllipsis(ellipsis);
1728
if ((*m_tokenIt) == Token_ellipsis) {
1729
AST::Node ellipsis = ast_from_token(m_tokenIt);
1730
ast->setEllipsis(ellipsis);
1735
ast->setParameterDeclarationList(params);
1737
/// @todo add ellipsis
1738
update_pos(ast, start, m_tokenIt);
1744
bool Parser::parseParameterDeclarationList(ParameterDeclarationListAST::Node& node)
1746
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseParameterDeclarationList()";
1748
TokenIterator start = m_tokenIt;
1750
ParameterDeclarationListAST::Node ast = CreateNode<ParameterDeclarationListAST>();
1752
ParameterDeclarationAST::Node param;
1753
if (!parseParameterDeclaration(param)) {
1757
ast->addParameter(param);
1760
while ((*m_tokenIt) == ',') {
1762
advanceAndCheckTrailingComment(comment);
1764
if ((*m_tokenIt) == Token_ellipsis)
1767
if (!parseParameterDeclaration(param)) {
1771
if (!comment.isEmpty())
1772
param->setComment(comment);
1773
ast->addParameter(param);
1776
update_pos(ast, start, m_tokenIt);
1782
bool Parser::parseParameterDeclaration(ParameterDeclarationAST::Node& node)
1784
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseParameterDeclaration()";
1786
TokenIterator start = m_tokenIt;
1789
TypeSpecifierAST::Node spec;
1790
if (!parseTypeSpecifier(spec)) {
1795
TokenIterator index = m_tokenIt;
1797
DeclaratorAST::Node decl;
1798
if (!parseDeclarator(decl)) {
1801
// try with abstract declarator
1802
if (!parseAbstractDeclarator(decl))
1807
if ((*m_tokenIt) == '=') {
1809
if (!parseLogicalOrExpression(expr, true)) {
1810
//reportError(i18n("Expression expected"));
1814
ParameterDeclarationAST::Node ast = CreateNode<ParameterDeclarationAST>();
1815
ast->setTypeSpec(spec);
1816
ast->setDeclarator(decl);
1817
ast->setExpression(expr);
1819
update_pos(ast, start, m_tokenIt);
1825
bool Parser::parseClassSpecifier(TypeSpecifierAST::Node& node)
1827
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseClassSpecifier()";
1829
TokenIterator start = m_tokenIt;
1832
TokenIterator classKeyStart = m_tokenIt;
1834
int kind = (*m_tokenIt);
1835
if (kind == Token_class || kind == Token_struct || kind == Token_union) {
1836
AST::Node asn = CreateNode<AST>();
1839
update_pos(classKey, classKeyStart, m_tokenIt);
1844
GroupAST::Node winDeclSpec;
1845
parseWinDeclSpec(winDeclSpec);
1847
while ((*m_tokenIt) == Token_identifier && lex->lookAhead(m_tokenIt, 1) == Token_identifier)
1853
BaseClauseAST::Node bases;
1854
if ((*m_tokenIt) == ':') {
1855
if (!parseBaseClause(bases)) {
1861
while ((*m_tokenIt) == Token_comment) {
1862
comment += (*m_tokenIt).text();
1865
if ((*m_tokenIt) != '{') {
1870
if (!advance('{', "{"))
1873
ClassSpecifierAST::Node ast = CreateNode<ClassSpecifierAST>();
1874
ast->setWinDeclSpec(winDeclSpec);
1875
ast->setClassKey(classKey);
1877
ast->setBaseClause(bases);
1879
while (!(*m_tokenIt).isNull()) {
1880
if ((*m_tokenIt) == '}')
1883
DeclarationAST::Node memSpec = CreateNode<DeclarationAST>();
1884
TokenIterator startDecl = m_tokenIt;
1885
if (!parseMemberSpecification(memSpec)) {
1886
if (startDecl == m_tokenIt)
1887
++m_tokenIt; // skip at least one token
1888
skipUntilDeclaration();
1890
ast->addDeclaration(memSpec);
1893
if ((*m_tokenIt) != '}') {
1894
reportError(i18n("} missing"));
1898
update_pos(ast, start, m_tokenIt);
1904
bool Parser::parseAccessSpecifier(AST::Node& node)
1906
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseAccessSpecifier()";
1908
TokenIterator start = m_tokenIt;
1910
switch ((*m_tokenIt)) {
1912
case Token_protected:
1913
case Token_private: {
1914
AST::Node asn = CreateNode<AST>();
1917
update_pos(node, start, m_tokenIt);
1925
void Parser::advanceAndCheckTrailingComment(QString& comment)
1927
Token t = *m_tokenIt;
1928
int previousTokenEndLine = t.getEndPosition().line;
1930
if ((*m_tokenIt) != Token_comment)
1933
int commentStartLine = t.getStartPosition().line;
1934
if (commentStartLine != previousTokenEndLine)
1936
comment += (*m_tokenIt).text();
1940
void Parser::advance_nr(int tk, char const* descr)
1942
const Token& token = (*m_tokenIt);
1944
reportError(i18n("'%1' expected found '%2'", QString(descr),
1950
AST::Node Parser::ast_from_token(TokenIterator tk) const
1952
AST::Node node = CreateNode<AST>();
1953
TokenIterator l_tmp = tk;
1955
update_pos(node, tk, l_tmp);
1959
bool Parser::parseMemberSpecification(DeclarationAST::Node& node)
1961
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseMemberSpecification()";
1964
while ((*m_tokenIt) == Token_comment) {
1965
comment += (*m_tokenIt).text();
1968
if ((*m_tokenIt).isNull())
1971
TokenIterator start = m_tokenIt;
1975
if ((*m_tokenIt) == ';') {
1976
advanceAndCheckTrailingComment(comment);
1977
if (!comment.isEmpty())
1978
node->setComment(comment);
1980
} else if ((*m_tokenIt) == Token_Q_OBJECT || (*m_tokenIt) == Token_K_DCOP) {
1983
} else if ((*m_tokenIt) == Token_signals || (*m_tokenIt) == Token_k_dcop || (*m_tokenIt) == Token_k_dcop_signals) {
1984
AccessDeclarationAST::Node ast = CreateNode<AccessDeclarationAST>();
1986
AST::Node n = CreateNode<AST>();
1987
update_pos(n, start, m_tokenIt);
1989
if (!advance(':', ":"))
1991
update_pos(ast, start, m_tokenIt);
1994
} else if (parseTypedef(node)) {
1996
} else if (parseUsing(node)) {
1998
} else if (parseTemplateDeclaration(node)) {
2000
} else if (parseAccessSpecifier(access)) {
2001
AccessDeclarationAST::Node ast = CreateNode<AccessDeclarationAST>();
2002
ast->addAccess(access);
2004
TokenIterator startSlot = m_tokenIt;
2005
if ((*m_tokenIt) == Token_slots) {
2007
AST::Node sl = CreateNode<AST>();
2008
update_pos(sl, startSlot, m_tokenIt);
2011
if (!advance(':', ":"))
2013
update_pos(ast, start, m_tokenIt);
2020
GroupAST::Node storageSpec;
2021
parseStorageClassSpecifier(storageSpec);
2026
TypeSpecifierAST::Node spec;
2027
if (parseEnumSpecifier(spec) || parseClassSpecifier(spec)) {
2028
spec->setCvQualify(cv);
2031
parseCvQualify(cv2);
2032
spec->setCv2Qualify(cv2);
2034
InitDeclaratorListAST::Node declarators;
2035
parseInitDeclaratorList(declarators);
2036
if (!advance(';', ";"))
2039
if (!comment.isEmpty()) {
2040
//uDebug() << "Parser::parseMemberSpecification(spec): comment is " << comment;
2041
spec->setComment(comment);
2044
SimpleDeclarationAST::Node ast = CreateNode<SimpleDeclarationAST>();
2045
ast->setTypeSpec(spec);
2046
ast->setInitDeclaratorList(declarators);
2047
update_pos(ast, start, m_tokenIt);
2055
bool success = parseDeclarationInternal(node, comment);
2056
if (success && !comment.isEmpty()) {
2057
node->setComment(comment);
2058
//uDebug() << "Parser::parseMemberSpecification(): comment is " << comment;
2063
bool Parser::parseCtorInitializer(AST::Node& /*node*/)
2065
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseCtorInitializer()";
2067
if ((*m_tokenIt) != ':') {
2073
if (!parseMemInitializerList(inits)) {
2074
reportError(i18n("Member initializers expected"));
2080
bool Parser::parseElaboratedTypeSpecifier(TypeSpecifierAST::Node& node)
2082
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseElaboratedTypeSpecifier()";
2084
TokenIterator start = m_tokenIt;
2086
int tk = (*m_tokenIt);
2087
if (tk == Token_class ||
2088
tk == Token_struct ||
2089
tk == Token_union ||
2091
tk == Token_typename) {
2092
AST::Node kind = CreateNode<AST>();
2094
update_pos(kind, start, m_tokenIt);
2098
if (parseName(name)) {
2099
ElaboratedTypeSpecifierAST::Node ast = CreateNode<ElaboratedTypeSpecifierAST>();
2102
update_pos(ast, start, m_tokenIt);
2113
bool Parser::parseDeclaratorId(NameAST::Node& node)
2115
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseDeclaratorId()";
2116
return parseName(node);
2119
bool Parser::parseExceptionSpecification(GroupAST::Node& node)
2121
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseExceptionSpecification()";
2123
if ((*m_tokenIt) != Token_throw) {
2128
if (!advance('(', "("))
2130
if ((*m_tokenIt) == Token_ellipsis) {
2131
// extension found in MSVC++ 7.x headers
2132
TokenIterator start = m_tokenIt;
2133
GroupAST::Node ast = CreateNode<GroupAST>();
2134
AST::Node ellipsis = ast_from_token(m_tokenIt);
2135
ast->addNode(ellipsis);
2137
update_pos(ast, start, m_tokenIt);
2140
parseTypeIdList(node);
2142
if (!advance(')', ")"))
2148
bool Parser::parseEnumerator(EnumeratorAST::Node& node)
2150
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseEnumerator()";
2153
while ((*m_tokenIt) == Token_comment) {
2154
comment += (*m_tokenIt).text();
2157
if ((*m_tokenIt).isNull())
2160
TokenIterator start = m_tokenIt;
2162
if ((*m_tokenIt) != Token_identifier) {
2167
EnumeratorAST::Node ena = CreateNode<EnumeratorAST>();
2170
AST::Node id = CreateNode<AST>();
2171
update_pos(id, start, m_tokenIt);
2174
if ((*m_tokenIt) == '=') {
2178
if (!parseConstantExpression(expr)) {
2179
reportError(i18n("Constant expression expected"));
2181
node->setExpr(expr);
2184
update_pos(node, start, m_tokenIt);
2189
bool Parser::parseInitDeclarator(InitDeclaratorAST::Node& node)
2191
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseInitDeclarator()";
2193
TokenIterator start = m_tokenIt;
2195
DeclaratorAST::Node decl;
2197
if (!parseDeclarator(decl)) {
2201
parseInitializer(init);
2203
InitDeclaratorAST::Node ast = CreateNode<InitDeclaratorAST>();
2204
ast->setDeclarator(decl);
2205
ast->setInitializer(init);
2206
update_pos(ast, start, m_tokenIt);
2214
bool Parser::parseBaseClause(BaseClauseAST::Node& node)
2216
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseBaseClause()";
2218
TokenIterator start = m_tokenIt;
2219
if ((*m_tokenIt) != ':') {
2224
BaseClauseAST::Node bca = CreateNode<BaseClauseAST>();
2226
BaseSpecifierAST::Node baseSpec;
2227
if (parseBaseSpecifier(baseSpec)) {
2228
bca->addBaseSpecifier(baseSpec);
2231
while ((*m_tokenIt) == ',') {
2233
advanceAndCheckTrailingComment(comment);
2235
if (!parseBaseSpecifier(baseSpec)) {
2236
reportError(i18n("Base class specifier expected"));
2239
if (!comment.isEmpty())
2240
baseSpec->setComment(comment);
2241
bca->addBaseSpecifier(baseSpec);
2246
update_pos(bca, start, m_tokenIt);
2252
bool Parser::parseInitializer(AST::Node& node)
2254
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseInitializer()";
2256
if ((*m_tokenIt) == '=') {
2260
if (!parseInitializerClause(node)) {
2261
reportError(i18n("Initializer clause expected"));
2264
} else if ((*m_tokenIt) == '(') {
2267
skipCommaExpression(expr);
2269
if (!advance(')', ")"))
2276
bool Parser::parseMemInitializerList(AST::Node& /*node*/)
2278
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseMemInitializerList()";
2281
if (!parseMemInitializer(init)) {
2286
while ((*m_tokenIt) == ',') {
2288
advanceAndCheckTrailingComment(comment);
2290
if (parseMemInitializer(init)) {
2299
bool Parser::parseMemInitializer(AST::Node& /*node*/)
2301
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseMemInitializer()";
2303
NameAST::Node initId;
2304
if (!parseMemInitializerId(initId)) {
2305
reportError(i18n("Identifier expected"));
2308
if (!advance('(', "("))
2311
skipCommaExpression(expr);
2312
if (!advance(')', ")"))
2318
bool Parser::parseTypeIdList(GroupAST::Node& node)
2320
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTypeIdList()";
2322
TokenIterator start = m_tokenIt;
2325
if (!parseTypeId(typeId)) {
2329
GroupAST::Node ast = CreateNode<GroupAST>();
2330
ast->addNode(typeId);
2333
while ((*m_tokenIt) == ',') {
2335
advanceAndCheckTrailingComment(comment);
2336
if (parseTypeId(typeId)) {
2337
if (!comment.isEmpty())
2338
typeId->setComment(comment);
2339
ast->addNode(typeId);
2341
reportError(i18n("Type id expected"));
2346
update_pos(ast, start, m_tokenIt);
2351
bool Parser::parseBaseSpecifier(BaseSpecifierAST::Node& node)
2353
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseBaseSpecifier()";
2355
TokenIterator start = m_tokenIt;
2356
BaseSpecifierAST::Node ast = CreateNode<BaseSpecifierAST>();
2359
if ((*m_tokenIt) == Token_virtual) {
2360
AST::Node virt = ast_from_token(m_tokenIt);
2361
ast->setIsVirtual(virt);
2365
parseAccessSpecifier(access);
2367
parseAccessSpecifier(access);
2369
if ((*m_tokenIt) == Token_virtual) {
2370
AST::Node virt = ast_from_token(m_tokenIt);
2371
ast->setIsVirtual(virt);
2377
if (!parseName(name)) {
2378
reportError(i18n("Class name expected"));
2381
ast->setAccess(access);
2383
update_pos(ast, start, m_tokenIt);
2390
bool Parser::parseInitializerClause(AST::Node& node)
2392
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseInitializerClause()";
2394
if ((*m_tokenIt) == '{') {
2395
if (!skip('{', '}')) {
2396
reportError(i18n("} missing"));
2400
if (!parseAssignmentExpression(node)) {
2401
//reportError(i18n("Expression expected"));
2408
bool Parser::parseMemInitializerId(NameAST::Node& node)
2410
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseMemInitializerId()";
2412
return parseName(node);
2415
bool Parser::parsePtrToMember(AST::Node& /*node*/)
2417
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parsePtrToMember()";
2419
if ((*m_tokenIt) == Token_scope) {
2423
while ((*m_tokenIt) == Token_identifier) {
2426
if ((*m_tokenIt) == Token_scope && lex->lookAhead(m_tokenIt, 1) == '*') {
2427
++m_tokenIt; // skip ::
2428
++m_tokenIt; // skip *
2437
bool Parser::parseUnqualifiedName(ClassOrNamespaceNameAST::Node& node)
2439
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseUnqualifiedName()";
2441
TokenIterator start = m_tokenIt;
2442
bool isDestructor = false;
2444
ClassOrNamespaceNameAST::Node ast = CreateNode<ClassOrNamespaceNameAST>();
2446
if ((*m_tokenIt) == Token_identifier) {
2447
TokenIterator startName = m_tokenIt;
2448
AST::Node n = CreateNode<AST>();
2450
update_pos(n, startName, m_tokenIt);
2452
} else if ((*m_tokenIt) == '~' && lex->lookAhead(m_tokenIt, 1) == Token_identifier) {
2453
TokenIterator startName = m_tokenIt;
2454
AST::Node n = CreateNode<AST>();
2455
++m_tokenIt; // skip ~
2456
++m_tokenIt; // skip classname
2457
update_pos(n, startName, m_tokenIt);
2459
isDestructor = true;
2460
} else if ((*m_tokenIt) == Token_operator) {
2462
if (!parseOperatorFunctionId(n))
2469
if (!isDestructor) {
2471
TokenIterator index = m_tokenIt;
2473
if ((*m_tokenIt) == '<') {
2476
// optional template arguments
2477
TemplateArgumentListAST::Node args;
2478
parseTemplateArgumentList(args);
2480
if ((*m_tokenIt) != '>') {
2484
ast->setTemplateArgumentList(args);
2489
update_pos(ast, start, m_tokenIt);
2495
bool Parser::parseStringLiteral(AST::Node& /*node*/)
2497
while (!(*m_tokenIt).isNull()) {
2498
if ((*m_tokenIt) == Token_identifier &&
2499
(*m_tokenIt).text() == "L" && lex->lookAhead(m_tokenIt, 1) == Token_string_literal) {
2503
} else if ((*m_tokenIt) == Token_string_literal) {
2511
bool Parser::skipExpressionStatement(StatementAST::Node& node)
2513
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::skipExpressionStatement()";
2515
TokenIterator start = m_tokenIt;
2518
skipCommaExpression(expr);
2520
if (!advance(';', ";"))
2523
ExpressionStatementAST::Node ast = CreateNode<ExpressionStatementAST>();
2524
ast->setExpression(expr);
2525
update_pos(ast, start, m_tokenIt);
2531
bool Parser::parseStatement(StatementAST::Node& node) // thanks to fiore@8080.it ;)
2533
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseStatement()";
2534
switch ((*m_tokenIt)) {
2537
return parseWhileStatement(node);
2540
return parseDoStatement(node);
2543
return parseForStatement(node);
2546
return parseIfStatement(node);
2549
return parseSwitchStatement(node);
2552
return parseTryBlockStatement(node);
2556
return parseLabeledStatement(node);
2559
case Token_continue:
2561
if (!advance(';', ";"))
2567
if (!advance(Token_identifier, "identifier"))
2569
if (!advance(';', ";"))
2573
case Token_return: {
2576
skipCommaExpression(expr);
2577
if (!advance(';', ";"))
2583
return parseCompoundStatement(node);
2585
case Token_identifier:
2586
if (parseLabeledStatement(node))
2591
//uDebug() << "------------> try with declaration statement";
2592
if (parseDeclarationStatement(node))
2595
return skipExpressionStatement(node);
2598
bool Parser::parseCondition(ConditionAST::Node& node)
2600
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseCondition()";
2602
TokenIterator start = m_tokenIt;
2604
ConditionAST::Node ast = CreateNode<ConditionAST>();
2606
TypeSpecifierAST::Node spec;
2607
if (parseTypeSpecifier(spec)) {
2608
DeclaratorAST::Node decl;
2609
if (parseDeclarator(decl) && (*m_tokenIt) == '=') {
2613
if (skipExpression(expr)) {
2614
ast->setTypeSpec(spec);
2615
ast->setDeclarator(decl);
2616
ast->setExpression(expr);
2618
update_pos(ast, start, m_tokenIt);
2629
if (!skipCommaExpression(expr))
2632
ast->setExpression(expr);
2633
update_pos(ast, start, m_tokenIt);
2639
bool Parser::parseWhileStatement(StatementAST::Node& node)
2641
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseWhileStatement()";
2642
TokenIterator start = m_tokenIt;
2644
if (!advance(Token_while, "while"))
2646
if (!advance('(', "("))
2649
ConditionAST::Node cond;
2650
if (!parseCondition(cond)) {
2651
reportError(i18n("condition expected"));
2654
if (!advance(')', ")"))
2657
StatementAST::Node body;
2658
if (!parseStatement(body)) {
2659
reportError(i18n("statement expected"));
2663
WhileStatementAST::Node ast = CreateNode<WhileStatementAST>();
2664
ast->setCondition(cond);
2665
ast->setStatement(body);
2666
update_pos(ast, start, m_tokenIt);
2672
bool Parser::parseDoStatement(StatementAST::Node& node)
2674
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseDoStatement()";
2675
TokenIterator start = m_tokenIt;
2677
if (!advance(Token_do, "do"))
2680
StatementAST::Node body;
2681
if (!parseStatement(body)) {
2682
reportError(i18n("statement expected"));
2686
advance_nr(Token_while, "while");
2687
advance_nr('(', "(");
2690
if (!skipCommaExpression(expr)) {
2691
reportError(i18n("expression expected"));
2695
advance_nr(')', ")");
2696
advance_nr(';', ";");
2698
DoStatementAST::Node ast = CreateNode<DoStatementAST>();
2699
ast->setStatement(body);
2700
//ast->setCondition(condition);
2701
update_pos(ast, start, m_tokenIt);
2707
bool Parser::parseForStatement(StatementAST::Node& node)
2709
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseForStatement()";
2710
TokenIterator start = m_tokenIt;
2712
if (!advance(Token_for, "for"))
2714
if (!advance('(', "("))
2717
StatementAST::Node init;
2718
if (!parseForInitStatement(init)) {
2719
reportError(i18n("for initialization expected"));
2723
ConditionAST::Node cond;
2724
parseCondition(cond);
2725
if (!advance(';', ";"))
2729
skipCommaExpression(expr);
2730
if (!advance(')', ")"))
2733
StatementAST::Node body;
2734
if (!parseStatement(body))
2737
ForStatementAST::Node ast = CreateNode<ForStatementAST>();
2738
ast->setInitStatement(init);
2739
ast->setCondition(cond);
2740
// ast->setExpression(expression);
2741
ast->setStatement(body);
2742
update_pos(ast, start, m_tokenIt);
2748
bool Parser::parseForInitStatement(StatementAST::Node& node)
2750
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseForInitStatement()";
2752
if (parseDeclarationStatement(node))
2755
return skipExpressionStatement(node);
2758
bool Parser::parseCompoundStatement(StatementAST::Node& node)
2760
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseCompoundStatement()";
2761
TokenIterator start = m_tokenIt;
2763
if ((*m_tokenIt) != '{') {
2768
StatementListAST::Node ast = CreateNode<StatementListAST>();
2770
while (!(*m_tokenIt).isNull()) {
2771
if ((*m_tokenIt) == '}')
2774
StatementAST::Node stmt;
2775
TokenIterator startStmt = m_tokenIt;
2776
if (!parseStatement(stmt)) {
2777
if (startStmt == m_tokenIt)
2779
skipUntilStatement();
2781
ast->addStatement(stmt);
2785
if ((*m_tokenIt) != '}') {
2786
reportError(i18n("} expected"));
2791
update_pos(ast, start, m_tokenIt);
2797
bool Parser::parseIfStatement(StatementAST::Node& node)
2799
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseIfStatement()";
2801
TokenIterator start = m_tokenIt;
2803
if (!advance(Token_if, "if"))
2806
if (!advance('(', "("))
2809
IfStatementAST::Node ast = CreateNode<IfStatementAST>();
2811
ConditionAST::Node cond;
2812
if (!parseCondition(cond)) {
2813
reportError(i18n("condition expected"));
2816
if (!advance(')', ")"))
2819
StatementAST::Node stmt;
2820
if (!parseStatement(stmt)) {
2821
reportError(i18n("statement expected"));
2825
ast->setCondition(cond);
2826
ast->setStatement(stmt);
2828
if ((*m_tokenIt) == Token_else) {
2830
StatementAST::Node elseStmt;
2831
if (!parseStatement(elseStmt)) {
2832
reportError(i18n("statement expected"));
2835
ast->setElseStatement(elseStmt);
2838
update_pos(ast, start, m_tokenIt);
2844
bool Parser::parseSwitchStatement(StatementAST::Node& node)
2846
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseSwitchStatement()";
2847
TokenIterator start = m_tokenIt;
2848
if (!advance(Token_switch, "switch"))
2851
if (!advance('(', "("))
2854
ConditionAST::Node cond;
2855
if (!parseCondition(cond)) {
2856
reportError(i18n("condition expected"));
2859
if (!advance(')', ")"))
2862
StatementAST::Node stmt;
2863
if (!parseCompoundStatement(stmt)) {
2868
SwitchStatementAST::Node ast = CreateNode<SwitchStatementAST>();
2869
ast->setCondition(cond);
2870
ast->setStatement(stmt);
2871
update_pos(ast, start, m_tokenIt);
2877
bool Parser::parseLabeledStatement(StatementAST::Node& node)
2879
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseLabeledStatement()";
2880
switch ((*m_tokenIt)) {
2881
case Token_identifier:
2883
if (lex->lookAhead(m_tokenIt, 1) == ':') {
2887
StatementAST::Node stmt;
2888
if (parseStatement(stmt)) {
2898
if (!parseConstantExpression(expr)) {
2899
reportError(i18n("expression expected"));
2900
} else if ((*m_tokenIt) == Token_ellipsis) {
2904
if (!parseConstantExpression(expr2)) {
2905
reportError(i18n("expression expected"));
2908
if (!advance(':', ":"))
2911
StatementAST::Node stmt;
2912
if (parseStatement(stmt)) {
2924
bool Parser::parseBlockDeclaration(DeclarationAST::Node& node)
2926
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseBlockDeclaration()";
2927
switch ((*m_tokenIt)) {
2929
return parseTypedef(node);
2931
return parseUsing(node);
2933
return parseAsmDefinition(node);
2934
case Token_namespace:
2935
return parseNamespaceAliasDefinition(node);
2938
TokenIterator start = m_tokenIt;
2940
GroupAST::Node storageSpec;
2941
parseStorageClassSpecifier(storageSpec);
2946
TypeSpecifierAST::Node spec;
2947
if (!parseTypeSpecifierOrClassSpec(spec)) { // replace with simpleTypeSpecifier?!?!
2951
spec->setCvQualify(cv);
2954
parseCvQualify(cv2);
2955
spec->setCv2Qualify(cv2);
2957
InitDeclaratorListAST::Node declarators;
2958
parseInitDeclaratorList(declarators);
2960
if ((*m_tokenIt) != ';') {
2966
SimpleDeclarationAST::Node ast = CreateNode<SimpleDeclarationAST>();
2967
ast->setTypeSpec(spec);
2968
ast->setInitDeclaratorList(declarators);
2969
update_pos(ast, start, m_tokenIt);
2975
bool Parser::parseNamespaceAliasDefinition(DeclarationAST::Node& /*node*/)
2977
if ((*m_tokenIt) != Token_namespace) {
2982
if (!advance(Token_identifier, "identifier"))
2984
if (!advance('=', "="))
2988
if (!parseName(name)) {
2989
reportError(i18n("Namespace name expected"));
2992
if (!advance(';', ";"))
2999
bool Parser::parseDeclarationStatement(StatementAST::Node& node)
3001
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseDeclarationStatement()";
3003
TokenIterator start = m_tokenIt;
3005
DeclarationAST::Node decl;
3006
if (!parseBlockDeclaration(decl)) {
3010
DeclarationStatementAST::Node ast = CreateNode<DeclarationStatementAST>();
3011
ast->setDeclaration(decl);
3012
update_pos(ast, start, m_tokenIt);
3015
//uDebug() << "---------------------> found a block declaration";
3019
bool Parser::parseDeclarationInternal(DeclarationAST::Node& node, QString& comment)
3021
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseDeclarationInternal()";
3023
TokenIterator start = m_tokenIt;
3025
// that is for the case '__declspec(dllexport) int ...' or
3026
// '__declspec(dllexport) inline int ...', etc.
3027
GroupAST::Node winDeclSpec;
3028
parseWinDeclSpec(winDeclSpec);
3030
GroupAST::Node funSpec;
3031
bool hasFunSpec = parseFunctionSpecifier(funSpec);
3033
GroupAST::Node storageSpec;
3034
bool hasStorageSpec = parseStorageClassSpecifier(storageSpec);
3036
if (hasStorageSpec && !hasFunSpec)
3037
hasFunSpec = parseFunctionSpecifier(funSpec);
3039
// that is for the case 'friend __declspec(dllexport) ....'
3040
GroupAST::Node winDeclSpec2;
3041
parseWinDeclSpec(winDeclSpec2);
3046
TokenIterator index = m_tokenIt;
3048
if (parseName(name) && (*m_tokenIt) == '(') {
3049
// no type specifier, maybe a constructor or a cast operator??
3053
InitDeclaratorAST::Node declarator;
3054
if (parseInitDeclarator(declarator)) {
3055
TokenIterator endSignature = m_tokenIt;
3057
switch ((*m_tokenIt)) {
3061
InitDeclaratorListAST::Node declarators = CreateNode<InitDeclaratorListAST>();
3063
// update declarators position
3064
if (declarator.get()) {
3065
declarators->setStartPosition(declarator->getStartPosition());
3066
declarators->setEndPosition(declarator->getEndPosition());
3068
declarators->addInitDeclarator(declarator);
3070
SimpleDeclarationAST::Node ast = CreateNode<SimpleDeclarationAST>();
3071
ast->setInitDeclaratorList(declarators);
3072
ast->setText(toString(start, endSignature));
3074
update_pos(node, start, m_tokenIt);
3082
StatementListAST::Node funBody;
3083
if (parseCtorInitializer(ctorInit) && parseFunctionBody(funBody)) {
3084
FunctionDefinitionAST::Node ast = CreateNode<FunctionDefinitionAST>();
3085
ast->setStorageSpecifier(storageSpec);
3086
ast->setFunctionSpecifier(funSpec);
3087
ast->setInitDeclarator(declarator);
3088
ast->setFunctionBody(funBody);
3089
ast->setText(toString(start, endSignature));
3091
update_pos(node, start, m_tokenIt);
3098
StatementListAST::Node funBody;
3099
if (parseFunctionBody(funBody)) {
3100
FunctionDefinitionAST::Node ast = CreateNode<FunctionDefinitionAST>();
3101
ast->setStorageSpecifier(storageSpec);
3102
ast->setFunctionSpecifier(funSpec);
3103
ast->setInitDeclarator(declarator);
3104
ast->setText(toString(start, endSignature));
3105
ast->setFunctionBody(funBody);
3107
update_pos(node, start, m_tokenIt);
3115
// ops!! it seems a declarator
3129
if ((*m_tokenIt) == Token_const && lex->lookAhead(m_tokenIt, 1) == Token_identifier && lex->lookAhead(m_tokenIt, 2) == '=') {
3130
// constant definition
3132
InitDeclaratorListAST::Node declarators;
3133
if (parseInitDeclaratorList(declarators)) {
3134
if (!advance(';', ";"))
3136
DeclarationAST::Node ast = CreateNode<DeclarationAST>();
3138
update_pos(node, start, m_tokenIt);
3145
TypeSpecifierAST::Node spec;
3146
if (parseTypeSpecifier(spec)) {
3148
parseFunctionSpecifier(funSpec); // e.g. "void inline"
3149
spec->setCvQualify(cv);
3151
InitDeclaratorListAST::Node declarators;
3153
InitDeclaratorAST::Node decl;
3154
TokenIterator startDeclarator = m_tokenIt;
3155
bool maybeFunctionDefinition = false;
3157
if ((*m_tokenIt) != ';') {
3158
if (parseInitDeclarator(decl) && (*m_tokenIt) == '{') {
3159
// function definition
3160
maybeFunctionDefinition = true;
3162
m_tokenIt = startDeclarator;
3163
if (!parseInitDeclaratorList(declarators)) {
3170
TokenIterator endSignature = m_tokenIt;
3171
switch ((*m_tokenIt)) {
3173
advanceAndCheckTrailingComment(comment);
3174
SimpleDeclarationAST::Node ast = CreateNode<SimpleDeclarationAST>();
3175
ast->setStorageSpecifier(storageSpec);
3176
ast->setFunctionSpecifier(funSpec);
3177
ast->setText(toString(start, endSignature));
3178
ast->setTypeSpec(spec);
3179
ast->setWinDeclSpec(winDeclSpec);
3180
ast->setInitDeclaratorList(declarators);
3182
update_pos(node, start, m_tokenIt);
3187
if (!maybeFunctionDefinition) {
3191
StatementListAST::Node funBody;
3192
if (parseFunctionBody(funBody)) {
3193
FunctionDefinitionAST::Node ast = CreateNode<FunctionDefinitionAST>();
3194
ast->setWinDeclSpec(winDeclSpec);
3195
ast->setStorageSpecifier(storageSpec);
3196
ast->setFunctionSpecifier(funSpec);
3197
ast->setText(toString(start, endSignature));
3198
ast->setTypeSpec(spec);
3199
ast->setFunctionBody(funBody);
3200
ast->setInitDeclarator(decl);
3202
update_pos(node, start, m_tokenIt);
3215
bool Parser::parseFunctionBody(StatementListAST::Node& node)
3217
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseFunctionBody()";
3219
TokenIterator start = m_tokenIt;
3220
if ((*m_tokenIt) != '{') {
3225
StatementListAST::Node ast = CreateNode<StatementListAST>();
3227
while (!(*m_tokenIt).isNull()) {
3228
if ((*m_tokenIt) == '}')
3231
StatementAST::Node stmt;
3232
TokenIterator startStmt = m_tokenIt;
3233
if (!parseStatement(stmt)) {
3234
if (startStmt == m_tokenIt)
3236
skipUntilStatement();
3238
ast->addStatement(stmt);
3241
if ((*m_tokenIt) != '}') {
3242
reportError(i18n("} expected"));
3246
update_pos(ast, start, m_tokenIt);
3252
QString Parser::toString(TokenIterator start, TokenIterator end,
3253
const QString& sep) const
3257
for (; start != end; ++start) {
3258
l << (*start).text();
3261
return l.join(sep).trimmed();
3264
bool Parser::parseTypeSpecifierOrClassSpec(TypeSpecifierAST::Node& node)
3266
if (parseClassSpecifier(node))
3268
else if (parseEnumSpecifier(node))
3270
else if (parseTypeSpecifier(node))
3276
bool Parser::parseTryBlockStatement(StatementAST::Node& node)
3278
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseTryBlockStatement()";
3280
if ((*m_tokenIt) != Token_try) {
3285
StatementAST::Node stmt;
3286
if (!parseCompoundStatement(stmt)) {
3291
if ((*m_tokenIt) != Token_catch) {
3292
reportError(i18n("catch expected"));
3296
while ((*m_tokenIt) == Token_catch) {
3298
if (!advance('(', "("))
3300
ConditionAST::Node cond;
3301
if (!parseCondition(cond)) {
3302
reportError(i18n("condition expected"));
3305
if (!advance(')', ")"))
3308
StatementAST::Node body;
3309
if (!parseCompoundStatement(body)) {
3319
bool Parser::parsePrimaryExpression(AST::Node& /*node*/)
3321
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parsePrimarExpression()";
3324
switch ((*m_tokenIt)) {
3325
case Token_string_literal: {
3327
parseStringLiteral(lit);
3331
case Token_number_literal:
3332
case Token_char_literal:
3342
case Token_dynamic_cast:
3343
case Token_static_cast:
3344
case Token_reinterpret_cast:
3345
case Token_const_cast: {
3351
parseTypeId(typeId);
3358
parseCommaExpression(expr);
3364
case Token_typeid: {
3369
parseCommaExpression(expr);
3377
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "token = " << (*m_tokenIt).text();
3379
if (!parseExpression(expr)) {
3388
TokenIterator start = m_tokenIt;
3389
TypeSpecifierAST::Node typeSpec;
3390
if (parseSimpleTypeSpecifier(typeSpec) && (*m_tokenIt) == '(') {
3393
parseCommaExpression(expr);
3401
if (parseName(name))
3409
bool Parser::parsePostfixExpression(AST::Node& /*node*/)
3411
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parsePostfixExpression()";
3414
if (!parsePrimaryExpression(expr))
3418
switch ((*m_tokenIt)) {
3422
parseCommaExpression(e);
3431
parseCommaExpression(funArgs);
3445
if ((*m_tokenIt) == Token_template)
3449
if (!parseName(name)) {
3455
case Token_typename: {
3459
if (!parseName(name)) {
3466
parseCommaExpression(expr);
3482
bool Parser::parseUnaryExpression(AST::Node& node)
3484
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseUnaryExpression()";
3486
switch ((*m_tokenIt)) {
3497
return parseCastExpression(expr);
3500
case Token_sizeof: {
3502
TokenIterator index = m_tokenIt;
3503
if ((*m_tokenIt) == '(') {
3506
if (parseTypeId(typeId) && (*m_tokenIt) == ')') {
3513
return parseUnaryExpression(expr);
3517
return parseNewExpression(node);
3520
return parseDeleteExpression(node);
3523
return parsePostfixExpression(node);
3526
bool Parser::parseNewExpression(AST::Node& /*node*/)
3528
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseNewExpression()";
3529
if ((*m_tokenIt) == Token_scope && lex->lookAhead(m_tokenIt, 1) == Token_new)
3532
if (! check(Token_new))
3535
if ((*m_tokenIt) == '(') {
3538
parseCommaExpression(expr);
3543
if ((*m_tokenIt) == '(') {
3546
parseTypeId(typeId);
3551
parseNewTypeId(typeId);
3555
parseNewInitializer(init);
3559
bool Parser::parseNewTypeId(AST::Node& /*node*/)
3561
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseNewTypeId()";
3562
TypeSpecifierAST::Node typeSpec;
3563
if (parseTypeSpecifier(typeSpec)) {
3564
AST::Node declarator;
3565
parseNewDeclarator(declarator);
3572
bool Parser::parseNewDeclarator(AST::Node& /*node*/)
3574
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseNewDeclarator()";
3576
if (parsePtrOperator(ptrOp)) {
3577
AST::Node declarator;
3578
parseNewDeclarator(declarator);
3582
if ((*m_tokenIt) == '[') {
3583
while ((*m_tokenIt) == '[') {
3586
parseExpression(expr);
3587
if (!advance(']', "]"))
3596
bool Parser::parseNewInitializer(AST::Node& /*node*/)
3598
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseNewInitializer()";
3599
if ((*m_tokenIt) != '(')
3604
parseCommaExpression(expr);
3611
bool Parser::parseDeleteExpression(AST::Node& /*node*/)
3613
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseDeleteExpression()";
3614
if ((*m_tokenIt) == Token_scope && lex->lookAhead(m_tokenIt, 1) == Token_delete)
3617
if (! check(Token_delete))
3620
if ((*m_tokenIt) == '[') {
3627
return parseCastExpression(expr);
3630
bool Parser::parseCastExpression(AST::Node& /*node*/)
3632
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseCastExpression()";
3634
TokenIterator index = m_tokenIt;
3636
if ((*m_tokenIt) == '(') {
3639
if (parseTypeId(typeId)) {
3640
if ((*m_tokenIt) == ')') {
3643
if (parseCastExpression(expr))
3652
return parseUnaryExpression(expr);
3655
bool Parser::parsePmExpression(AST::Node& /*node*/)
3657
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser:parsePmExpression()";
3659
if (!parseCastExpression(expr))
3662
while ((*m_tokenIt) == Token_ptrmem) {
3665
if (!parseCastExpression(expr))
3672
bool Parser::parseMultiplicativeExpression(AST::Node& /*node*/)
3674
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseMultiplicativeExpression()";
3676
if (!parsePmExpression(expr))
3679
while ((*m_tokenIt) == '*' || (*m_tokenIt) == '/' || (*m_tokenIt) == '%') {
3682
if (!parsePmExpression(expr))
3690
bool Parser::parseAdditiveExpression(AST::Node& /*node*/)
3692
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseAdditiveExpression()";
3694
if (!parseMultiplicativeExpression(expr))
3697
while ((*m_tokenIt) == '+' || (*m_tokenIt) == '-') {
3700
if (!parseMultiplicativeExpression(expr))
3707
bool Parser::parseShiftExpression(AST::Node& /*node*/)
3709
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseShiftExpression()";
3711
if (!parseAdditiveExpression(expr))
3714
if ((*m_tokenIt) == '>') {
3715
uWarning() << "TODO: add support for '>>'";
3718
while ((*m_tokenIt) == Token_left_shift) {
3721
if (!parseAdditiveExpression(expr))
3728
bool Parser::parseRelationalExpression(AST::Node& /*node*/, bool templArgs)
3730
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseRelationalExpression()";
3732
if (!parseShiftExpression(expr))
3735
while ((*m_tokenIt) == '<' || ((*m_tokenIt) == '>' && !templArgs) ||
3736
(*m_tokenIt) == Token_leq || (*m_tokenIt) == Token_geq) {
3739
if (!parseShiftExpression(expr))
3746
bool Parser::parseEqualityExpression(AST::Node& /*node*/, bool templArgs)
3748
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseEqualityExpression()";
3750
if (!parseRelationalExpression(expr, templArgs))
3753
while ((*m_tokenIt) == Token_eq || (*m_tokenIt) == Token_not_eq) {
3756
if (!parseRelationalExpression(expr, templArgs))
3763
bool Parser::parseAndExpression(AST::Node& /*node*/, bool templArgs)
3765
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseAndExpression()";
3767
if (!parseEqualityExpression(expr, templArgs))
3770
while ((*m_tokenIt) == '&') {
3773
if (!parseEqualityExpression(expr, templArgs))
3780
bool Parser::parseExclusiveOrExpression(AST::Node& /*node*/, bool templArgs)
3782
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseExclusiveOrExpression()";
3784
if (!parseAndExpression(expr, templArgs))
3787
while ((*m_tokenIt) == '^') {
3790
if (!parseAndExpression(expr, templArgs))
3797
bool Parser::parseInclusiveOrExpression(AST::Node& /*node*/, bool templArgs)
3799
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseInclusiveOrExpression()";
3801
if (!parseExclusiveOrExpression(expr, templArgs))
3804
while ((*m_tokenIt) == '|') {
3807
if (!parseExclusiveOrExpression(expr, templArgs))
3814
bool Parser::parseLogicalAndExpression(AST::Node& /*node*/, bool templArgs)
3816
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseLogicalAndExpression()";
3819
if (!parseInclusiveOrExpression(expr, templArgs))
3822
while ((*m_tokenIt) == Token_and) {
3825
if (!parseInclusiveOrExpression(expr, templArgs))
3832
bool Parser::parseLogicalOrExpression(AST::Node& node, bool templArgs)
3834
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseLogicalOrExpression()";
3836
TokenIterator start = m_tokenIt;
3839
if (!parseLogicalAndExpression(expr, templArgs))
3842
while ((*m_tokenIt) == Token_or) {
3845
if (!parseLogicalAndExpression(expr, templArgs))
3849
AST::Node ast = CreateNode<AST>();
3850
update_pos(ast, start, m_tokenIt);
3855
bool Parser::parseConditionalExpression(AST::Node& /*node*/)
3857
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseConditionalExpression()";
3859
if (!parseLogicalOrExpression(expr))
3862
if ((*m_tokenIt) == '?') {
3865
if (!parseExpression(expr))
3871
if (!parseAssignmentExpression(expr))
3878
bool Parser::parseAssignmentExpression(AST::Node& node)
3880
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseAssignmentExpression()";
3881
TokenIterator start = m_tokenIt;
3883
if ((*m_tokenIt) == Token_throw && !parseThrowExpression(expr))
3885
else if (!parseConditionalExpression(expr))
3888
while ((*m_tokenIt) == Token_assign || (*m_tokenIt) == '=') {
3891
if (!parseConditionalExpression(expr))
3895
AST::Node ast = CreateNode<AST>();
3896
update_pos(ast, start, m_tokenIt);
3901
bool Parser::parseConstantExpression(AST::Node& node)
3903
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseConstantExpression()";
3904
TokenIterator start = m_tokenIt;
3905
if (parseConditionalExpression(node)) {
3906
AST::Node ast = CreateNode<AST>();
3907
update_pos(ast, start, m_tokenIt);
3914
bool Parser::parseExpression(AST::Node& node)
3916
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseExpression()";
3918
TokenIterator start = m_tokenIt;
3920
if (!parseCommaExpression(node))
3923
AST::Node ast = CreateNode<AST>();
3924
update_pos(ast, start, m_tokenIt);
3929
bool Parser::parseCommaExpression(AST::Node& node)
3931
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseCommaExpression()";
3932
TokenIterator start = m_tokenIt;
3935
if (!parseAssignmentExpression(expr))
3939
while ((*m_tokenIt) == ',') {
3941
advanceAndCheckTrailingComment(comment);
3943
if (!parseAssignmentExpression(expr))
3945
if (!comment.isEmpty())
3946
expr->setComment(comment);
3949
AST::Node ast = CreateNode<AST>();
3950
update_pos(ast, start, m_tokenIt);
3955
bool Parser::parseThrowExpression(AST::Node& /*node*/)
3957
//uDebug() << "--- tok = " << (*m_tokenIt).text() << " -- " << "Parser::parseThrowExpression()";
3958
if ((*m_tokenIt) != Token_throw)
3961
if (! check(Token_throw))
3964
if (!parseAssignmentExpression(expr))
3970
bool Parser::parseIvarDeclList(AST::Node & node)
3976
bool Parser::parseIvarDecls(AST::Node & node)
3982
bool Parser::parseIvarDecl(AST::Node & node)
3988
bool Parser::parseIvars(AST::Node & node)
3994
bool Parser::parseIvarDeclarator(AST::Node & node)
4000
bool Parser::parseMethodDecl(AST::Node & node)
4006
bool Parser::parseUnarySelector(AST::Node & node)
4012
bool Parser::parseKeywordSelector(AST::Node & node)
4018
bool Parser::parseSelector(AST::Node & node)
4024
bool Parser::parseKeywordDecl(AST::Node & node)
4030
bool Parser::parseReceiver(AST::Node & node)
4036
bool Parser::parseObjcMessageExpr(AST::Node & node)
4042
bool Parser::parseMessageArgs(AST::Node & node)
4048
bool Parser::parseKeywordExpr(AST::Node & node)
4054
bool Parser::parseKeywordArgList(AST::Node & node)
4060
bool Parser::parseKeywordArg(AST::Node & node)
4066
bool Parser::parseReservedWord(AST::Node & node)
4072
bool Parser::parseMyParms(AST::Node & node)
4078
bool Parser::parseMyParm(AST::Node & node)
4084
bool Parser::parseOptParmList(AST::Node & node)
4090
bool Parser::parseObjcSelectorExpr(AST::Node & node)
4096
bool Parser::parseSelectorArg(AST::Node & node)
4102
bool Parser::parseKeywordNameList(AST::Node & node)
4108
bool Parser::parseKeywordName(AST::Node & node)
4114
bool Parser::parseObjcEncodeExpr(AST::Node & node)
4120
bool Parser::parseObjcString(AST::Node & node)
4126
bool Parser::parseProtocolRefs(AST::Node & node)
4132
bool Parser::parseIdentifierList(GroupAST::Node & node)
4134
TokenIterator start = m_tokenIt;
4136
if ((*m_tokenIt) != Token_identifier)
4139
GroupAST::Node ast = CreateNode<GroupAST>();
4141
AST::Node tk = ast_from_token(m_tokenIt);
4146
while ((*m_tokenIt) == ',') {
4148
advanceAndCheckTrailingComment(comment);
4149
if ((*m_tokenIt) == Token_identifier) {
4150
AST::Node tk = ast_from_token(m_tokenIt);
4154
if (!advance(Token_identifier, "identifier"))
4159
update_pos(node, start, m_tokenIt);
4163
bool Parser::parseIdentifierColon(AST::Node & node)
4167
if ((*m_tokenIt) == Token_identifier && lex->lookAhead(m_tokenIt, 1) == ':') {
4171
} // ### else if PTYPENAME -> return true ;
4176
bool Parser::parseObjcProtocolExpr(AST::Node & node)
4182
bool Parser::parseObjcOpenBracketExpr(AST::Node & node)
4188
bool Parser::parseObjcCloseBracket(AST::Node & node)
4194
bool Parser::parseObjcDef(DeclarationAST::Node & node)
4200
bool Parser::parseObjcClassDef(DeclarationAST::Node & node)
4206
bool Parser::parseObjcClassDecl(DeclarationAST::Node & node)
4210
if (!advance(OBJC_CLASS, "@class"))
4213
GroupAST::Node idList;
4214
parseIdentifierList(idList);
4215
if (!advance(';', ";"))
4221
bool Parser::parseObjcProtocolDecl(DeclarationAST::Node & node)
4225
if (!advance(OBJC_PROTOCOL, "@protocol"))
4228
GroupAST::Node idList;
4229
parseIdentifierList(idList);
4230
if (!advance(';', ";"))
4236
bool Parser::parseObjcAliasDecl(DeclarationAST::Node & node)
4240
if (!advance(OBJC_ALIAS, "@alias"))
4243
GroupAST::Node idList;
4244
parseIdentifierList(idList);
4245
if (!advance(';', ";"))
4251
bool Parser::parseObjcProtocolDef(DeclarationAST::Node & node)
4257
bool Parser::parseObjcMethodDef(DeclarationAST::Node & node)
4263
bool Parser::parseWinDeclSpec(GroupAST::Node & node)
4265
if ((*m_tokenIt) == Token_identifier && (*m_tokenIt).text() == "__declspec" && lex->lookAhead(m_tokenIt, 1) == '(') {
4266
TokenIterator start = m_tokenIt;
4268
++m_tokenIt; // skip '('
4270
parseIdentifierList(node);
4271
if (!advance(')', ")"))
4274
update_pos(node, start, m_tokenIt);