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>
|
2011-11-26 01:41:36 +04:00
|
|
|
#include <boost/foreach.hpp>
|
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-11-26 01:41:36 +04:00
|
|
|
Response Traverser::traverse(const AbstractNode &node, const State &state)
|
2011-08-04 06:58:17 +04:00
|
|
|
{
|
2010-03-02 21:22:31 +03:00
|
|
|
State newstate = state;
|
|
|
|
newstate.setNumChildren(node.getChildren().size());
|
|
|
|
|
2012-10-31 19:35:36 +04:00
|
|
|
Response response = ContinueTraversal;
|
2010-03-02 21:22:31 +03:00
|
|
|
if (traversaltype == PREFIX || traversaltype == PRE_AND_POSTFIX) {
|
|
|
|
newstate.setPrefix(true);
|
|
|
|
newstate.setParent(state.parent());
|
2011-11-26 01:41:36 +04:00
|
|
|
response = node.accept(newstate, this->visitor);
|
2010-03-02 21:22:31 +03:00
|
|
|
}
|
2011-11-26 01:41:36 +04:00
|
|
|
|
|
|
|
// Pruned traversals mean don't traverse children
|
|
|
|
if (response == ContinueTraversal) {
|
|
|
|
newstate.setParent(&node);
|
|
|
|
BOOST_FOREACH(const AbstractNode *chnode, node.getChildren()) {
|
|
|
|
response = this->traverse(*chnode, newstate);
|
|
|
|
if (response == AbortTraversal) return response; // Abort immediately
|
|
|
|
}
|
2010-03-02 21:22:31 +03:00
|
|
|
}
|
2011-11-26 01:41:36 +04:00
|
|
|
|
|
|
|
// Postfix is executed for all non-aborted traversals
|
|
|
|
if (response != AbortTraversal) {
|
|
|
|
if (traversaltype == POSTFIX || traversaltype == PRE_AND_POSTFIX) {
|
|
|
|
newstate.setParent(state.parent());
|
|
|
|
newstate.setPrefix(false);
|
|
|
|
newstate.setPostfix(true);
|
|
|
|
response = node.accept(newstate, this->visitor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (response != AbortTraversal) response = ContinueTraversal;
|
|
|
|
return response;
|
2010-03-02 21:22:31 +03:00
|
|
|
}
|