Index: modules/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestNumericQueryParser.java
===================================================================
--- modules/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestNumericQueryParser.java	(révision 1150713)
+++ modules/queryparser/src/test/org/apache/lucene/queryparser/flexible/standard/TestNumericQueryParser.java	(copie de travail)
@@ -325,6 +325,25 @@
   }
   
   @Test
+  public void testOpenRangeNumericQuery() throws Exception {
+	assertOpenRangeQuery(NumberType.ZERO, "<", 1);
+	assertOpenRangeQuery(NumberType.POSITIVE, "<", 2);
+	assertOpenRangeQuery(NumberType.NEGATIVE, "<", 0);
+	
+	assertOpenRangeQuery(NumberType.ZERO, "<=", 2);
+	assertOpenRangeQuery(NumberType.POSITIVE, "<=", 3);
+	assertOpenRangeQuery(NumberType.NEGATIVE, "<=", 1);
+	
+	assertOpenRangeQuery(NumberType.ZERO, ">", 1);
+	assertOpenRangeQuery(NumberType.POSITIVE, ">", 0);
+	assertOpenRangeQuery(NumberType.NEGATIVE, ">", 2);
+	
+	assertOpenRangeQuery(NumberType.ZERO, ">=", 2);
+	assertOpenRangeQuery(NumberType.POSITIVE, ">=", 1);
+	assertOpenRangeQuery(NumberType.NEGATIVE, ">=", 3);
+  }
+  
+  @Test
   public void testSimpleNumericQuery() throws Exception {
     assertSimpleQuery(NumberType.ZERO, 1);
     assertSimpleQuery(NumberType.POSITIVE, 1);
@@ -366,6 +385,26 @@
     
   }
   
+  public void assertOpenRangeQuery(NumberType boundType, String operator, int expectedDocCount)
+      throws QueryNodeException, IOException {
+
+    StringBuilder sb = new StringBuilder();
+    
+    for (NumericField.DataType type : NumericField.DataType.values()) {
+      String boundStr = numberToString(getNumberType(boundType, type.name()));
+      
+      sb.append("+").append(type.name()).append(operator).append('"').append(boundStr).append('"').append(' ');
+    }
+    
+    String boundDateStr = ESCAPER.escape(
+        DATE_FORMAT.format(new Date(getNumberType(boundType, DATE_FIELD_NAME)
+            .longValue())), LOCALE, EscapeQuerySyntax.Type.STRING).toString();
+    
+    sb.append("+").append(DATE_FIELD_NAME).append(operator).append('"').append(boundDateStr).append('"');
+    
+    testQuery(sb.toString(), expectedDocCount);
+  }
+  
   public void assertSimpleQuery(NumberType numberType, int expectedDocCount)
       throws QueryNodeException, IOException {
     StringBuilder sb = new StringBuilder();
@@ -401,7 +440,6 @@
     if (VERBOSE) System.out.println(msg);
     
     assertEquals(msg, expectedDocCount, topDocs.totalHits);
-    
   }
   
   private static String numberToString(Number number) {
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/Token.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/Token.java	(révision 1150713)
+++ modules/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=072a7ad2709e5810f5c35fa113fa0c8b (do not edit this line) */
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/TokenMgrError.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/TokenMgrError.java	(révision 1150713)
+++ modules/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=9cfe06f5ffcaac4b72c928c9ced2f5e7 (do not edit this line) */
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/QueryParser.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/QueryParser.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/QueryParser.java	(copie de travail)
@@ -624,7 +624,7 @@
       return (jj_ntk = jj_nt.kind);
   }
 
-  private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
+  private java.util.List jj_expentries = new java.util.ArrayList();
   private int[] jj_expentry;
   private int jj_kind = -1;
   private int[] jj_lasttokens = new int[100];
@@ -684,7 +684,7 @@
     jj_add_error_token(0, 0);
     int[][] exptokseq = new int[jj_expentries.size()][];
     for (int i = 0; i < jj_expentries.size(); i++) {
-      exptokseq[i] = jj_expentries.get(i);
+      exptokseq[i] = (int[])jj_expentries.get(i);
     }
     return new ParseException(token, exptokseq, tokenImage);
   }
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/CharStream.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/CharStream.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/CharStream.java	(copie de travail)
@@ -28,14 +28,14 @@
 
   /**
    * Returns the column position of the character last read.
-   * @deprecated (gen)
+   * @deprecated
    * @see #getEndColumn
    */
   int getColumn();
 
   /**
    * Returns the line number of the character last read.
-   * @deprecated (gen)
+   * @deprecated
    * @see #getEndLine
    */
   int getLine();
@@ -109,4 +109,4 @@
   void Done();
 
 }
-/* JavaCC - OriginalChecksum=872eafa2c180de2e08862f87f675b2dd (do not edit this line) */
+/* JavaCC - OriginalChecksum=def574f5a8956cf01b79ebe7bce95e74 (do not edit this line) */
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/ParseException.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/surround/parser/ParseException.java	(révision 1150713)
+++ modules/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=10f9a58db50336511327c43cc760ac21 (do not edit this line) */
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/NumericRangeQueryNodeProcessor.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/NumericRangeQueryNodeProcessor.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/processors/NumericRangeQueryNodeProcessor.java	(copie de travail)
@@ -87,7 +87,7 @@
             Number lowerNumber, upperNumber;
             
             try {
-              lowerNumber = numberFormat.parse(lower.getTextAsString());
+              lowerNumber = lower.getTextAsString() == null ? null : numberFormat.parse(lower.getTextAsString());
               
             } catch (ParseException e) {
               throw new QueryNodeParseException(new MessageImpl(
@@ -97,7 +97,7 @@
             }
             
             try {
-              upperNumber = numberFormat.parse(upper.getTextAsString());
+              upperNumber = upper.getTextAsString() == null ? null : numberFormat.parse(upper.getTextAsString());
               
             } catch (ParseException e) {
               throw new QueryNodeParseException(new MessageImpl(
@@ -108,20 +108,20 @@
             
             switch (numericConfig.getType()) {
               case LONG:
-                upperNumber = upperNumber.longValue();
-                lowerNumber = lowerNumber.longValue();
+                if (upperNumber != null) upperNumber = upperNumber.longValue();
+                if (lowerNumber != null) lowerNumber = lowerNumber.longValue();
                 break;
               case INT:
-                upperNumber = upperNumber.intValue();
-                lowerNumber = lowerNumber.intValue();
+                if (upperNumber != null) upperNumber = upperNumber.intValue();
+                if (lowerNumber != null) lowerNumber = lowerNumber.intValue();
                 break;
               case DOUBLE:
-                upperNumber = upperNumber.doubleValue();
-                lowerNumber = lowerNumber.doubleValue();
+                if (upperNumber != null) upperNumber = upperNumber.doubleValue();
+                if (lowerNumber != null) lowerNumber = lowerNumber.doubleValue();
                 break;
               case FLOAT:
-                upperNumber = upperNumber.floatValue();
-                lowerNumber = lowerNumber.floatValue();
+                if (upperNumber != null) upperNumber = upperNumber.floatValue();
+                if (lowerNumber != null) lowerNumber = lowerNumber.floatValue();
             }
             
             NumericQueryNode lowerNode = new NumericQueryNode(
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParserTokenManager.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParserTokenManager.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParserTokenManager.java	(copie de travail)
@@ -86,16 +86,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, 26);
+      case 94:
          return jjStopAtPos(0, 21);
-      case 94:
-         return jjStopAtPos(0, 16);
       case 123:
-         return jjStopAtPos(0, 22);
+         return jjStopAtPos(0, 27);
       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
 };
@@ -127,10 +155,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)
@@ -174,33 +202,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(6, 7);
                   break;
                case 26:
@@ -210,8 +238,8 @@
                case 27:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjCheckNAdd(27);
                   break;
                case 28:
@@ -224,8 +252,8 @@
                      jjCheckNAddStates(3, 5);
                   break;
                case 32:
-                  if (curChar == 47 && kind > 20)
-                     kind = 20;
+                  if (curChar == 47 && kind > 25)
+                     kind = 25;
                   break;
                default : break;
             }
@@ -241,14 +269,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)
@@ -317,8 +345,8 @@
                case 20:
                   if ((0x97ffffff87ffffffL & l) == 0L)
                      break;
-                  if (kind > 18)
-                     kind = 18;
+                  if (kind > 23)
+                     kind = 23;
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 21:
@@ -326,8 +354,8 @@
                      jjCheckNAddTwoStates(22, 22);
                   break;
                case 22:
-                  if (kind > 18)
-                     kind = 18;
+                  if (kind > 23)
+                     kind = 23;
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 23:
@@ -337,8 +365,8 @@
                case 24:
                   if (curChar != 126)
                      break;
-                  if (kind > 19)
-                     kind = 19;
+                  if (kind > 24)
+                     kind = 24;
                   jjstateSet[jjnewStateCnt++] = 25;
                   break;
                case 29:
@@ -371,8 +399,8 @@
                   }
                   if (jjCanMove_2(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 18)
-                        kind = 18;
+                     if (kind > 23)
+                        kind = 23;
                      jjCheckNAddTwoStates(20, 21);
                   }
                   break;
@@ -385,15 +413,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;
                case 29:
@@ -422,9 +450,9 @@
    switch (pos)
    {
       case 0:
-         if ((active0 & 0x10000000L) != 0L)
+         if ((active0 & 0x200000000L) != 0L)
          {
-            jjmatchedKind = 31;
+            jjmatchedKind = 36;
             return 6;
          }
          return -1;
@@ -441,9 +469,9 @@
    switch(curChar)
    {
       case 84:
-         return jjMoveStringLiteralDfa1_1(0x10000000L);
+         return jjMoveStringLiteralDfa1_1(0x200000000L);
       case 125:
-         return jjStopAtPos(0, 29);
+         return jjStopAtPos(0, 34);
       default :
          return jjMoveNfa_1(0, 0);
    }
@@ -458,8 +486,8 @@
    switch(curChar)
    {
       case 79:
-         if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_1(1, 28, 6);
+         if ((active0 & 0x200000000L) != 0L)
+            return jjStartNfaWithStates_1(1, 33, 6);
          break;
       default :
          break;
@@ -495,8 +523,8 @@
                case 0:
                   if ((0xfffffffeffffffffL & l) != 0L)
                   {
-                     if (kind > 31)
-                        kind = 31;
+                     if (kind > 36)
+                        kind = 36;
                      jjCheckNAdd(6);
                   }
                   if ((0x100002600L & l) != 0L)
@@ -520,14 +548,14 @@
                      jjCheckNAddStates(8, 10);
                   break;
                case 5:
-                  if (curChar == 34 && kind > 30)
-                     kind = 30;
+                  if (curChar == 34 && kind > 35)
+                     kind = 35;
                   break;
                case 6:
                   if ((0xfffffffeffffffffL & l) == 0L)
                      break;
-                  if (kind > 31)
-                     kind = 31;
+                  if (kind > 36)
+                     kind = 36;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -545,8 +573,8 @@
                case 6:
                   if ((0xdfffffffffffffffL & l) == 0L)
                      break;
-                  if (kind > 31)
-                     kind = 31;
+                  if (kind > 36)
+                     kind = 36;
                   jjCheckNAdd(6);
                   break;
                case 2:
@@ -579,8 +607,8 @@
                   }
                   if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 31)
-                        kind = 31;
+                     if (kind > 36)
+                        kind = 36;
                      jjCheckNAdd(6);
                   }
                   break;
@@ -591,8 +619,8 @@
                case 6:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 31)
-                     kind = 31;
+                  if (kind > 36)
+                     kind = 36;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -637,8 +665,8 @@
                case 0:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 23)
-                     kind = 23;
+                  if (kind > 28)
+                     kind = 28;
                   jjAddStates(11, 12);
                   break;
                case 1:
@@ -648,8 +676,8 @@
                case 2:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
-                  if (kind > 23)
-                     kind = 23;
+                  if (kind > 28)
+                     kind = 28;
                   jjCheckNAdd(2);
                   break;
                default : break;
@@ -700,9 +728,9 @@
    switch (pos)
    {
       case 0:
-         if ((active0 & 0x1000000L) != 0L)
+         if ((active0 & 0x20000000L) != 0L)
          {
-            jjmatchedKind = 27;
+            jjmatchedKind = 32;
             return 6;
          }
          return -1;
@@ -719,9 +747,9 @@
    switch(curChar)
    {
       case 84:
-         return jjMoveStringLiteralDfa1_2(0x1000000L);
+         return jjMoveStringLiteralDfa1_2(0x20000000L);
       case 93:
-         return jjStopAtPos(0, 25);
+         return jjStopAtPos(0, 30);
       default :
          return jjMoveNfa_2(0, 0);
    }
@@ -736,8 +764,8 @@
    switch(curChar)
    {
       case 79:
-         if ((active0 & 0x1000000L) != 0L)
-            return jjStartNfaWithStates_2(1, 24, 6);
+         if ((active0 & 0x20000000L) != 0L)
+            return jjStartNfaWithStates_2(1, 29, 6);
          break;
       default :
          break;
@@ -773,8 +801,8 @@
                case 0:
                   if ((0xfffffffeffffffffL & l) != 0L)
                   {
-                     if (kind > 27)
-                        kind = 27;
+                     if (kind > 32)
+                        kind = 32;
                      jjCheckNAdd(6);
                   }
                   if ((0x100002600L & l) != 0L)
@@ -798,14 +826,14 @@
                      jjCheckNAddStates(8, 10);
                   break;
                case 5:
-                  if (curChar == 34 && kind > 26)
-                     kind = 26;
+                  if (curChar == 34 && kind > 31)
+                     kind = 31;
                   break;
                case 6:
                   if ((0xfffffffeffffffffL & l) == 0L)
                      break;
-                  if (kind > 27)
-                     kind = 27;
+                  if (kind > 32)
+                     kind = 32;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -823,8 +851,8 @@
                case 6:
                   if ((0xffffffffdfffffffL & l) == 0L)
                      break;
-                  if (kind > 27)
-                     kind = 27;
+                  if (kind > 32)
+                     kind = 32;
                   jjCheckNAdd(6);
                   break;
                case 2:
@@ -857,8 +885,8 @@
                   }
                   if (jjCanMove_1(hiByte, i1, i2, l1, l2))
                   {
-                     if (kind > 27)
-                        kind = 27;
+                     if (kind > 32)
+                        kind = 32;
                      jjCheckNAdd(6);
                   }
                   break;
@@ -869,8 +897,8 @@
                case 6:
                   if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
                      break;
-                  if (kind > 27)
-                     kind = 27;
+                  if (kind > 32)
+                     kind = 32;
                   jjCheckNAdd(6);
                   break;
                default : break;
@@ -933,8 +961,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, 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, null, "\133", "\173", null, "\124\117", "\135", null, null, "\124\117", 
+"\175", null, null, };
 
 /** Lexer state names. */
 public static final String[] lexStateNames = {
@@ -946,11 +975,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, -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, 
+   -1, 2, 1, 3, -1, 3, -1, -1, -1, 3, -1, -1, 
 };
 static final long[] jjtoToken = {
-   0xffffff01L, 
+   0x1fffffff01L, 
 };
 static final long[] jjtoSkip = {
    0x80L, 
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/Token.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/Token.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/Token.java	(copie de travail)
@@ -121,4 +121,4 @@
   }
 
 }
-/* JavaCC - OriginalChecksum=0aac6816ecd328eda2f38b9d09739ab6 (do not edit this line) */
+/* JavaCC - OriginalChecksum=e9c55091ec11152bcd3a300ddff5c73a (do not edit this line) */
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/TokenMgrError.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/TokenMgrError.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/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=76b513fd9c50f65248056bbeeff49277 (do not edit this line) */
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParserConstants.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParserConstants.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParserConstants.java	(copie de travail)
@@ -37,39 +37,49 @@
   /** 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 REGEXPTERM = 20;
+  int OP_MORETHANEQ = 20;
   /** RegularExpression Id. */
-  int RANGEIN_START = 21;
+  int CARAT = 21;
   /** RegularExpression Id. */
-  int RANGEEX_START = 22;
+  int QUOTED = 22;
   /** RegularExpression Id. */
-  int NUMBER = 23;
+  int TERM = 23;
   /** RegularExpression Id. */
-  int RANGEIN_TO = 24;
+  int FUZZY_SLOP = 24;
   /** RegularExpression Id. */
-  int RANGEIN_END = 25;
+  int REGEXPTERM = 25;
   /** RegularExpression Id. */
-  int RANGEIN_QUOTED = 26;
+  int RANGEIN_START = 26;
   /** RegularExpression Id. */
-  int RANGEIN_GOOP = 27;
+  int RANGEEX_START = 27;
   /** RegularExpression Id. */
-  int RANGEEX_TO = 28;
+  int NUMBER = 28;
   /** RegularExpression Id. */
-  int RANGEEX_END = 29;
+  int RANGEIN_TO = 29;
   /** RegularExpression Id. */
-  int RANGEEX_QUOTED = 30;
+  int RANGEIN_END = 30;
   /** RegularExpression Id. */
-  int RANGEEX_GOOP = 31;
+  int RANGEIN_QUOTED = 31;
+  /** RegularExpression Id. */
+  int RANGEIN_GOOP = 32;
+  /** RegularExpression Id. */
+  int RANGEEX_TO = 33;
+  /** RegularExpression Id. */
+  int RANGEEX_END = 34;
+  /** RegularExpression Id. */
+  int RANGEEX_QUOTED = 35;
+  /** RegularExpression Id. */
+  int RANGEEX_GOOP = 36;
 
   /** Lexical state. */
   int Boost = 0;
@@ -98,6 +108,11 @@
     "\"(\"",
     "\")\"",
     "\":\"",
+    "\"=\"",
+    "\"<\"",
+    "\"<=\"",
+    "\">\"",
+    "\">=\"",
     "\"^\"",
     "<QUOTED>",
     "<TERM>",
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParser.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParser.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParser.java	(copie de travail)
@@ -59,7 +59,7 @@
    public StandardSyntaxParser() {
         this(new StringReader(""));
   }
-     /** Parses a query string, returning a {@link org.apache.lucene.queryparser.flexible.core.nodes.QueryNode}.
+     /** Parses a query string, returning a {@link org.apache.lucene.queryParser.core.nodes.QueryNode}.
      *  @param query  the query string to be parsed.
      *  @throws ParseException if the parsing fails
      */
@@ -315,43 +315,168 @@
 
   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 REGEXPTERM:
-    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 REGEXPTERM:
+      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 REGEXPTERM:
+        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;
@@ -396,7 +521,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();
       }
@@ -406,7 +531,7 @@
                                 fuzzy=true;
         break;
       default:
-        jj_la1[10] = jj_gen;
+        jj_la1[16] = jj_gen;
         ;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -419,12 +544,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) {
@@ -452,7 +577,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();
       }
@@ -461,7 +586,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) {
@@ -472,7 +597,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();
       }
@@ -483,7 +608,7 @@
         boost = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[16] = jj_gen;
+        jj_la1[22] = jj_gen;
         ;
       }
           if (goop1.kind == RANGEIN_QUOTED) {
@@ -509,7 +634,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();
       }
@@ -518,7 +643,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) {
@@ -529,7 +654,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();
       }
@@ -540,7 +665,7 @@
         boost = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[20] = jj_gen;
+        jj_la1[26] = jj_gen;
         ;
       }
           if (goop1.kind == RANGEEX_QUOTED) {
@@ -563,7 +688,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) {
@@ -572,7 +697,7 @@
         boost = jj_consume_token(NUMBER);
         break;
       default:
-        jj_la1[22] = jj_gen;
+        jj_la1[28] = jj_gen;
         ;
       }
          int phraseSlop = 0;
@@ -590,7 +715,7 @@
          }
       break;
     default:
-      jj_la1[23] = jj_gen;
+      jj_la1[29] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -619,12 +744,124 @@
     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_3R_12()) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(28)) 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_10() {
+    if (jj_scan_token(QUOTED)) 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(28)) 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_11() {
+    if (jj_scan_token(TERM)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_12() {
+    if (jj_scan_token(REGEXPTERM)) 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;
   }
 
+  private boolean jj_3R_8() {
+    if (jj_scan_token(RANGEIN_START)) return true;
+    return false;
+  }
+
   /** Generated Token Manager. */
   public StandardSyntaxParserTokenManager token_source;
   JavaCharStream jj_input_stream;
@@ -636,15 +873,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,0xf63c00,0x200,0x100,0x10000,0xf62000,0x940000,0x80000,0x80000,0x10000,0xc000000,0x1000000,0xc000000,0x10000,0xc0000000,0x10000000,0xc0000000,0x10000,0x80000,0x10000,0xf60000,};
+      jj_la1_0 = new int[] {0x300,0x300,0x1c00,0x1c00,0x1ec03c00,0x200,0x100,0x18000,0x1e0000,0x10c00000,0x1f8000,0x18000,0x200000,0x1ec02000,0x1ec02000,0x12800000,0x1000000,0x1000000,0x200000,0x80000000,0x20000000,0x80000000,0x200000,0x0,0x0,0x0,0x200000,0x1000000,0x200000,0x1ec00000,};
    }
-  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,0x1,0x0,0x1,0x0,0x18,0x2,0x18,0x0,0x0,0x0,0x0,};
+   }
+  final private JJCalls[] jj_2_rtns = new JJCalls[2];
   private boolean jj_rescan = false;
   private int jj_gc = 0;
 
@@ -659,7 +901,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();
   }
 
@@ -674,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();
   }
 
@@ -685,7 +927,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();
   }
 
@@ -696,7 +938,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();
   }
 
@@ -706,7 +948,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();
   }
 
@@ -716,7 +958,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();
   }
 
@@ -794,7 +1036,7 @@
       return (jj_ntk = jj_nt.kind);
   }
 
-  private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
+  private java.util.List jj_expentries = new java.util.ArrayList();
   private int[] jj_expentry;
   private int jj_kind = -1;
   private int[] jj_lasttokens = new int[100];
@@ -828,21 +1070,24 @@
   /** Generate ParseException. */
   public ParseException generateParseException() {
     jj_expentries.clear();
-    boolean[] la1tokens = new boolean[32];
+    boolean[] la1tokens = new boolean[37];
     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 < 32; i++) {
+    for (int i = 0; i < 37; i++) {
       if (la1tokens[i]) {
         jj_expentry = new int[1];
         jj_expentry[0] = i;
@@ -854,7 +1099,7 @@
     jj_add_error_token(0, 0);
     int[][] exptokseq = new int[jj_expentries.size()][];
     for (int i = 0; i < jj_expentries.size(); i++) {
-      exptokseq[i] = jj_expentries.get(i);
+      exptokseq[i] = (int[])jj_expentries.get(i);
     }
     return new ParseException(token, exptokseq, tokenImage);
   }
@@ -869,7 +1114,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 {
@@ -877,6 +1122,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: modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParser.jj
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParser.jj	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/StandardSyntaxParser.jj	(copie de travail)
@@ -108,7 +108,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") >
@@ -127,7 +127,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>)*  >
@@ -335,22 +340,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: modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/ParseException.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/ParseException.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/ParseException.java	(copie de travail)
@@ -4,8 +4,8 @@
  
  import org.apache.lucene.messages.Message;
  import org.apache.lucene.messages.MessageImpl;
- import org.apache.lucene.queryparser.flexible.core.QueryNodeParseException;
- import org.apache.lucene.queryparser.flexible.core.messages.QueryParserMessages;
+ import org.apache.lucene.queryparser.flexible.core.*;
+ import org.apache.lucene.queryparser.flexible.core.messages.*;
 
 /**
  * This exception is thrown when parse errors are encountered.
@@ -56,7 +56,7 @@
   /** Constructor with message. */
   public ParseException(Message message) {
      super(message);
-                         }
+   }
 
   /**
    * This variable determines which constructor was used to create
@@ -193,4 +193,4 @@
    }
 
 }
-/* JavaCC - OriginalChecksum=38bce846fe6c8482993969f741c0323e (do not edit this line) */
+/* JavaCC - OriginalChecksum=0f25f4245374bbf9920c9a82efecadd2 (do not edit this line) */
Index: modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/JavaCharStream.java
===================================================================
--- modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/JavaCharStream.java	(révision 1150713)
+++ modules/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/parser/JavaCharStream.java	(copie de travail)
@@ -347,7 +347,7 @@
 
   @Deprecated
   /**
-   * @deprecated (gen)
+   * @deprecated
    * @see #getEndColumn
    */
   public int getColumn() {
@@ -356,7 +356,7 @@
 
   @Deprecated
   /**
-   * @deprecated (gen)
+   * @deprecated
    * @see #getEndLine
    */
   public int getLine() {
@@ -613,4 +613,4 @@
   }
 
 }
-/* JavaCC - OriginalChecksum=f19c73b8f7faf94cc4a581e7b2933cc6 (do not edit this line) */
+/* JavaCC - OriginalChecksum=7eecaeeaea1254b3e35fe8890a0127ce (do not edit this line) */
