blob: b760f2bd368fd588a259337d49b1d594b51fa3a2 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2001-2004 Roberto Raggi
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the qt3to4 porting application of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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.1, 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.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $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