Index: java/org/apache/lucene/queryParser/QueryParser.java
===================================================================
--- java/org/apache/lucene/queryParser/QueryParser.java	(revision 511167)
+++ java/org/apache/lucene/queryParser/QueryParser.java	(working copy)
@@ -53,7 +53,7 @@
  * By default a date is converted into a search term using the deprecated
  * {@link DateField} for compatibility reasons.
  * To use the new {@link DateTools} to convert dates, a
- * {@link org.apache.lucene.document.DateTools.Resolution} has to be set.
+ * {@link DateTools.Resolution} has to be set.
  * </p>
  * <p>
  * The date resolution that shall be used for RangeQueries can be set
@@ -794,7 +794,7 @@
     StringBuffer sb = new StringBuffer();
     for (int i = 0; i < s.length(); i++) {
       char c = s.charAt(i);
-      // NOTE: keep this in sync with _ESCAPED_CHAR below!
+      // These characters are part of the query syntax and must be escaped
       if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':'
         || c == '^' || c == '[' || c == ']' || c == '\"' || c == '{' || c == '}' || c == '~'
         || c == '*' || c == '?') {
Index: java/org/apache/lucene/queryParser/QueryParser.jj
===================================================================
--- java/org/apache/lucene/queryParser/QueryParser.jj	(revision 511167)
+++ java/org/apache/lucene/queryParser/QueryParser.jj	(working copy)
@@ -345,7 +345,7 @@
   /**
    * Sets the date resolution used by RangeQueries for a specific field.
    *  
-   * @param field field for which the date resolution is to be set 
+   * @param fieldName field for which the date resolution is to be set 
    * @param dateResolution date resolution to set
    */
   public void setDateResolution(String fieldName, DateTools.Resolution dateResolution) {
@@ -818,7 +818,7 @@
     StringBuffer sb = new StringBuffer();
     for (int i = 0; i < s.length(); i++) {
       char c = s.charAt(i);
-      // NOTE: keep this in sync with _ESCAPED_CHAR below!
+      // These characters are part of the query syntax and must be escaped
       if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':'
         || c == '^' || c == '[' || c == ']' || c == '\"' || c == '{' || c == '}' || c == '~'
         || c == '*' || c == '?') {
@@ -854,11 +854,10 @@
 
 <*> TOKEN : {
   <#_NUM_CHAR:   ["0"-"9"] >
-// NOTE: keep this in sync with escape(String) above!
-| <#_ESCAPED_CHAR: "\\" [ "\\", "+", "-", "!", "(", ")", ":", "^",
-                          "[", "]", "\"", "{", "}", "~", "*", "?" ] >
+// every character that follows a backslash is considered as an escaped character
+| <#_ESCAPED_CHAR: "\\" ~[] >
 | <#_TERM_START_CHAR: ( ~[ " ", "\t", "\n", "\r", "+", "-", "!", "(", ")", ":", "^",
-                           "[", "]", "\"", "{", "}", "~", "*", "?" ]
+                           "[", "]", "\"", "{", "}", "~", "*", "?", "\\" ]
                        | <_ESCAPED_CHAR> ) >
 | <#_TERM_CHAR: ( <_TERM_START_CHAR> | <_ESCAPED_CHAR> | "-" | "+" ) >
 | <#_WHITESPACE: ( " " | "\t" | "\n" | "\r") >
Index: java/org/apache/lucene/queryParser/QueryParserTokenManager.java
===================================================================
--- java/org/apache/lucene/queryParser/QueryParserTokenManager.java	(revision 511167)
+++ java/org/apache/lucene/queryParser/QueryParserTokenManager.java	(working copy)
@@ -209,8 +209,6 @@
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 22:
-                  if ((0x84002f0600000000L & l) == 0L)
-                     break;
                   if (kind > 18)
                      kind = 18;
                   jjCheckNAddTwoStates(20, 21);
@@ -246,8 +244,7 @@
                      kind = 20;
                   break;
                case 31:
-                  if ((0x84002f0600000000L & l) != 0L)
-                     jjCheckNAddStates(0, 2);
+                  jjCheckNAddStates(0, 2);
                   break;
                case 32:
                   if ((0xfbffd4f8ffffd9ffL & l) == 0L)
@@ -264,8 +261,6 @@
                   jjCheckNAddTwoStates(33, 34);
                   break;
                case 35:
-                  if ((0x84002f0600000000L & l) == 0L)
-                     break;
                   if (kind > 21)
                      kind = 21;
                   jjCheckNAddTwoStates(33, 34);
@@ -282,43 +277,43 @@
             switch(jjstateSet[--i])
             {
                case 37:
-                  if ((0x97ffffff97ffffffL & l) != 0L)
+                  if ((0x97ffffff87ffffffL & l) != 0L)
                   {
                      if (kind > 21)
                         kind = 21;
                      jjCheckNAddTwoStates(33, 34);
                   }
-                  if ((0x97ffffff97ffffffL & l) != 0L)
-                     jjCheckNAddStates(0, 2);
-                  if (curChar == 92)
+                  else if (curChar == 92)
                      jjCheckNAddTwoStates(31, 31);
-                  if (curChar == 92)
+                  if ((0x97ffffff87ffffffL & l) != 0L)
+                     jjCheckNAddStates(0, 2);
+                  else if (curChar == 92)
                      jjCheckNAddTwoStates(35, 35);
                   break;
                case 0:
-                  if ((0x97ffffff97ffffffL & l) != 0L)
+                  if ((0x97ffffff87ffffffL & l) != 0L)
                   {
                      if (kind > 21)
                         kind = 21;
                      jjCheckNAddTwoStates(33, 34);
                   }
+                  else if (curChar == 92)
+                     jjCheckNAddStates(8, 10);
                   else if (curChar == 126)
                   {
                      if (kind > 19)
                         kind = 19;
                      jjstateSet[jjnewStateCnt++] = 24;
                   }
-                  if ((0x97ffffff97ffffffL & l) != 0L)
+                  if ((0x97ffffff87ffffffL & l) != 0L)
                      jjCheckNAddStates(0, 2);
-                  if ((0x97ffffff97ffffffL & l) != 0L)
+                  if ((0x97ffffff87ffffffL & l) != 0L)
                   {
                      if (kind > 18)
                         kind = 18;
                      jjCheckNAddTwoStates(20, 21);
                   }
-                  if (curChar == 92)
-                     jjCheckNAddStates(8, 10);
-                  else if (curChar == 78)
+                  if (curChar == 78)
                      jjstateSet[jjnewStateCnt++] = 11;
                   else if (curChar == 124)
                      jjstateSet[jjnewStateCnt++] = 8;
@@ -376,7 +371,7 @@
                   break;
                case 19:
                case 20:
-                  if ((0x97ffffff97ffffffL & l) == 0L)
+                  if ((0x97ffffff87ffffffL & l) == 0L)
                      break;
                   if (kind > 18)
                      kind = 18;
@@ -387,8 +382,6 @@
                      jjCheckNAddTwoStates(22, 22);
                   break;
                case 22:
-                  if ((0x6800000078000000L & l) == 0L)
-                     break;
                   if (kind > 18)
                      kind = 18;
                   jjCheckNAddTwoStates(20, 21);
@@ -401,11 +394,11 @@
                   jjstateSet[jjnewStateCnt++] = 24;
                   break;
                case 27:
-                  if ((0x97ffffff97ffffffL & l) != 0L)
+                  if ((0x97ffffff87ffffffL & l) != 0L)
                      jjCheckNAddStates(0, 2);
                   break;
                case 28:
-                  if ((0x97ffffff97ffffffL & l) != 0L)
+                  if ((0x97ffffff87ffffffL & l) != 0L)
                      jjCheckNAddStates(0, 2);
                   break;
                case 30:
@@ -413,18 +406,17 @@
                      jjCheckNAddTwoStates(31, 31);
                   break;
                case 31:
-                  if ((0x6800000078000000L & l) != 0L)
-                     jjCheckNAddStates(0, 2);
+                  jjCheckNAddStates(0, 2);
                   break;
                case 32:
-                  if ((0x97ffffff97ffffffL & l) == 0L)
+                  if ((0x97ffffff87ffffffL & l) == 0L)
                      break;
                   if (kind > 21)
                      kind = 21;
                   jjCheckNAddTwoStates(33, 34);
                   break;
                case 33:
-                  if ((0x97ffffff97ffffffL & l) == 0L)
+                  if ((0x97ffffff87ffffffL & l) == 0L)
                      break;
                   if (kind > 21)
                      kind = 21;
@@ -435,8 +427,6 @@
                      jjCheckNAddTwoStates(35, 35);
                   break;
                case 35:
-                  if ((0x6800000078000000L & l) == 0L)
-                     break;
                   if (kind > 21)
                      kind = 21;
                   jjCheckNAddTwoStates(33, 34);
@@ -492,6 +482,7 @@
                   break;
                case 19:
                case 20:
+               case 22:
                   if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
                      break;
                   if (kind > 18)
@@ -499,6 +490,7 @@
                   jjCheckNAddTwoStates(20, 21);
                   break;
                case 27:
+               case 31:
                   if (jjCanMove_0(hiByte, i1, i2, l1, l2))
                      jjCheckNAddStates(0, 2);
                   break;
@@ -507,6 +499,7 @@
                      jjCheckNAddStates(0, 2);
                   break;
                case 32:
+               case 35:
                   if (!jjCanMove_0(hiByte, i1, i2, l1, l2))
                      break;
                   if (kind > 21)
Index: test/org/apache/lucene/queryParser/TestQueryParser.java
===================================================================
--- test/org/apache/lucene/queryParser/TestQueryParser.java	(revision 511167)
+++ test/org/apache/lucene/queryParser/TestQueryParser.java	(working copy)
@@ -514,6 +514,8 @@
     //assertQueryEquals("foo \\|| bar", a, "foo \\|| bar");
     //assertQueryEquals("foo \\AND bar", a, "foo \\AND bar");*/
 
+    assertQueryEquals("\\a", a, "a");
+    
     assertQueryEquals("a\\-b:c", a, "a-b:c");
     assertQueryEquals("a\\+b:c", a, "a+b:c");
     assertQueryEquals("a\\:b:c", a, "a:b:c");
@@ -577,6 +579,9 @@
         assertQueryEquals("XY\\u005", a, "XYZ");
         fail("ParseException expected, not thrown");
     } catch (ParseException expected) {}
+    
+    // Tests bug LUCENE-800
+    assertQueryEquals("(item:\\\\ item:ABCD\\\\)", a, "item:\\ item:ABCD\\");
   }
 
   public void testQueryStringEscaping() throws Exception {
