summaryrefslogtreecommitdiff
path: root/src/traverser.cc
diff options
context:
space:
mode:
authorMarius Kintel <kintel@sim.no>2010-03-02 18:22:31 (GMT)
committerMarius Kintel <marius@kintel.net>2010-10-31 00:42:34 (GMT)
commit393c5a19fedfa4f97ca939fbcf52c2ccab1cde6a (patch)
treefbcb75d32e8763aac3f0ad28528936a0ec11930b /src/traverser.cc
parent746159d1838e895e80725cdc892f7bef85feb1af (diff)
Committed current version of visitor refactoring
Diffstat (limited to 'src/traverser.cc')
-rw-r--r--src/traverser.cc40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/traverser.cc b/src/traverser.cc
new file mode 100644
index 0000000..af29132
--- /dev/null
+++ b/src/traverser.cc
@@ -0,0 +1,40 @@
+#include "traverser.h"
+#include "visitor.h"
+#include "node.h"
+#include "state.h"
+
+void Traverser::execute()
+{
+ State state(NULL);
+ traverse(state, this->root);
+}
+
+void Traverser::traverse(const State &state, const AbstractNode &node)
+{
+ // 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);
+ const std::list<AbstractNode*> &children = node.getChildren();
+ for (std::list<AbstractNode*>::const_iterator iter = children.begin();
+ iter != children.end();
+ iter++) {
+
+ traverse(newstate, **iter);
+ }
+
+ 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