diff options
author | Mark Spruiell <mes@zeroc.com> | 2003-10-22 00:53:41 +0000 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2003-10-22 00:53:41 +0000 |
commit | 58ee57d8c0da60d3d636d550e9a84a3f5f155833 (patch) | |
tree | fc17865ef9e7a3f0a88c354c288599f39af9c500 /cpp/src/Transform/Node.cpp | |
parent | . (diff) | |
download | ice-58ee57d8c0da60d3d636d550e9a84a3f5f155833.tar.bz2 ice-58ee57d8c0da60d3d636d550e9a84a3f5f155833.tar.xz ice-58ee57d8c0da60d3d636d550e9a84a3f5f155833.zip |
adding dictionary/sequence element access to grammar
Diffstat (limited to 'cpp/src/Transform/Node.cpp')
-rw-r--r-- | cpp/src/Transform/Node.cpp | 125 |
1 files changed, 110 insertions, 15 deletions
diff --git a/cpp/src/Transform/Node.cpp b/cpp/src/Transform/Node.cpp index 0c4948f72dd..57b1f426751 100644 --- a/cpp/src/Transform/Node.cpp +++ b/cpp/src/Transform/Node.cpp @@ -16,17 +16,54 @@ using namespace std; -ostream& -operator<<(ostream& os, const Transform::Identifier& id) +namespace Transform +{ + +class EntityNodePrinter : public EntityNodeVisitor { - for(Transform::Identifier::const_iterator p = id.begin(); p != id.end(); ++p) +public: + + EntityNodePrinter(ostream& os) : + _os(os), _first(true) { - if(p != id.begin()) + } + + virtual void + visitIdentifier(const std::string& name) + { + if(_first) + { + _first = false; + } + else { - os << '.'; + _os << '.'; } - os << *p; + _os << name; + } + + virtual void + visitElement(const NodePtr& value) + { + assert(!_first); + _os << '['; + value->print(_os); + _os << ']'; } + +private: + + ostream& _os; + bool _first; +}; + +} // End of namespace Transform + +ostream& +operator<<(ostream& os, const Transform::EntityNodePtr& entity) +{ + Transform::EntityNodePrinter printer(os); + entity->visit(printer); return os; } @@ -406,38 +443,96 @@ Transform::DataNode::print(ostream& os) const } // -// IdentNode +// EntityNodeVisitor // -Transform::IdentNode::IdentNode(const Identifier& value) : - _value(value) +Transform::EntityNodeVisitor::~EntityNodeVisitor() { } +// +// EntityNode +// Transform::DataPtr -Transform::IdentNode::evaluate(SymbolTable& st) +Transform::EntityNode::evaluate(SymbolTable& st) { - DataPtr result = st.getValue(_value); + DataPtr result = st.getValue(this); if(!result) { ostringstream ostr; print(ostr); - throw EvaluateException(__FILE__, __LINE__, "unknown identifier `" + ostr.str() + "'"); + throw EvaluateException(__FILE__, __LINE__, "unknown entity `" + ostr.str() + "'"); } return result; } void -Transform::IdentNode::print(ostream& os) const +Transform::EntityNode::print(ostream& os) const +{ + EntityNodePrinter printer(os); + visit(printer); +} + +void +Transform::EntityNode::append(const EntityNodePtr& next) +{ + if(_next) + { + _next->append(next); + } + else + { + _next = next; + } +} + +// +// IdentNode +// +Transform::IdentNode::IdentNode(const string& value) : + _value(value) { - os << _value; } -Transform::Identifier +string Transform::IdentNode::getValue() const { return _value; } +void +Transform::IdentNode::visit(EntityNodeVisitor& visitor) const +{ + visitor.visitIdentifier(_value); + if(_next) + { + _next->visit(visitor); + } +} + +// +// ElementNode +// +Transform::ElementNode::ElementNode(const NodePtr& value) : + _value(value) +{ +} + +Transform::NodePtr +Transform::ElementNode::getValue() const +{ + return _value; +} + +void +Transform::ElementNode::visit(EntityNodeVisitor& visitor) const +{ + visitor.visitElement(_value); + if(_next) + { + _next->visit(visitor); + } +} + // // ConstantNode // |