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
****************************************************************************/
32
#include "smallobject.h"
38
class TypeSpecifierAST;
48
NodeType_TemplateArgumentList = 1000,
49
NodeType_ClassOrNamespaceName,
52
NodeType_TypeSpecifier,
53
NodeType_BaseSpecifier,
55
NodeType_ClassSpecifier,
57
NodeType_EnumSpecifier,
58
NodeType_ElaboratedTypeSpecifier,
60
NodeType_LinkageSpecification,
62
NodeType_NamespaceAlias,
64
NodeType_UsingDirective,
65
NodeType_InitDeclaratorList,
68
NodeType_InitDeclarator,
69
NodeType_TemplateDeclaration,
70
NodeType_SimpleDeclaration,
72
NodeType_StatementList,
74
NodeType_WhileStatement,
76
NodeType_ForStatement,
77
NodeType_SwitchStatement,
78
NodeType_DeclarationStatement,
79
NodeType_ReturnStatement,
80
NodeType_TranslationUnit,
81
NodeType_FunctionDefinition,
82
NodeType_ExpressionStatement,
83
NodeType_ParameterDeclaration,
84
NodeType_ParameterDeclarationList,
85
NodeType_ParameterDeclarationClause,
86
NodeType_AccessDeclaration,
87
NodeType_TypeParameter,
88
NodeType_TemplateParameter,
89
NodeType_TemplateParameterList,
94
NodeType_Expression = 2000,
95
NodeType_BinaryExpression,
96
NodeType_PrimaryExpression,
101
NodeType_PostfixExpression,
102
NodeType_Subscripting,
103
NodeType_FunctionCall,
104
NodeType_ExplicitTypeConversion,
105
NodeType_PseudoConstructorCall,
106
NodeType_ClassMemberAccess,
108
NodeType_CppCastExpression,
109
NodeType_TypeIdentification,
111
NodeType_UnaryExpression,
112
NodeType_NewExpression,
114
NodeType_NewDeclarator,
115
NodeType_NewInitializer,
116
NodeType_DeleteExpression,
117
NodeType_CastExpression,
118
NodeType_ConditionalExpression,
119
NodeType_ThrowExpression,
121
NodeType_Custom = 3000
125
template <typename T>
126
inline int length(List<T> *e)
128
return e ? e->size() : 0;
134
enum { Type=NodeType_Generic };
141
AST(int startToken=0, int count=1);
142
virtual ~AST() { --N; }
144
inline int startToken() const
145
{ return m_startToken; }
147
inline int endToken() const
148
{ return m_endToken; }
150
inline void setPosition(int startToken, int endToken)
152
m_startToken = startToken;
153
m_endToken = endToken;
156
inline int nodeType() const
157
{ return m_nodeType; }
159
inline void setNodeType(int nodeType)
160
{ m_nodeType = nodeType; }
162
inline AST *parent() const
165
void setParent(AST *parent);
167
inline List<AST *> *children() const
168
{ return m_children; }
170
void appendChild(AST *child);
171
void removeChild(AST *child);
174
inline Scope *scope() const
179
return m_parent ? m_parent->scope() : 0;
182
inline void setScope(Scope *scope)
191
List<AST *> *m_children;
194
AST(const AST &source);
195
void operator = (const AST &source);
198
class AbstractExpressionAST: public AST
201
enum { Type = NodeType_Expression };
203
AbstractExpressionAST();
205
inline Symbol *symbol() const
208
inline void setSymbol(Symbol *symbol)
209
{ m_symbol = symbol; }
216
template <int kind, class Base = AbstractExpressionAST>
217
class ExpressionAST: public Base
220
enum { Type = kind };
223
inline ExpressionAST() {}
226
ExpressionAST(const ExpressionAST &source);
227
void operator = (const ExpressionAST &source);
230
class BinaryExpressionAST: public AbstractExpressionAST
233
enum { Type = NodeType_BinaryExpression };
236
BinaryExpressionAST();
238
inline AST *op() const
241
inline AbstractExpressionAST *leftExpression() const
244
inline AbstractExpressionAST *rightExpression() const
248
void setLeftExpression(AbstractExpressionAST *left);
249
void setRightExpression(AbstractExpressionAST *right);
253
AbstractExpressionAST *m_left;
254
AbstractExpressionAST *m_right;
257
BinaryExpressionAST(const BinaryExpressionAST &source);
258
void operator = (const BinaryExpressionAST &source);
261
class ConditionalExpressionAST: public AbstractExpressionAST
264
enum { Type = NodeType_ConditionalExpression };
267
ConditionalExpressionAST();
269
inline AbstractExpressionAST *condition() const
270
{ return m_condition; }
272
inline AbstractExpressionAST *leftExpression() const
275
inline AbstractExpressionAST *rightExpression() const
278
void setCondition(AbstractExpressionAST *condition);
279
void setLeftExpression(AbstractExpressionAST *left);
280
void setRightExpression(AbstractExpressionAST *right);
283
AbstractExpressionAST *m_condition;
284
AbstractExpressionAST *m_left;
285
AbstractExpressionAST *m_right;
288
ConditionalExpressionAST(const ConditionalExpressionAST& source);
289
void operator = (const ConditionalExpressionAST &source);
294
// postfix expression
297
class SubscriptingAST: public AbstractExpressionAST
300
enum { Type = NodeType_Subscripting };
305
inline AbstractExpressionAST *expression() const
306
{ return m_expression; }
308
inline AbstractExpressionAST *subscript() const
309
{ return m_subscript; }
311
void setExpression(AbstractExpressionAST *expression);
312
void setSubscript(AbstractExpressionAST *subscript);
315
AbstractExpressionAST *m_expression;
316
AbstractExpressionAST *m_subscript;
319
SubscriptingAST(const SubscriptingAST &source);
320
void operator = (const SubscriptingAST &source);
323
class FunctionCallAST: public AbstractExpressionAST
326
enum { Type = NodeType_FunctionCall };
331
inline AbstractExpressionAST *expression() const
332
{ return m_expression; }
334
inline AbstractExpressionAST *arguments() const
335
{ return m_arguments; }
337
void setExpression(AbstractExpressionAST *expression);
338
void setArguments(AbstractExpressionAST *arguments);
341
AbstractExpressionAST *m_expression;
342
AbstractExpressionAST *m_arguments;
345
FunctionCallAST(const FunctionCallAST &source);
346
void operator = (const FunctionCallAST &source);
349
class ExplicitTypeConversionAST: public AbstractExpressionAST
352
enum { Type = NodeType_ExplicitTypeConversion };
355
ExplicitTypeConversionAST();
358
ExplicitTypeConversionAST(const ExplicitTypeConversionAST &source);
359
void operator = (const ExplicitTypeConversionAST &source);
362
class PseudoDestructorCallAST: public AbstractExpressionAST
365
enum { Type = NodeType_PseudoConstructorCall };
368
PseudoDestructorCallAST();
371
PseudoDestructorCallAST(const PseudoDestructorCallAST &source);
372
void operator = (const PseudoDestructorCallAST &source);
375
class ClassMemberAccessAST: public AbstractExpressionAST
378
enum { Type = NodeType_ClassMemberAccess };
381
ClassMemberAccessAST();
383
inline AST *op() const
386
inline AbstractExpressionAST *expression() const
387
{ return m_expression; }
389
inline NameAST *name() const
393
void setExpression(AbstractExpressionAST *expression);
394
void setName(NameAST *name);
398
AbstractExpressionAST *m_expression;
403
ClassMemberAccessAST(const ClassMemberAccessAST &source);
404
void operator = (const ClassMemberAccessAST &source);
407
class IncrDecrAST: public AbstractExpressionAST
410
enum { Type = NodeType_IncrDecr };
415
inline AST *op() const
418
inline AbstractExpressionAST *expression() const
419
{ return m_expression; }
422
void setExpression(AbstractExpressionAST *expression);
426
AbstractExpressionAST *m_expression;
429
IncrDecrAST(const IncrDecrAST &source);
430
void operator = (const IncrDecrAST &source);
433
class CppCastExpressionAST: public AbstractExpressionAST
436
enum { Type = NodeType_CppCastExpression };
439
CppCastExpressionAST();
441
inline AST *castOp() const
444
inline AST *typeId() const
447
inline AbstractExpressionAST *expression() const
448
{ return m_expression; }
450
void setCastOp(AST *castOp);
451
void setTypeId(AST *typeId);
452
void setExpression(AbstractExpressionAST *expression);
457
AbstractExpressionAST *m_expression;
460
CppCastExpressionAST(const CppCastExpressionAST &source);
461
void operator = (const CppCastExpressionAST &source);
464
class TypeIdentificationAST: public AbstractExpressionAST
467
enum { Type = NodeType_TypeIdentification };
470
TypeIdentificationAST();
473
TypeIdentificationAST(const TypeIdentificationAST &source);
474
void operator = (const TypeIdentificationAST &source);
477
class TypeIdAST: public AST
480
enum { Type = NodeType_TypeId };
485
inline TypeSpecifierAST *typeSpecifier() const
486
{ return m_typeSpecifier; }
488
inline DeclaratorAST *declarator() const
489
{ return m_declarator; }
491
void setTypeSpecifier(TypeSpecifierAST *typeSpecifier);
492
void setDeclarator(DeclaratorAST *declarator);
495
TypeSpecifierAST *m_typeSpecifier;
496
DeclaratorAST *m_declarator;
499
TypeIdAST(const TypeIdAST &source);
500
void operator = (const TypeIdAST &source);
503
class StatementAST: public AST
506
enum { Type = NodeType_Statement };
509
class TemplateArgumentListAST: public AST
512
enum { Type = NodeType_TemplateArgumentList };
515
TemplateArgumentListAST();
517
void addArgument(AST *arg);
518
inline List<AST *> *argumentList() const { return m_argumentList; }
521
List<AST *> *m_argumentList;
524
TemplateArgumentListAST(const TemplateArgumentListAST &source);
525
void operator = (const TemplateArgumentListAST &source);
528
class ClassOrNamespaceNameAST: public AST
531
enum { Type = NodeType_ClassOrNamespaceName };
534
ClassOrNamespaceNameAST();
536
inline AST *name() const { return m_name; }
537
void setName(AST *name);
539
inline TemplateArgumentListAST *templateArgumentList() const { return m_templateArgumentList; }
540
void setTemplateArgumentList(TemplateArgumentListAST *templateArgumentList);
544
TemplateArgumentListAST* m_templateArgumentList;
547
ClassOrNamespaceNameAST(const ClassOrNamespaceNameAST &source);
548
void operator = (const ClassOrNamespaceNameAST &source);
551
class NameAST: public AST
554
enum { Type = NodeType_Name };
559
inline bool isGlobal() const { return m_global; }
560
void setGlobal(bool b);
562
void addClassOrNamespaceName(ClassOrNamespaceNameAST *classOrNamespaceName);
563
inline List<ClassOrNamespaceNameAST *> *classOrNamespaceNameList() const { return m_classOrNamespaceNameList; }
565
inline ClassOrNamespaceNameAST *unqualifiedName() const { return m_unqualifiedName; }
566
void setUnqualifiedName(ClassOrNamespaceNameAST *unqualifiedName);
570
ClassOrNamespaceNameAST* m_unqualifiedName;
571
List<ClassOrNamespaceNameAST *> *m_classOrNamespaceNameList;
574
NameAST(const NameAST &source);
575
void operator = (const NameAST &source);
578
class TypeParameterAST: public AST
581
enum { Type = NodeType_TypeParameter };
586
inline AST *kind() const { return m_kind; }
587
void setKind(AST *kind);
589
inline class TemplateParameterListAST *templateParameterList() const { return m_templateParameterList; }
590
void setTemplateParameterList(class TemplateParameterListAST *templateParameterList);
592
inline NameAST *name() const { return m_name; }
593
void setName(NameAST *name);
595
inline AST *typeId() const { return m_typeId; }
596
void setTypeId(AST *typeId);
600
class TemplateParameterListAST *m_templateParameterList;
605
TypeParameterAST(const TypeParameterAST &source);
606
void operator = (const TypeParameterAST &source);
609
class DeclarationAST: public AST
612
enum { Type = NodeType_Declaration };
618
DeclarationAST(const DeclarationAST &source);
619
void operator = (const DeclarationAST &source);
622
class AccessDeclarationAST: public DeclarationAST
625
enum { Type = NodeType_AccessDeclaration };
628
AccessDeclarationAST();
630
inline List<AST *> *accessList() const { return m_accessList; }
631
void addAccess(AST *access);
634
List<AST *> *m_accessList;
637
AccessDeclarationAST(const AccessDeclarationAST &source);
638
void operator = (const AccessDeclarationAST &source);
641
class TypeSpecifierAST: public AST
644
enum { Type = NodeType_TypeSpecifier };
649
inline virtual NameAST *name() const { return m_name; }
650
virtual void setName(NameAST *name);
652
inline AST *cvQualify() const { return m_cvQualify; }
653
void setCvQualify(AST *cvQualify);
655
inline AST *cv2Qualify() const { return m_cv2Qualify; }
656
void setCv2Qualify(AST *cv2Qualify);
664
TypeSpecifierAST(const TypeSpecifierAST &source);
665
void operator = (const TypeSpecifierAST &source);
668
class BaseSpecifierAST: public AST
671
enum { Type = NodeType_BaseSpecifier };
676
inline AST *isVirtual() const { return m_isVirtual; }
677
void setIsVirtual(AST *isVirtual);
679
inline AST *access() const { return m_access; }
680
void setAccess(AST *access);
682
inline NameAST *name() const { return m_name; }
683
void setName(NameAST *name);
691
BaseSpecifierAST(const BaseSpecifierAST &source);
692
void operator = (const BaseSpecifierAST &source);
695
class BaseClauseAST: public AST
698
enum { Type = NodeType_BaseClause };
703
void addBaseSpecifier(BaseSpecifierAST *baseSpecifier);
704
inline List<BaseSpecifierAST *> *baseSpecifierList() const { return m_baseSpecifierList; }
707
List<BaseSpecifierAST *> *m_baseSpecifierList;
710
BaseClauseAST(const BaseClauseAST &source);
711
void operator = (const BaseClauseAST &source);
714
class ClassSpecifierAST: public TypeSpecifierAST
717
enum { Type = NodeType_ClassSpecifier };
722
inline AST *winDeclSpec() const { return m_winDeclSpec; }
723
void setWinDeclSpec(AST *winDeclSpec);
725
inline AST *classKey() const { return m_classKey; }
726
void setClassKey(AST *classKey);
728
inline BaseClauseAST *baseClause() const { return m_baseClause; }
729
void setBaseClause(BaseClauseAST *baseClause);
731
inline List<DeclarationAST *> *declarationList() const { return m_declarationList; }
732
void addDeclaration(DeclarationAST *declaration);
737
BaseClauseAST* m_baseClause;
738
List<DeclarationAST *> *m_declarationList;
741
ClassSpecifierAST(const ClassSpecifierAST &source);
742
void operator = (const ClassSpecifierAST &source);
745
class EnumeratorAST: public AST
748
enum { Type = NodeType_Enumerator };
753
inline AST *id() const { return m_id; }
756
inline AbstractExpressionAST *expression() const { return m_expression; }
757
void setExpression(AbstractExpressionAST *expr);
761
AbstractExpressionAST* m_expression;
764
EnumeratorAST(const EnumeratorAST &source);
765
void operator = (const EnumeratorAST &source);
768
class EnumSpecifierAST: public TypeSpecifierAST
771
enum { Type = NodeType_EnumSpecifier };
776
void addEnumerator(EnumeratorAST *enumerator);
777
inline List<EnumeratorAST *> *enumeratorList() const { return m_enumeratorList; }
780
List<EnumeratorAST *> *m_enumeratorList;
783
EnumSpecifierAST(const EnumSpecifierAST &source);
784
void operator = (const EnumSpecifierAST &source);
787
class ElaboratedTypeSpecifierAST: public TypeSpecifierAST
790
enum { Type = NodeType_ElaboratedTypeSpecifier };
793
ElaboratedTypeSpecifierAST();
795
inline AST *kind() const { return m_kind; }
796
void setKind(AST *kind);
802
ElaboratedTypeSpecifierAST(const ElaboratedTypeSpecifierAST &source);
803
void operator = (const ElaboratedTypeSpecifierAST &source);
807
class LinkageBodyAST: public AST
810
enum { Type = NodeType_LinkageBody };
815
void addDeclaration(DeclarationAST *ast);
816
inline List<DeclarationAST *> *declarationList() const { return m_declarationList; }
819
List<DeclarationAST *> *m_declarationList;
822
LinkageBodyAST(const LinkageBodyAST &source);
823
void operator = (const LinkageBodyAST &source);
826
class LinkageSpecificationAST: public DeclarationAST
829
enum { Type = NodeType_LinkageSpecification };
832
LinkageSpecificationAST();
834
inline AST *externType() const { return m_externType; }
835
void setExternType(AST *externType);
837
inline LinkageBodyAST *linkageBody() const { return m_linkageBody; }
838
void setLinkageBody(LinkageBodyAST *linkageBody);
840
inline DeclarationAST *declaration() const { return m_declaration; }
841
void setDeclaration(DeclarationAST *decl);
845
LinkageBodyAST* m_linkageBody;
846
DeclarationAST* m_declaration;
849
LinkageSpecificationAST(const LinkageSpecificationAST &source);
850
void operator = (const LinkageSpecificationAST &source);
853
class NamespaceAST: public DeclarationAST
856
enum { Type = NodeType_Namespace };
861
inline AST *namespaceName() const { return m_namespaceName; }
862
void setNamespaceName(AST *namespaceName);
864
inline LinkageBodyAST *linkageBody() const { return m_linkageBody; }
865
void setLinkageBody(LinkageBodyAST *linkageBody);
868
AST* m_namespaceName;
869
LinkageBodyAST* m_linkageBody;
872
NamespaceAST(const NamespaceAST &source);
873
void operator = (const NamespaceAST &source);
876
class NamespaceAliasAST: public DeclarationAST
879
enum { Type = NodeType_NamespaceAlias };
884
inline AST *namespaceName() const { return m_namespaceName; }
885
void setNamespaceName(AST *name);
887
inline NameAST *aliasName() const { return m_aliasName; }
888
void setAliasName(NameAST *name);
891
AST* m_namespaceName;
892
NameAST* m_aliasName;
895
NamespaceAliasAST(const NamespaceAliasAST &source);
896
void operator = (const NamespaceAliasAST &source);
899
class UsingAST: public DeclarationAST
902
enum { Type = NodeType_Using };
907
inline AST *typeName() const { return m_typeName; }
908
void setTypeName(AST *typeName);
910
inline NameAST *name() const { return m_name; }
911
void setName(NameAST *name);
918
UsingAST(const UsingAST &source);
919
void operator = (const UsingAST &source);
922
class UsingDirectiveAST: public DeclarationAST
925
enum { Type = NodeType_UsingDirective };
930
inline NameAST *name() const { return m_name; }
931
void setName(NameAST *name);
937
UsingDirectiveAST(const UsingDirectiveAST &source);
938
void operator = (const UsingDirectiveAST &source);
941
class DeclaratorAST: public AST
944
enum { Type = NodeType_Declarator };
949
inline List<AST *> *ptrOpList() const { return m_ptrOpList; }
950
void addPtrOp(AST *ptrOp);
952
inline DeclaratorAST *subDeclarator() const { return m_subDeclarator; }
953
void setSubDeclarator(DeclaratorAST *subDeclarator);
955
inline NameAST *declaratorId() const { return m_declaratorId; }
956
void setDeclaratorId(NameAST *declaratorId);
958
inline AST *bitfieldInitialization() const { return m_bitfieldInitialization; }
959
void setBitfieldInitialization(AST *bitfieldInitialization);
961
inline List<AST *> *arrayDimensionList() const { return m_arrayDimensionList; }
962
void addArrayDimension(AST *arrayDimension);
964
inline class ParameterDeclarationClauseAST *parameterDeclarationClause() const { return m_parameterDeclarationClause; }
965
void setParameterDeclarationClause(class ParameterDeclarationClauseAST *parameterDeclarationClause);
967
// ### replace 'constant' with cvQualify
968
inline AST *constant() const { return m_constant; }
969
void setConstant(AST *constant);
971
inline AST *exceptionSpecification() const { return m_exceptionSpecification; }
972
void setExceptionSpecification(AST *exceptionSpecification);
975
List<AST *> *m_ptrOpList;
976
DeclaratorAST * m_subDeclarator;
977
NameAST* m_declaratorId;
978
AST* m_bitfieldInitialization;
979
List<AST *> *m_arrayDimensionList;
980
class ParameterDeclarationClauseAST * m_parameterDeclarationClause;
982
AST* m_exceptionSpecification;
985
DeclaratorAST(const DeclaratorAST &source);
986
void operator = (const DeclaratorAST &source);
989
class ParameterDeclarationAST: public AST
992
enum { Type = NodeType_ParameterDeclaration };
995
ParameterDeclarationAST();
997
inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
998
void setTypeSpec(TypeSpecifierAST *typeSpec);
1000
inline DeclaratorAST *declarator() const { return m_declarator; }
1001
void setDeclarator(DeclaratorAST *declarator);
1003
inline AbstractExpressionAST *expression() const { return m_expression; }
1004
void setExpression(AbstractExpressionAST *expression);
1007
TypeSpecifierAST* m_typeSpec;
1008
DeclaratorAST* m_declarator;
1009
AbstractExpressionAST* m_expression;
1012
ParameterDeclarationAST(const ParameterDeclarationAST &source);
1013
void operator = (const ParameterDeclarationAST &source);
1016
class ParameterDeclarationListAST: public AST
1019
enum { Type = NodeType_ParameterDeclarationList };
1022
ParameterDeclarationListAST();
1024
inline List<ParameterDeclarationAST *> *parameterList() const { return m_parameterList; }
1025
void addParameter(ParameterDeclarationAST *parameter);
1028
List<ParameterDeclarationAST *> *m_parameterList;
1031
ParameterDeclarationListAST(const ParameterDeclarationListAST &source);
1032
void operator = (const ParameterDeclarationListAST &source);
1035
class ParameterDeclarationClauseAST: public AST
1038
enum { Type = NodeType_ParameterDeclarationClause };
1041
ParameterDeclarationClauseAST();
1043
inline ParameterDeclarationListAST *parameterDeclarationList() const { return m_parameterDeclarationList; }
1044
void setParameterDeclarationList(ParameterDeclarationListAST *parameterDeclarationList);
1046
inline AST *ellipsis() const { return m_ellipsis; }
1047
void setEllipsis(AST *ellipsis);
1050
ParameterDeclarationListAST* m_parameterDeclarationList;
1054
ParameterDeclarationClauseAST(const ParameterDeclarationClauseAST &source);
1055
void operator = (const ParameterDeclarationClauseAST &source);
1059
class InitDeclaratorAST: public AST
1062
enum { Type = NodeType_InitDeclarator };
1065
InitDeclaratorAST();
1067
inline DeclaratorAST *declarator() const { return m_declarator; }
1068
void setDeclarator(DeclaratorAST *declarator);
1070
inline AST *initializer() const { return m_initializer; }
1071
void setInitializer(AST *initializer);
1074
DeclaratorAST* m_declarator;
1078
InitDeclaratorAST(const InitDeclaratorAST &source);
1079
void operator = (const InitDeclaratorAST &source);
1082
class InitDeclaratorListAST: public AST
1085
enum { Type = NodeType_InitDeclaratorList };
1088
InitDeclaratorListAST();
1090
inline List<InitDeclaratorAST *> *initDeclaratorList() const { return m_initDeclaratorList; }
1091
void addInitDeclarator(InitDeclaratorAST *decl);
1094
List<InitDeclaratorAST *> *m_initDeclaratorList;
1097
InitDeclaratorListAST(const InitDeclaratorListAST &source);
1098
void operator = (const InitDeclaratorListAST &source);
1101
class TypedefAST: public DeclarationAST
1104
enum { Type = NodeType_Typedef };
1109
inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
1110
void setTypeSpec(TypeSpecifierAST *typeSpec);
1112
inline InitDeclaratorListAST *initDeclaratorList() const { return m_initDeclaratorList; }
1113
void setInitDeclaratorList(InitDeclaratorListAST *initDeclaratorList);
1116
TypeSpecifierAST* m_typeSpec;
1117
InitDeclaratorListAST* m_initDeclaratorList;
1120
void operator = (const TypedefAST &source);
1123
class TemplateParameterAST: public AST
1126
enum { Type = NodeType_TemplateParameter };
1129
TemplateParameterAST();
1131
inline TypeParameterAST *typeParameter() const { return m_typeParameter; }
1132
void setTypeParameter(TypeParameterAST *typeParameter);
1134
inline ParameterDeclarationAST *typeValueParameter() const { return m_typeValueParameter; }
1135
void setTypeValueParameter(ParameterDeclarationAST *typeValueParameter);
1138
TypeParameterAST* m_typeParameter;
1139
ParameterDeclarationAST* m_typeValueParameter;
1142
TemplateParameterAST(const TemplateParameterAST &source);
1143
void operator = (const TemplateParameterAST &source);
1146
class TemplateParameterListAST: public AST
1149
enum { Type = NodeType_TemplateParameterList };
1152
TemplateParameterListAST();
1154
inline List<TemplateParameterAST *> *templateParameterList() const { return m_templateParameterList; }
1155
void addTemplateParameter(TemplateParameterAST *templateParameter);
1158
List<TemplateParameterAST *> *m_templateParameterList;
1161
TemplateParameterListAST(const TemplateParameterListAST &source);
1162
void operator = (const TemplateParameterListAST &source);
1165
class TemplateDeclarationAST: public DeclarationAST
1168
enum { Type = NodeType_TemplateDeclaration };
1171
TemplateDeclarationAST();
1173
inline AST *exported() const { return m_exported; }
1174
void setExported(AST *exported);
1176
inline TemplateParameterListAST *templateParameterList() const { return m_templateParameterList; }
1177
void setTemplateParameterList(TemplateParameterListAST *templateParameterList);
1179
inline DeclarationAST *declaration() const { return m_declaration; }
1180
void setDeclaration(DeclarationAST *declaration);
1184
TemplateParameterListAST* m_templateParameterList;
1185
DeclarationAST* m_declaration;
1188
TemplateDeclarationAST(const TemplateDeclarationAST &source);
1189
void operator = (const TemplateDeclarationAST &source);
1192
class SimpleDeclarationAST: public DeclarationAST
1195
enum { Type = NodeType_SimpleDeclaration };
1198
SimpleDeclarationAST();
1200
inline AST *functionSpecifier() const { return m_functionSpecifier; }
1201
void setFunctionSpecifier(AST *functionSpecifier);
1203
inline AST *storageSpecifier() const { return m_storageSpecifier; }
1204
void setStorageSpecifier(AST *storageSpecifier);
1206
inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
1207
void setTypeSpec(TypeSpecifierAST *typeSpec);
1209
inline InitDeclaratorListAST *initDeclaratorList() const { return m_initDeclaratorList; }
1210
void setInitDeclaratorList(InitDeclaratorListAST *initDeclaratorList);
1212
inline AST *winDeclSpec() const { return m_winDeclSpec; }
1213
void setWinDeclSpec(AST *winDeclSpec);
1216
AST* m_functionSpecifier;
1217
AST* m_storageSpecifier;
1218
TypeSpecifierAST* m_typeSpec;
1219
InitDeclaratorListAST* m_initDeclaratorList;
1223
SimpleDeclarationAST(const SimpleDeclarationAST &source);
1224
void operator = (const SimpleDeclarationAST &source);
1227
class ExpressionStatementAST: public StatementAST
1230
enum { Type = NodeType_ExpressionStatement };
1233
ExpressionStatementAST();
1235
inline AbstractExpressionAST *expression() const { return m_expression; }
1236
void setExpression(AbstractExpressionAST *expression);
1239
AbstractExpressionAST* m_expression;
1242
ExpressionStatementAST(const ExpressionStatementAST &source);
1243
void operator = (const ExpressionStatementAST &source);
1246
class ReturnStatementAST: public StatementAST
1249
enum { Type = NodeType_ReturnStatement };
1252
ReturnStatementAST();
1254
inline AbstractExpressionAST *expression() const { return m_expression; }
1255
void setExpression(AbstractExpressionAST *expression);
1258
AbstractExpressionAST* m_expression;
1261
ReturnStatementAST(const ReturnStatementAST &source);
1262
void operator = (const ReturnStatementAST &source);
1266
class ConditionAST: public AST
1269
enum { Type = NodeType_Condition };
1274
inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
1275
void setTypeSpec(TypeSpecifierAST *typeSpec);
1277
inline DeclaratorAST *declarator() const { return m_declarator; }
1278
void setDeclarator(DeclaratorAST *declarator);
1280
inline AbstractExpressionAST *expression() const { return m_expression; }
1281
void setExpression(AbstractExpressionAST *expression);
1284
TypeSpecifierAST* m_typeSpec;
1285
DeclaratorAST* m_declarator;
1286
AbstractExpressionAST* m_expression;
1289
ConditionAST(const ConditionAST &source);
1290
void operator = (const ConditionAST &source);
1293
class IfStatementAST: public StatementAST
1296
enum { Type = NodeType_IfStatement };
1301
inline ConditionAST *condition() const { return m_condition; }
1302
void setCondition(ConditionAST *condition);
1304
inline StatementAST *statement() const { return m_statement; }
1305
void setStatement(StatementAST *statement);
1307
inline StatementAST *elseStatement() const { return m_elseStatement; }
1308
void setElseStatement(StatementAST *statement);
1311
ConditionAST* m_condition;
1312
StatementAST* m_statement;
1313
StatementAST* m_elseStatement;
1316
IfStatementAST(const IfStatementAST &source);
1317
void operator = (const IfStatementAST &source);
1320
class WhileStatementAST: public StatementAST
1323
enum { Type = NodeType_WhileStatement };
1326
WhileStatementAST();
1328
inline ConditionAST *condition() const { return m_condition; }
1329
void setCondition(ConditionAST *condition);
1331
inline StatementAST *statement() const { return m_statement; }
1332
void setStatement(StatementAST *statement);
1335
ConditionAST* m_condition;
1336
StatementAST* m_statement;
1339
WhileStatementAST(const WhileStatementAST &source);
1340
void operator = (const WhileStatementAST &source);
1343
class DoStatementAST: public StatementAST
1346
enum { Type = NodeType_DoStatement };
1351
inline ConditionAST *condition() const { return m_condition; }
1352
void setCondition(ConditionAST *condition);
1354
inline StatementAST *statement() const { return m_statement; }
1355
void setStatement(StatementAST *statement);
1358
ConditionAST* m_condition;
1359
StatementAST* m_statement;
1362
DoStatementAST(const DoStatementAST &source);
1363
void operator = (const DoStatementAST &source);
1366
class ForStatementAST: public StatementAST
1369
enum { Type = NodeType_ForStatement };
1374
inline StatementAST *initStatement() const { return m_initStatement; }
1375
void setInitStatement(StatementAST *statement);
1377
inline ConditionAST *condition() const { return m_condition; }
1378
void setCondition(ConditionAST *condition);
1380
inline AbstractExpressionAST *expression() const { return m_expression; }
1381
void setExpression(AbstractExpressionAST *expression);
1383
inline StatementAST *statement() const { return m_statement; }
1384
void setStatement(StatementAST *statement);
1387
ConditionAST* m_condition;
1388
StatementAST* m_initStatement;
1389
StatementAST* m_statement;
1390
AbstractExpressionAST* m_expression;
1393
ForStatementAST(const ForStatementAST &source);
1394
void operator = (const ForStatementAST &source);
1397
class SwitchStatementAST: public StatementAST
1400
enum { Type = NodeType_SwitchStatement };
1403
SwitchStatementAST();
1405
inline ConditionAST *condition() const { return m_condition; }
1406
void setCondition(ConditionAST *condition);
1408
inline StatementAST *statement() const { return m_statement; }
1409
void setStatement(StatementAST *statement);
1412
ConditionAST* m_condition;
1413
StatementAST* m_statement;
1416
SwitchStatementAST(const SwitchStatementAST &source);
1417
void operator = (const SwitchStatementAST &source);
1420
class StatementListAST: public StatementAST
1423
enum { Type = NodeType_StatementList };
1428
inline List<StatementAST *> *statementList() const { return m_statementList; }
1429
void addStatement(StatementAST *statement);
1432
List<StatementAST *> *m_statementList;
1435
StatementListAST(const StatementListAST &source);
1436
void operator = (const StatementListAST &source);
1439
class DeclarationStatementAST: public StatementAST
1442
enum { Type = NodeType_DeclarationStatement };
1445
DeclarationStatementAST();
1447
inline DeclarationAST *declaration() const { return m_declaration; }
1448
void setDeclaration(DeclarationAST *declaration);
1451
DeclarationAST* m_declaration;
1454
DeclarationStatementAST(const DeclarationStatementAST &source);
1455
void operator = (const DeclarationStatementAST &source);
1458
class FunctionDefinitionAST: public DeclarationAST
1461
enum { Type = NodeType_FunctionDefinition };
1464
FunctionDefinitionAST();
1466
inline AST *functionSpecifier() const { return m_functionSpecifier; }
1467
void setFunctionSpecifier(AST *functionSpecifier);
1469
inline AST *storageSpecifier() const { return m_storageSpecifier; }
1470
void setStorageSpecifier(AST *storageSpecifier);
1472
inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
1473
void setTypeSpec(TypeSpecifierAST *typeSpec);
1475
inline InitDeclaratorAST *initDeclarator() const { return m_initDeclarator; }
1476
void setInitDeclarator(InitDeclaratorAST *initDeclarator);
1478
inline StatementListAST *functionBody() const { return m_functionBody; }
1479
void setFunctionBody(StatementListAST *functionBody);
1481
inline AST *winDeclSpec() const { return m_winDeclSpec; }
1482
void setWinDeclSpec(AST *winDeclSpec);
1485
AST* m_functionSpecifier;
1486
AST* m_storageSpecifier;
1487
TypeSpecifierAST* m_typeSpec;
1488
InitDeclaratorAST* m_initDeclarator;
1489
StatementListAST* m_functionBody;
1493
FunctionDefinitionAST(const FunctionDefinitionAST &source);
1494
void operator = (const FunctionDefinitionAST &source);
1497
class TranslationUnitAST: public AST
1500
enum { Type = NodeType_TranslationUnit };
1503
TranslationUnitAST();
1505
void addDeclaration(DeclarationAST *ast);
1506
inline List<DeclarationAST *> *declarationList() const { return m_declarationList; }
1509
List<DeclarationAST *> *m_declarationList;
1512
TranslationUnitAST(const TranslationUnitAST &source);
1513
void operator = (const TranslationUnitAST &source);
1516
template <class T> T* CreateNode(pool *p)
1518
T* node = new (p->allocate(sizeof(T))) T;
1519
node->setNodeType(T::Type);
1524
template <int kind> ExpressionAST<kind> *CreateExpression(pool *p)
1526
ExpressionAST<kind>* node = new (p->allocate(sizeof(ExpressionAST<kind>))) ExpressionAST<kind>;
1527
node->setNodeType(kind);
1533
template <typename T>
1534
inline List<T *> *snoc(List<T *> *e, T *d, pool *p)
1535
{ if (!e) e = new (p->allocate(sizeof(List<T*>))) List<T *>(p); e->append(d); return e; }
1538
//Workaround for ICE on MSVC, use macro instead of template.
1539
#define SNOC(ListType, ListValueType) \
1540
inline ListType *snoc(ListType *e, ListValueType *d, pool *p) \
1541
{ if (!e) e = new (p->allocate(sizeof(ListType))) ListType(p); e->append(d); return e; }
1543
SNOC(List<AST *>, AST)
1544
SNOC(List<ClassOrNamespaceNameAST *>, ClassOrNamespaceNameAST)
1545
SNOC(List<BaseSpecifierAST *>, BaseSpecifierAST)
1546
SNOC(List<DeclarationAST *>, DeclarationAST)
1547
SNOC(List<EnumeratorAST *>, EnumeratorAST)
1548
SNOC(List<ParameterDeclarationAST *>, ParameterDeclarationAST)
1549
SNOC(List<InitDeclaratorAST *>, InitDeclaratorAST)
1550
SNOC(List<TemplateParameterAST *>, TemplateParameterAST)
1551
SNOC(List<StatementAST *>, StatementAST)