From 2281c5a6bf116f5298ced3330a5268abd1181bb0 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 31 Aug 2013 12:24:30 -0400 Subject: [PATCH] A3t::findPattern - Now parses patterns and extracts the pattern, which may include escaped / characters, which is an improvement. --- src/parser/A3t.cpp | 33 +++++++++++++++++++++++++++++++-- src/parser/A3t.h | 3 ++- src/parser/Tree.cpp | 3 ++- src/parser/run | 1 + 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/parser/A3t.cpp b/src/parser/A3t.cpp index 108eb86f3..ba15df8c0 100644 --- a/src/parser/A3t.cpp +++ b/src/parser/A3t.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -60,6 +61,9 @@ Tree* A3t::parse () findCommand (); findFileOverride (); findConfigOverride (); + findPattern (); + + validate (); return _tree; } @@ -232,9 +236,34 @@ void A3t::findConfigOverride () } //////////////////////////////////////////////////////////////////////////////// -// Validate the parse tree. -void A3t::validate () +// /pattern/ +void A3t::findPattern () { + std::vector ::iterator i; + for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i) + { + // Parser override operator. + if ((*i)->attribute ("raw") == "--") + break; + + Nibbler n ((*i)->attribute ("raw")); + std::string pattern; + if (n.getQuoted ('/', pattern) && + n.depleted () && + pattern.length () > 0) + { + (*i)->tag ("PATTERN"); + Tree* b = (*i)->addBranch (new Tree ("data")); + b->attribute ("pattern", pattern); + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Validate the parse tree. +void A3t::validate () +{ + // TODO Any RC node must have a root/*[+RC]/data[@file] that exists. } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/parser/A3t.h b/src/parser/A3t.h index e1c27f719..c6a1bba35 100644 --- a/src/parser/A3t.h +++ b/src/parser/A3t.h @@ -46,6 +46,7 @@ private: void findCommand (); void findFileOverride (); void findConfigOverride (); + void findPattern (); void validate (); private: @@ -55,4 +56,4 @@ private: #endif -//////////////////////////////////////////////////////////////////////////////// + diff --git a/src/parser/Tree.cpp b/src/parser/Tree.cpp index 3bf799522..ac7d399db 100644 --- a/src/parser/Tree.cpp +++ b/src/parser/Tree.cpp @@ -240,7 +240,8 @@ void Tree::dumpNode (Tree* t, int depth) for (int i = 0; i < depth; ++i) std::cout << " "; - std::cout << t << " \033[1m" << t->_name << "\033[0m"; +// std::cout << t << " \033[1m" << t->_name << "\033[0m"; + std::cout << "\033[1m" << t->_name << "\033[0m"; // Dump attributes. std::string atts; diff --git a/src/parser/run b/src/parser/run index c836e5611..6f02ad98a 100755 --- a/src/parser/run +++ b/src/parser/run @@ -10,4 +10,5 @@ echo; ./args rc:~/.taskrc 123 mod pro:'P 1' +home /from/to/g rc.name=value echo; ./args rc:~/..taskrc rc.name=value add -- modify +tag /from/to/g name:value +echo; ./args /pattern/ nex