From 61e943f45600ba44c94ba19275e28cd43dd48ea1 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 9 Nov 2014 16:32:38 -0500 Subject: [PATCH] CLI - Implemented ::disqualifySugarFree to prevent lexing arguments that ultimately resolve to zero operators. --- src/CLI.cpp | 36 +++++++++++++++++++++++++++++++----- src/CLI.h | 1 + 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/CLI.cpp b/src/CLI.cpp index 893b40c51..f0b4eaa43 100644 --- a/src/CLI.cpp +++ b/src/CLI.cpp @@ -666,8 +666,9 @@ void CLI::addArg (const std::string& arg) if (disqualifyInsufficientTerms (lexemes) || disqualifyNoOps (lexemes) || - disqualifyOnlyParenOps (lexemes) || - disqualifyFirstLastBinary (lexemes)) +// disqualifyOnlyParenOps (lexemes) || + disqualifyFirstLastBinary (lexemes) || + disqualifySugarFree (lexemes)) { _original_args.push_back (raw); } @@ -2373,18 +2374,43 @@ bool CLI::disqualifyOnlyParenOps ( } //////////////////////////////////////////////////////////////////////////////// +// Disqualify terms when there are are binary operators at either end, as long +// as there are no operators in between, which includes syntactic sugar that +// hides operators. bool CLI::disqualifyFirstLastBinary ( const std::vector >& lexemes) const { + bool firstBinary = false; + bool lastBinary = false; + std::string dummy; if (canonicalize (dummy, "binary_operator", lexemes[0].first)) - return true; + firstBinary = true; if (lexemes.size () > 1 && canonicalize (dummy, "binary_operator", lexemes[lexemes.size () - 1].first)) - return true; + lastBinary = true; - return false; + return firstBinary || lastBinary; +} + +//////////////////////////////////////////////////////////////////////////////// +// Disqualify terms when there operators hidden by syntactic sugar. +bool CLI::disqualifySugarFree ( + const std::vector >& lexemes) const +{ + bool sugared = true; + for (unsigned int i = 1; i < lexemes.size () - 1; ++i) + if (isTag (lexemes[i].first) || + isUUIDList (lexemes[i].first) || + isUUID (lexemes[i].first) || + isIDSequence (lexemes[i].first) || + isID (lexemes[i].first) || + isPattern (lexemes[i].first) || + isAttribute (lexemes[i].first)) + sugared = true; + + return ! sugared; } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/CLI.h b/src/CLI.h index 1265b6862..d96c16dd0 100644 --- a/src/CLI.h +++ b/src/CLI.h @@ -130,6 +130,7 @@ private: bool disqualifyNoOps (const std::vector >&) const; bool disqualifyOnlyParenOps (const std::vector >&) const; bool disqualifyFirstLastBinary (const std::vector >&) const; + bool disqualifySugarFree (const std::vector >&) const; public: std::multimap _entities;