Switch to side-by-side view

--- a/src/query/wasaparse.ypp
+++ b/src/query/wasaparse.ypp
@@ -13,7 +13,7 @@
 
 using namespace std;
 
-// #define LOG_PARSER
+//#define LOG_PARSER
 #ifdef LOG_PARSER
 #define LOGP(X) {cerr << X;}
 #else
@@ -45,6 +45,7 @@
 
 %union {
     std::string *str;
+    Rcl::SearchDataClauseRange *rg;
     Rcl::SearchDataClauseSimple *cl;
     Rcl::SearchData *sd;
 }
@@ -52,6 +53,7 @@
 
 %type <cl> qualquote
 %type <cl> fieldexpr
+%type <rg> range
 %type <cl> term
 %type <sd> query
 %type <str> complexfieldname
@@ -64,7 +66,7 @@
 %left AND UCONCAT '(' '-'
 %left OR
 
-%token EQUALS CONTAINS SMALLEREQ SMALLER GREATEREQ GREATER
+%token EQUALS CONTAINS SMALLEREQ SMALLER GREATEREQ GREATER RANGE
 
 %%
 
@@ -154,9 +156,17 @@
     $$ = $3;
     delete $1;
 }
+| complexfieldname CONTAINS range
+{
+    LOGP("fe: " << *$1 << " : " << $3->gettext() << endl);
+    $3->setfield(*$1);
+    $3->setrel(Rcl::SearchDataClause::REL_CONTAINS);
+    $$ = $3;
+    delete $1;
+}
 | complexfieldname SMALLER term 
 {
-    LOGP(cerr << "fe: " << *$1 << " < " << $3->gettext() << endl);
+    LOGP("fe: " << *$1 << " < " << $3->gettext() << endl);
     $3->setfield(*$1);
     $3->setrel(Rcl::SearchDataClause::REL_LT);
     $$ = $3;
@@ -209,6 +219,30 @@
     delete $1;
     delete $3;
 }
+
+range:
+WORD RANGE WORD
+{
+    LOGP("Range: " << *$1 << string(" .. ") << *$3 << endl);
+    $$ = new Rcl::SearchDataClauseRange(*$1, *$3);
+    delete $1;
+    delete $3;
+}
+|
+RANGE WORD
+{
+    LOGP("Range: " << "" << string(" .. ") << *$2 << endl);
+    $$ = new Rcl::SearchDataClauseRange("", *$2);
+    delete $2;
+}
+|
+WORD RANGE
+{
+    LOGP("Range: " << *$1 << string(" .. ") << "" << endl);
+    $$ = new Rcl::SearchDataClauseRange(*$1, "");
+    delete $1;
+}
+;
 
 term: 
 WORD
@@ -389,7 +423,7 @@
         return c;
     }
 
-    // field-term relations
+    // field-term relations, and ranges
     switch (c) {
     case '=': return yy::parser::token::EQUALS;
     case ':': return yy::parser::token::CONTAINS;
@@ -402,6 +436,15 @@
             return yy::parser::token::SMALLER;
         }
     }
+    case '.': {
+        int c1 = d->GETCHAR();
+        if (c1 == '.') {
+            return yy::parser::token::RANGE;
+        } else {
+            d->UNGETCHAR(c1);
+            break;
+        }
+    }
     case '>': {
         int c1 = d->GETCHAR();
         if (c1 == '=') {
@@ -430,6 +473,16 @@
             //cerr << "Word broken by special char" << endl;
             d->UNGETCHAR(c);
             break;
+        } else if (c == '.') {
+            int c1 = d->GETCHAR();
+            if (c1 == '.') {
+                d->UNGETCHAR(c1);
+                d->UNGETCHAR(c);
+                break;
+            } else {
+                d->UNGETCHAR(c1);
+                word->push_back(c);
+            }
         } else if (c == 0) {
             //cerr << "Word broken by EOF" << endl;
             break;