diff options
Diffstat (limited to 'cpp/src/Transform/Node.h')
-rw-r--r-- | cpp/src/Transform/Node.h | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/cpp/src/Transform/Node.h b/cpp/src/Transform/Node.h index 860448b8017..54d0333eeb7 100644 --- a/cpp/src/Transform/Node.h +++ b/cpp/src/Transform/Node.h @@ -23,7 +23,8 @@ namespace Transform class Node; typedef IceUtil::Handle<Node> NodePtr; -typedef std::vector<std::string> Identifier; +class EntityNode; +typedef IceUtil::Handle<EntityNode> EntityNodePtr; class EvaluateException : public IceUtil::Exception { @@ -34,6 +35,7 @@ public: virtual void ice_print(std::ostream&) const; virtual IceUtil::Exception* ice_clone() const; virtual void ice_throw() const; + std::string reason() const; private: @@ -47,7 +49,7 @@ public: virtual ~SymbolTable(); - virtual DataPtr getValue(const Identifier&) const = 0; + virtual DataPtr getValue(const EntityNodePtr&) const = 0; virtual DataPtr getConstantValue(const std::string&) const = 0; }; @@ -126,24 +128,65 @@ private: DataPtr _data; }; -class IdentNode : public Node +class EntityNodeVisitor { public: - IdentNode(const Identifier&); + virtual ~EntityNodeVisitor(); + + virtual void visitIdentifier(const std::string&) = 0; + virtual void visitElement(const NodePtr&) = 0; +}; + +class EntityNode : public Node +{ +public: virtual DataPtr evaluate(SymbolTable&); virtual void print(std::ostream&) const; - Identifier getValue() const; + virtual void visit(EntityNodeVisitor&) const = 0; + + void append(const EntityNodePtr&); + +protected: + + EntityNodePtr _next; +}; + +class IdentNode : public EntityNode +{ +public: + + IdentNode(const std::string&); + + virtual void visit(EntityNodeVisitor&) const; + + std::string getValue() const; private: - Identifier _value; + std::string _value; }; typedef IceUtil::Handle<IdentNode> IdentNodePtr; +class ElementNode : public EntityNode +{ +public: + + ElementNode(const NodePtr&); + + virtual void visit(EntityNodeVisitor&) const; + + NodePtr getValue() const; + +private: + + NodePtr _value; +}; +typedef IceUtil::Handle<ElementNode> ElementNodePtr; + class ConstantNode : public Node { public: @@ -161,6 +204,6 @@ private: } // End of namespace Transform -std::ostream& operator<<(std::ostream&, const Transform::Identifier&); +std::ostream& operator<<(std::ostream&, const Transform::EntityNodePtr&); #endif |