summaryrefslogtreecommitdiff
path: root/src/traverser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/traverser.cc')
-rw-r--r--src/traverser.cc44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/traverser.cc b/src/traverser.cc
new file mode 100644
index 0000000..a87449b
--- /dev/null
+++ b/src/traverser.cc
@@ -0,0 +1,44 @@
+#include "traverser.h"
+#include "visitor.h"
+#include "node.h"
+#include "state.h"
+#include <algorithm>
+
+void Traverser::execute()
+{
+ State state(NULL);
+ traverse(this->root, state);
+}
+
+struct TraverseNode
+{
+ Traverser *traverser;
+ const State &state;
+ TraverseNode(Traverser *traverser, const State &state) :
+ traverser(traverser), state(state) {}
+ void operator()(const AbstractNode *node) { traverser->traverse(*node, state); }
+};
+
+void Traverser::traverse(const AbstractNode &node, const State &state)
+{
+ // FIXME: Handle abort
+
+ State newstate = state;
+ newstate.setNumChildren(node.getChildren().size());
+
+ if (traversaltype == PREFIX || traversaltype == PRE_AND_POSTFIX) {
+ newstate.setPrefix(true);
+ newstate.setParent(state.parent());
+ node.accept(newstate, this->visitor);
+ }
+
+ newstate.setParent(&node);
+ std::for_each(node.getChildren().begin(), node.getChildren().end(), TraverseNode(this, newstate));
+
+ if (traversaltype == POSTFIX || traversaltype == PRE_AND_POSTFIX) {
+ newstate.setParent(state.parent());
+ newstate.setPrefix(false);
+ newstate.setPostfix(true);
+ node.accept(newstate, this->visitor);
+ }
+}
contact: Jan Huwald // Impressum