From af77e2e150d73be08d55c8461e89ea8d0664d8d4 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 23 Aug 2014 13:08:52 -0400 Subject: [PATCH] Parser - Modified ::findTag to perform one action and repeat, rather than attempt everything at once, with an invalid iterator. --- src/Parser.cpp | 70 +++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/src/Parser.cpp b/src/Parser.cpp index 2c5ec1786..139f17e9c 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -920,44 +920,56 @@ void Parser::findSubstitution () void Parser::findTag () { context.debug ("Parser::findTag"); - bool action = false; + bool action = true; - std::vector nodes; - collect (nodes); - std::vector ::iterator i; - for (i = nodes.begin (); i != nodes.end (); ++i) + do { - std::string raw = (*i)->attribute ("raw"); - Nibbler n (raw); - - std::string tag; - std::string sign; - if (n.getN (1, sign) && - (sign == "+" || sign == "-") && - n.getUntilEOS (tag) && - tag.find (' ') == std::string::npos) + action = false; + std::vector nodes; + collect (nodes, collectAll); + std::vector ::iterator i; + for (i = nodes.begin (); i != nodes.end (); ++i) { - (*i)->unTag ("?"); - (*i)->removeAllBranches (); - (*i)->tag ("TAG"); - (*i)->attribute ("sign", sign); - (*i)->attribute ("tag", tag); + if (! (*i)->hasTag ("?")) + continue; - Tree* branch = (*i)->addBranch (new Tree ("argTag")); - branch->attribute ("raw", "tags"); + if ((*i)->hasTag ("TERMINATOR") || + (*i)->hasTag ("TERMINATED")) + break; - branch = (*i)->addBranch (new Tree ("argTag")); - branch->attribute ("raw", (sign == "+" ? "_hastag_" : "_notag_")); - branch->tag ("OP"); + std::string raw = (*i)->attribute ("raw"); + Nibbler n (raw); - branch = (*i)->addBranch (new Tree ("argTag")); - branch->attribute ("raw", tag); - action = true; + std::string tag; + std::string sign; + if (n.getN (1, sign) && + (sign == "+" || sign == "-") && + n.getUntilEOS (tag) && + tag.find (' ') == std::string::npos) + { + (*i)->unTag ("?"); + (*i)->removeAllBranches (); + (*i)->tag ("TAG"); + (*i)->attribute ("sign", sign); + (*i)->attribute ("tag", tag); + + Tree* branch = (*i)->addBranch (new Tree ("argTag")); + branch->attribute ("raw", "tags"); + + branch = (*i)->addBranch (new Tree ("argTag")); + branch->attribute ("raw", (sign == "+" ? "_hastag_" : "_notag_")); + branch->tag ("OP"); + + branch = (*i)->addBranch (new Tree ("argTag")); + branch->attribute ("raw", tag); + action = true; + break; + } } } + while (action); - if (action) - context.debug (_tree->dump ()); + context.debug (_tree->dump ()); } ////////////////////////////////////////////////////////////////////////////////