- Converted all remaining methods to use collect.  Now there is full recursion
  everywhere, which means the parse tree can be arbitrarily deep.
This commit is contained in:
Paul Beckingham 2014-08-17 13:41:17 -04:00
parent dff7dae3bc
commit a3d2750f40
2 changed files with 30 additions and 20 deletions

View file

@ -193,7 +193,6 @@ Tree* Parser::parse ()
findStrayModifications ();
findPlainArgs ();
// GOOD ^^^
findMissingOperators ();
validate ();
@ -276,7 +275,7 @@ bool Parser::canonicalize (
// Recursively scan all nodes, depth first, and create a linear list of node
// pointers, for simple iteration. This eliminates the need for recursion in
// each ::find* method.
void Parser::collect (std::vector <Tree*>& nodes, bool all, Tree* tree /* = NULL */)
void Parser::collect (std::vector <Tree*>& nodes, bool all, Tree* tree /* = NULL */) const
{
if (tree == NULL)
tree = _tree;
@ -505,8 +504,10 @@ void Parser::getOverrides (
std::string& home,
File& rc)
{
std::vector <Tree*> nodes;
collect (nodes, false);
std::vector <Tree*>::iterator i;
for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i)
for (i = nodes.begin (); i != nodes.end (); ++i)
{
if ((*i)->hasTag ("RC"))
{
@ -535,8 +536,10 @@ void Parser::getDataLocation (Path& data)
if (location != "")
data = location;
std::vector <Tree*> nodes;
collect (nodes, false);
std::vector <Tree*>::iterator i;
for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i)
for (i = nodes.begin (); i != nodes.end (); ++i)
{
if ((*i)->hasTag ("CONFIG") &&
(*i)->attribute ("name") == "data.location")
@ -580,8 +583,11 @@ void Parser::injectDefaults ()
bool found_command = false;
bool found_sequence = false;
bool found_other = false;
std::vector <Tree*> nodes;
collect (nodes, true);
std::vector <Tree*>::iterator i;
for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i)
for (i = nodes.begin (); i != nodes.end (); ++i)
{
if ((*i)->hasTag ("BINARY"))
;
@ -625,8 +631,10 @@ void Parser::injectDefaults ()
}
std::string combined;
std::vector <Tree*> nodes;
collect (nodes, false);
std::vector <Tree*>::iterator i;
for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i)
for (i = nodes.begin (); i != nodes.end (); ++i)
{
if (combined.length ())
combined += ' ';
@ -701,8 +709,10 @@ const std::string Parser::getFilterExpression ()
{
// Construct an efficient ID/UUID clause.
std::string sequence = "";
std::vector <Tree*> nodes;
collect (nodes, true);
std::vector <Tree*>::iterator i;
for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i)
for (i = nodes.begin (); i != nodes.end (); ++i)
{
if ((*i)->hasTag ("FILTER") && ! (*i)->hasTag ("PSEUDO"))
{
@ -746,8 +756,10 @@ const std::string Parser::getFilterExpression ()
const std::vector <std::string> Parser::getWords () const
{
std::vector <std::string> words;
std::vector <Tree*>::const_iterator i;
for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i)
std::vector <Tree*> nodes;
collect (nodes, true);
std::vector <Tree*>::iterator i;
for (i = nodes.begin (); i != nodes.end (); ++i)
{
if (! (*i)->hasTag ("BINARY") &&
! (*i)->hasTag ("RC") &&
@ -764,8 +776,10 @@ const std::vector <std::string> Parser::getWords () const
////////////////////////////////////////////////////////////////////////////////
std::string Parser::getLimit () const
{
std::vector <Tree*>::const_iterator i;
for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i)
std::vector <Tree*> nodes;
collect (nodes, false);
std::vector <Tree*>::iterator i;
for (i = nodes.begin (); i != nodes.end (); ++i)
{
// Parser override operator.
if ((*i)->attribute ("raw") == "--")
@ -784,16 +798,12 @@ std::string Parser::getLimit () const
////////////////////////////////////////////////////////////////////////////////
std::string Parser::getCommand () const
{
std::vector <Tree*>::const_iterator i;
for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i)
{
// Parser override operator.
if ((*i)->attribute ("raw") == "--")
break;
std::vector <Tree*> nodes;
collect (nodes, false);
std::vector <Tree*>::iterator i;
for (i = nodes.begin (); i != nodes.end (); ++i)
if ((*i)->hasTag ("CMD"))
return (*i)->attribute ("canonical");
}
return "";
}

View file

@ -47,7 +47,7 @@ public:
bool exactMatch (const std::string&, const std::string&) const;
bool canonicalize (std::string&, const std::string&, const std::string&) const;
void collect (std::vector <Tree*>&, bool, Tree* tree = NULL);
void collect (std::vector <Tree*>&, bool, Tree* tree = NULL) const;
void findBinary ();
void resolveAliases ();