2010-03-02 21:22:31 +03:00
|
|
|
#include "traverser.h"
|
|
|
|
#include "visitor.h"
|
|
|
|
#include "node.h"
|
|
|
|
#include "state.h"
|
2011-08-04 06:58:17 +04:00
|
|
|
#include <algorithm>
|
2010-03-02 21:22:31 +03:00
|
|
|
|
|
|
|
void Traverser::execute()
|
|
|
|
{
|
|
|
|
State state(NULL);
|
2010-11-08 00:29:34 +03:00
|
|
|
traverse(this->root, state);
|
2010-03-02 21:22:31 +03:00
|
|
|
}
|
|
|
|
|
2011-08-04 06:58:17 +04:00
|
|
|
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); }
|
|
|
|
};
|
|
|
|
|
2010-11-08 00:29:34 +03:00
|
|
|
void Traverser::traverse(const AbstractNode &node, const State &state)
|
2010-03-02 21:22:31 +03:00
|
|
|
{
|
|
|
|
// 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);
|
2011-08-04 06:58:17 +04:00
|
|
|
std::for_each(node.getChildren().begin(), node.getChildren().end(), TraverseNode(this, newstate));
|
2010-03-02 21:22:31 +03:00
|
|
|
|
|
|
|
if (traversaltype == POSTFIX || traversaltype == PRE_AND_POSTFIX) {
|
|
|
|
newstate.setParent(state.parent());
|
|
|
|
newstate.setPrefix(false);
|
|
|
|
newstate.setPostfix(true);
|
|
|
|
node.accept(newstate, this->visitor);
|
|
|
|
}
|
|
|
|
}
|