diff options
Diffstat (limited to 'tools/porting/src/ast.h')
-rw-r--r-- | tools/porting/src/ast.h | 1598 |
1 files changed, 1598 insertions, 0 deletions
diff --git a/tools/porting/src/ast.h b/tools/porting/src/ast.h new file mode 100644 index 0000000..7daa680 --- /dev/null +++ b/tools/porting/src/ast.h @@ -0,0 +1,1598 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** Copyright (C) 2001-2004 Roberto Raggi +** +** This file is part of the qt3to4 porting application of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef AST_H +#define AST_H + +#include "smallobject.h" +#include "list.h" + +QT_BEGIN_NAMESPACE + +class AST; +class NameAST; +class TypeIdAST; +class TypeSpecifierAST; +class DeclaratorAST; + +class Symbol; +class Scope; + +enum NodeType +{ + NodeType_Generic = 0, + + NodeType_TemplateArgumentList = 1000, + NodeType_ClassOrNamespaceName, + NodeType_Name, + NodeType_Declaration, + NodeType_TypeSpecifier, + NodeType_BaseSpecifier, + NodeType_BaseClause, + NodeType_ClassSpecifier, + NodeType_Enumerator, + NodeType_EnumSpecifier, + NodeType_ElaboratedTypeSpecifier, + NodeType_LinkageBody, + NodeType_LinkageSpecification, + NodeType_Namespace, + NodeType_NamespaceAlias, + NodeType_Using, + NodeType_UsingDirective, + NodeType_InitDeclaratorList, + NodeType_Typedef, + NodeType_Declarator, + NodeType_InitDeclarator, + NodeType_TemplateDeclaration, + NodeType_SimpleDeclaration, + NodeType_Statement, + NodeType_StatementList, + NodeType_IfStatement, + NodeType_WhileStatement, + NodeType_DoStatement, + NodeType_ForStatement, + NodeType_SwitchStatement, + NodeType_DeclarationStatement, + NodeType_LabeledStatement, + NodeType_ReturnStatement, + NodeType_TranslationUnit, + NodeType_FunctionDefinition, + NodeType_ExpressionStatement, + NodeType_ParameterDeclaration, + NodeType_ParameterDeclarationList, + NodeType_ParameterDeclarationClause, + NodeType_AccessDeclaration, + NodeType_TypeParameter, + NodeType_TemplateParameter, + NodeType_TemplateParameterList, + NodeType_Condition, + + NodeType_TypeId, + + NodeType_Expression = 2000, + NodeType_BinaryExpression, + NodeType_PrimaryExpression, + +// +// postfix expression +// + NodeType_PostfixExpression, + NodeType_Subscripting, + NodeType_FunctionCall, + NodeType_ExplicitTypeConversion, + NodeType_PseudoConstructorCall, + NodeType_ClassMemberAccess, + NodeType_IncrDecr, + NodeType_CppCastExpression, + NodeType_TypeIdentification, + + NodeType_UnaryExpression, + NodeType_NewExpression, + NodeType_NewTypeId, + NodeType_NewDeclarator, + NodeType_NewInitializer, + NodeType_DeleteExpression, + NodeType_CastExpression, + NodeType_ConditionalExpression, + NodeType_ThrowExpression, + + NodeType_Custom = 3000 +}; + + +template <typename T> +inline int length(List<T> *e) +{ + return e ? e->size() : 0; +} + +class AST +{ +public: + enum { Type=NodeType_Generic }; + + pool *_pool; + + static int N; + +public: + AST(int startToken=0, int count=1); + virtual ~AST() { --N; } + + inline int startToken() const + { return m_startToken; } + + inline int endToken() const + { return m_endToken; } + + inline void setPosition(int startToken, int endToken) + { + m_startToken = startToken; + m_endToken = endToken; + } + + inline int nodeType() const + { return m_nodeType; } + + inline void setNodeType(int nodeType) + { m_nodeType = nodeType; } + + inline AST *parent() const + { return m_parent; } + + void setParent(AST *parent); + + inline List<AST *> *children() const + { return m_children; } + + void appendChild(AST *child); + void removeChild(AST *child); + +// ### move + inline Scope *scope() const + { + if (m_scope) + return m_scope; + + return m_parent ? m_parent->scope() : 0; + } + + inline void setScope(Scope *scope) + { m_scope = scope; } + +private: + Scope *m_scope; + int m_nodeType; + int m_startToken; + int m_endToken; + AST *m_parent; + List<AST *> *m_children; + +private: + AST(const AST &source); + void operator = (const AST &source); +}; + +class AbstractExpressionAST: public AST +{ +public: + enum { Type = NodeType_Expression }; + + AbstractExpressionAST(); + + inline Symbol *symbol() const + { return m_symbol; } + + inline void setSymbol(Symbol *symbol) + { m_symbol = symbol; } + +private: + Symbol *m_symbol; +}; + +// ### remove me +template <int kind, class Base = AbstractExpressionAST> +class ExpressionAST: public Base +{ +public: + enum { Type = kind }; + +public: + inline ExpressionAST() {} + +private: + ExpressionAST(const ExpressionAST &source); + void operator = (const ExpressionAST &source); +}; + +class BinaryExpressionAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_BinaryExpression }; + +public: + BinaryExpressionAST(); + + inline AST *op() const + { return m_op; } + + inline AbstractExpressionAST *leftExpression() const + { return m_left; } + + inline AbstractExpressionAST *rightExpression() const + { return m_right; } + + void setOp(AST *op); + void setLeftExpression(AbstractExpressionAST *left); + void setRightExpression(AbstractExpressionAST *right); + +private: + AST *m_op; + AbstractExpressionAST *m_left; + AbstractExpressionAST *m_right; + +private: + BinaryExpressionAST(const BinaryExpressionAST &source); + void operator = (const BinaryExpressionAST &source); +}; + +class ConditionalExpressionAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_ConditionalExpression }; + +public: + ConditionalExpressionAST(); + + inline AbstractExpressionAST *condition() const + { return m_condition; } + + inline AbstractExpressionAST *leftExpression() const + { return m_left; } + + inline AbstractExpressionAST *rightExpression() const + { return m_right; } + + void setCondition(AbstractExpressionAST *condition); + void setLeftExpression(AbstractExpressionAST *left); + void setRightExpression(AbstractExpressionAST *right); + +private: + AbstractExpressionAST *m_condition; + AbstractExpressionAST *m_left; + AbstractExpressionAST *m_right; + +private: + ConditionalExpressionAST(const ConditionalExpressionAST& source); + void operator = (const ConditionalExpressionAST &source); +}; + + +// +// postfix expression +// + +class SubscriptingAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_Subscripting }; + +public: + SubscriptingAST(); + + inline AbstractExpressionAST *expression() const + { return m_expression; } + + inline AbstractExpressionAST *subscript() const + { return m_subscript; } + + void setExpression(AbstractExpressionAST *expression); + void setSubscript(AbstractExpressionAST *subscript); + +private: + AbstractExpressionAST *m_expression; + AbstractExpressionAST *m_subscript; + +private: + SubscriptingAST(const SubscriptingAST &source); + void operator = (const SubscriptingAST &source); +}; + +class FunctionCallAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_FunctionCall }; + +public: + FunctionCallAST(); + + inline AbstractExpressionAST *expression() const + { return m_expression; } + + inline AbstractExpressionAST *arguments() const + { return m_arguments; } + + void setExpression(AbstractExpressionAST *expression); + void setArguments(AbstractExpressionAST *arguments); + +private: + AbstractExpressionAST *m_expression; + AbstractExpressionAST *m_arguments; + +private: + FunctionCallAST(const FunctionCallAST &source); + void operator = (const FunctionCallAST &source); +}; + +class ExplicitTypeConversionAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_ExplicitTypeConversion }; + +public: + ExplicitTypeConversionAST(); + +private: + ExplicitTypeConversionAST(const ExplicitTypeConversionAST &source); + void operator = (const ExplicitTypeConversionAST &source); +}; + +class PseudoDestructorCallAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_PseudoConstructorCall }; + +public: + PseudoDestructorCallAST(); + +private: + PseudoDestructorCallAST(const PseudoDestructorCallAST &source); + void operator = (const PseudoDestructorCallAST &source); +}; + +class ClassMemberAccessAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_ClassMemberAccess }; + +public: + ClassMemberAccessAST(); + + inline AST *op() const + { return m_op; } + + inline AbstractExpressionAST *expression() const + { return m_expression; } + + inline NameAST *name() const + { return m_name; } + + void setOp(AST *op); + void setExpression(AbstractExpressionAST *expression); + void setName(NameAST *name); + +private: + AST *m_op; + AbstractExpressionAST *m_expression; + AST *m_templ; + NameAST *m_name; + +private: + ClassMemberAccessAST(const ClassMemberAccessAST &source); + void operator = (const ClassMemberAccessAST &source); +}; + +class IncrDecrAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_IncrDecr }; + +public: + IncrDecrAST(); + + inline AST *op() const + { return m_op; } + + inline AbstractExpressionAST *expression() const + { return m_expression; } + + void setOp(AST *op); + void setExpression(AbstractExpressionAST *expression); + +private: + AST *m_op; + AbstractExpressionAST *m_expression; + +private: + IncrDecrAST(const IncrDecrAST &source); + void operator = (const IncrDecrAST &source); +}; + +class CppCastExpressionAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_CppCastExpression }; + +public: + CppCastExpressionAST(); + + inline AST *castOp() const + { return m_castOp; } + + inline AST *typeId() const + { return m_typeId; } + + inline AbstractExpressionAST *expression() const + { return m_expression; } + + void setCastOp(AST *castOp); + void setTypeId(AST *typeId); + void setExpression(AbstractExpressionAST *expression); + +private: + AST *m_castOp; + AST *m_typeId; + AbstractExpressionAST *m_expression; + +private: + CppCastExpressionAST(const CppCastExpressionAST &source); + void operator = (const CppCastExpressionAST &source); +}; + +class TypeIdentificationAST: public AbstractExpressionAST +{ +public: + enum { Type = NodeType_TypeIdentification }; + +public: + TypeIdentificationAST(); + +private: + TypeIdentificationAST(const TypeIdentificationAST &source); + void operator = (const TypeIdentificationAST &source); +}; + +class TypeIdAST: public AST +{ +public: + enum { Type = NodeType_TypeId }; + +public: + TypeIdAST(); + + inline TypeSpecifierAST *typeSpecifier() const + { return m_typeSpecifier; } + + inline DeclaratorAST *declarator() const + { return m_declarator; } + + void setTypeSpecifier(TypeSpecifierAST *typeSpecifier); + void setDeclarator(DeclaratorAST *declarator); + +private: + TypeSpecifierAST *m_typeSpecifier; + DeclaratorAST *m_declarator; + +private: + TypeIdAST(const TypeIdAST &source); + void operator = (const TypeIdAST &source); +}; + +class StatementAST: public AST +{ +public: + enum { Type = NodeType_Statement }; +}; + +class TemplateArgumentListAST: public AST +{ +public: + enum { Type = NodeType_TemplateArgumentList }; + +public: + TemplateArgumentListAST(); + + void addArgument(AST *arg); + inline List<AST *> *argumentList() const { return m_argumentList; } + +private: + List<AST *> *m_argumentList; + +private: + TemplateArgumentListAST(const TemplateArgumentListAST &source); + void operator = (const TemplateArgumentListAST &source); +}; + +class ClassOrNamespaceNameAST: public AST +{ +public: + enum { Type = NodeType_ClassOrNamespaceName }; + +public: + ClassOrNamespaceNameAST(); + + inline AST *name() const { return m_name; } + void setName(AST *name); + + inline TemplateArgumentListAST *templateArgumentList() const { return m_templateArgumentList; } + void setTemplateArgumentList(TemplateArgumentListAST *templateArgumentList); + +private: + AST* m_name; + TemplateArgumentListAST* m_templateArgumentList; + +private: + ClassOrNamespaceNameAST(const ClassOrNamespaceNameAST &source); + void operator = (const ClassOrNamespaceNameAST &source); +}; + +class NameAST: public AST +{ +public: + enum { Type = NodeType_Name }; + +public: + NameAST(); + + inline bool isGlobal() const { return m_global; } + void setGlobal(bool b); + + void addClassOrNamespaceName(ClassOrNamespaceNameAST *classOrNamespaceName); + inline List<ClassOrNamespaceNameAST *> *classOrNamespaceNameList() const { return m_classOrNamespaceNameList; } + + inline ClassOrNamespaceNameAST *unqualifiedName() const { return m_unqualifiedName; } + void setUnqualifiedName(ClassOrNamespaceNameAST *unqualifiedName); + +private: + bool m_global; + ClassOrNamespaceNameAST* m_unqualifiedName; + List<ClassOrNamespaceNameAST *> *m_classOrNamespaceNameList; + +private: + NameAST(const NameAST &source); + void operator = (const NameAST &source); +}; + +class TypeParameterAST: public AST +{ +public: + enum { Type = NodeType_TypeParameter }; + +public: + TypeParameterAST(); + + inline AST *kind() const { return m_kind; } + void setKind(AST *kind); + + inline class TemplateParameterListAST *templateParameterList() const { return m_templateParameterList; } + void setTemplateParameterList(class TemplateParameterListAST *templateParameterList); + + inline NameAST *name() const { return m_name; } + void setName(NameAST *name); + + inline AST *typeId() const { return m_typeId; } + void setTypeId(AST *typeId); + +private: + AST* m_kind; + class TemplateParameterListAST *m_templateParameterList; + NameAST* m_name; + AST* m_typeId; + +private: + TypeParameterAST(const TypeParameterAST &source); + void operator = (const TypeParameterAST &source); +}; + +class DeclarationAST: public AST +{ +public: + enum { Type = NodeType_Declaration }; + +public: + DeclarationAST(); + +private: + DeclarationAST(const DeclarationAST &source); + void operator = (const DeclarationAST &source); +}; + +class AccessDeclarationAST: public DeclarationAST +{ +public: + enum { Type = NodeType_AccessDeclaration }; + +public: + AccessDeclarationAST(); + + inline List<AST *> *accessList() const { return m_accessList; } + void addAccess(AST *access); + +private: + List<AST *> *m_accessList; + +private: + AccessDeclarationAST(const AccessDeclarationAST &source); + void operator = (const AccessDeclarationAST &source); +}; + +class TypeSpecifierAST: public AST +{ +public: + enum { Type = NodeType_TypeSpecifier }; + +public: + TypeSpecifierAST(); + + inline virtual NameAST *name() const { return m_name; } + virtual void setName(NameAST *name); + + inline AST *cvQualify() const { return m_cvQualify; } + void setCvQualify(AST *cvQualify); + + inline AST *cv2Qualify() const { return m_cv2Qualify; } + void setCv2Qualify(AST *cv2Qualify); + +private: + NameAST* m_name; + AST* m_cvQualify; + AST* m_cv2Qualify; + +private: + TypeSpecifierAST(const TypeSpecifierAST &source); + void operator = (const TypeSpecifierAST &source); +}; + +class BaseSpecifierAST: public AST +{ +public: + enum { Type = NodeType_BaseSpecifier }; + +public: + BaseSpecifierAST(); + + inline AST *isVirtual() const { return m_isVirtual; } + void setIsVirtual(AST *isVirtual); + + inline AST *access() const { return m_access; } + void setAccess(AST *access); + + inline NameAST *name() const { return m_name; } + void setName(NameAST *name); + +private: + AST* m_isVirtual; + AST* m_access; + NameAST* m_name; + +private: + BaseSpecifierAST(const BaseSpecifierAST &source); + void operator = (const BaseSpecifierAST &source); +}; + +class BaseClauseAST: public AST +{ +public: + enum { Type = NodeType_BaseClause }; + +public: + BaseClauseAST(); + + void addBaseSpecifier(BaseSpecifierAST *baseSpecifier); + inline List<BaseSpecifierAST *> *baseSpecifierList() const { return m_baseSpecifierList; } + +private: + List<BaseSpecifierAST *> *m_baseSpecifierList; + +private: + BaseClauseAST(const BaseClauseAST &source); + void operator = (const BaseClauseAST &source); +}; + +class ClassSpecifierAST: public TypeSpecifierAST +{ +public: + enum { Type = NodeType_ClassSpecifier }; + +public: + ClassSpecifierAST(); + + inline AST *winDeclSpec() const { return m_winDeclSpec; } + void setWinDeclSpec(AST *winDeclSpec); + + inline AST *classKey() const { return m_classKey; } + void setClassKey(AST *classKey); + + inline BaseClauseAST *baseClause() const { return m_baseClause; } + void setBaseClause(BaseClauseAST *baseClause); + + inline List<DeclarationAST *> *declarationList() const { return m_declarationList; } + void addDeclaration(DeclarationAST *declaration); + +private: + AST* m_winDeclSpec; + AST* m_classKey; + BaseClauseAST* m_baseClause; + List<DeclarationAST *> *m_declarationList; + +private: + ClassSpecifierAST(const ClassSpecifierAST &source); + void operator = (const ClassSpecifierAST &source); +}; + +class EnumeratorAST: public AST +{ +public: + enum { Type = NodeType_Enumerator }; + +public: + EnumeratorAST(); + + inline AST *id() const { return m_id; } + void setId(AST *id); + + inline AbstractExpressionAST *expression() const { return m_expression; } + void setExpression(AbstractExpressionAST *expr); + +private: + AST* m_id; + AbstractExpressionAST* m_expression; + +private: + EnumeratorAST(const EnumeratorAST &source); + void operator = (const EnumeratorAST &source); +}; + +class EnumSpecifierAST: public TypeSpecifierAST +{ +public: + enum { Type = NodeType_EnumSpecifier }; + +public: + EnumSpecifierAST(); + + void addEnumerator(EnumeratorAST *enumerator); + inline List<EnumeratorAST *> *enumeratorList() const { return m_enumeratorList; } + +private: + List<EnumeratorAST *> *m_enumeratorList; + +private: + EnumSpecifierAST(const EnumSpecifierAST &source); + void operator = (const EnumSpecifierAST &source); +}; + +class ElaboratedTypeSpecifierAST: public TypeSpecifierAST +{ +public: + enum { Type = NodeType_ElaboratedTypeSpecifier }; + +public: + ElaboratedTypeSpecifierAST(); + + inline AST *kind() const { return m_kind; } + void setKind(AST *kind); + +private: + AST* m_kind; + +private: + ElaboratedTypeSpecifierAST(const ElaboratedTypeSpecifierAST &source); + void operator = (const ElaboratedTypeSpecifierAST &source); +}; + + +class LinkageBodyAST: public AST +{ +public: + enum { Type = NodeType_LinkageBody }; + +public: + LinkageBodyAST(); + + void addDeclaration(DeclarationAST *ast); + inline List<DeclarationAST *> *declarationList() const { return m_declarationList; } + +private: + List<DeclarationAST *> *m_declarationList; + +private: + LinkageBodyAST(const LinkageBodyAST &source); + void operator = (const LinkageBodyAST &source); +}; + +class LinkageSpecificationAST: public DeclarationAST +{ +public: + enum { Type = NodeType_LinkageSpecification }; + +public: + LinkageSpecificationAST(); + + inline AST *externType() const { return m_externType; } + void setExternType(AST *externType); + + inline LinkageBodyAST *linkageBody() const { return m_linkageBody; } + void setLinkageBody(LinkageBodyAST *linkageBody); + + inline DeclarationAST *declaration() const { return m_declaration; } + void setDeclaration(DeclarationAST *decl); + +private: + AST* m_externType; + LinkageBodyAST* m_linkageBody; + DeclarationAST* m_declaration; + +private: + LinkageSpecificationAST(const LinkageSpecificationAST &source); + void operator = (const LinkageSpecificationAST &source); +}; + +class NamespaceAST: public DeclarationAST +{ +public: + enum { Type = NodeType_Namespace }; + +public: + NamespaceAST(); + + inline AST *namespaceName() const { return m_namespaceName; } + void setNamespaceName(AST *namespaceName); + + inline LinkageBodyAST *linkageBody() const { return m_linkageBody; } + void setLinkageBody(LinkageBodyAST *linkageBody); + +private: + AST* m_namespaceName; + LinkageBodyAST* m_linkageBody; + +private: + NamespaceAST(const NamespaceAST &source); + void operator = (const NamespaceAST &source); +}; + +class NamespaceAliasAST: public DeclarationAST +{ +public: + enum { Type = NodeType_NamespaceAlias }; + +public: + NamespaceAliasAST(); + + inline AST *namespaceName() const { return m_namespaceName; } + void setNamespaceName(AST *name); + + inline NameAST *aliasName() const { return m_aliasName; } + void setAliasName(NameAST *name); + +private: + AST* m_namespaceName; + NameAST* m_aliasName; + +private: + NamespaceAliasAST(const NamespaceAliasAST &source); + void operator = (const NamespaceAliasAST &source); +}; + +class UsingAST: public DeclarationAST +{ +public: + enum { Type = NodeType_Using }; + +public: + UsingAST(); + + inline AST *typeName() const { return m_typeName; } + void setTypeName(AST *typeName); + + inline NameAST *name() const { return m_name; } + void setName(NameAST *name); + +private: + AST* m_typeName; + NameAST* m_name; + +private: + UsingAST(const UsingAST &source); + void operator = (const UsingAST &source); +}; + +class UsingDirectiveAST: public DeclarationAST +{ +public: + enum { Type = NodeType_UsingDirective }; + +public: + UsingDirectiveAST(); + + inline NameAST *name() const { return m_name; } + void setName(NameAST *name); + +private: + NameAST* m_name; + +private: + UsingDirectiveAST(const UsingDirectiveAST &source); + void operator = (const UsingDirectiveAST &source); +}; + +class DeclaratorAST: public AST +{ +public: + enum { Type = NodeType_Declarator }; + +public: + DeclaratorAST(); + + inline List<AST *> *ptrOpList() const { return m_ptrOpList; } + void addPtrOp(AST *ptrOp); + + inline DeclaratorAST *subDeclarator() const { return m_subDeclarator; } + void setSubDeclarator(DeclaratorAST *subDeclarator); + + inline NameAST *declaratorId() const { return m_declaratorId; } + void setDeclaratorId(NameAST *declaratorId); + + inline AST *bitfieldInitialization() const { return m_bitfieldInitialization; } + void setBitfieldInitialization(AST *bitfieldInitialization); + + inline List<AST *> *arrayDimensionList() const { return m_arrayDimensionList; } + void addArrayDimension(AST *arrayDimension); + + inline class ParameterDeclarationClauseAST *parameterDeclarationClause() const { return m_parameterDeclarationClause; } + void setParameterDeclarationClause(class ParameterDeclarationClauseAST *parameterDeclarationClause); + + // ### replace 'constant' with cvQualify + inline AST *constant() const { return m_constant; } + void setConstant(AST *constant); + + inline AST *exceptionSpecification() const { return m_exceptionSpecification; } + void setExceptionSpecification(AST *exceptionSpecification); + +private: + List<AST *> *m_ptrOpList; + DeclaratorAST * m_subDeclarator; + NameAST* m_declaratorId; + AST* m_bitfieldInitialization; + List<AST *> *m_arrayDimensionList; + class ParameterDeclarationClauseAST * m_parameterDeclarationClause; + AST* m_constant; + AST* m_exceptionSpecification; + +private: + DeclaratorAST(const DeclaratorAST &source); + void operator = (const DeclaratorAST &source); +}; + +class ParameterDeclarationAST: public AST +{ +public: + enum { Type = NodeType_ParameterDeclaration }; + +public: + ParameterDeclarationAST(); + + inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; } + void setTypeSpec(TypeSpecifierAST *typeSpec); + + inline DeclaratorAST *declarator() const { return m_declarator; } + void setDeclarator(DeclaratorAST *declarator); + + inline AbstractExpressionAST *expression() const { return m_expression; } + void setExpression(AbstractExpressionAST *expression); + +private: + TypeSpecifierAST* m_typeSpec; + DeclaratorAST* m_declarator; + AbstractExpressionAST* m_expression; + +private: + ParameterDeclarationAST(const ParameterDeclarationAST &source); + void operator = (const ParameterDeclarationAST &source); +}; + +class ParameterDeclarationListAST: public AST +{ +public: + enum { Type = NodeType_ParameterDeclarationList }; + +public: + ParameterDeclarationListAST(); + + inline List<ParameterDeclarationAST *> *parameterList() const { return m_parameterList; } + void addParameter(ParameterDeclarationAST *parameter); + +private: + List<ParameterDeclarationAST *> *m_parameterList; + +private: + ParameterDeclarationListAST(const ParameterDeclarationListAST &source); + void operator = (const ParameterDeclarationListAST &source); +}; + +class ParameterDeclarationClauseAST: public AST +{ +public: + enum { Type = NodeType_ParameterDeclarationClause }; + +public: + ParameterDeclarationClauseAST(); + + inline ParameterDeclarationListAST *parameterDeclarationList() const { return m_parameterDeclarationList; } + void setParameterDeclarationList(ParameterDeclarationListAST *parameterDeclarationList); + + inline AST *ellipsis() const { return m_ellipsis; } + void setEllipsis(AST *ellipsis); + +private: + ParameterDeclarationListAST* m_parameterDeclarationList; + AST* m_ellipsis; + +private: + ParameterDeclarationClauseAST(const ParameterDeclarationClauseAST &source); + void operator = (const ParameterDeclarationClauseAST &source); +}; + + +class InitDeclaratorAST: public AST +{ +public: + enum { Type = NodeType_InitDeclarator }; + +public: + InitDeclaratorAST(); + + inline DeclaratorAST *declarator() const { return m_declarator; } + void setDeclarator(DeclaratorAST *declarator); + + inline AST *initializer() const { return m_initializer; } + void setInitializer(AST *initializer); + +private: + DeclaratorAST* m_declarator; + AST* m_initializer; + +private: + InitDeclaratorAST(const InitDeclaratorAST &source); + void operator = (const InitDeclaratorAST &source); +}; + +class InitDeclaratorListAST: public AST +{ +public: + enum { Type = NodeType_InitDeclaratorList }; + +public: + InitDeclaratorListAST(); + + inline List<InitDeclaratorAST *> *initDeclaratorList() const { return m_initDeclaratorList; } + void addInitDeclarator(InitDeclaratorAST *decl); + +private: + List<InitDeclaratorAST *> *m_initDeclaratorList; + +private: + InitDeclaratorListAST(const InitDeclaratorListAST &source); + void operator = (const InitDeclaratorListAST &source); +}; + +class TypedefAST: public DeclarationAST +{ +public: + enum { Type = NodeType_Typedef }; + +public: + TypedefAST(); + + inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; } + void setTypeSpec(TypeSpecifierAST *typeSpec); + + inline InitDeclaratorListAST *initDeclaratorList() const { return m_initDeclaratorList; } + void setInitDeclaratorList(InitDeclaratorListAST *initDeclaratorList); + +private: + TypeSpecifierAST* m_typeSpec; + InitDeclaratorListAST* m_initDeclaratorList; + +private: + void operator = (const TypedefAST &source); +}; + +class TemplateParameterAST: public AST +{ +public: + enum { Type = NodeType_TemplateParameter }; + +public: + TemplateParameterAST(); + + inline TypeParameterAST *typeParameter() const { return m_typeParameter; } + void setTypeParameter(TypeParameterAST *typeParameter); + + inline ParameterDeclarationAST *typeValueParameter() const { return m_typeValueParameter; } + void setTypeValueParameter(ParameterDeclarationAST *typeValueParameter); + +private: + TypeParameterAST* m_typeParameter; + ParameterDeclarationAST* m_typeValueParameter; + +private: + TemplateParameterAST(const TemplateParameterAST &source); + void operator = (const TemplateParameterAST &source); +}; + +class TemplateParameterListAST: public AST +{ +public: + enum { Type = NodeType_TemplateParameterList }; + +public: + TemplateParameterListAST(); + + inline List<TemplateParameterAST *> *templateParameterList() const { return m_templateParameterList; } + void addTemplateParameter(TemplateParameterAST *templateParameter); + +private: + List<TemplateParameterAST *> *m_templateParameterList; + +private: + TemplateParameterListAST(const TemplateParameterListAST &source); + void operator = (const TemplateParameterListAST &source); +}; + +class TemplateDeclarationAST: public DeclarationAST +{ +public: + enum { Type = NodeType_TemplateDeclaration }; + +public: + TemplateDeclarationAST(); + + inline AST *exported() const { return m_exported; } + void setExported(AST *exported); + + inline TemplateParameterListAST *templateParameterList() const { return m_templateParameterList; } + void setTemplateParameterList(TemplateParameterListAST *templateParameterList); + + inline DeclarationAST *declaration() const { return m_declaration; } + void setDeclaration(DeclarationAST *declaration); + +private: + AST* m_exported; + TemplateParameterListAST* m_templateParameterList; + DeclarationAST* m_declaration; + +private: + TemplateDeclarationAST(const TemplateDeclarationAST &source); + void operator = (const TemplateDeclarationAST &source); +}; + +class SimpleDeclarationAST: public DeclarationAST +{ +public: + enum { Type = NodeType_SimpleDeclaration }; + +public: + SimpleDeclarationAST(); + + inline AST *functionSpecifier() const { return m_functionSpecifier; } + void setFunctionSpecifier(AST *functionSpecifier); + + inline AST *storageSpecifier() const { return m_storageSpecifier; } + void setStorageSpecifier(AST *storageSpecifier); + + inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; } + void setTypeSpec(TypeSpecifierAST *typeSpec); + + inline InitDeclaratorListAST *initDeclaratorList() const { return m_initDeclaratorList; } + void setInitDeclaratorList(InitDeclaratorListAST *initDeclaratorList); + + inline AST *winDeclSpec() const { return m_winDeclSpec; } + void setWinDeclSpec(AST *winDeclSpec); + +private: + AST* m_functionSpecifier; + AST* m_storageSpecifier; + TypeSpecifierAST* m_typeSpec; + InitDeclaratorListAST* m_initDeclaratorList; + AST* m_winDeclSpec; + +private: + SimpleDeclarationAST(const SimpleDeclarationAST &source); + void operator = (const SimpleDeclarationAST &source); +}; + +class ExpressionStatementAST: public StatementAST +{ +public: + enum { Type = NodeType_ExpressionStatement }; + +public: + ExpressionStatementAST(); + + inline AbstractExpressionAST *expression() const { return m_expression; } + void setExpression(AbstractExpressionAST *expression); + +private: + AbstractExpressionAST* m_expression; + +private: + ExpressionStatementAST(const ExpressionStatementAST &source); + void operator = (const ExpressionStatementAST &source); +}; + +class ReturnStatementAST: public StatementAST +{ +public: + enum { Type = NodeType_ReturnStatement }; + +public: + ReturnStatementAST(); + + inline AbstractExpressionAST *expression() const { return m_expression; } + void setExpression(AbstractExpressionAST *expression); + +private: + AbstractExpressionAST* m_expression; + +private: + ReturnStatementAST(const ReturnStatementAST &source); + void operator = (const ReturnStatementAST &source); +}; + + +class ConditionAST: public AST +{ +public: + enum { Type = NodeType_Condition }; + +public: + ConditionAST(); + + inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; } + void setTypeSpec(TypeSpecifierAST *typeSpec); + + inline DeclaratorAST *declarator() const { return m_declarator; } + void setDeclarator(DeclaratorAST *declarator); + + inline AbstractExpressionAST *expression() const { return m_expression; } + void setExpression(AbstractExpressionAST *expression); + +private: + TypeSpecifierAST* m_typeSpec; + DeclaratorAST* m_declarator; + AbstractExpressionAST* m_expression; + +private: + ConditionAST(const ConditionAST &source); + void operator = (const ConditionAST &source); +}; + +class IfStatementAST: public StatementAST +{ +public: + enum { Type = NodeType_IfStatement }; + +public: + IfStatementAST(); + + inline ConditionAST *condition() const { return m_condition; } + void setCondition(ConditionAST *condition); + + inline StatementAST *statement() const { return m_statement; } + void setStatement(StatementAST *statement); + + inline StatementAST *elseStatement() const { return m_elseStatement; } + void setElseStatement(StatementAST *statement); + +private: + ConditionAST* m_condition; + StatementAST* m_statement; + StatementAST* m_elseStatement; + +private: + IfStatementAST(const IfStatementAST &source); + void operator = (const IfStatementAST &source); +}; + +class WhileStatementAST: public StatementAST +{ +public: + enum { Type = NodeType_WhileStatement }; + +public: + WhileStatementAST(); + + inline ConditionAST *condition() const { return m_condition; } + void setCondition(ConditionAST *condition); + + inline StatementAST *statement() const { return m_statement; } + void setStatement(StatementAST *statement); + +private: + ConditionAST* m_condition; + StatementAST* m_statement; + +private: + WhileStatementAST(const WhileStatementAST &source); + void operator = (const WhileStatementAST &source); +}; + +class DoStatementAST: public StatementAST +{ +public: + enum { Type = NodeType_DoStatement }; + +public: + DoStatementAST(); + + inline ConditionAST *condition() const { return m_condition; } + void setCondition(ConditionAST *condition); + + inline StatementAST *statement() const { return m_statement; } + void setStatement(StatementAST *statement); + +private: + ConditionAST* m_condition; + StatementAST* m_statement; + +private: + DoStatementAST(const DoStatementAST &source); + void operator = (const DoStatementAST &source); +}; + +class ForStatementAST: public StatementAST +{ +public: + enum { Type = NodeType_ForStatement }; + +public: + ForStatementAST(); + + inline StatementAST *initStatement() const { return m_initStatement; } + void setInitStatement(StatementAST *statement); + + inline ConditionAST *condition() const { return m_condition; } + void setCondition(ConditionAST *condition); + + inline AbstractExpressionAST *expression() const { return m_expression; } + void setExpression(AbstractExpressionAST *expression); + + inline StatementAST *statement() const { return m_statement; } + void setStatement(StatementAST *statement); + +private: + ConditionAST* m_condition; + StatementAST* m_initStatement; + StatementAST* m_statement; + AbstractExpressionAST* m_expression; + +private: + ForStatementAST(const ForStatementAST &source); + void operator = (const ForStatementAST &source); +}; + +class SwitchStatementAST: public StatementAST +{ +public: + enum { Type = NodeType_SwitchStatement }; + +public: + SwitchStatementAST(); + + inline ConditionAST *condition() const { return m_condition; } + void setCondition(ConditionAST *condition); + + inline StatementAST *statement() const { return m_statement; } + void setStatement(StatementAST *statement); + +private: + ConditionAST* m_condition; + StatementAST* m_statement; + +private: + SwitchStatementAST(const SwitchStatementAST &source); + void operator = (const SwitchStatementAST &source); +}; + +class StatementListAST: public StatementAST +{ +public: + enum { Type = NodeType_StatementList }; + +public: + StatementListAST(); + + inline List<StatementAST *> *statementList() const { return m_statementList; } + void addStatement(StatementAST *statement); + +private: + List<StatementAST *> *m_statementList; + +private: + StatementListAST(const StatementListAST &source); + void operator = (const StatementListAST &source); +}; + +class DeclarationStatementAST: public StatementAST +{ +public: + enum { Type = NodeType_DeclarationStatement }; + +public: + DeclarationStatementAST(); + + inline DeclarationAST *declaration() const { return m_declaration; } + void setDeclaration(DeclarationAST *declaration); + +private: + DeclarationAST* m_declaration; + +private: + DeclarationStatementAST(const DeclarationStatementAST &source); + void operator = (const DeclarationStatementAST &source); +}; + +/* + LabeledStatementAST: + case constant-expression : statement + default : statement (expression is 0) +*/ +class LabeledStatementAST: public StatementAST +{ +public: + enum { Type = NodeType_LabeledStatement }; +public: + LabeledStatementAST(); + + inline StatementAST *statement() const { return m_statement; } + void setStatement(StatementAST *statement); + + inline AbstractExpressionAST *expression() const { return m_expression; } + void setExpression(AbstractExpressionAST *expression); +private: + StatementAST* m_statement; + AbstractExpressionAST *m_expression; + +private: + LabeledStatementAST(const LabeledStatementAST &source); + void operator = (const LabeledStatementAST &source); +}; + +class FunctionDefinitionAST: public DeclarationAST +{ +public: + enum { Type = NodeType_FunctionDefinition }; + +public: + FunctionDefinitionAST(); + + inline AST *functionSpecifier() const { return m_functionSpecifier; } + void setFunctionSpecifier(AST *functionSpecifier); + + inline AST *storageSpecifier() const { return m_storageSpecifier; } + void setStorageSpecifier(AST *storageSpecifier); + + inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; } + void setTypeSpec(TypeSpecifierAST *typeSpec); + + inline InitDeclaratorAST *initDeclarator() const { return m_initDeclarator; } + void setInitDeclarator(InitDeclaratorAST *initDeclarator); + + inline StatementListAST *functionBody() const { return m_functionBody; } + void setFunctionBody(StatementListAST *functionBody); + + inline AST *winDeclSpec() const { return m_winDeclSpec; } + void setWinDeclSpec(AST *winDeclSpec); + +private: + AST* m_functionSpecifier; + AST* m_storageSpecifier; + TypeSpecifierAST* m_typeSpec; + InitDeclaratorAST* m_initDeclarator; + StatementListAST* m_functionBody; + AST* m_winDeclSpec; + +private: + FunctionDefinitionAST(const FunctionDefinitionAST &source); + void operator = (const FunctionDefinitionAST &source); +}; + +class TranslationUnitAST: public AST +{ +public: + enum { Type = NodeType_TranslationUnit }; + +public: + TranslationUnitAST(); + + void addDeclaration(DeclarationAST *ast); + inline List<DeclarationAST *> *declarationList() const { return m_declarationList; } + +private: + List<DeclarationAST *> *m_declarationList; + +private: + TranslationUnitAST(const TranslationUnitAST &source); + void operator = (const TranslationUnitAST &source); +}; + +template <class T> T* CreateNode(pool *p) +{ + T* node = new (p->allocate(sizeof(T))) T; + node->setNodeType(T::Type); + node->_pool = p; + return node; +} + +template <int kind> ExpressionAST<kind> *CreateExpression(pool *p) +{ + ExpressionAST<kind>* node = new (p->allocate(sizeof(ExpressionAST<kind>))) ExpressionAST<kind>; + node->setNodeType(kind); + node->_pool = p; + return node; +} + +/* +template <typename T> +inline List<T *> *snoc(List<T *> *e, T *d, pool *p) +{ if (!e) e = new (p->allocate(sizeof(List<T*>))) List<T *>(p); e->append(d); return e; } +*/ + +//Workaround for ICE on MSVC, use macro instead of template. +#define SNOC(ListType, ListValueType) \ +inline ListType *snoc(ListType *e, ListValueType *d, pool *p) \ +{ if (!e) e = new (p->allocate(sizeof(ListType))) ListType(p); e->append(d); return e; } + +SNOC(List<AST *>, AST) +SNOC(List<ClassOrNamespaceNameAST *>, ClassOrNamespaceNameAST) +SNOC(List<BaseSpecifierAST *>, BaseSpecifierAST) +SNOC(List<DeclarationAST *>, DeclarationAST) +SNOC(List<EnumeratorAST *>, EnumeratorAST) +SNOC(List<ParameterDeclarationAST *>, ParameterDeclarationAST) +SNOC(List<InitDeclaratorAST *>, InitDeclaratorAST) +SNOC(List<TemplateParameterAST *>, TemplateParameterAST) +SNOC(List<StatementAST *>, StatementAST) + +QT_END_NAMESPACE + +#endif // AST_H |