From 6635cd9d849069d93e964ab35566a67cd544a8b5 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 17 Aug 2014 23:39:06 -0400 Subject: [PATCH] Parser - Corrected indirect node insertion, which must be into _tree, not into nodes. --- src/Parser.cpp | 64 ++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/src/Parser.cpp b/src/Parser.cpp index 0d680c259..dd661e827 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -1759,51 +1759,43 @@ bool Parser::insertAnd () { std::vector nodes; collect (nodes, true); - std::vector ::iterator prev = nodes.begin (); + + // Subset the nodes to only the FILTER, non-PSEUDO nodes. + std::vector filterNodes; std::vector ::iterator i; for (i = nodes.begin (); i != nodes.end (); ++i) - { if ((*i)->hasTag ("FILTER") && ! (*i)->hasTag ("PSEUDO")) + filterNodes.push_back (*i); + + std::vector ::iterator prev = filterNodes.begin (); + for (i = filterNodes.begin (); i != filterNodes.end (); ++i) + { + if (i != prev && + (! (*prev)->hasTag ("OP") || (*prev)->attribute ("raw") == ")") && + (! (*i)->hasTag ("OP") || (*i)->attribute ("raw") == "(")) { - if ((*i)->_branches.size ()) - { - std::vector ::iterator sub; - for (sub = (*i)->_branches.begin (); sub != (*i)->_branches.end (); ++sub) - { - if (sub != prev && - prev != nodes.begin () && - (! (*prev)->hasTag ("OP") || (*prev)->attribute ("raw") == ")") && - (! (*sub)->hasTag ("OP") || (*sub)->attribute ("raw") == "(")) - { - Tree* branch = new Tree ("argOp"); - branch->attribute ("raw", "and"); - branch->tag ("OP"); - branch->tag ("FILTER"); - (*i)->_branches.insert (sub, branch); - return true; - } + Tree* branch = new Tree ("argOp"); + branch->attribute ("raw", "and"); + branch->tag ("OP"); + branch->tag ("FILTER"); + branch->_trunk = (*i)->_trunk; - prev = sub; + std::vector ::iterator b; + for (b = (*i)->_trunk->_branches.begin (); + b != (*i)->_trunk->_branches.end (); + ++b) + { + if (*b == *i) + { + (*i)->_trunk->_branches.insert (b, branch); + break; } } - else - { - if (i != prev && - prev != nodes.begin () && - (! (*prev)->hasTag ("OP") || (*prev)->attribute ("raw") == ")") && - (! (*i)->hasTag ("OP") || (*i)->attribute ("raw") == "(")) - { - Tree* branch = new Tree ("argOp"); - branch->attribute ("raw", "and"); - branch->tag ("OP"); - branch->tag ("FILTER"); - _tree->_branches.insert (i, branch); - return true; - } - prev = i; - } + return true; } + + prev = i; } return false;