Index: src/test/org/apache/lucene/queryParser/TestQueryParser.java =================================================================== --- src/test/org/apache/lucene/queryParser/TestQueryParser.java (revision 580018) +++ src/test/org/apache/lucene/queryParser/TestQueryParser.java (working copy) @@ -18,13 +18,8 @@ */ import junit.framework.TestCase; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.analysis.LowerCaseTokenizer; -import org.apache.lucene.analysis.SimpleAnalyzer; +import org.apache.lucene.analysis.*; import org.apache.lucene.analysis.Token; -import org.apache.lucene.analysis.TokenFilter; -import org.apache.lucene.analysis.TokenStream; -import org.apache.lucene.analysis.WhitespaceAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.DateField; import org.apache.lucene.document.DateTools; @@ -200,6 +195,9 @@ assertQueryEquals("türm term term", new WhitespaceAnalyzer(), "türm term term"); assertQueryEquals("ümlaut", new WhitespaceAnalyzer(), "ümlaut"); + assertQueryEquals("\"\"", new KeywordAnalyzer(), ""); + assertQueryEquals("foo:\"\"", new KeywordAnalyzer(), "foo:"); + assertQueryEquals("a AND b", null, "+a +b"); assertQueryEquals("(a AND b)", null, "+a +b"); assertQueryEquals("c OR (a AND b)", null, "c (+a +b)"); Index: src/java/org/apache/lucene/queryParser/QueryParser.jj =================================================================== --- src/java/org/apache/lucene/queryParser/QueryParser.jj (revision 580018) +++ src/java/org/apache/lucene/queryParser/QueryParser.jj (working copy) @@ -888,7 +888,7 @@ | | | : Boost -| +| | (<_TERM_CHAR>)* > | )+ ( "." (<_NUM_CHAR>)+ )? )? > | (<_TERM_CHAR>)* "*" ) > Index: src/java/org/apache/lucene/queryParser/QueryParserTokenManager.java =================================================================== --- src/java/org/apache/lucene/queryParser/QueryParserTokenManager.java (revision 580018) +++ src/java/org/apache/lucene/queryParser/QueryParserTokenManager.java (working copy) @@ -142,7 +142,7 @@ kind = 6; } else if (curChar == 34) - jjCheckNAddTwoStates(15, 17); + jjCheckNAddStates(0, 2); else if (curChar == 33) { if (kind > 9) @@ -152,7 +152,7 @@ { if (kind > 18) kind = 18; - jjCheckNAddStates(0, 4); + jjCheckNAddStates(3, 7); } else if (curChar == 42) { @@ -175,17 +175,14 @@ kind = 9; break; case 14: + case 16: if (curChar == 34) - jjCheckNAddTwoStates(15, 17); + jjCheckNAddStates(0, 2); break; case 15: if ((0xfffffffbffffffffL & l) != 0L) - jjCheckNAddStates(5, 7); + jjCheckNAddStates(0, 2); break; - case 16: - if (curChar == 34) - jjCheckNAddStates(5, 7); - break; case 18: if (curChar == 34 && kind > 17) kind = 17; @@ -229,7 +226,7 @@ break; if (kind > 18) kind = 18; - jjCheckNAddStates(0, 4); + jjCheckNAddStates(3, 7); break; case 29: if ((0x7bfff8f8ffffd9ffL & l) == 0L) @@ -276,7 +273,7 @@ { if (kind > 18) kind = 18; - jjCheckNAddStates(0, 4); + jjCheckNAddStates(3, 7); } else if (curChar == 92) jjCheckNAddStates(13, 15); @@ -342,7 +339,7 @@ jjstateSet[jjnewStateCnt++] = 11; break; case 15: - jjAddStates(5, 7); + jjAddStates(0, 2); break; case 17: if (curChar == 92) @@ -383,7 +380,7 @@ break; if (kind > 18) kind = 18; - jjCheckNAddStates(0, 4); + jjCheckNAddStates(3, 7); break; case 29: if ((0x97ffffff87ffffffL & l) == 0L) @@ -451,12 +448,12 @@ { if (kind > 18) kind = 18; - jjCheckNAddStates(0, 4); + jjCheckNAddStates(3, 7); } break; case 15: if (jjCanMove_0(hiByte, i1, i2, l1, l2)) - jjAddStates(5, 7); + jjAddStates(0, 2); break; case 24: if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) @@ -470,7 +467,7 @@ break; if (kind > 18) kind = 18; - jjCheckNAddStates(0, 4); + jjCheckNAddStates(3, 7); break; case 29: case 31: @@ -955,7 +952,7 @@ } } static final int[] jjnextStates = { - 29, 32, 23, 33, 30, 15, 17, 18, 20, 21, 32, 23, 33, 31, 34, 27, + 15, 17, 18, 29, 32, 23, 33, 30, 20, 21, 32, 23, 33, 31, 34, 27, 2, 4, 5, 0, 1, }; private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)