From 34db02515ccc5570535534585eb7b0306ff6e878 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 1 Sep 2013 11:08:05 -0400 Subject: [PATCH] A3t::findAttributeModifier - Added support for attmods including :/= alternatives, which is an improvement. --- src/parser/A3t.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++ src/parser/A3t.h | 2 +- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/parser/A3t.cpp b/src/parser/A3t.cpp index a139ed831..b9638e5c7 100644 --- a/src/parser/A3t.cpp +++ b/src/parser/A3t.cpp @@ -67,6 +67,7 @@ Tree* A3t::parse () findPattern (); findTag (); findAttribute (); + findAttributeModifier (); validate (); @@ -417,6 +418,62 @@ void A3t::findAttribute () } } +//////////////////////////////////////////////////////////////////////////////// +// .[:=]['"]['"] +void A3t::findAttributeModifier () +{ + std::vector ::iterator i; + for (i = _tree->_branches.begin (); i != _tree->_branches.end (); ++i) + { + // Parser override operator. + if ((*i)->attribute ("raw") == "--") + break; + + // Skip known args. + if (! (*i)->hasTag ("?")) + continue; + + std::string raw = (*i)->attribute ("raw"); + Nibbler n (raw); + + std::string name; + if (n.getUntil (".", name)) + { + std::string canonical; + if (canonicalize (canonical, "attribute", name) || + canonicalize (canonical, "uda", name)) + { + if (n.skip ('.')) + { + std::string sense = "+"; + if (n.skip ('~')) + sense = "-"; + + std::string modifier; + n.getUntilOneOf (":=", modifier); + + if (n.skip (':') || + n.skip ('=')) + { + std::string value; + if (n.getQuoted ('"', value) || + n.getQuoted ('\'', value) || + n.getUntilEOS (value)) + { + (*i)->unTag ("?"); + (*i)->tag ("ATTMOD"); + (*i)->attribute ("name", canonical); + (*i)->attribute ("value", value); + (*i)->attribute ("modifier", modifier); + (*i)->attribute ("sense", sense); + } + } + } + } + } + } +} + //////////////////////////////////////////////////////////////////////////////// // Validate the parse tree. void A3t::validate () diff --git a/src/parser/A3t.h b/src/parser/A3t.h index 5e22e1170..b92e10b9b 100644 --- a/src/parser/A3t.h +++ b/src/parser/A3t.h @@ -50,6 +50,7 @@ private: void findSubstitution (); void findTag (); void findAttribute (); + void findAttributeModifier (); void validate (); private: @@ -59,4 +60,3 @@ private: #endif -