summaryrefslogtreecommitdiff
path: root/cpp/src/Transform/Node.cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2003-10-22 00:53:41 +0000
committerMark Spruiell <mes@zeroc.com>2003-10-22 00:53:41 +0000
commit58ee57d8c0da60d3d636d550e9a84a3f5f155833 (patch)
treefc17865ef9e7a3f0a88c354c288599f39af9c500 /cpp/src/Transform/Node.cpp
parent. (diff)
downloadice-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.cpp125
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
//