diff --git a/src/Parser.cpp b/src/Parser.cpp index 327821af3..446c5008b 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -269,6 +269,45 @@ bool Parser::canonicalize ( return false; } +//////////////////////////////////////////////////////////////////////////////// +// Experimental method to iterate over nodes, and callback, which is essentially +// a co-routine implementation. +void Parser::scan (void (Parser::*callback) (Tree*)) +{ + std::vector ::iterator i; + for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i) + { + if ((*i)->_branches.size ()) + { + std::vector ::iterator b; + for (b = (*i)->_branches.begin (); b != (*i)->_branches.end (); ++b) + { + // Parser override operator. + if ((*b)->attribute ("raw") == "--") + break; + + // Skip known args. + if (! (*b)->hasTag ("?")) + continue; + + (this->*callback) (*b); + } + } + else + { + // Parser override operator. + if ((*i)->attribute ("raw") == "--") + break; + + // Skip known args. + if (! (*i)->hasTag ("?")) + continue; + + (this->*callback) (*i); + } + } +} + //////////////////////////////////////////////////////////////////////////////// // Locate and tag the binary. void Parser::findBinary () diff --git a/src/Parser.h b/src/Parser.h index 27491b0cf..6232f6379 100644 --- a/src/Parser.h +++ b/src/Parser.h @@ -69,6 +69,7 @@ public: private: void findTerminator (); + void scan (void (Parser::*callback)(Tree*)); void findPattern (); void findSubstitution (); void findTag ();