virtual void visit(NodeVisitor &) = 0;
};
+template<typename T>
+class NodePtr: public RefPtr<T>
+{
+public:
+ NodePtr() { }
+ NodePtr(T *p): RefPtr<T>(p) { }
+ NodePtr(const NodePtr &p): RefPtr<T>(p ? p->clone() : 0) { }
+
+ template<typename U>
+ NodePtr(const RefPtr<U> &p): RefPtr<T>(p) { }
+
+ template<typename U>
+ NodePtr(const NodePtr<U> &p): RefPtr<T>(p ? p->clone() : 0) { }
+};
+
+template<typename C>
+class NodeContainer: public C
+{
+public:
+ NodeContainer() { }
+ NodeContainer(const NodeContainer &);
+};
+
+template<typename T>
+class NodeList: public NodeContainer<std::list<RefPtr<T> > >
+{ };
+
+template<typename T>
+class NodeArray: public NodeContainer<std::vector<RefPtr<T> > >
+{ };
+
struct StructDeclaration;
struct VariableDeclaration;
struct FunctionDeclaration;
struct Block: Node
{
- std::list<RefPtr<Node> > body;
+ NodeList<Node> body;
bool use_braces;
std::map<std::string, StructDeclaration *> types;
std::map<std::string, VariableDeclaration *> variables;
struct ParenthesizedExpression: Expression
{
- RefPtr<Expression> expression;
+ NodePtr<Expression> expression;
virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
virtual void visit(NodeVisitor &);
struct MemberAccess: Expression
{
- RefPtr<Expression> left;
+ NodePtr<Expression> left;
std::string member;
VariableDeclaration *declaration;
struct UnaryExpression: Expression
{
std::string oper;
- RefPtr<Expression> expression;
+ NodePtr<Expression> expression;
bool prefix;
UnaryExpression();
struct BinaryExpression: Expression
{
- RefPtr<Expression> left;
+ NodePtr<Expression> left;
std::string oper;
- RefPtr<Expression> right;
+ NodePtr<Expression> right;
std::string after;
virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
std::string name;
FunctionDeclaration *declaration;
bool constructor;
- std::vector<RefPtr<Expression> > arguments;
+ NodeArray<Expression> arguments;
FunctionCall();
struct ExpressionStatement: Node
{
- RefPtr<Expression> expression;
+ NodePtr<Expression> expression;
virtual ExpressionStatement *clone() const { return new ExpressionStatement(*this); }
virtual void visit(NodeVisitor &);
StructDeclaration *type_declaration;
std::string name;
bool array;
- RefPtr<Expression> array_size;
- RefPtr<Expression> init_expression;
+ NodePtr<Expression> array_size;
+ NodePtr<Expression> init_expression;
VariableDeclaration *linked_declaration;
- RefPtr<Layout> layout;
+ NodePtr<Layout> layout;
VariableDeclaration();
{
std::string return_type;
std::string name;
- std::vector<RefPtr<VariableDeclaration> > parameters;
+ NodeArray<VariableDeclaration> parameters;
FunctionDeclaration *definition;
Block body;
struct Conditional: Node
{
- RefPtr<Expression> condition;
+ NodePtr<Expression> condition;
Block body;
Block else_body;
struct Iteration: Node
{
- RefPtr<Node> init_statement;
- RefPtr<Expression> condition;
- RefPtr<Expression> loop_expression;
+ NodePtr<Node> init_statement;
+ NodePtr<Expression> condition;
+ NodePtr<Expression> loop_expression;
Block body;
virtual Iteration *clone() const { return new Iteration(*this); }
struct Passthrough: Node
{
- RefPtr<Expression> subscript;
+ NodePtr<Expression> subscript;
virtual Passthrough *clone() const { return new Passthrough(*this); }
virtual void visit(NodeVisitor &);
struct Return: Node
{
- RefPtr<Expression> expression;
+ NodePtr<Expression> expression;
virtual Return *clone() const { return new Return(*this); }
virtual void visit(NodeVisitor &);