Index: contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java
===================================================================
--- contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java	(révision 1151103)
+++ contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java	(copie de travail)
@@ -615,6 +615,15 @@
     assertQueryEquals("( bar blar { a TO z}) ", null, "bar blar {a TO z}");
     assertQueryEquals("gack ( bar blar { a TO z}) ", null,
         "gack (bar blar {a TO z})");
+
+    assertQueryEquals("field>=a", null, "[a TO *]");
+    assertQueryEquals("field >= a", null, "[a TO *]");
+    assertQueryEquals("field<=a", null, "[* TO a]");
+    assertQueryEquals("field <= a", null, "[* TO a]");
+    assertQueryEquals("field>a", null, "{a TO *]");
+    assertQueryEquals("field > a", null, "{a TO *]");
+    assertQueryEquals("field<a", null, "[* TO a}");
+    assertQueryEquals("field < a", null, "[* TO a}");
   }
 
   public void testFarsiRangeCollating() throws Exception {
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/LowercaseExpandedTermsQueryNodeProcessor.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/LowercaseExpandedTermsQueryNodeProcessor.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/LowercaseExpandedTermsQueryNodeProcessor.java	(copie de travail)
@@ -73,7 +73,8 @@
         || node instanceof ParametricQueryNode) {
 
       FieldQueryNode fieldNode = (FieldQueryNode) node;
-      fieldNode.setText(UnescapedCharSequence.toLowerCase(fieldNode.getText()));
+      CharSequence text = fieldNode.getText();
+      fieldNode.setText(text == null ? null : UnescapedCharSequence.toLowerCase(text));
     }
 
     return node;
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserTokenManager.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserTokenManager.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserTokenManager.java	(copie de travail)
@@ -85,16 +85,44 @@
          return jjStopAtPos(0, 12);
       case 58:
          return jjStopAtPos(0, 15);
+      case 60:
+         jjmatchedKind = 17;
+         return jjMoveStringLiteralDfa1_3(0x40000L);
+      case 61:
+         return jjStopAtPos(0, 16);
+      case 62:
+         jjmatchedKind = 19;
+         return jjMoveStringLiteralDfa1_3(0x100000L);
       case 91:
-         return jjStopAtPos(0, 20);
+         return jjStopAtPos(0, 25);
       case 94:
-         return jjStopAtPos(0, 16);
+         return jjStopAtPos(0, 21);
       case 123:
-         return jjStopAtPos(0, 21);
+         return jjStopAtPos(0, 26);
       default :
          return jjMoveNfa_3(0, 0);
    }
 }
+private int jjMoveStringLiteralDfa1_3(long active0)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_3(0, active0);
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 61:
+         if ((active0 & 0x40000L) != 0L)
+            return jjStopAtPos(1, 18);
+         else if ((active0 & 0x100000L) != 0L)
+            return jjStopAtPos(1, 20);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_3(0, active0);
+}
 static final long[] jjbitVec0 = {
    0x1L, 0x0L, 0x0L, 0x0L
 };
@@ -126,10 +154,10 @@
             switch(jjstateSet[--i])
             {
                case 0:
-                  if ((0xfbffd4f8ffffd9ffL & l) != 0L)
+                  if ((0x8bffd4f8ffffd9ffL & l) != 0L)
                   {
-                     if (kind > 18)
-                        kind = 18;
+                     if (kind > 23)
+                        kind = 23;
                      jjCheckNAddTwoStates(20, 21);
                   }
                   else if ((0x100002600L & l) != 0L)
@@ -171,33 +199,33 @@
                   jjCheckNAddStates(0, 2);
                   break;
                case 18:
-                  if (curChar == 34 && kind > 17)
-                     kind = 17;
+                  if (curChar == 34 && kind > 22)
+                     kind = 22;
                   break;
                case 19:
-                  if ((0xfbffd4f8ffffd9ffL & l) == 0L)
+                  if ((0x8bffd4f8ffffd9ffL & l) == 0L)
                      break;
-                  if (kind > 18)
-                     kind = 18;
+                  if (kind > 23)
+                     kind = 23;
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 20:
-                  if ((0xfbfffcf8ffffd9ffL & l) == 0L)
+                  if ((0x8bfffcf8ffffd9ffL & l) == 0L)
                      break;
-                  if (kind > 18)
-                     kind = 18;
+                  if (kind > 23)
+                     kind = 23;
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 22:
-                  if (kind > 18)
-                     kind = 18;
+                  if (kind > 23)
+                     kind = 23;
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 25:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjAddStates(3, 4);
                   break;
                case 26:
@@ -207,8 +235,8 @@
                case 27:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAdd(27);
                   break;
                default : break;
@@ -225,14 +253,14 @@
                case 0:
                   if ((0x97ffffff87ffffffL & l) != 0L)
                   {
-                     if (kind > 18)
-                        kind = 18;
+                     if (kind > 23)
+                        kind = 23;
                      jjCheckNAddTwoStates(20, 21);
                   }
                   else if (curChar == 126)
                   {
-                     if (kind > 19)
-                        kind = 19;
+                     if (kind > 24)
+                        kind = 24;
                      jjstateSet[jjnewStateCnt++] = 25;
                   }
                   else if (curChar == 92)
@@ -301,8 +329,8 @@
                case 20:
                   if ((0x97ffffff87ffffffL & l) == 0L)
                      break;
-                  if (kind > 18)
-                     kind = 18;
+                  if (kind > 23)
+                     kind = 23;
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 21:
@@ -310,8 +338,8 @@
                      jjCheckNAddTwoStates(22, 22);
                   break;
                case 22:
-                  if (kind > 18)
-                     kind = 18;
+                  if (kind > 23)
+                     kind = 23;
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 23:
@@ -321,8 +349,8 @@
                case 24:
                   if (curChar != 126)
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjstateSet[jjnewStateCnt++] = 25;
                   break;
                default : break;
@@ -348,8 +376,8 @@
                   }
                   if (jjCanMove_2(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 18)
-                        kind = 18;
+                     if (kind > 23)
+                        kind = 23;
                      jjCheckNAddTwoStates(20, 21);
                   }
                   break;
@@ -362,15 +390,15 @@
                case 20:
                   if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 18)
-                     kind = 18;
+                  if (kind > 23)
+                     kind = 23;
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 22:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 18)
-                     kind = 18;
+                  if (kind > 23)
+                     kind = 23;
                   jjCheckNAddTwoStates(20, 21);
                   break;
                default : break;
@@ -395,9 +423,9 @@
    switch (pos)
    {
       case 0:
-         if ((active0 & 0x8000000L) != 0L)
+         if ((active0 & 0x100000000L) != 0L)
          {
-            jjmatchedKind = 30;
+            jjmatchedKind = 35;
             return 6;
          }
          return -1;
@@ -414,9 +442,9 @@
    switch(curChar)
    {
       case 84:
-         return jjMoveStringLiteralDfa1_1(0x8000000L);
+         return jjMoveStringLiteralDfa1_1(0x100000000L);
       case 125:
-         return jjStopAtPos(0, 28);
+         return jjStopAtPos(0, 33);
       default :
          return jjMoveNfa_1(0, 0);
    }
@@ -431,8 +459,8 @@
    switch(curChar)
    {
       case 79:
-         if ((active0 & 0x8000000L) != 0L)
-            return jjStartNfaWithStates_1(1, 27, 6);
+         if ((active0 & 0x100000000L) != 0L)
+            return jjStartNfaWithStates_1(1, 32, 6);
          break;
       default :
          break;
@@ -468,8 +496,8 @@
                case 0:
                   if ((0xfffffffeffffffffL & l) != 0L)
                   {
-                     if (kind > 30)
-                        kind = 30;
+                     if (kind > 35)
+                        kind = 35;
                      jjCheckNAdd(6);
                   }
                   if ((0x100002600L & l) != 0L)
@@ -493,14 +521,14 @@
                      jjCheckNAddStates(5, 7);
                   break;
                case 5:
-                  if (curChar == 34 && kind > 29)
-                     kind = 29;
+                  if (curChar == 34 && kind > 34)
+                     kind = 34;
                   break;
                case 6:
                   if ((0xfffffffeffffffffL & l) == 0L)
                      break;
-                  if (kind > 30)
-                     kind = 30;
+                  if (kind > 35)
+                     kind = 35;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -518,8 +546,8 @@
                case 6:
                   if ((0xdfffffffffffffffL & l) == 0L)
                      break;
-                  if (kind > 30)
-                     kind = 30;
+                  if (kind > 35)
+                     kind = 35;
                   jjCheckNAdd(6);
                   break;
                case 2:
@@ -552,8 +580,8 @@
                   }
                   if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 30)
-                        kind = 30;
+                     if (kind > 35)
+                        kind = 35;
                      jjCheckNAdd(6);
                   }
                   break;
@@ -564,8 +592,8 @@
                case 6:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 30)
-                     kind = 30;
+                  if (kind > 35)
+                     kind = 35;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -610,8 +638,8 @@
                case 0:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjAddStates(8, 9);
                   break;
                case 1:
@@ -621,8 +649,8 @@
                case 2:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAdd(2);
                   break;
                default : break;
@@ -673,9 +701,9 @@
    switch (pos)
    {
       case 0:
-         if ((active0 & 0x800000L) != 0L)
+         if ((active0 & 0x10000000L) != 0L)
          {
-            jjmatchedKind = 26;
+            jjmatchedKind = 31;
             return 6;
          }
          return -1;
@@ -692,9 +720,9 @@
    switch(curChar)
    {
       case 84:
-         return jjMoveStringLiteralDfa1_2(0x800000L);
+         return jjMoveStringLiteralDfa1_2(0x10000000L);
       case 93:
-         return jjStopAtPos(0, 24);
+         return jjStopAtPos(0, 29);
       default :
          return jjMoveNfa_2(0, 0);
    }
@@ -709,8 +737,8 @@
    switch(curChar)
    {
       case 79:
-         if ((active0 & 0x800000L) != 0L)
-            return jjStartNfaWithStates_2(1, 23, 6);
+         if ((active0 & 0x10000000L) != 0L)
+            return jjStartNfaWithStates_2(1, 28, 6);
          break;
       default :
          break;
@@ -746,8 +774,8 @@
                case 0:
                   if ((0xfffffffeffffffffL & l) != 0L)
                   {
-                     if (kind > 26)
-                        kind = 26;
+                     if (kind > 31)
+                        kind = 31;
                      jjCheckNAdd(6);
                   }
                   if ((0x100002600L & l) != 0L)
@@ -771,14 +799,14 @@
                      jjCheckNAddStates(5, 7);
                   break;
                case 5:
-                  if (curChar == 34 && kind > 25)
-                     kind = 25;
+                  if (curChar == 34 && kind > 30)
+                     kind = 30;
                   break;
                case 6:
                   if ((0xfffffffeffffffffL & l) == 0L)
                      break;
-                  if (kind > 26)
-                     kind = 26;
+                  if (kind > 31)
+                     kind = 31;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -796,8 +824,8 @@
                case 6:
                   if ((0xffffffffdfffffffL & l) == 0L)
                      break;
-                  if (kind > 26)
-                     kind = 26;
+                  if (kind > 31)
+                     kind = 31;
                   jjCheckNAdd(6);
                   break;
                case 2:
@@ -830,8 +858,8 @@
                   }
                   if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 26)
-                        kind = 26;
+                     if (kind > 31)
+                        kind = 31;
                      jjCheckNAdd(6);
                   }
                   break;
@@ -842,8 +870,8 @@
                case 6:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 26)
-                     kind = 26;
+                  if (kind > 31)
+                     kind = 31;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -906,8 +934,9 @@
 /** Token literal values. */
 public static final String[] jjstrLiteralImages = {
 "", null, null, null, null, null, null, null, null, null, null, "\53", "\55", 
-"\50", "\51", "\72", "\136", null, null, null, "\133", "\173", null, "\124\117", 
-"\135", null, null, "\124\117", "\175", null, null, };
+"\50", "\51", "\72", "\75", "\74", "\74\75", "\76", "\76\75", "\136", null, null, 
+null, "\133", "\173", null, "\124\117", "\135", null, null, "\124\117", "\175", null, 
+null, };
 
 /** Lexer state names. */
 public static final String[] lexStateNames = {
@@ -919,11 +948,11 @@
 
 /** Lex State array. */
 public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 2, 1, 3, -1, 3, 
-   -1, -1, -1, 3, -1, -1, 
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, 
+   2, 1, 3, -1, 3, -1, -1, -1, 3, -1, -1, 
 };
 static final long[] jjtoToken = {
-   0x7fffff01L, 
+   0xfffffff01L, 
 };
 static final long[] jjtoSkip = {
    0x80L, 
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/Token.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/Token.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/Token.java	(copie de travail)
@@ -121,4 +121,4 @@
   }
 
 }
-/* JavaCC - OriginalChecksum=0aac6816ecd328eda2f38b9d09739ab6 (do not edit this line) */
+/* JavaCC - OriginalChecksum=cecb6022e0f2e2fca751015375f6d319 (do not edit this line) */
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/TokenMgrError.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/TokenMgrError.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/TokenMgrError.java	(copie de travail)
@@ -138,4 +138,4 @@
       this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
    }
 }
-/* JavaCC - OriginalChecksum=a75b5b61664a73631a032a6e44f4b38a (do not edit this line) */
+/* JavaCC - OriginalChecksum=0e9c5fad06efef4f41f97b851ac7b0ce (do not edit this line) */
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserConstants.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserConstants.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParserConstants.java	(copie de travail)
@@ -37,37 +37,47 @@
   /** RegularExpression Id. */
   int RPAREN = 14;
   /** RegularExpression Id. */
-  int COLON = 15;
+  int OP_COLON = 15;
   /** RegularExpression Id. */
-  int CARAT = 16;
+  int OP_EQUAL = 16;
   /** RegularExpression Id. */
-  int QUOTED = 17;
+  int OP_LESSTHAN = 17;
   /** RegularExpression Id. */
-  int TERM = 18;
+  int OP_LESSTHANEQ = 18;
   /** RegularExpression Id. */
-  int FUZZY_SLOP = 19;
+  int OP_MORETHAN = 19;
   /** RegularExpression Id. */
-  int RANGEIN_START = 20;
+  int OP_MORETHANEQ = 20;
   /** RegularExpression Id. */
-  int RANGEEX_START = 21;
+  int CARAT = 21;
   /** RegularExpression Id. */
-  int NUMBER = 22;
+  int QUOTED = 22;
   /** RegularExpression Id. */
-  int RANGEIN_TO = 23;
+  int TERM = 23;
   /** RegularExpression Id. */
-  int RANGEIN_END = 24;
+  int FUZZY_SLOP = 24;
   /** RegularExpression Id. */
-  int RANGEIN_QUOTED = 25;
+  int RANGEIN_START = 25;
   /** RegularExpression Id. */
-  int RANGEIN_GOOP = 26;
+  int RANGEEX_START = 26;
   /** RegularExpression Id. */
-  int RANGEEX_TO = 27;
+  int NUMBER = 27;
   /** RegularExpression Id. */
-  int RANGEEX_END = 28;
+  int RANGEIN_TO = 28;
   /** RegularExpression Id. */
-  int RANGEEX_QUOTED = 29;
+  int RANGEIN_END = 29;
   /** RegularExpression Id. */
-  int RANGEEX_GOOP = 30;
+  int RANGEIN_QUOTED = 30;
+  /** RegularExpression Id. */
+  int RANGEIN_GOOP = 31;
+  /** RegularExpression Id. */
+  int RANGEEX_TO = 32;
+  /** RegularExpression Id. */
+  int RANGEEX_END = 33;
+  /** RegularExpression Id. */
+  int RANGEEX_QUOTED = 34;
+  /** RegularExpression Id. */
+  int RANGEEX_GOOP = 35;
 
   /** Lexical state. */
   int Boost = 0;
@@ -96,6 +106,11 @@
     "\"(\"",
     "\")\"",
     "\":\"",
+    "\"=\"",
+    "\"<\"",
+    "\"<=\"",
+    "\">\"",
+    "\">=\"",
     "\"^\"",
     "<QUOTED>",
     "<TERM>",
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.java	(copie de travail)
@@ -313,42 +313,166 @@
 
   final public QueryNode Clause(CharSequence field) throws ParseException {
   QueryNode q;
-  Token fieldToken=null, boost=null;
+  Token fieldToken=null, boost=null, operator=null, term=null;
+  ParametricQueryNode qLower, qUpper;
+
   boolean group = false;
-    if (jj_2_1(2)) {
+    if (jj_2_2(3)) {
       fieldToken = jj_consume_token(TERM);
-      jj_consume_token(COLON);
-                               field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case OP_COLON:
+      case OP_EQUAL:
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case OP_COLON:
+          jj_consume_token(OP_COLON);
+          break;
+        case OP_EQUAL:
+          jj_consume_token(OP_EQUAL);
+          break;
+        default:
+          jj_la1[7] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+                                 field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);
+        q = Term(field);
+        break;
+      case OP_LESSTHAN:
+      case OP_LESSTHANEQ:
+      case OP_MORETHAN:
+      case OP_MORETHANEQ:
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case OP_LESSTHAN:
+          operator = jj_consume_token(OP_LESSTHAN);
+          break;
+        case OP_LESSTHANEQ:
+          operator = jj_consume_token(OP_LESSTHANEQ);
+          break;
+        case OP_MORETHAN:
+          operator = jj_consume_token(OP_MORETHAN);
+          break;
+        case OP_MORETHANEQ:
+          operator = jj_consume_token(OP_MORETHANEQ);
+          break;
+        default:
+          jj_la1[8] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+                                                                                                               field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case TERM:
+          term = jj_consume_token(TERM);
+          break;
+        case QUOTED:
+          term = jj_consume_token(QUOTED);
+          break;
+        case NUMBER:
+          term = jj_consume_token(NUMBER);
+          break;
+        default:
+          jj_la1[9] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+        if (term.kind == QUOTED) {
+            term.image = term.image.substring(1, term.image.length()-1);
+        }
+        switch (operator.kind) {
+            case OP_LESSTHAN:
+                qLower = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.GE,
+                                         null, term.beginColumn, term.endColumn);
+                qUpper = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.LT,
+                                         EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn);
+                break;
+            case OP_LESSTHANEQ:
+                qLower = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.GE,
+                                         null, term.beginColumn, term.endColumn);
+                qUpper = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.LE,
+                                         EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn);
+                break;
+            case OP_MORETHAN:
+                qLower = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.GT,
+                                         EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn);
+                qUpper = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.LE,
+                                         null, term.beginColumn, term.endColumn);
+                break;
+            case OP_MORETHANEQ:
+                qLower = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.GE,
+                                         EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn);
+                qUpper = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.LE,
+                                         null, term.beginColumn, term.endColumn);
+                break;
+            default:
+                {if (true) throw new Error("Unhandled case: operator="+operator.toString());}
+        }
+        q = new ParametricRangeQueryNode(qLower, qUpper);
+        break;
+      default:
+        jj_la1[10] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
+      }
     } else {
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case QUOTED:
-    case TERM:
-    case RANGEIN_START:
-    case RANGEEX_START:
-    case NUMBER:
-      q = Term(field);
-      break;
-    case LPAREN:
-      jj_consume_token(LPAREN);
-      q = Query(field);
-      jj_consume_token(RPAREN);
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CARAT:
-        jj_consume_token(CARAT);
-        boost = jj_consume_token(NUMBER);
+      case LPAREN:
+      case QUOTED:
+      case TERM:
+      case RANGEIN_START:
+      case RANGEEX_START:
+      case NUMBER:
+        if (jj_2_1(2)) {
+          fieldToken = jj_consume_token(TERM);
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case OP_COLON:
+            jj_consume_token(OP_COLON);
+            break;
+          case OP_EQUAL:
+            jj_consume_token(OP_EQUAL);
+            break;
+          default:
+            jj_la1[11] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+                                 field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);
+        } else {
+          ;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case QUOTED:
+        case TERM:
+        case RANGEIN_START:
+        case RANGEEX_START:
+        case NUMBER:
+          q = Term(field);
+          break;
+        case LPAREN:
+          jj_consume_token(LPAREN);
+          q = Query(field);
+          jj_consume_token(RPAREN);
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case CARAT:
+            jj_consume_token(CARAT);
+            boost = jj_consume_token(NUMBER);
+            break;
+          default:
+            jj_la1[12] = jj_gen;
+            ;
+          }
+                                                                 group=true;
+          break;
+        default:
+          jj_la1[13] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
         break;
       default:
-        jj_la1[7] = jj_gen;
-        ;
+        jj_la1[14] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
       }
-                                                                 group=true;
-      break;
-    default:
-      jj_la1[8] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
     }
       if (boost != null) {
                   float f = (float)1.0;
@@ -387,7 +511,7 @@
         term = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[9] = jj_gen;
+        jj_la1[15] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -397,7 +521,7 @@
                                 fuzzy=true;
         break;
       default:
-        jj_la1[10] = jj_gen;
+        jj_la1[16] = jj_gen;
         ;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -410,12 +534,12 @@
                                                          fuzzy=true;
           break;
         default:
-          jj_la1[11] = jj_gen;
+          jj_la1[17] = jj_gen;
           ;
         }
         break;
       default:
-        jj_la1[12] = jj_gen;
+        jj_la1[18] = jj_gen;
         ;
       }
        if (fuzzy) {
@@ -439,7 +563,7 @@
         goop1 = jj_consume_token(RANGEIN_QUOTED);
         break;
       default:
-        jj_la1[13] = jj_gen;
+        jj_la1[19] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -448,7 +572,7 @@
         jj_consume_token(RANGEIN_TO);
         break;
       default:
-        jj_la1[14] = jj_gen;
+        jj_la1[20] = jj_gen;
         ;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -459,7 +583,7 @@
         goop2 = jj_consume_token(RANGEIN_QUOTED);
         break;
       default:
-        jj_la1[15] = jj_gen;
+        jj_la1[21] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -470,7 +594,7 @@
         boost = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[16] = jj_gen;
+        jj_la1[22] = jj_gen;
         ;
       }
           if (goop1.kind == RANGEIN_QUOTED) {
@@ -496,7 +620,7 @@
         goop1 = jj_consume_token(RANGEEX_QUOTED);
         break;
       default:
-        jj_la1[17] = jj_gen;
+        jj_la1[23] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -505,7 +629,7 @@
         jj_consume_token(RANGEEX_TO);
         break;
       default:
-        jj_la1[18] = jj_gen;
+        jj_la1[24] = jj_gen;
         ;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -516,7 +640,7 @@
         goop2 = jj_consume_token(RANGEEX_QUOTED);
         break;
       default:
-        jj_la1[19] = jj_gen;
+        jj_la1[25] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -527,7 +651,7 @@
         boost = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[20] = jj_gen;
+        jj_la1[26] = jj_gen;
         ;
       }
           if (goop1.kind == RANGEEX_QUOTED) {
@@ -550,7 +674,7 @@
         fuzzySlop = jj_consume_token(FUZZY_SLOP);
         break;
       default:
-        jj_la1[21] = jj_gen;
+        jj_la1[27] = jj_gen;
         ;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -559,7 +683,7 @@
         boost = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[22] = jj_gen;
+        jj_la1[28] = jj_gen;
         ;
       }
          int phraseSlop = 0;
@@ -577,7 +701,7 @@
          }
       break;
     default:
-      jj_la1[23] = jj_gen;
+      jj_la1[29] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -606,9 +730,113 @@
     finally { jj_save(0, xla); }
   }
 
+  private boolean jj_2_2(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_2(); }
+    catch(LookaheadSuccess ls) { return true; }
+    finally { jj_save(1, xla); }
+  }
+
+  private boolean jj_3R_7() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_11()) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(27)) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_8() {
+    if (jj_scan_token(RANGEIN_START)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_6() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_7()) {
+    jj_scanpos = xsp;
+    if (jj_3R_8()) {
+    jj_scanpos = xsp;
+    if (jj_3R_9()) {
+    jj_scanpos = xsp;
+    if (jj_3R_10()) return true;
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_5() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(17)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(18)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(19)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(20)) return true;
+    }
+    }
+    }
+    xsp = jj_scanpos;
+    if (jj_scan_token(23)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(22)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(27)) return true;
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_9() {
+    if (jj_scan_token(RANGEEX_START)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_4() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(15)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(16)) return true;
+    }
+    if (jj_3R_6()) return true;
+    return false;
+  }
+
+  private boolean jj_3_2() {
+    if (jj_scan_token(TERM)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_4()) {
+    jj_scanpos = xsp;
+    if (jj_3R_5()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_10() {
+    if (jj_scan_token(QUOTED)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_11() {
+    if (jj_scan_token(TERM)) return true;
+    return false;
+  }
+
   private boolean jj_3_1() {
     if (jj_scan_token(TERM)) return true;
-    if (jj_scan_token(COLON)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(15)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(16)) return true;
+    }
     return false;
   }
 
@@ -623,15 +851,20 @@
   private Token jj_scanpos, jj_lastpos;
   private int jj_la;
   private int jj_gen;
-  final private int[] jj_la1 = new int[24];
+  final private int[] jj_la1 = new int[30];
   static private int[] jj_la1_0;
+  static private int[] jj_la1_1;
   static {
       jj_la1_init_0();
+      jj_la1_init_1();
    }
    private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] {0x300,0x300,0x1c00,0x1c00,0x763c00,0x200,0x100,0x10000,0x762000,0x440000,0x80000,0x80000,0x10000,0x6000000,0x800000,0x6000000,0x10000,0x60000000,0x8000000,0x60000000,0x10000,0x80000,0x10000,0x760000,};
+      jj_la1_0 = new int[] {0x300,0x300,0x1c00,0x1c00,0xec03c00,0x200,0x100,0x18000,0x1e0000,0x8c00000,0x1f8000,0x18000,0x200000,0xec02000,0xec02000,0x8800000,0x1000000,0x1000000,0x200000,0xc0000000,0x10000000,0xc0000000,0x200000,0x0,0x0,0x0,0x200000,0x1000000,0x200000,0xec00000,};
    }
-  final private JJCalls[] jj_2_rtns = new JJCalls[1];
+   private static void jj_la1_init_1() {
+      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x1,0xc,0x0,0x0,0x0,0x0,};
+   }
+  final private JJCalls[] jj_2_rtns = new JJCalls[2];
   private boolean jj_rescan = false;
   private int jj_gc = 0;
 
@@ -646,7 +879,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -661,7 +894,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -672,7 +905,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -683,7 +916,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -693,7 +926,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -703,7 +936,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 24; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -815,21 +1048,24 @@
   /** Generate ParseException. */
   public ParseException generateParseException() {
     jj_expentries.clear();
-    boolean[] la1tokens = new boolean[31];
+    boolean[] la1tokens = new boolean[36];
     if (jj_kind >= 0) {
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 24; i++) {
+    for (int i = 0; i < 30; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
             la1tokens[j] = true;
           }
+          if ((jj_la1_1[i] & (1<<j)) != 0) {
+            la1tokens[32+j] = true;
+          }
         }
       }
     }
-    for (int i = 0; i < 31; i++) {
+    for (int i = 0; i < 36; i++) {
       if (la1tokens[i]) {
         jj_expentry = new int[1];
         jj_expentry[0] = i;
@@ -856,7 +1092,7 @@
 
   private void jj_rescan_token() {
     jj_rescan = true;
-    for (int i = 0; i < 1; i++) {
+    for (int i = 0; i < 2; i++) {
     try {
       JJCalls p = jj_2_rtns[i];
       do {
@@ -864,6 +1100,7 @@
           jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
           switch (i) {
             case 0: jj_3_1(); break;
+            case 1: jj_3_2(); break;
           }
         }
         p = p.next;
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.jj
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.jj	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/StandardSyntaxParser.jj	(copie de travail)
@@ -107,7 +107,7 @@
 // every character that follows a backslash is considered as an escaped character
 | <#_ESCAPED_CHAR: "\\" ~[] >
 | <#_TERM_START_CHAR: ( ~[ " ", "\t", "\n", "\r", "\u3000", "+", "-", "!", "(", ")", ":", "^",
-                           "[", "]", "\"", "{", "}", "~", "\\" ]
+                           "<", ">", "=", "[", "]", "\"", "{", "}", "~", "\\" ]
                        | <_ESCAPED_CHAR> ) >
 | <#_TERM_CHAR: ( <_TERM_START_CHAR> | <_ESCAPED_CHAR> | "-" | "+" ) >
 | <#_WHITESPACE: ( " " | "\t" | "\n" | "\r" | "\u3000") >
@@ -126,7 +126,12 @@
 | <MINUS:     "-" >
 | <LPAREN:    "(" >
 | <RPAREN:    ")" >
-| <COLON:     ":" >
+| <OP_COLON:  ":" >
+| <OP_EQUAL:  "=" >
+| <OP_LESSTHAN:   "<"  >
+| <OP_LESSTHANEQ: "<=" >
+| <OP_MORETHAN:   ">"  >
+| <OP_MORETHANEQ: ">=" >
 | <CARAT:     "^" > : Boost
 | <QUOTED:     "\"" (<_QUOTED_CHAR>)* "\"">
 | <TERM:      <_TERM_START_CHAR> (<_TERM_CHAR>)*  >
@@ -333,22 +338,62 @@
 
 QueryNode Clause(CharSequence field) : {
   QueryNode q;
-  Token fieldToken=null, boost=null;
+  Token fieldToken=null, boost=null, operator=null, term=null;
+  ParametricQueryNode qLower, qUpper;
+
   boolean group = false;
 }
 {
-  [
+(
+  LOOKAHEAD(3)
+  fieldToken=<TERM> (
+    ( <OP_COLON> | <OP_EQUAL> ) {field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);} q=Term(field)
+  | ( operator=<OP_LESSTHAN> | operator=<OP_LESSTHANEQ> | operator=<OP_MORETHAN> | operator=<OP_MORETHANEQ> ) {field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);}( term=<TERM> | term=<QUOTED> | term=<NUMBER> )
+    {
+        if (term.kind == QUOTED) {
+            term.image = term.image.substring(1, term.image.length()-1);
+        }
+        switch (operator.kind) {
+            case OP_LESSTHAN:
+                qLower = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.GE,
+                                         null, term.beginColumn, term.endColumn);
+                qUpper = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.LT,
+                                         EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn);
+                break;
+            case OP_LESSTHANEQ:
+                qLower = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.GE,
+                                         null, term.beginColumn, term.endColumn);
+                qUpper = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.LE,
+                                         EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn);
+                break;
+            case OP_MORETHAN:
+                qLower = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.GT,
+                                         EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn);
+                qUpper = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.LE,
+                                         null, term.beginColumn, term.endColumn);
+                break;
+            case OP_MORETHANEQ:
+                qLower = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.GE,
+                                         EscapeQuerySyntaxImpl.discardEscapeChar(term.image), term.beginColumn, term.endColumn);
+                qUpper = new ParametricQueryNode(field, ParametricQueryNode.CompareOperator.LE,
+                                         null, term.beginColumn, term.endColumn);
+                break;
+            default:
+                throw new Error("Unhandled case: operator="+operator.toString());
+        }
+        q = new ParametricRangeQueryNode(qLower, qUpper);
+    }
+  )
+| [
     LOOKAHEAD(2)
-    (
-    fieldToken=<TERM> <COLON> {field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);}    
-    )
+    fieldToken=<TERM>
+    ( <OP_COLON> | <OP_EQUAL> ) {field=EscapeQuerySyntaxImpl.discardEscapeChar(fieldToken.image);}
   ]
-
   (
    q=Term(field)
    | <LPAREN> q=Query(field) <RPAREN> (<CARAT> boost=<NUMBER>)? {group=true;}
-
   )
+)
     {
       if (boost != null) {
 		  float f = (float)1.0;
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/ParseException.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/ParseException.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/ParseException.java	(copie de travail)
@@ -193,4 +193,4 @@
    }
 
 }
-/* JavaCC - OriginalChecksum=38bce846fe6c8482993969f741c0323e (do not edit this line) */
+/* JavaCC - OriginalChecksum=d0caeac083e9874065f9d1e298b5ccd9 (do not edit this line) */
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/JavaCharStream.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/JavaCharStream.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/parser/JavaCharStream.java	(copie de travail)
@@ -613,4 +613,4 @@
   }
 
 }
-/* JavaCC - OriginalChecksum=f19c73b8f7faf94cc4a581e7b2933cc6 (do not edit this line) */
+/* JavaCC - OriginalChecksum=31519f95b41182c6740c2afd8dfbf344 (do not edit this line) */
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/Token.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/Token.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/Token.java	(copie de travail)
@@ -121,4 +121,4 @@
   }
 
 }
-/* JavaCC - OriginalChecksum=a1d2d2c0d7f5810183a1438fb4d51c1c (do not edit this line) */
+/* JavaCC - OriginalChecksum=6259c74f0c24e4450d7a20602f42a645 (do not edit this line) */
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/TokenMgrError.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/TokenMgrError.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/TokenMgrError.java	(copie de travail)
@@ -138,4 +138,4 @@
       this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
    }
 }
-/* JavaCC - OriginalChecksum=fecdd69c7d7b49407e441e312085db53 (do not edit this line) */
+/* JavaCC - OriginalChecksum=8a3572aec0e1390fee17dc4030371f1c (do not edit this line) */
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/CharStream.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/CharStream.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/CharStream.java	(copie de travail)
@@ -109,4 +109,4 @@
   void Done();
 
 }
-/* JavaCC - OriginalChecksum=872eafa2c180de2e08862f87f675b2dd (do not edit this line) */
+/* JavaCC - OriginalChecksum=cf8221406bf530bb4b94a478c72c6d6e (do not edit this line) */
Index: contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/ParseException.java
===================================================================
--- contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/ParseException.java	(révision 1151103)
+++ contrib/queryparser/src/java/org/apache/lucene/queryParser/surround/parser/ParseException.java	(copie de travail)
@@ -195,4 +195,4 @@
    }
 
 }
-/* JavaCC - OriginalChecksum=2a154532f17c98e29d1671b8413edb60 (do not edit this line) */
+/* JavaCC - OriginalChecksum=67d3d1346e4ba67bda5f447ef9dfb409 (do not edit this line) */
Index: src/test/org/apache/lucene/queryParser/TestQueryParser.java
===================================================================
--- src/test/org/apache/lucene/queryParser/TestQueryParser.java	(révision 1151103)
+++ src/test/org/apache/lucene/queryParser/TestQueryParser.java	(copie de travail)
@@ -529,6 +529,15 @@
     assertQueryEquals("[ a TO z] AND bar", null, "+[a TO z] +bar");
     assertQueryEquals("( bar blar { a TO z}) ", null, "bar blar {a TO z}");
     assertQueryEquals("gack ( bar blar { a TO z}) ", null, "gack (bar blar {a TO z})");
+
+    assertQueryEquals("field>=a", null, "[a TO *]");
+    assertQueryEquals("field >= a", null, "[a TO *]");
+    assertQueryEquals("field<=a", null, "[* TO a]");
+    assertQueryEquals("field <= a", null, "[* TO a]");
+    assertQueryEquals("field>a", null, "{a TO *}");
+    assertQueryEquals("field > a", null, "{a TO *}");
+    assertQueryEquals("field<a", null, "{* TO a}");
+    assertQueryEquals("field < a", null, "{* TO a}");
   }
     
   public void testFarsiRangeCollating() throws Exception {
Index: src/java/org/apache/lucene/queryParser/QueryParserConstants.java
===================================================================
--- src/java/org/apache/lucene/queryParser/QueryParserConstants.java	(révision 1151103)
+++ src/java/org/apache/lucene/queryParser/QueryParserConstants.java	(copie de travail)
@@ -37,43 +37,53 @@
   /** RegularExpression Id. */
   int RPAREN = 14;
   /** RegularExpression Id. */
-  int COLON = 15;
+  int OP_COLON = 15;
   /** RegularExpression Id. */
-  int STAR = 16;
+  int OP_EQUAL = 16;
   /** RegularExpression Id. */
-  int CARAT = 17;
+  int OP_LESSTHAN = 17;
   /** RegularExpression Id. */
-  int QUOTED = 18;
+  int OP_LESSTHANEQ = 18;
   /** RegularExpression Id. */
-  int TERM = 19;
+  int OP_MORETHAN = 19;
   /** RegularExpression Id. */
-  int FUZZY_SLOP = 20;
+  int OP_MORETHANEQ = 20;
   /** RegularExpression Id. */
-  int PREFIXTERM = 21;
+  int STAR = 21;
   /** RegularExpression Id. */
-  int WILDTERM = 22;
+  int CARAT = 22;
   /** RegularExpression Id. */
-  int RANGEIN_START = 23;
+  int QUOTED = 23;
   /** RegularExpression Id. */
-  int RANGEEX_START = 24;
+  int TERM = 24;
   /** RegularExpression Id. */
-  int NUMBER = 25;
+  int FUZZY_SLOP = 25;
   /** RegularExpression Id. */
-  int RANGEIN_TO = 26;
+  int PREFIXTERM = 26;
   /** RegularExpression Id. */
-  int RANGEIN_END = 27;
+  int WILDTERM = 27;
   /** RegularExpression Id. */
-  int RANGEIN_QUOTED = 28;
+  int RANGEIN_START = 28;
   /** RegularExpression Id. */
-  int RANGEIN_GOOP = 29;
+  int RANGEEX_START = 29;
   /** RegularExpression Id. */
-  int RANGEEX_TO = 30;
+  int NUMBER = 30;
   /** RegularExpression Id. */
-  int RANGEEX_END = 31;
+  int RANGEIN_TO = 31;
   /** RegularExpression Id. */
-  int RANGEEX_QUOTED = 32;
+  int RANGEIN_END = 32;
   /** RegularExpression Id. */
-  int RANGEEX_GOOP = 33;
+  int RANGEIN_QUOTED = 33;
+  /** RegularExpression Id. */
+  int RANGEIN_GOOP = 34;
+  /** RegularExpression Id. */
+  int RANGEEX_TO = 35;
+  /** RegularExpression Id. */
+  int RANGEEX_END = 36;
+  /** RegularExpression Id. */
+  int RANGEEX_QUOTED = 37;
+  /** RegularExpression Id. */
+  int RANGEEX_GOOP = 38;
 
   /** Lexical state. */
   int Boost = 0;
@@ -102,6 +112,11 @@
     "\"(\"",
     "\")\"",
     "\":\"",
+    "\"=\"",
+    "\"<\"",
+    "\"<=\"",
+    "\">\"",
+    "\">=\"",
     "\"*\"",
     "\"^\"",
     "<QUOTED>",
Index: src/java/org/apache/lucene/queryParser/Token.java
===================================================================
--- src/java/org/apache/lucene/queryParser/Token.java	(révision 1151103)
+++ src/java/org/apache/lucene/queryParser/Token.java	(copie de travail)
@@ -121,4 +121,4 @@
   }
 
 }
-/* JavaCC - OriginalChecksum=c147cc166a7cf8812c7c39bc8c5eb868 (do not edit this line) */
+/* JavaCC - OriginalChecksum=37b1923f964a5a434f5ea3d6952ff200 (do not edit this line) */
Index: src/java/org/apache/lucene/queryParser/TokenMgrError.java
===================================================================
--- src/java/org/apache/lucene/queryParser/TokenMgrError.java	(révision 1151103)
+++ src/java/org/apache/lucene/queryParser/TokenMgrError.java	(copie de travail)
@@ -138,4 +138,4 @@
       this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
    }
 }
-/* JavaCC - OriginalChecksum=1c94e13236c7e0121e49427992341ee3 (do not edit this line) */
+/* JavaCC - OriginalChecksum=334e679cf1a88b3070bb8e3d80ee3f5e (do not edit this line) */
Index: src/java/org/apache/lucene/queryParser/QueryParser.java
===================================================================
--- src/java/org/apache/lucene/queryParser/QueryParser.java	(révision 1151103)
+++ src/java/org/apache/lucene/queryParser/QueryParser.java	(copie de travail)
@@ -771,8 +771,8 @@
                                 boolean inclusive) throws ParseException
   {
     if (lowercaseExpandedTerms) {
-      part1 = part1.toLowerCase();
-      part2 = part2.toLowerCase();
+      part1 = part1 != null ? part1.toLowerCase() : null;
+      part2 = part2 != null ? part2.toLowerCase() : null;
     }
     try {
       DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
@@ -1276,56 +1276,179 @@
 
   final public Query Clause(String field) throws ParseException {
   Query q;
-  Token fieldToken=null, boost=null;
-    if (jj_2_1(2)) {
+  Token fieldToken=null, boost=null, operator=null, term=null;
+    if (jj_2_2(3)) {
+      fieldToken = jj_consume_token(TERM);
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case TERM:
-        fieldToken = jj_consume_token(TERM);
-        jj_consume_token(COLON);
-                               field=discardEscapeChar(fieldToken.image);
+      case OP_COLON:
+      case OP_EQUAL:
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case OP_COLON:
+          jj_consume_token(OP_COLON);
+          break;
+        case OP_EQUAL:
+          jj_consume_token(OP_EQUAL);
+          break;
+        default:
+          jj_la1[5] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+                                 field=discardEscapeChar(fieldToken.image);
+        q = Term(field);
         break;
-      case STAR:
-        jj_consume_token(STAR);
-        jj_consume_token(COLON);
-                      field="*";
+      case OP_LESSTHAN:
+      case OP_LESSTHANEQ:
+      case OP_MORETHAN:
+      case OP_MORETHANEQ:
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case OP_LESSTHAN:
+          operator = jj_consume_token(OP_LESSTHAN);
+          break;
+        case OP_LESSTHANEQ:
+          operator = jj_consume_token(OP_LESSTHANEQ);
+          break;
+        case OP_MORETHAN:
+          operator = jj_consume_token(OP_MORETHAN);
+          break;
+        case OP_MORETHANEQ:
+          operator = jj_consume_token(OP_MORETHANEQ);
+          break;
+        default:
+          jj_la1[6] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+                                                                                                               field=discardEscapeChar(fieldToken.image);
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case TERM:
+          term = jj_consume_token(TERM);
+          break;
+        case QUOTED:
+          term = jj_consume_token(QUOTED);
+          break;
+        case NUMBER:
+          term = jj_consume_token(NUMBER);
+          break;
+        default:
+          jj_la1[7] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
+        if (term.kind == QUOTED) {
+            term.image = term.image.substring(1, term.image.length()-1);
+        }
+        switch (operator.kind) {
+            case OP_LESSTHAN:
+                q = getRangeQuery(field, null, discardEscapeChar(term.image), false);
+                break;
+            case OP_LESSTHANEQ:
+                q = getRangeQuery(field, null, discardEscapeChar(term.image), true);
+                break;
+            case OP_MORETHAN:
+                q = getRangeQuery(field, discardEscapeChar(term.image), null, false);
+                break;
+            case OP_MORETHANEQ:
+                q = getRangeQuery(field, discardEscapeChar(term.image), null, true);
+                break;
+            default:
+                {if (true) throw new Error("Unhandled case: operator="+operator.toString());}
+        }
         break;
       default:
-        jj_la1[5] = jj_gen;
+        jj_la1[8] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
     } else {
-      ;
-    }
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case STAR:
-    case QUOTED:
-    case TERM:
-    case PREFIXTERM:
-    case WILDTERM:
-    case RANGEIN_START:
-    case RANGEEX_START:
-    case NUMBER:
-      q = Term(field);
-      break;
-    case LPAREN:
-      jj_consume_token(LPAREN);
-      q = Query(field);
-      jj_consume_token(RPAREN);
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-      case CARAT:
-        jj_consume_token(CARAT);
-        boost = jj_consume_token(NUMBER);
+      case LPAREN:
+      case STAR:
+      case QUOTED:
+      case TERM:
+      case PREFIXTERM:
+      case WILDTERM:
+      case RANGEIN_START:
+      case RANGEEX_START:
+      case NUMBER:
+        if (jj_2_1(2)) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case TERM:
+            fieldToken = jj_consume_token(TERM);
+            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+            case OP_COLON:
+              jj_consume_token(OP_COLON);
+              break;
+            case OP_EQUAL:
+              jj_consume_token(OP_EQUAL);
+              break;
+            default:
+              jj_la1[9] = jj_gen;
+              jj_consume_token(-1);
+              throw new ParseException();
+            }
+                                                   field=discardEscapeChar(fieldToken.image);
+            break;
+          case STAR:
+            jj_consume_token(STAR);
+            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+            case OP_COLON:
+              jj_consume_token(OP_COLON);
+              break;
+            case OP_EQUAL:
+              jj_consume_token(OP_EQUAL);
+              break;
+            default:
+              jj_la1[10] = jj_gen;
+              jj_consume_token(-1);
+              throw new ParseException();
+            }
+                                          field="*";
+            break;
+          default:
+            jj_la1[11] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+          }
+        } else {
+          ;
+        }
+        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+        case STAR:
+        case QUOTED:
+        case TERM:
+        case PREFIXTERM:
+        case WILDTERM:
+        case RANGEIN_START:
+        case RANGEEX_START:
+        case NUMBER:
+          q = Term(field);
+          break;
+        case LPAREN:
+          jj_consume_token(LPAREN);
+          q = Query(field);
+          jj_consume_token(RPAREN);
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case CARAT:
+            jj_consume_token(CARAT);
+            boost = jj_consume_token(NUMBER);
+            break;
+          default:
+            jj_la1[12] = jj_gen;
+            ;
+          }
+          break;
+        default:
+          jj_la1[13] = jj_gen;
+          jj_consume_token(-1);
+          throw new ParseException();
+        }
         break;
       default:
-        jj_la1[6] = jj_gen;
-        ;
+        jj_la1[14] = jj_gen;
+        jj_consume_token(-1);
+        throw new ParseException();
       }
-      break;
-    default:
-      jj_la1[7] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
     }
       if (boost != null) {
         float f = (float)1.0;
@@ -1370,7 +1493,7 @@
         term = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[8] = jj_gen;
+        jj_la1[15] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -1380,7 +1503,7 @@
                                 fuzzy=true;
         break;
       default:
-        jj_la1[9] = jj_gen;
+        jj_la1[16] = jj_gen;
         ;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1393,12 +1516,12 @@
                                                          fuzzy=true;
           break;
         default:
-          jj_la1[10] = jj_gen;
+          jj_la1[17] = jj_gen;
           ;
         }
         break;
       default:
-        jj_la1[11] = jj_gen;
+        jj_la1[18] = jj_gen;
         ;
       }
        String termImage=discardEscapeChar(term.image);
@@ -1431,7 +1554,7 @@
         goop1 = jj_consume_token(RANGEIN_QUOTED);
         break;
       default:
-        jj_la1[12] = jj_gen;
+        jj_la1[19] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -1440,7 +1563,7 @@
         jj_consume_token(RANGEIN_TO);
         break;
       default:
-        jj_la1[13] = jj_gen;
+        jj_la1[20] = jj_gen;
         ;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1451,7 +1574,7 @@
         goop2 = jj_consume_token(RANGEIN_QUOTED);
         break;
       default:
-        jj_la1[14] = jj_gen;
+        jj_la1[21] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -1462,7 +1585,7 @@
         boost = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[15] = jj_gen;
+        jj_la1[22] = jj_gen;
         ;
       }
           if (goop1.kind == RANGEIN_QUOTED) {
@@ -1483,7 +1606,7 @@
         goop1 = jj_consume_token(RANGEEX_QUOTED);
         break;
       default:
-        jj_la1[16] = jj_gen;
+        jj_la1[23] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -1492,7 +1615,7 @@
         jj_consume_token(RANGEEX_TO);
         break;
       default:
-        jj_la1[17] = jj_gen;
+        jj_la1[24] = jj_gen;
         ;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1503,7 +1626,7 @@
         goop2 = jj_consume_token(RANGEEX_QUOTED);
         break;
       default:
-        jj_la1[18] = jj_gen;
+        jj_la1[25] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -1514,7 +1637,7 @@
         boost = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[19] = jj_gen;
+        jj_la1[26] = jj_gen;
         ;
       }
           if (goop1.kind == RANGEEX_QUOTED) {
@@ -1533,7 +1656,7 @@
         fuzzySlop = jj_consume_token(FUZZY_SLOP);
         break;
       default:
-        jj_la1[20] = jj_gen;
+        jj_la1[27] = jj_gen;
         ;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1542,7 +1665,7 @@
         boost = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[21] = jj_gen;
+        jj_la1[28] = jj_gen;
         ;
       }
          int s = phraseSlop;
@@ -1556,7 +1679,7 @@
          q = getFieldQuery(field, discardEscapeChar(term.image.substring(1, term.image.length()-1)), s);
       break;
     default:
-      jj_la1[22] = jj_gen;
+      jj_la1[29] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1587,15 +1710,26 @@
     finally { jj_save(0, xla); }
   }
 
-  private boolean jj_3R_3() {
-    if (jj_scan_token(STAR)) return true;
-    if (jj_scan_token(COLON)) return true;
+  private boolean jj_2_2(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_2(); }
+    catch(LookaheadSuccess ls) { return true; }
+    finally { jj_save(1, xla); }
+  }
+
+  private boolean jj_3R_10() {
+    if (jj_scan_token(QUOTED)) return true;
     return false;
   }
 
   private boolean jj_3R_2() {
     if (jj_scan_token(TERM)) return true;
-    if (jj_scan_token(COLON)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(15)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(16)) return true;
+    }
     return false;
   }
 
@@ -1609,6 +1743,123 @@
     return false;
   }
 
+  private boolean jj_3R_5() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(17)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(18)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(19)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(20)) return true;
+    }
+    }
+    }
+    xsp = jj_scanpos;
+    if (jj_scan_token(24)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(23)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(30)) return true;
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_8() {
+    if (jj_scan_token(RANGEIN_START)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_4() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(15)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(16)) return true;
+    }
+    if (jj_3R_6()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_13() {
+    if (jj_scan_token(WILDTERM)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_12() {
+    if (jj_scan_token(PREFIXTERM)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_11() {
+    if (jj_scan_token(STAR)) return true;
+    return false;
+  }
+
+  private boolean jj_3_2() {
+    if (jj_scan_token(TERM)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_4()) {
+    jj_scanpos = xsp;
+    if (jj_3R_5()) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_7() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(24)) {
+    jj_scanpos = xsp;
+    if (jj_3R_11()) {
+    jj_scanpos = xsp;
+    if (jj_3R_12()) {
+    jj_scanpos = xsp;
+    if (jj_3R_13()) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(30)) return true;
+    }
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_9() {
+    if (jj_scan_token(RANGEEX_START)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_6() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_7()) {
+    jj_scanpos = xsp;
+    if (jj_3R_8()) {
+    jj_scanpos = xsp;
+    if (jj_3R_9()) {
+    jj_scanpos = xsp;
+    if (jj_3R_10()) return true;
+    }
+    }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_3() {
+    if (jj_scan_token(STAR)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(15)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(16)) return true;
+    }
+    return false;
+  }
+
   /** Generated Token Manager. */
   public QueryParserTokenManager token_source;
   /** Current token. */
@@ -1619,7 +1870,7 @@
   private Token jj_scanpos, jj_lastpos;
   private int jj_la;
   private int jj_gen;
-  final private int[] jj_la1 = new int[23];
+  final private int[] jj_la1 = new int[30];
   static private int[] jj_la1_0;
   static private int[] jj_la1_1;
   static {
@@ -1627,12 +1878,12 @@
       jj_la1_init_1();
    }
    private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] {0x300,0x300,0x1c00,0x1c00,0x3ed3f00,0x90000,0x20000,0x3ed2000,0x2690000,0x100000,0x100000,0x20000,0x30000000,0x4000000,0x30000000,0x20000,0x0,0x40000000,0x0,0x20000,0x100000,0x20000,0x3ed0000,};
+      jj_la1_0 = new int[] {0x300,0x300,0x1c00,0x1c00,0x7da03f00,0x18000,0x1e0000,0x41800000,0x1f8000,0x18000,0x18000,0x1200000,0x400000,0x7da02000,0x7da02000,0x4d200000,0x2000000,0x2000000,0x400000,0x0,0x80000000,0x0,0x400000,0x0,0x0,0x0,0x400000,0x2000000,0x400000,0x7da00000,};
    }
    private static void jj_la1_init_1() {
-      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x0,};
+      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6,0x0,0x6,0x0,0x60,0x8,0x60,0x0,0x0,0x0,0x0,};
    }
-  final private JJCalls[] jj_2_rtns = new JJCalls[1];
+  final private JJCalls[] jj_2_rtns = new JJCalls[2];
   private boolean jj_rescan = false;
   private int jj_gc = 0;
 
@@ -1642,7 +1893,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 23; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -1652,7 +1903,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 23; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -1662,7 +1913,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 23; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -1672,7 +1923,7 @@
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 23; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 30; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -1784,12 +2035,12 @@
   /** Generate ParseException. */
   public ParseException generateParseException() {
     jj_expentries.clear();
-    boolean[] la1tokens = new boolean[34];
+    boolean[] la1tokens = new boolean[39];
     if (jj_kind >= 0) {
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 23; i++) {
+    for (int i = 0; i < 30; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
@@ -1801,7 +2052,7 @@
         }
       }
     }
-    for (int i = 0; i < 34; i++) {
+    for (int i = 0; i < 39; i++) {
       if (la1tokens[i]) {
         jj_expentry = new int[1];
         jj_expentry[0] = i;
@@ -1828,7 +2079,7 @@
 
   private void jj_rescan_token() {
     jj_rescan = true;
-    for (int i = 0; i < 1; i++) {
+    for (int i = 0; i < 2; i++) {
     try {
       JJCalls p = jj_2_rtns[i];
       do {
@@ -1836,6 +2087,7 @@
           jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
           switch (i) {
             case 0: jj_3_1(); break;
+            case 1: jj_3_2(); break;
           }
         }
         p = p.next;
Index: src/java/org/apache/lucene/queryParser/QueryParser.jj
===================================================================
--- src/java/org/apache/lucene/queryParser/QueryParser.jj	(révision 1151103)
+++ src/java/org/apache/lucene/queryParser/QueryParser.jj	(copie de travail)
@@ -795,8 +795,8 @@
                                 boolean inclusive) throws ParseException
   {
     if (lowercaseExpandedTerms) {
-      part1 = part1.toLowerCase();
-      part2 = part2.toLowerCase();
+      part1 = part1 != null ? part1.toLowerCase() : null;
+      part2 = part2 != null ? part2.toLowerCase() : null;
     }
     try {
       DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
@@ -1193,7 +1193,7 @@
 // every character that follows a backslash is considered as an escaped character
 | <#_ESCAPED_CHAR: "\\" ~[] >
 | <#_TERM_START_CHAR: ( ~[ " ", "\t", "\n", "\r", "\u3000", "+", "-", "!", "(", ")", ":", "^",
-                           "[", "]", "\"", "{", "}", "~", "*", "?", "\\" ]
+                           "<", ">", "=", "[", "]", "\"", "{", "}", "~", "*", "?", "\\" ]
                        | <_ESCAPED_CHAR> ) >
 | <#_TERM_CHAR: ( <_TERM_START_CHAR> | <_ESCAPED_CHAR> | "-" | "+" ) >
 | <#_WHITESPACE: ( " " | "\t" | "\n" | "\r" | "\u3000") >
@@ -1212,7 +1212,12 @@
 | <MINUS:     "-" >
 | <LPAREN:    "(" >
 | <RPAREN:    ")" >
-| <COLON:     ":" >
+| <OP_COLON:  ":" >
+| <OP_EQUAL:  "=" >
+| <OP_LESSTHAN:   "<"  >
+| <OP_LESSTHANEQ: "<=" >
+| <OP_MORETHAN:   ">"  >
+| <OP_MORETHANEQ: ">=" >
 | <STAR:      "*" >
 | <CARAT:     "^" > : Boost
 | <QUOTED:     "\"" (<_QUOTED_CHAR>)* "\"">
@@ -1308,22 +1313,49 @@
 
 Query Clause(String field) : {
   Query q;
-  Token fieldToken=null, boost=null;
+  Token fieldToken=null, boost=null, operator=null, term=null;
 }
 {
-  [
+(
+  LOOKAHEAD(3)
+  fieldToken=<TERM> (
+    ( <OP_COLON> | <OP_EQUAL> ) {field=discardEscapeChar(fieldToken.image);} q=Term(field)
+  | ( operator=<OP_LESSTHAN> | operator=<OP_LESSTHANEQ> | operator=<OP_MORETHAN> | operator=<OP_MORETHANEQ> ) {field=discardEscapeChar(fieldToken.image);}( term=<TERM> | term=<QUOTED> | term=<NUMBER> )
+    {
+        if (term.kind == QUOTED) {
+            term.image = term.image.substring(1, term.image.length()-1);
+        }
+        switch (operator.kind) {
+            case OP_LESSTHAN:
+                q = getRangeQuery(field, null, discardEscapeChar(term.image), false);
+                break;
+            case OP_LESSTHANEQ:
+                q = getRangeQuery(field, null, discardEscapeChar(term.image), true);
+                break;
+            case OP_MORETHAN:
+                q = getRangeQuery(field, discardEscapeChar(term.image), null, false);
+                break;
+            case OP_MORETHANEQ:
+                q = getRangeQuery(field, discardEscapeChar(term.image), null, true);
+                break;
+            default:
+                throw new Error("Unhandled case: operator="+operator.toString());
+        }
+    }
+  )
+| [
     LOOKAHEAD(2)
     (
-    fieldToken=<TERM> <COLON> {field=discardEscapeChar(fieldToken.image);}
-    | <STAR> <COLON> {field="*";}
+    fieldToken=<TERM> ( <OP_COLON> | <OP_EQUAL> ) {field=discardEscapeChar(fieldToken.image);}
+    | <STAR> ( <OP_COLON> | <OP_EQUAL> ) {field="*";}
     )
   ]
-
   (
    q=Term(field)
    | <LPAREN> q=Query(field) <RPAREN> (<CARAT> boost=<NUMBER>)?
 
   )
+)
     {
       if (boost != null) {
         float f = (float)1.0;
Index: src/java/org/apache/lucene/queryParser/CharStream.java
===================================================================
--- src/java/org/apache/lucene/queryParser/CharStream.java	(révision 1151103)
+++ src/java/org/apache/lucene/queryParser/CharStream.java	(copie de travail)
@@ -109,4 +109,4 @@
   void Done();
 
 }
-/* JavaCC - OriginalChecksum=32a89423891f765dde472f7ef0e3ef7b (do not edit this line) */
+/* JavaCC - OriginalChecksum=a83909a2403f969f94d18375f9f143e4 (do not edit this line) */
Index: src/java/org/apache/lucene/queryParser/ParseException.java
===================================================================
--- src/java/org/apache/lucene/queryParser/ParseException.java	(révision 1151103)
+++ src/java/org/apache/lucene/queryParser/ParseException.java	(copie de travail)
@@ -195,4 +195,4 @@
    }
 
 }
-/* JavaCC - OriginalChecksum=c7631a240f7446940695eac31d9483ca (do not edit this line) */
+/* JavaCC - OriginalChecksum=c63b396885c4ff44d7aa48d3feae60cd (do not edit this line) */
Index: src/java/org/apache/lucene/queryParser/QueryParserTokenManager.java
===================================================================
--- src/java/org/apache/lucene/queryParser/QueryParserTokenManager.java	(révision 1151103)
+++ src/java/org/apache/lucene/queryParser/QueryParserTokenManager.java	(copie de travail)
@@ -46,6 +46,10 @@
 {
    switch (pos)
    {
+      case 0:
+         if ((active0 & 0x200000L) != 0L)
+            return 36;
+         return -1;
       default :
          return -1;
    }
@@ -69,23 +73,51 @@
       case 41:
          return jjStopAtPos(0, 14);
       case 42:
-         return jjStartNfaWithStates_3(0, 16, 36);
+         return jjStartNfaWithStates_3(0, 21, 36);
       case 43:
          return jjStopAtPos(0, 11);
       case 45:
          return jjStopAtPos(0, 12);
       case 58:
          return jjStopAtPos(0, 15);
+      case 60:
+         jjmatchedKind = 17;
+         return jjMoveStringLiteralDfa1_3(0x40000L);
+      case 61:
+         return jjStopAtPos(0, 16);
+      case 62:
+         jjmatchedKind = 19;
+         return jjMoveStringLiteralDfa1_3(0x100000L);
       case 91:
-         return jjStopAtPos(0, 23);
+         return jjStopAtPos(0, 28);
       case 94:
-         return jjStopAtPos(0, 17);
+         return jjStopAtPos(0, 22);
       case 123:
-         return jjStopAtPos(0, 24);
+         return jjStopAtPos(0, 29);
       default :
          return jjMoveNfa_3(0, 0);
    }
 }
+private int jjMoveStringLiteralDfa1_3(long active0)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_3(0, active0);
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 61:
+         if ((active0 & 0x40000L) != 0L)
+            return jjStopAtPos(1, 18);
+         else if ((active0 & 0x100000L) != 0L)
+            return jjStopAtPos(1, 20);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_3(0, active0);
+}
 private int jjStartNfaWithStates_3(int pos, int kind, int state)
 {
    jjmatchedKind = kind;
@@ -126,17 +158,17 @@
             {
                case 36:
                case 25:
-                  if ((0xfbfffcf8ffffd9ffL & l) == 0L)
+                  if ((0x8bfffcf8ffffd9ffL & l) == 0L)
                      break;
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAddTwoStates(25, 26);
                   break;
                case 0:
-                  if ((0xfbffd4f8ffffd9ffL & l) != 0L)
+                  if ((0x8bffd4f8ffffd9ffL & l) != 0L)
                   {
-                     if (kind > 22)
-                        kind = 22;
+                     if (kind > 27)
+                        kind = 27;
                      jjCheckNAddTwoStates(25, 26);
                   }
                   else if ((0x100002600L & l) != 0L)
@@ -151,16 +183,16 @@
                      if (kind > 10)
                         kind = 10;
                   }
-                  if ((0x7bffd0f8ffffd9ffL & l) != 0L)
+                  if ((0xbffd0f8ffffd9ffL & l) != 0L)
                   {
-                     if (kind > 19)
-                        kind = 19;
+                     if (kind > 24)
+                        kind = 24;
                      jjCheckNAddStates(3, 7);
                   }
                   else if (curChar == 42)
                   {
-                     if (kind > 21)
-                        kind = 21;
+                     if (kind > 26)
+                        kind = 26;
                   }
                   if (curChar == 38)
                      jjstateSet[jjnewStateCnt++] = 4;
@@ -189,14 +221,14 @@
                   jjCheckNAddStates(0, 2);
                   break;
                case 18:
-                  if (curChar == 34 && kind > 18)
-                     kind = 18;
+                  if (curChar == 34 && kind > 23)
+                     kind = 23;
                   break;
                case 20:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 20)
-                     kind = 20;
+                  if (kind > 25)
+                     kind = 25;
                   jjAddStates(8, 9);
                   break;
                case 21:
@@ -206,47 +238,47 @@
                case 22:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 20)
-                     kind = 20;
+                  if (kind > 25)
+                     kind = 25;
                   jjCheckNAdd(22);
                   break;
                case 23:
-                  if (curChar == 42 && kind > 21)
-                     kind = 21;
+                  if (curChar == 42 && kind > 26)
+                     kind = 26;
                   break;
                case 24:
-                  if ((0xfbffd4f8ffffd9ffL & l) == 0L)
+                  if ((0x8bffd4f8ffffd9ffL & l) == 0L)
                      break;
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAddTwoStates(25, 26);
                   break;
                case 27:
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAddTwoStates(25, 26);
                   break;
                case 28:
-                  if ((0x7bffd0f8ffffd9ffL & l) == 0L)
+                  if ((0xbffd0f8ffffd9ffL & l) == 0L)
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAddStates(3, 7);
                   break;
                case 29:
-                  if ((0x7bfff8f8ffffd9ffL & l) == 0L)
+                  if ((0xbfff8f8ffffd9ffL & l) == 0L)
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAddTwoStates(29, 30);
                   break;
                case 31:
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAddTwoStates(29, 30);
                   break;
                case 32:
-                  if ((0x7bfff8f8ffffd9ffL & l) != 0L)
+                  if ((0xbfff8f8ffffd9ffL & l) != 0L)
                      jjCheckNAddStates(10, 12);
                   break;
                case 34:
@@ -266,8 +298,8 @@
                case 36:
                   if ((0x97ffffff87ffffffL & l) != 0L)
                   {
-                     if (kind > 22)
-                        kind = 22;
+                     if (kind > 27)
+                        kind = 27;
                      jjCheckNAddTwoStates(25, 26);
                   }
                   else if (curChar == 92)
@@ -276,22 +308,22 @@
                case 0:
                   if ((0x97ffffff87ffffffL & l) != 0L)
                   {
-                     if (kind > 19)
-                        kind = 19;
+                     if (kind > 24)
+                        kind = 24;
                      jjCheckNAddStates(3, 7);
                   }
                   else if (curChar == 92)
                      jjCheckNAddStates(13, 15);
                   else if (curChar == 126)
                   {
-                     if (kind > 20)
-                        kind = 20;
+                     if (kind > 25)
+                        kind = 25;
                      jjstateSet[jjnewStateCnt++] = 20;
                   }
                   if ((0x97ffffff87ffffffL & l) != 0L)
                   {
-                     if (kind > 22)
-                        kind = 22;
+                     if (kind > 27)
+                        kind = 27;
                      jjCheckNAddTwoStates(25, 26);
                   }
                   if (curChar == 78)
@@ -357,22 +389,22 @@
                case 19:
                   if (curChar != 126)
                      break;
-                  if (kind > 20)
-                     kind = 20;
+                  if (kind > 25)
+                     kind = 25;
                   jjstateSet[jjnewStateCnt++] = 20;
                   break;
                case 24:
                   if ((0x97ffffff87ffffffL & l) == 0L)
                      break;
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAddTwoStates(25, 26);
                   break;
                case 25:
                   if ((0x97ffffff87ffffffL & l) == 0L)
                      break;
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAddTwoStates(25, 26);
                   break;
                case 26:
@@ -380,22 +412,22 @@
                      jjCheckNAddTwoStates(27, 27);
                   break;
                case 27:
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAddTwoStates(25, 26);
                   break;
                case 28:
                   if ((0x97ffffff87ffffffL & l) == 0L)
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAddStates(3, 7);
                   break;
                case 29:
                   if ((0x97ffffff87ffffffL & l) == 0L)
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAddTwoStates(29, 30);
                   break;
                case 30:
@@ -403,8 +435,8 @@
                      jjCheckNAddTwoStates(31, 31);
                   break;
                case 31:
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAddTwoStates(29, 30);
                   break;
                case 32:
@@ -441,8 +473,8 @@
                case 25:
                   if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAddTwoStates(25, 26);
                   break;
                case 0:
@@ -453,14 +485,14 @@
                   }
                   if (jjCanMove_2(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 22)
-                        kind = 22;
+                     if (kind > 27)
+                        kind = 27;
                      jjCheckNAddTwoStates(25, 26);
                   }
                   if (jjCanMove_2(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 19)
-                        kind = 19;
+                     if (kind > 24)
+                        kind = 24;
                      jjCheckNAddStates(3, 7);
                   }
                   break;
@@ -472,36 +504,36 @@
                case 24:
                   if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAddTwoStates(25, 26);
                   break;
                case 27:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 22)
-                     kind = 22;
+                  if (kind > 27)
+                     kind = 27;
                   jjCheckNAddTwoStates(25, 26);
                   break;
                case 28:
                   if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAddStates(3, 7);
                   break;
                case 29:
                   if (!jjCanMove_2(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAddTwoStates(29, 30);
                   break;
                case 31:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAddTwoStates(29, 30);
                   break;
                case 32:
@@ -534,9 +566,9 @@
    switch (pos)
    {
       case 0:
-         if ((active0 & 0x40000000L) != 0L)
+         if ((active0 & 0x800000000L) != 0L)
          {
-            jjmatchedKind = 33;
+            jjmatchedKind = 38;
             return 6;
          }
          return -1;
@@ -553,9 +585,9 @@
    switch(curChar)
    {
       case 84:
-         return jjMoveStringLiteralDfa1_1(0x40000000L);
+         return jjMoveStringLiteralDfa1_1(0x800000000L);
       case 125:
-         return jjStopAtPos(0, 31);
+         return jjStopAtPos(0, 36);
       default :
          return jjMoveNfa_1(0, 0);
    }
@@ -570,8 +602,8 @@
    switch(curChar)
    {
       case 79:
-         if ((active0 & 0x40000000L) != 0L)
-            return jjStartNfaWithStates_1(1, 30, 6);
+         if ((active0 & 0x800000000L) != 0L)
+            return jjStartNfaWithStates_1(1, 35, 6);
          break;
       default :
          break;
@@ -607,8 +639,8 @@
                case 0:
                   if ((0xfffffffeffffffffL & l) != 0L)
                   {
-                     if (kind > 33)
-                        kind = 33;
+                     if (kind > 38)
+                        kind = 38;
                      jjCheckNAdd(6);
                   }
                   if ((0x100002600L & l) != 0L)
@@ -632,14 +664,14 @@
                      jjCheckNAddStates(16, 18);
                   break;
                case 5:
-                  if (curChar == 34 && kind > 32)
-                     kind = 32;
+                  if (curChar == 34 && kind > 37)
+                     kind = 37;
                   break;
                case 6:
                   if ((0xfffffffeffffffffL & l) == 0L)
                      break;
-                  if (kind > 33)
-                     kind = 33;
+                  if (kind > 38)
+                     kind = 38;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -657,8 +689,8 @@
                case 6:
                   if ((0xdfffffffffffffffL & l) == 0L)
                      break;
-                  if (kind > 33)
-                     kind = 33;
+                  if (kind > 38)
+                     kind = 38;
                   jjCheckNAdd(6);
                   break;
                case 2:
@@ -691,8 +723,8 @@
                   }
                   if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 33)
-                        kind = 33;
+                     if (kind > 38)
+                        kind = 38;
                      jjCheckNAdd(6);
                   }
                   break;
@@ -703,8 +735,8 @@
                case 6:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 33)
-                     kind = 33;
+                  if (kind > 38)
+                     kind = 38;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -749,8 +781,8 @@
                case 0:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 25)
-                     kind = 25;
+                  if (kind > 30)
+                     kind = 30;
                   jjAddStates(19, 20);
                   break;
                case 1:
@@ -760,8 +792,8 @@
                case 2:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 25)
-                     kind = 25;
+                  if (kind > 30)
+                     kind = 30;
                   jjCheckNAdd(2);
                   break;
                default : break;
@@ -812,9 +844,9 @@
    switch (pos)
    {
       case 0:
-         if ((active0 & 0x4000000L) != 0L)
+         if ((active0 & 0x80000000L) != 0L)
          {
-            jjmatchedKind = 29;
+            jjmatchedKind = 34;
             return 6;
          }
          return -1;
@@ -831,9 +863,9 @@
    switch(curChar)
    {
       case 84:
-         return jjMoveStringLiteralDfa1_2(0x4000000L);
+         return jjMoveStringLiteralDfa1_2(0x80000000L);
       case 93:
-         return jjStopAtPos(0, 27);
+         return jjStopAtPos(0, 32);
       default :
          return jjMoveNfa_2(0, 0);
    }
@@ -848,8 +880,8 @@
    switch(curChar)
    {
       case 79:
-         if ((active0 & 0x4000000L) != 0L)
-            return jjStartNfaWithStates_2(1, 26, 6);
+         if ((active0 & 0x80000000L) != 0L)
+            return jjStartNfaWithStates_2(1, 31, 6);
          break;
       default :
          break;
@@ -885,8 +917,8 @@
                case 0:
                   if ((0xfffffffeffffffffL & l) != 0L)
                   {
-                     if (kind > 29)
-                        kind = 29;
+                     if (kind > 34)
+                        kind = 34;
                      jjCheckNAdd(6);
                   }
                   if ((0x100002600L & l) != 0L)
@@ -910,14 +942,14 @@
                      jjCheckNAddStates(16, 18);
                   break;
                case 5:
-                  if (curChar == 34 && kind > 28)
-                     kind = 28;
+                  if (curChar == 34 && kind > 33)
+                     kind = 33;
                   break;
                case 6:
                   if ((0xfffffffeffffffffL & l) == 0L)
                      break;
-                  if (kind > 29)
-                     kind = 29;
+                  if (kind > 34)
+                     kind = 34;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -935,8 +967,8 @@
                case 6:
                   if ((0xffffffffdfffffffL & l) == 0L)
                      break;
-                  if (kind > 29)
-                     kind = 29;
+                  if (kind > 34)
+                     kind = 34;
                   jjCheckNAdd(6);
                   break;
                case 2:
@@ -969,8 +1001,8 @@
                   }
                   if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 29)
-                        kind = 29;
+                     if (kind > 34)
+                        kind = 34;
                      jjCheckNAdd(6);
                   }
                   break;
@@ -981,8 +1013,8 @@
                case 6:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 29)
-                     kind = 29;
+                  if (kind > 34)
+                     kind = 34;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -1046,8 +1078,9 @@
 /** Token literal values. */
 public static final String[] jjstrLiteralImages = {
 "", null, null, null, null, null, null, null, null, null, null, "\53", "\55", 
-"\50", "\51", "\72", "\52", "\136", null, null, null, null, null, "\133", "\173", 
-null, "\124\117", "\135", null, null, "\124\117", "\175", null, null, };
+"\50", "\51", "\72", "\75", "\74", "\74\75", "\76", "\76\75", "\52", "\136", null, 
+null, null, null, null, "\133", "\173", null, "\124\117", "\135", null, null, 
+"\124\117", "\175", null, null, };
 
 /** Lexer state names. */
 public static final String[] lexStateNames = {
@@ -1059,11 +1092,11 @@
 
 /** Lex State array. */
 public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, 2, 1, 
-   3, -1, 3, -1, -1, -1, 3, -1, -1, 
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 
+   -1, -1, -1, 2, 1, 3, -1, 3, -1, -1, -1, 3, -1, -1, 
 };
 static final long[] jjtoToken = {
-   0x3ffffff01L, 
+   0x7fffffff01L, 
 };
 static final long[] jjtoSkip = {
    0x80L, 
