summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker/SelectorToken.cpp
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2013-03-04 21:08:45 +0000
committerAndrew Stitcher <astitcher@apache.org>2013-03-04 21:08:45 +0000
commitdfada942aa6795a44bcf6988fc300d0767c994e8 (patch)
tree07e59fa97f4a2d3a83e1e5a06786101251439497 /cpp/src/qpid/broker/SelectorToken.cpp
parent5ebf2fd5b0e7ada7089437efa95e37c6f473fcfc (diff)
downloadqpid-python-dfada942aa6795a44bcf6988fc300d0767c994e8.tar.gz
QPID-4558: Selectors for C++ broker
- Added numeric and boolean values * To literals and identifier values * To the code that extracts values from message properties - Added the full set of comparison operators - Implemented full "unknown" semantics for all operators. - Implemented extended "is null" and "is not null" operators that allow expressions as well as just identifiers. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1452525 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/SelectorToken.cpp')
-rw-r--r--cpp/src/qpid/broker/SelectorToken.cpp73
1 files changed, 70 insertions, 3 deletions
diff --git a/cpp/src/qpid/broker/SelectorToken.cpp b/cpp/src/qpid/broker/SelectorToken.cpp
index 6215f169d3..509d56af4b 100644
--- a/cpp/src/qpid/broker/SelectorToken.cpp
+++ b/cpp/src/qpid/broker/SelectorToken.cpp
@@ -221,10 +221,77 @@ bool tokeniseOperator(std::string::const_iterator& s, std::string::const_iterato
return true;
}
-// Can't parse numerics yet
-bool tokeniseNumeric(std::string::const_iterator& /*s*/, std::string::const_iterator& /*e*/, Token& /*tok*/)
+bool tokeniseNumeric(std::string::const_iterator& s, std::string::const_iterator& e, Token& tok)
{
- return false;
+ std::string::const_iterator t = s;
+
+ // Hand constructed state machine recogniser
+ enum {
+ START,
+ REJECT,
+ DIGIT,
+ DECIMAL_START,
+ DECIMAL,
+ EXPONENT_SIGN,
+ EXPONENT_START,
+ EXPONENT,
+ ACCEPT_EXACT,
+ ACCEPT_INEXACT
+ } state = START;
+
+ while (true)
+ switch (state) {
+ case START:
+ if (t==e) {state = REJECT;}
+ else if (std::isdigit(*t)) {++t; state = DIGIT;}
+ else if (*t=='.') {++t; state = DECIMAL_START;}
+ else state = REJECT;
+ break;
+ case DECIMAL_START:
+ if (t==e) {state = REJECT;}
+ else if (std::isdigit(*t)) {++t; state = DECIMAL;}
+ else state = REJECT;
+ break;
+ case EXPONENT_SIGN:
+ if (t==e) {state = REJECT;}
+ else if (*t=='-' || *t=='+') {++t; state = EXPONENT_START;}
+ else if (std::isdigit(*t)) {++t; state = EXPONENT;}
+ else state = REJECT;
+ break;
+ case EXPONENT_START:
+ if (t==e) {state = REJECT;}
+ else if (std::isdigit(*t)) {++t; state = EXPONENT;}
+ else state = REJECT;
+ break;
+ case DIGIT:
+ if (t==e) {state = ACCEPT_EXACT;}
+ else if (std::isdigit(*t)) {++t; state = DIGIT;}
+ else if (*t=='.') {++t; state = DECIMAL;}
+ else if (*t=='e' || *t=='E') {++t; state = EXPONENT_SIGN;}
+ else state = ACCEPT_EXACT;
+ break;
+ case DECIMAL:
+ if (t==e) {state = ACCEPT_INEXACT;}
+ else if (std::isdigit(*t)) {++t; state = DECIMAL;}
+ else if (*t=='e' || *t=='E') {++t; state = EXPONENT_SIGN;}
+ else state = ACCEPT_INEXACT;
+ break;
+ case EXPONENT:
+ if (t==e) {state = ACCEPT_INEXACT;}
+ else if (std::isdigit(*t)) {++t; state = EXPONENT;}
+ else state = ACCEPT_INEXACT;
+ break;
+ case ACCEPT_EXACT:
+ tok = Token(T_NUMERIC_EXACT, s, t);
+ s = t;
+ return true;
+ case ACCEPT_INEXACT:
+ tok = Token(T_NUMERIC_APPROX, s, t);
+ s = t;
+ return true;
+ case REJECT:
+ return false;
+ };
}
Tokeniser::Tokeniser(const std::string::const_iterator& s, const std::string::const_iterator& e) :