Index: main/src/test/java/org/apache/jsieve/SieveParserVisitorImplQuoteTest.java =================================================================== --- main/src/test/java/org/apache/jsieve/SieveParserVisitorImplQuoteTest.java (revision 1083729) +++ main/src/test/java/org/apache/jsieve/SieveParserVisitorImplQuoteTest.java (working copy) @@ -100,7 +100,7 @@ public void testVisitASTstringObjectMultiSlashQuoted() throws Exception { - node = stringNode("\"v\\\\al\\\\u\\e\\\\\""); + node = stringNode("\"v\\\\al\\\\ue\\\\\""); visitor.visit(node, data); assertEquals("Data value added after quotes stripped", 1, data.size()); assertEquals("Data value added after quotes stripped", "v\\al\\ue\\", Index: main/src/test/java/org/apache/jsieve/HeaderTest.java =================================================================== --- main/src/test/java/org/apache/jsieve/HeaderTest.java (revision 1083729) +++ main/src/test/java/org/apache/jsieve/HeaderTest.java (working copy) @@ -329,11 +329,11 @@ */ public void testSpecialCharsEscapingInMatch() { boolean isTestPassed = false; - String script = "if header :matches \"X-Caffeine\" \"my,\\\\,?,\\?,\\\\?,*,\\*,\\\\*,pattern\" {throwTestException;}"; + String script = "if header :matches \"X-Caffeine\" \"my,\\\\,?,\\\\?,*,\\\\*,pattern\" {throwTestException;}"; try { SieveMailAdapter mail = (SieveMailAdapter) JUnitUtils.createMail(); mail.getMessage().addHeader("X-Caffeine", - "my,\\,x,x,?,foo,bar,*,pattern"); + "my,\\,x,?,foo,*,pattern"); JUnitUtils.interpret(mail, script); } catch (MessagingException e) { } catch (ThrowTestException.TestException e) { @@ -349,11 +349,11 @@ */ public void testSpecialCharsEscapingInMatchFalse() { boolean isTestPassed = false; - String script = "if header :matches \"X-Caffeine\" \"my,?,\\?,\\\\?,*,\\*,\\\\*,pattern\" {throwTestException;}"; + String script = "if header :matches \"X-Caffeine\" \"my,?,\\\\?,*,\\\\*,pattern\" {throwTestException;}"; try { SieveMailAdapter mail = (SieveMailAdapter) JUnitUtils.createMail(); mail.getMessage().addHeader("X-Caffeine", - "my,x,x,q,foo,bar,*,pattern"); + "my,x,q,foo,*,pattern"); JUnitUtils.interpret(mail, script); isTestPassed = true; } catch (MessagingException e) { Index: main/src/main/jjtree/sieve/sieve.jjt =================================================================== --- main/src/main/jjtree/sieve/sieve.jjt (revision 1083744) +++ main/src/main/jjtree/sieve/sieve.jjt (working copy) @@ -121,10 +121,14 @@ // note that newlines and other characters are all allowed strings < QUOTED_STRING: "\"" - (~["\""]|"\\\"")* + (~["\"","\\"]|)* "\"" > | + <#ESCAPED_CHAR: + ("\\" ("\\"|"\"")) + > +| // multi-line = "text:" *(SP / HTAB) (hash-comment / CRLF) // *(multi-line-literal / multi-line-dotstuff) // "." CRLF