You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by nb...@apache.org on 2008/10/19 01:01:00 UTC

svn commit: r705936 - in /velocity/engine/trunk/src: java/org/apache/velocity/runtime/parser/ parser/ test/org/apache/velocity/test/issues/

Author: nbubna
Date: Sat Oct 18 16:01:00 2008
New Revision: 705936

URL: http://svn.apache.org/viewvc?rev=705936&view=rev
Log:
VELOCITY-631 $a#set($b=1) parser bug fix from Byron Foster

Added:
    velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity631TestCase.java   (with props)
Modified:
    velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java
    velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj
    velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserConstants.java
    velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserTokenManager.java
    velocity/engine/trunk/src/parser/Parser.jjt

Modified: velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java?rev=705936&r1=705935&r2=705936&view=diff
==============================================================================
--- velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java (original)
+++ velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.java Sat Oct 18 16:01:00 2008
@@ -2589,46 +2589,6 @@
     finally { jj_save(11, xla); }
   }
 
-  private boolean jj_3R_70() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_scan_token(26)) jj_scanpos = xsp;
-    return false;
-  }
-
-  private boolean jj_3_5() {
-    if (jj_3R_25()) return true;
-    if (jj_scan_token(COLON)) return true;
-    if (jj_3R_25()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_85()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_46() {
-    if (jj_3R_66()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_63() {
-    if (jj_scan_token(LEFT_CURLEY)) return true;
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3_5()) {
-    jj_scanpos = xsp;
-    if (jj_3R_70()) return true;
-    }
-    xsp = jj_scanpos;
-    if (jj_scan_token(7)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(65)) return true;
-    }
-    return false;
-  }
-
   private boolean jj_3R_45() {
     if (jj_3R_65()) return true;
     return false;
@@ -3218,6 +3178,46 @@
     return false;
   }
 
+  private boolean jj_3R_70() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_scan_token(26)) jj_scanpos = xsp;
+    return false;
+  }
+
+  private boolean jj_3_5() {
+    if (jj_3R_25()) return true;
+    if (jj_scan_token(COLON)) return true;
+    if (jj_3R_25()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_85()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_46() {
+    if (jj_3R_66()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_63() {
+    if (jj_scan_token(LEFT_CURLEY)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_5()) {
+    jj_scanpos = xsp;
+    if (jj_3R_70()) return true;
+    }
+    xsp = jj_scanpos;
+    if (jj_scan_token(7)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(65)) return true;
+    }
+    return false;
+  }
+
   /** Generated Token Manager. */
   public ParserTokenManager token_source;
   /** Current token. */

Modified: velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj?rev=705936&r1=705935&r2=705936&view=diff
==============================================================================
--- velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj (original)
+++ velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/Parser.jj Sat Oct 18 16:01:00 2008
@@ -617,7 +617,19 @@
  * to eat any preceeding whitespace so it is invisible in formatting.
  * (As it should be.)  If this works well, I am going to chuck the whole MORE:
  * token abomination.
+ *
+ * We added the lexical states REFERENCE, REFMODIFIER, REFMOD2 to
+ * address JIRA issue VELOCITY-631. With SET_DIRECTIVE only in the
+ * DEFAULT lexical state the following VTL fails "$a#set($b = 1)"
+ * because the Reference token uses LOOKAHEAD(2) combined with the
+ * fact that we explicity set the lex state to REFERENCE with the $
+ * token, which means we would never evaulate this token during the
+ * look ahead.  This general issue is disscussed here:
+ *
+ *  http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-ie.htm#tth_sEc3.12
+ *
  */
+<DEFAULT, REFERENCE, REFMODIFIER, REFMOD2>
 TOKEN:
 {
   <SET_DIRECTIVE: (" "|"\t")*  ("#set" | "#{set}")  (" ")* "(">

Modified: velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserConstants.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserConstants.java?rev=705936&r1=705935&r2=705936&view=diff
==============================================================================
--- velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserConstants.java (original)
+++ velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserConstants.java Sat Oct 18 16:01:00 2008
@@ -148,9 +148,9 @@
   /** Lexical state. */
   int DEFAULT = 3;
   /** Lexical state. */
-  int PRE_DIRECTIVE = 4;
+  int REFERENCE = 4;
   /** Lexical state. */
-  int REFERENCE = 5;
+  int PRE_DIRECTIVE = 5;
   /** Lexical state. */
   int IN_MULTI_LINE_COMMENT = 6;
   /** Lexical state. */

Modified: velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserTokenManager.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserTokenManager.java?rev=705936&r1=705935&r2=705936&view=diff
==============================================================================
--- velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserTokenManager.java (original)
+++ velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/ParserTokenManager.java Sat Oct 18 16:01:00 2008
@@ -1213,7 +1213,7 @@
       catch(java.io.IOException e) { return curPos; }
    }
 }
-private final int jjStopStringLiteralDfa_4(int pos, long active0)
+private final int jjStopStringLiteralDfa_5(int pos, long active0)
 {
    switch (pos)
    {
@@ -1225,26 +1225,26 @@
          return -1;
    }
 }
-private final int jjStartNfa_4(int pos, long active0)
+private final int jjStartNfa_5(int pos, long active0)
 {
-   return jjMoveNfa_4(jjStopStringLiteralDfa_4(pos, active0), pos + 1);
+   return jjMoveNfa_5(jjStopStringLiteralDfa_5(pos, active0), pos + 1);
 }
-private int jjMoveStringLiteralDfa0_4()
+private int jjMoveStringLiteralDfa0_5()
 {
    switch(curChar)
    {
       case 35:
          jjmatchedKind = 17;
-         return jjMoveStringLiteralDfa1_4(0x50000L);
+         return jjMoveStringLiteralDfa1_5(0x50000L);
       default :
-         return jjMoveNfa_4(3, 0);
+         return jjMoveNfa_5(3, 0);
    }
 }
-private int jjMoveStringLiteralDfa1_4(long active0)
+private int jjMoveStringLiteralDfa1_5(long active0)
 {
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_4(0, active0);
+      jjStopStringLiteralDfa_5(0, active0);
       return 1;
    }
    switch(curChar)
@@ -1255,22 +1255,22 @@
          break;
       case 42:
          if ((active0 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_4(1, 16, 0);
+            return jjStartNfaWithStates_5(1, 16, 0);
          break;
       default :
          break;
    }
-   return jjStartNfa_4(0, active0);
+   return jjStartNfa_5(0, active0);
 }
-private int jjStartNfaWithStates_4(int pos, int kind, int state)
+private int jjStartNfaWithStates_5(int pos, int kind, int state)
 {
    jjmatchedKind = kind;
    jjmatchedPos = pos;
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_4(state, pos + 1);
+   return jjMoveNfa_5(state, pos + 1);
 }
-private int jjMoveNfa_4(int startState, int curPos)
+private int jjMoveNfa_5(int startState, int curPos)
 {
    int startsAt = 0;
    jjnewStateCnt = 92;
@@ -2537,79 +2537,79 @@
       catch(java.io.IOException e) { return curPos; }
    }
 }
-private final int jjStopStringLiteralDfa_5(int pos, long active0, long active1)
+private final int jjStopStringLiteralDfa_4(int pos, long active0, long active1)
 {
    switch (pos)
    {
       case 0:
          if ((active0 & 0x70000L) != 0L)
-            return 2;
+            return 27;
          if ((active0 & 0x30000000L) != 0L)
          {
             jjmatchedKind = 62;
-            return 5;
+            return 13;
          }
          return -1;
       case 1:
-         if ((active0 & 0x10000L) != 0L)
-            return 0;
          if ((active0 & 0x30000000L) != 0L)
          {
             jjmatchedKind = 62;
             jjmatchedPos = 1;
-            return 5;
+            return 13;
          }
+         if ((active0 & 0x10000L) != 0L)
+            return 25;
          return -1;
       case 2:
          if ((active0 & 0x30000000L) != 0L)
          {
             jjmatchedKind = 62;
             jjmatchedPos = 2;
-            return 5;
+            return 13;
          }
          return -1;
       case 3:
+         if ((active0 & 0x10000000L) != 0L)
+            return 13;
          if ((active0 & 0x20000000L) != 0L)
          {
             jjmatchedKind = 62;
             jjmatchedPos = 3;
-            return 5;
+            return 13;
          }
-         if ((active0 & 0x10000000L) != 0L)
-            return 5;
          return -1;
       default :
          return -1;
    }
 }
-private final int jjStartNfa_5(int pos, long active0, long active1)
+private final int jjStartNfa_4(int pos, long active0, long active1)
 {
-   return jjMoveNfa_5(jjStopStringLiteralDfa_5(pos, active0, active1), pos + 1);
+   return jjMoveNfa_4(jjStopStringLiteralDfa_4(pos, active0, active1), pos + 1);
 }
-private int jjMoveStringLiteralDfa0_5()
+private int jjMoveStringLiteralDfa0_4()
 {
    switch(curChar)
    {
       case 35:
          jjmatchedKind = 17;
-         return jjMoveStringLiteralDfa1_5(0x50000L);
+         return jjMoveStringLiteralDfa1_4(0x50000L);
       case 102:
-         return jjMoveStringLiteralDfa1_5(0x20000000L);
+         return jjMoveStringLiteralDfa1_4(0x20000000L);
       case 116:
-         return jjMoveStringLiteralDfa1_5(0x10000000L);
+         return jjMoveStringLiteralDfa1_4(0x10000000L);
       case 123:
          return jjStopAtPos(0, 64);
       case 125:
          return jjStopAtPos(0, 65);
       default :
-         return jjMoveNfa_5(3, 0);
+         return jjMoveNfa_4(12, 0);
    }
 }
-private int jjMoveStringLiteralDfa1_5(long active0)
+private int jjMoveStringLiteralDfa1_4(long active0)
 {
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_5(0, active0, 0L);
+      jjStopStringLiteralDfa_4(0, active0, 0L);
       return 1;
    }
    switch(curChar)
@@ -2620,91 +2620,91 @@
          break;
       case 42:
          if ((active0 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_5(1, 16, 0);
+            return jjStartNfaWithStates_4(1, 16, 25);
          break;
       case 97:
-         return jjMoveStringLiteralDfa2_5(active0, 0x20000000L);
+         return jjMoveStringLiteralDfa2_4(active0, 0x20000000L);
       case 114:
-         return jjMoveStringLiteralDfa2_5(active0, 0x10000000L);
+         return jjMoveStringLiteralDfa2_4(active0, 0x10000000L);
       default :
          break;
    }
-   return jjStartNfa_5(0, active0, 0L);
+   return jjStartNfa_4(0, active0, 0L);
 }
-private int jjMoveStringLiteralDfa2_5(long old0, long active0)
+private int jjMoveStringLiteralDfa2_4(long old0, long active0)
 {
    if (((active0 &= old0)) == 0L)
-      return jjStartNfa_5(0, old0, 0L);
+      return jjStartNfa_4(0, old0, 0L);
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_5(1, active0, 0L);
+      jjStopStringLiteralDfa_4(1, active0, 0L);
       return 2;
    }
    switch(curChar)
    {
       case 108:
-         return jjMoveStringLiteralDfa3_5(active0, 0x20000000L);
+         return jjMoveStringLiteralDfa3_4(active0, 0x20000000L);
       case 117:
-         return jjMoveStringLiteralDfa3_5(active0, 0x10000000L);
+         return jjMoveStringLiteralDfa3_4(active0, 0x10000000L);
       default :
          break;
    }
-   return jjStartNfa_5(1, active0, 0L);
+   return jjStartNfa_4(1, active0, 0L);
 }
-private int jjMoveStringLiteralDfa3_5(long old0, long active0)
+private int jjMoveStringLiteralDfa3_4(long old0, long active0)
 {
    if (((active0 &= old0)) == 0L)
-      return jjStartNfa_5(1, old0, 0L);
+      return jjStartNfa_4(1, old0, 0L);
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_5(2, active0, 0L);
+      jjStopStringLiteralDfa_4(2, active0, 0L);
       return 3;
    }
    switch(curChar)
    {
       case 101:
          if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_5(3, 28, 5);
+            return jjStartNfaWithStates_4(3, 28, 13);
          break;
       case 115:
-         return jjMoveStringLiteralDfa4_5(active0, 0x20000000L);
+         return jjMoveStringLiteralDfa4_4(active0, 0x20000000L);
       default :
          break;
    }
-   return jjStartNfa_5(2, active0, 0L);
+   return jjStartNfa_4(2, active0, 0L);
 }
-private int jjMoveStringLiteralDfa4_5(long old0, long active0)
+private int jjMoveStringLiteralDfa4_4(long old0, long active0)
 {
    if (((active0 &= old0)) == 0L)
-      return jjStartNfa_5(2, old0, 0L);
+      return jjStartNfa_4(2, old0, 0L);
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_5(3, active0, 0L);
+      jjStopStringLiteralDfa_4(3, active0, 0L);
       return 4;
    }
    switch(curChar)
    {
       case 101:
          if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_5(4, 29, 5);
+            return jjStartNfaWithStates_4(4, 29, 13);
          break;
       default :
          break;
    }
-   return jjStartNfa_5(3, active0, 0L);
+   return jjStartNfa_4(3, active0, 0L);
 }
-private int jjStartNfaWithStates_5(int pos, int kind, int state)
+private int jjStartNfaWithStates_4(int pos, int kind, int state)
 {
    jjmatchedKind = kind;
    jjmatchedPos = pos;
    try { curChar = input_stream.readChar(); }
    catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_5(state, pos + 1);
+   return jjMoveNfa_4(state, pos + 1);
 }
-private int jjMoveNfa_5(int startState, int curPos)
+private int jjMoveNfa_4(int startState, int curPos)
 {
    int startsAt = 0;
-   jjnewStateCnt = 16;
+   jjnewStateCnt = 28;
    int i = 1;
    jjstateSet[0] = startState;
    int kind = 0x7fffffff;
@@ -2719,59 +2719,81 @@
          {
             switch(jjstateSet[--i])
             {
-               case 3:
-                  if (curChar == 36)
+               case 12:
+                  if ((0x100000200L & l) != 0L)
+                     jjCheckNAddTwoStates(0, 1);
+                  else if (curChar == 35)
+                     jjCheckNAddStates(126, 128);
+                  else if (curChar == 36)
                   {
                      if (kind > 13)
                         kind = 13;
-                     jjCheckNAddTwoStates(13, 14);
+                     jjCheckNAddTwoStates(21, 22);
                   }
                   else if (curChar == 46)
-                     jjstateSet[jjnewStateCnt++] = 7;
-                  else if (curChar == 35)
-                     jjstateSet[jjnewStateCnt++] = 2;
+                     jjstateSet[jjnewStateCnt++] = 15;
                   break;
-               case 0:
+               case 27:
                   if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 1;
+                     jjstateSet[jjnewStateCnt++] = 25;
+                  break;
+               case 0:
+                  if ((0x100000200L & l) != 0L)
+                     jjCheckNAddTwoStates(0, 1);
                   break;
                case 1:
-                  if ((0xfffffff7ffffffffL & l) != 0L && kind > 15)
-                     kind = 15;
+                  if (curChar == 35)
+                     jjCheckNAddTwoStates(6, 11);
                   break;
-               case 2:
-                  if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 0;
+               case 3:
+                  if (curChar == 32)
+                     jjAddStates(108, 109);
                   break;
-               case 5:
+               case 4:
+                  if (curChar == 40 && kind > 12)
+                     kind = 12;
+                  break;
+               case 13:
                   if ((0x3ff200000000000L & l) == 0L)
                      break;
                   if (kind > 62)
                      kind = 62;
-                  jjstateSet[jjnewStateCnt++] = 5;
+                  jjstateSet[jjnewStateCnt++] = 13;
                   break;
-               case 6:
+               case 14:
                   if (curChar == 46)
-                     jjstateSet[jjnewStateCnt++] = 7;
+                     jjstateSet[jjnewStateCnt++] = 15;
                   break;
-               case 10:
+               case 18:
                   if (curChar == 36 && kind > 13)
                      kind = 13;
                   break;
-               case 12:
+               case 20:
                   if (curChar == 36)
-                     jjCheckNAddTwoStates(13, 14);
+                     jjCheckNAddTwoStates(21, 22);
                   break;
-               case 14:
+               case 22:
                   if (curChar == 33 && kind > 14)
                      kind = 14;
                   break;
-               case 15:
+               case 23:
                   if (curChar != 36)
                      break;
                   if (kind > 13)
                      kind = 13;
-                  jjCheckNAddTwoStates(13, 14);
+                  jjCheckNAddTwoStates(21, 22);
+                  break;
+               case 24:
+                  if (curChar == 35)
+                     jjCheckNAddStates(126, 128);
+                  break;
+               case 25:
+                  if (curChar == 42)
+                     jjstateSet[jjnewStateCnt++] = 26;
+                  break;
+               case 26:
+                  if ((0xfffffff7ffffffffL & l) != 0L && kind > 15)
+                     kind = 15;
                   break;
                default : break;
             }
@@ -2784,47 +2806,84 @@
          {
             switch(jjstateSet[--i])
             {
-               case 3:
+               case 12:
                   if ((0x7fffffe87fffffeL & l) != 0L)
                   {
                      if (kind > 62)
                         kind = 62;
-                     jjCheckNAdd(5);
+                     jjCheckNAdd(13);
                   }
                   else if (curChar == 92)
-                     jjCheckNAddStates(126, 129);
+                     jjCheckNAddStates(129, 132);
                   break;
-               case 1:
-                  if (kind > 15)
-                     kind = 15;
+               case 27:
+                  if (curChar == 123)
+                     jjstateSet[jjnewStateCnt++] = 10;
+                  else if (curChar == 115)
+                     jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               case 2:
+                  if (curChar == 116)
+                     jjCheckNAddTwoStates(3, 4);
                   break;
-               case 4:
                case 5:
+                  if (curChar == 101)
+                     jjstateSet[jjnewStateCnt++] = 2;
+                  break;
+               case 6:
+                  if (curChar == 115)
+                     jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               case 7:
+                  if (curChar == 125)
+                     jjCheckNAddTwoStates(3, 4);
+                  break;
+               case 8:
+                  if (curChar == 116)
+                     jjstateSet[jjnewStateCnt++] = 7;
+                  break;
+               case 9:
+                  if (curChar == 101)
+                     jjstateSet[jjnewStateCnt++] = 8;
+                  break;
+               case 10:
+                  if (curChar == 115)
+                     jjstateSet[jjnewStateCnt++] = 9;
+                  break;
+               case 11:
+                  if (curChar == 123)
+                     jjstateSet[jjnewStateCnt++] = 10;
+                  break;
+               case 13:
                   if ((0x7fffffe87fffffeL & l) == 0L)
                      break;
                   if (kind > 62)
                      kind = 62;
-                  jjCheckNAdd(5);
+                  jjCheckNAdd(13);
                   break;
-               case 7:
+               case 15:
                   if ((0x7fffffe07fffffeL & l) != 0L && kind > 63)
                      kind = 63;
                   break;
-               case 8:
+               case 16:
                   if (curChar == 92)
-                     jjCheckNAddStates(126, 129);
+                     jjCheckNAddStates(129, 132);
                   break;
-               case 9:
+               case 17:
                   if (curChar == 92)
-                     jjCheckNAddTwoStates(9, 10);
+                     jjCheckNAddTwoStates(17, 18);
                   break;
-               case 11:
+               case 19:
                   if (curChar == 92)
-                     jjCheckNAddTwoStates(11, 12);
+                     jjCheckNAddTwoStates(19, 20);
                   break;
-               case 13:
+               case 21:
                   if (curChar == 92)
-                     jjAddStates(95, 96);
+                     jjAddStates(133, 134);
+                  break;
+               case 26:
+                  if (kind > 15)
+                     kind = 15;
                   break;
                default : break;
             }
@@ -2841,7 +2900,7 @@
          {
             switch(jjstateSet[--i])
             {
-               case 1:
+               case 26:
                   if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 15)
                      kind = 15;
                   break;
@@ -2856,7 +2915,7 @@
          kind = 0x7fffffff;
       }
       ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 16 - (jjnewStateCnt = startsAt)))
+      if ((i = jjnewStateCnt) == (startsAt = 28 - (jjnewStateCnt = startsAt)))
          return curPos;
       try { curChar = input_stream.readChar(); }
       catch(java.io.IOException e) { return curPos; }
@@ -2868,23 +2927,23 @@
    {
       case 0:
          if ((active0 & 0x70000L) != 0L)
-            return 2;
+            return 48;
          if ((active0 & 0x30000000L) != 0L)
          {
             jjmatchedKind = 62;
-            return 28;
+            return 36;
          }
          if ((active0 & 0x10L) != 0L)
-            return 58;
+            return 70;
          return -1;
       case 1:
          if ((active0 & 0x10000L) != 0L)
-            return 0;
+            return 46;
          if ((active0 & 0x30000000L) != 0L)
          {
             jjmatchedKind = 62;
             jjmatchedPos = 1;
-            return 28;
+            return 36;
          }
          return -1;
       case 2:
@@ -2892,17 +2951,17 @@
          {
             jjmatchedKind = 62;
             jjmatchedPos = 2;
-            return 28;
+            return 36;
          }
          return -1;
       case 3:
          if ((active0 & 0x10000000L) != 0L)
-            return 28;
+            return 36;
          if ((active0 & 0x20000000L) != 0L)
          {
             jjmatchedKind = 62;
             jjmatchedPos = 3;
-            return 28;
+            return 36;
          }
          return -1;
       default :
@@ -2941,7 +3000,7 @@
       case 125:
          return jjStopAtPos(0, 7);
       default :
-         return jjMoveNfa_1(3, 0);
+         return jjMoveNfa_1(13, 0);
    }
 }
 private int jjMoveStringLiteralDfa1_1(long active0)
@@ -2959,7 +3018,7 @@
          break;
       case 42:
          if ((active0 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_1(1, 16, 0);
+            return jjStartNfaWithStates_1(1, 16, 46);
          break;
       case 46:
          if ((active0 & 0x10L) != 0L)
@@ -3007,7 +3066,7 @@
    {
       case 101:
          if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_1(3, 28, 28);
+            return jjStartNfaWithStates_1(3, 28, 36);
          break;
       case 115:
          return jjMoveStringLiteralDfa4_1(active0, 0x20000000L);
@@ -3029,7 +3088,7 @@
    {
       case 101:
          if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_1(4, 29, 28);
+            return jjStartNfaWithStates_1(4, 29, 36);
          break;
       default :
          break;
@@ -3047,7 +3106,7 @@
 private int jjMoveNfa_1(int startState, int curPos)
 {
    int startsAt = 0;
-   jjnewStateCnt = 59;
+   jjnewStateCnt = 71;
    int i = 1;
    jjstateSet[0] = startState;
    int kind = 0x7fffffff;
@@ -3062,253 +3121,271 @@
          {
             switch(jjstateSet[--i])
             {
-               case 3:
+               case 13:
                   if ((0x3ff000000000000L & l) != 0L)
                   {
                      if (kind > 52)
                         kind = 52;
-                     jjCheckNAddStates(130, 135);
+                     jjCheckNAddStates(135, 140);
                   }
                   else if ((0x100002600L & l) != 0L)
                   {
                      if (kind > 26)
                         kind = 26;
-                     jjCheckNAdd(4);
+                     jjCheckNAdd(12);
                   }
                   else if (curChar == 46)
-                     jjCheckNAddTwoStates(48, 58);
+                     jjCheckNAddTwoStates(60, 70);
                   else if (curChar == 45)
-                     jjCheckNAddStates(136, 139);
+                     jjCheckNAddStates(141, 144);
+                  else if (curChar == 35)
+                     jjCheckNAddStates(145, 147);
                   else if (curChar == 36)
                   {
                      if (kind > 13)
                         kind = 13;
-                     jjCheckNAddTwoStates(34, 35);
+                     jjCheckNAddTwoStates(42, 43);
                   }
                   else if (curChar == 39)
-                     jjCheckNAddStates(140, 142);
+                     jjCheckNAddStates(148, 150);
                   else if (curChar == 34)
-                     jjCheckNAddStates(143, 145);
-                  else if (curChar == 35)
-                     jjstateSet[jjnewStateCnt++] = 2;
+                     jjCheckNAddStates(151, 153);
+                  if ((0x100000200L & l) != 0L)
+                     jjCheckNAddTwoStates(0, 1);
                   break;
-               case 58:
-               case 48:
+               case 70:
+               case 60:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
                   if (kind > 53)
                      kind = 53;
-                  jjCheckNAddTwoStates(48, 49);
+                  jjCheckNAddTwoStates(60, 61);
                   break;
-               case 0:
+               case 48:
                   if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 1;
+                     jjstateSet[jjnewStateCnt++] = 46;
+                  break;
+               case 0:
+                  if ((0x100000200L & l) != 0L)
+                     jjCheckNAddTwoStates(0, 1);
                   break;
                case 1:
-                  if ((0xfffffff7ffffffffL & l) != 0L && kind > 15)
-                     kind = 15;
+                  if (curChar == 35)
+                     jjCheckNAddTwoStates(6, 11);
                   break;
-               case 2:
-                  if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 0;
+               case 3:
+                  if (curChar == 32)
+                     jjAddStates(108, 109);
                   break;
                case 4:
+                  if (curChar == 40 && kind > 12)
+                     kind = 12;
+                  break;
+               case 12:
                   if ((0x100002600L & l) == 0L)
                      break;
                   if (kind > 26)
                      kind = 26;
-                  jjCheckNAdd(4);
-                  break;
-               case 5:
-                  if (curChar == 34)
-                     jjCheckNAddStates(143, 145);
+                  jjCheckNAdd(12);
                   break;
-               case 6:
+               case 14:
                   if ((0xfffffffbffffffffL & l) != 0L)
-                     jjCheckNAddStates(143, 145);
+                     jjCheckNAddStates(151, 153);
                   break;
-               case 7:
+               case 15:
                   if (curChar == 34 && kind > 27)
                      kind = 27;
                   break;
-               case 9:
+               case 17:
                   if ((0x8400000000L & l) != 0L)
-                     jjCheckNAddStates(143, 145);
+                     jjCheckNAddStates(151, 153);
                   break;
-               case 10:
+               case 18:
                   if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(146, 149);
+                     jjCheckNAddStates(154, 157);
                   break;
-               case 11:
+               case 19:
                   if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAddStates(143, 145);
+                     jjCheckNAddStates(151, 153);
                   break;
-               case 12:
+               case 20:
                   if ((0xf000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 13;
+                     jjstateSet[jjnewStateCnt++] = 21;
                   break;
-               case 13:
+               case 21:
                   if ((0xff000000000000L & l) != 0L)
-                     jjCheckNAdd(11);
+                     jjCheckNAdd(19);
                   break;
-               case 15:
+               case 23:
                   if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 16;
+                     jjstateSet[jjnewStateCnt++] = 24;
                   break;
-               case 16:
+               case 24:
                   if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 17;
+                     jjstateSet[jjnewStateCnt++] = 25;
                   break;
-               case 17:
+               case 25:
                   if ((0x3ff000000000000L & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 18;
+                     jjstateSet[jjnewStateCnt++] = 26;
                   break;
-               case 18:
+               case 26:
                   if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddStates(143, 145);
+                     jjCheckNAddStates(151, 153);
                   break;
-               case 19:
+               case 27:
                   if (curChar == 32)
-                     jjAddStates(69, 70);
+                     jjAddStates(118, 119);
                   break;
-               case 20:
+               case 28:
                   if (curChar == 10)
-                     jjCheckNAddStates(143, 145);
+                     jjCheckNAddStates(151, 153);
                   break;
-               case 21:
+               case 29:
                   if (curChar == 39)
-                     jjCheckNAddStates(140, 142);
+                     jjCheckNAddStates(148, 150);
                   break;
-               case 22:
+               case 30:
                   if ((0xffffff7fffffffffL & l) != 0L)
-                     jjCheckNAddStates(140, 142);
+                     jjCheckNAddStates(148, 150);
                   break;
-               case 24:
+               case 32:
                   if (curChar == 32)
-                     jjAddStates(23, 24);
+                     jjAddStates(158, 159);
                   break;
-               case 25:
+               case 33:
                   if (curChar == 10)
-                     jjCheckNAddStates(140, 142);
+                     jjCheckNAddStates(148, 150);
                   break;
-               case 26:
+               case 34:
                   if (curChar == 39 && kind > 27)
                      kind = 27;
                   break;
-               case 28:
+               case 36:
                   if ((0x3ff200000000000L & l) == 0L)
                      break;
                   if (kind > 62)
                      kind = 62;
-                  jjstateSet[jjnewStateCnt++] = 28;
+                  jjstateSet[jjnewStateCnt++] = 36;
                   break;
-               case 31:
+               case 39:
                   if (curChar == 36 && kind > 13)
                      kind = 13;
                   break;
-               case 33:
+               case 41:
                   if (curChar == 36)
-                     jjCheckNAddTwoStates(34, 35);
+                     jjCheckNAddTwoStates(42, 43);
                   break;
-               case 35:
+               case 43:
                   if (curChar == 33 && kind > 14)
                      kind = 14;
                   break;
-               case 36:
+               case 44:
                   if (curChar != 36)
                      break;
                   if (kind > 13)
                      kind = 13;
-                  jjCheckNAddTwoStates(34, 35);
+                  jjCheckNAddTwoStates(42, 43);
                   break;
-               case 37:
+               case 45:
+                  if (curChar == 35)
+                     jjCheckNAddStates(145, 147);
+                  break;
+               case 46:
+                  if (curChar == 42)
+                     jjstateSet[jjnewStateCnt++] = 47;
+                  break;
+               case 47:
+                  if ((0xfffffff7ffffffffL & l) != 0L && kind > 15)
+                     kind = 15;
+                  break;
+               case 49:
                   if (curChar == 45)
-                     jjCheckNAddStates(136, 139);
+                     jjCheckNAddStates(141, 144);
                   break;
-               case 38:
+               case 50:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
                   if (kind > 52)
                      kind = 52;
-                  jjCheckNAddTwoStates(38, 40);
+                  jjCheckNAddTwoStates(50, 52);
                   break;
-               case 39:
+               case 51:
                   if (curChar == 46 && kind > 52)
                      kind = 52;
                   break;
-               case 40:
+               case 52:
                   if (curChar == 46)
-                     jjstateSet[jjnewStateCnt++] = 39;
+                     jjstateSet[jjnewStateCnt++] = 51;
                   break;
-               case 41:
+               case 53:
                   if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(41, 42);
+                     jjCheckNAddTwoStates(53, 54);
                   break;
-               case 42:
+               case 54:
                   if (curChar != 46)
                      break;
                   if (kind > 53)
                      kind = 53;
-                  jjCheckNAddTwoStates(43, 44);
+                  jjCheckNAddTwoStates(55, 56);
                   break;
-               case 43:
+               case 55:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
                   if (kind > 53)
                      kind = 53;
-                  jjCheckNAddTwoStates(43, 44);
+                  jjCheckNAddTwoStates(55, 56);
                   break;
-               case 45:
+               case 57:
                   if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(46);
+                     jjCheckNAdd(58);
                   break;
-               case 46:
+               case 58:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
                   if (kind > 53)
                      kind = 53;
-                  jjCheckNAdd(46);
+                  jjCheckNAdd(58);
                   break;
-               case 47:
+               case 59:
                   if (curChar == 46)
-                     jjCheckNAdd(48);
+                     jjCheckNAdd(60);
                   break;
-               case 50:
+               case 62:
                   if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(51);
+                     jjCheckNAdd(63);
                   break;
-               case 51:
+               case 63:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
                   if (kind > 53)
                      kind = 53;
-                  jjCheckNAdd(51);
+                  jjCheckNAdd(63);
                   break;
-               case 52:
+               case 64:
                   if ((0x3ff000000000000L & l) != 0L)
-                     jjCheckNAddTwoStates(52, 53);
+                     jjCheckNAddTwoStates(64, 65);
                   break;
-               case 54:
+               case 66:
                   if ((0x280000000000L & l) != 0L)
-                     jjCheckNAdd(55);
+                     jjCheckNAdd(67);
                   break;
-               case 55:
+               case 67:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
                   if (kind > 53)
                      kind = 53;
-                  jjCheckNAdd(55);
+                  jjCheckNAdd(67);
                   break;
-               case 56:
+               case 68:
                   if ((0x3ff000000000000L & l) == 0L)
                      break;
                   if (kind > 52)
                      kind = 52;
-                  jjCheckNAddStates(130, 135);
+                  jjCheckNAddStates(135, 140);
                   break;
-               case 57:
+               case 69:
                   if (curChar == 46)
-                     jjCheckNAddTwoStates(48, 58);
+                     jjCheckNAddTwoStates(60, 70);
                   break;
                default : break;
             }
@@ -3321,97 +3398,135 @@
          {
             switch(jjstateSet[--i])
             {
-               case 3:
+               case 13:
                   if ((0x7fffffe87fffffeL & l) != 0L)
                   {
                      if (kind > 62)
                         kind = 62;
-                     jjCheckNAdd(28);
+                     jjCheckNAdd(36);
                   }
                   else if (curChar == 92)
-                     jjCheckNAddStates(150, 153);
+                     jjCheckNAddStates(160, 163);
                   break;
-               case 58:
+               case 70:
                   if ((0x7fffffe07fffffeL & l) != 0L && kind > 63)
                      kind = 63;
                   break;
-               case 1:
-                  if (kind > 15)
-                     kind = 15;
+               case 48:
+                  if (curChar == 123)
+                     jjstateSet[jjnewStateCnt++] = 10;
+                  else if (curChar == 115)
+                     jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               case 2:
+                  if (curChar == 116)
+                     jjCheckNAddTwoStates(3, 4);
+                  break;
+               case 5:
+                  if (curChar == 101)
+                     jjstateSet[jjnewStateCnt++] = 2;
                   break;
                case 6:
-                  jjCheckNAddStates(143, 145);
+                  if (curChar == 115)
+                     jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               case 7:
+                  if (curChar == 125)
+                     jjCheckNAddTwoStates(3, 4);
                   break;
                case 8:
-                  if (curChar == 92)
-                     jjAddStates(154, 159);
+                  if (curChar == 116)
+                     jjstateSet[jjnewStateCnt++] = 7;
                   break;
                case 9:
-                  if ((0x14404410000000L & l) != 0L)
-                     jjCheckNAddStates(143, 145);
+                  if (curChar == 101)
+                     jjstateSet[jjnewStateCnt++] = 8;
+                  break;
+               case 10:
+                  if (curChar == 115)
+                     jjstateSet[jjnewStateCnt++] = 9;
+                  break;
+               case 11:
+                  if (curChar == 123)
+                     jjstateSet[jjnewStateCnt++] = 10;
                   break;
                case 14:
+                  jjCheckNAddStates(151, 153);
+                  break;
+               case 16:
+                  if (curChar == 92)
+                     jjAddStates(164, 169);
+                  break;
+               case 17:
+                  if ((0x14404410000000L & l) != 0L)
+                     jjCheckNAddStates(151, 153);
+                  break;
+               case 22:
                   if (curChar == 117)
-                     jjstateSet[jjnewStateCnt++] = 15;
+                     jjstateSet[jjnewStateCnt++] = 23;
                   break;
-               case 15:
+               case 23:
                   if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 16;
+                     jjstateSet[jjnewStateCnt++] = 24;
                   break;
-               case 16:
+               case 24:
                   if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 17;
+                     jjstateSet[jjnewStateCnt++] = 25;
                   break;
-               case 17:
+               case 25:
                   if ((0x7e0000007eL & l) != 0L)
-                     jjstateSet[jjnewStateCnt++] = 18;
+                     jjstateSet[jjnewStateCnt++] = 26;
                   break;
-               case 18:
+               case 26:
                   if ((0x7e0000007eL & l) != 0L)
-                     jjCheckNAddStates(143, 145);
+                     jjCheckNAddStates(151, 153);
                   break;
-               case 22:
-                  jjAddStates(140, 142);
+               case 30:
+                  jjAddStates(148, 150);
                   break;
-               case 23:
+               case 31:
                   if (curChar == 92)
-                     jjAddStates(23, 24);
+                     jjAddStates(158, 159);
                   break;
-               case 27:
-               case 28:
+               case 35:
+               case 36:
                   if ((0x7fffffe87fffffeL & l) == 0L)
                      break;
                   if (kind > 62)
                      kind = 62;
-                  jjCheckNAdd(28);
+                  jjCheckNAdd(36);
                   break;
-               case 29:
+               case 37:
                   if (curChar == 92)
-                     jjCheckNAddStates(150, 153);
+                     jjCheckNAddStates(160, 163);
                   break;
-               case 30:
+               case 38:
                   if (curChar == 92)
-                     jjCheckNAddTwoStates(30, 31);
+                     jjCheckNAddTwoStates(38, 39);
                   break;
-               case 32:
+               case 40:
                   if (curChar == 92)
-                     jjCheckNAddTwoStates(32, 33);
+                     jjCheckNAddTwoStates(40, 41);
                   break;
-               case 34:
+               case 42:
                   if (curChar == 92)
-                     jjAddStates(160, 161);
+                     jjAddStates(170, 171);
                   break;
-               case 44:
+               case 47:
+                  if (kind > 15)
+                     kind = 15;
+                  break;
+               case 56:
                   if ((0x2000000020L & l) != 0L)
-                     jjAddStates(162, 163);
+                     jjAddStates(172, 173);
                   break;
-               case 49:
+               case 61:
                   if ((0x2000000020L & l) != 0L)
-                     jjAddStates(164, 165);
+                     jjAddStates(174, 175);
                   break;
-               case 53:
+               case 65:
                   if ((0x2000000020L & l) != 0L)
-                     jjAddStates(166, 167);
+                     jjAddStates(27, 28);
                   break;
                default : break;
             }
@@ -3428,17 +3543,17 @@
          {
             switch(jjstateSet[--i])
             {
-               case 1:
-                  if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 15)
-                     kind = 15;
-                  break;
-               case 6:
+               case 14:
                   if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(143, 145);
+                     jjAddStates(151, 153);
                   break;
-               case 22:
+               case 30:
                   if (jjCanMove_0(hiByte, i1, i2, l1, l2))
-                     jjAddStates(140, 142);
+                     jjAddStates(148, 150);
+                  break;
+               case 47:
+                  if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 15)
+                     kind = 15;
                   break;
                default : break;
             }
@@ -3451,7 +3566,7 @@
          kind = 0x7fffffff;
       }
       ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 59 - (jjnewStateCnt = startsAt)))
+      if ((i = jjnewStateCnt) == (startsAt = 71 - (jjnewStateCnt = startsAt)))
          return curPos;
       try { curChar = input_stream.readChar(); }
       catch(java.io.IOException e) { return curPos; }
@@ -3463,40 +3578,40 @@
    {
       case 0:
          if ((active0 & 0x70000L) != 0L)
-            return 2;
+            return 27;
          if ((active0 & 0x30000000L) != 0L)
          {
             jjmatchedKind = 62;
-            return 5;
+            return 13;
          }
          return -1;
       case 1:
-         if ((active0 & 0x10000L) != 0L)
-            return 0;
          if ((active0 & 0x30000000L) != 0L)
          {
             jjmatchedKind = 62;
             jjmatchedPos = 1;
-            return 5;
+            return 13;
          }
+         if ((active0 & 0x10000L) != 0L)
+            return 25;
          return -1;
       case 2:
          if ((active0 & 0x30000000L) != 0L)
          {
             jjmatchedKind = 62;
             jjmatchedPos = 2;
-            return 5;
+            return 13;
          }
          return -1;
       case 3:
+         if ((active0 & 0x10000000L) != 0L)
+            return 13;
          if ((active0 & 0x20000000L) != 0L)
          {
             jjmatchedKind = 62;
             jjmatchedPos = 3;
-            return 5;
+            return 13;
          }
-         if ((active0 & 0x10000000L) != 0L)
-            return 5;
          return -1;
       default :
          return -1;
@@ -3524,7 +3639,7 @@
       case 125:
          return jjStopAtPos(0, 65);
       default :
-         return jjMoveNfa_2(3, 0);
+         return jjMoveNfa_2(12, 0);
    }
 }
 private int jjMoveStringLiteralDfa1_2(long active0)
@@ -3542,7 +3657,7 @@
          break;
       case 42:
          if ((active0 & 0x10000L) != 0L)
-            return jjStartNfaWithStates_2(1, 16, 0);
+            return jjStartNfaWithStates_2(1, 16, 25);
          break;
       case 97:
          return jjMoveStringLiteralDfa2_2(active0, 0x20000000L);
@@ -3586,7 +3701,7 @@
    {
       case 101:
          if ((active0 & 0x10000000L) != 0L)
-            return jjStartNfaWithStates_2(3, 28, 5);
+            return jjStartNfaWithStates_2(3, 28, 13);
          break;
       case 115:
          return jjMoveStringLiteralDfa4_2(active0, 0x20000000L);
@@ -3608,7 +3723,7 @@
    {
       case 101:
          if ((active0 & 0x20000000L) != 0L)
-            return jjStartNfaWithStates_2(4, 29, 5);
+            return jjStartNfaWithStates_2(4, 29, 13);
          break;
       default :
          break;
@@ -3626,7 +3741,7 @@
 private int jjMoveNfa_2(int startState, int curPos)
 {
    int startsAt = 0;
-   jjnewStateCnt = 16;
+   jjnewStateCnt = 28;
    int i = 1;
    jjstateSet[0] = startState;
    int kind = 0x7fffffff;
@@ -3641,59 +3756,81 @@
          {
             switch(jjstateSet[--i])
             {
-               case 3:
-                  if (curChar == 36)
+               case 12:
+                  if ((0x100000200L & l) != 0L)
+                     jjCheckNAddTwoStates(0, 1);
+                  else if (curChar == 35)
+                     jjCheckNAddStates(126, 128);
+                  else if (curChar == 36)
                   {
                      if (kind > 13)
                         kind = 13;
-                     jjCheckNAddTwoStates(13, 14);
+                     jjCheckNAddTwoStates(21, 22);
                   }
                   else if (curChar == 46)
-                     jjstateSet[jjnewStateCnt++] = 7;
-                  else if (curChar == 35)
-                     jjstateSet[jjnewStateCnt++] = 2;
+                     jjstateSet[jjnewStateCnt++] = 15;
                   break;
-               case 0:
+               case 27:
                   if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 1;
+                     jjstateSet[jjnewStateCnt++] = 25;
+                  break;
+               case 0:
+                  if ((0x100000200L & l) != 0L)
+                     jjCheckNAddTwoStates(0, 1);
                   break;
                case 1:
-                  if ((0xfffffff7ffffffffL & l) != 0L && kind > 15)
-                     kind = 15;
+                  if (curChar == 35)
+                     jjCheckNAddTwoStates(6, 11);
                   break;
-               case 2:
-                  if (curChar == 42)
-                     jjstateSet[jjnewStateCnt++] = 0;
+               case 3:
+                  if (curChar == 32)
+                     jjAddStates(108, 109);
                   break;
-               case 5:
+               case 4:
+                  if (curChar == 40 && kind > 12)
+                     kind = 12;
+                  break;
+               case 13:
                   if ((0x3ff200000000000L & l) == 0L)
                      break;
                   if (kind > 62)
                      kind = 62;
-                  jjstateSet[jjnewStateCnt++] = 5;
+                  jjstateSet[jjnewStateCnt++] = 13;
                   break;
-               case 6:
+               case 14:
                   if (curChar == 46)
-                     jjstateSet[jjnewStateCnt++] = 7;
+                     jjstateSet[jjnewStateCnt++] = 15;
                   break;
-               case 10:
+               case 18:
                   if (curChar == 36 && kind > 13)
                      kind = 13;
                   break;
-               case 12:
+               case 20:
                   if (curChar == 36)
-                     jjCheckNAddTwoStates(13, 14);
+                     jjCheckNAddTwoStates(21, 22);
                   break;
-               case 14:
+               case 22:
                   if (curChar == 33 && kind > 14)
                      kind = 14;
                   break;
-               case 15:
+               case 23:
                   if (curChar != 36)
                      break;
                   if (kind > 13)
                      kind = 13;
-                  jjCheckNAddTwoStates(13, 14);
+                  jjCheckNAddTwoStates(21, 22);
+                  break;
+               case 24:
+                  if (curChar == 35)
+                     jjCheckNAddStates(126, 128);
+                  break;
+               case 25:
+                  if (curChar == 42)
+                     jjstateSet[jjnewStateCnt++] = 26;
+                  break;
+               case 26:
+                  if ((0xfffffff7ffffffffL & l) != 0L && kind > 15)
+                     kind = 15;
                   break;
                default : break;
             }
@@ -3706,47 +3843,84 @@
          {
             switch(jjstateSet[--i])
             {
-               case 3:
+               case 12:
                   if ((0x7fffffe87fffffeL & l) != 0L)
                   {
                      if (kind > 62)
                         kind = 62;
-                     jjCheckNAdd(5);
+                     jjCheckNAdd(13);
                   }
                   else if (curChar == 92)
-                     jjCheckNAddStates(126, 129);
+                     jjCheckNAddStates(129, 132);
                   break;
-               case 1:
-                  if (kind > 15)
-                     kind = 15;
+               case 27:
+                  if (curChar == 123)
+                     jjstateSet[jjnewStateCnt++] = 10;
+                  else if (curChar == 115)
+                     jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               case 2:
+                  if (curChar == 116)
+                     jjCheckNAddTwoStates(3, 4);
                   break;
-               case 4:
                case 5:
+                  if (curChar == 101)
+                     jjstateSet[jjnewStateCnt++] = 2;
+                  break;
+               case 6:
+                  if (curChar == 115)
+                     jjstateSet[jjnewStateCnt++] = 5;
+                  break;
+               case 7:
+                  if (curChar == 125)
+                     jjCheckNAddTwoStates(3, 4);
+                  break;
+               case 8:
+                  if (curChar == 116)
+                     jjstateSet[jjnewStateCnt++] = 7;
+                  break;
+               case 9:
+                  if (curChar == 101)
+                     jjstateSet[jjnewStateCnt++] = 8;
+                  break;
+               case 10:
+                  if (curChar == 115)
+                     jjstateSet[jjnewStateCnt++] = 9;
+                  break;
+               case 11:
+                  if (curChar == 123)
+                     jjstateSet[jjnewStateCnt++] = 10;
+                  break;
+               case 13:
                   if ((0x7fffffe87fffffeL & l) == 0L)
                      break;
                   if (kind > 62)
                      kind = 62;
-                  jjCheckNAdd(5);
+                  jjCheckNAdd(13);
                   break;
-               case 7:
+               case 15:
                   if ((0x7fffffe07fffffeL & l) != 0L && kind > 63)
                      kind = 63;
                   break;
-               case 8:
+               case 16:
                   if (curChar == 92)
-                     jjCheckNAddStates(126, 129);
+                     jjCheckNAddStates(129, 132);
                   break;
-               case 9:
+               case 17:
                   if (curChar == 92)
-                     jjCheckNAddTwoStates(9, 10);
+                     jjCheckNAddTwoStates(17, 18);
                   break;
-               case 11:
+               case 19:
                   if (curChar == 92)
-                     jjCheckNAddTwoStates(11, 12);
+                     jjCheckNAddTwoStates(19, 20);
                   break;
-               case 13:
+               case 21:
                   if (curChar == 92)
-                     jjAddStates(95, 96);
+                     jjAddStates(133, 134);
+                  break;
+               case 26:
+                  if (kind > 15)
+                     kind = 15;
                   break;
                default : break;
             }
@@ -3763,7 +3937,7 @@
          {
             switch(jjstateSet[--i])
             {
-               case 1:
+               case 26:
                   if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 15)
                      kind = 15;
                   break;
@@ -3778,7 +3952,7 @@
          kind = 0x7fffffff;
       }
       ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 16 - (jjnewStateCnt = startsAt)))
+      if ((i = jjnewStateCnt) == (startsAt = 28 - (jjnewStateCnt = startsAt)))
          return curPos;
       try { curChar = input_stream.readChar(); }
       catch(java.io.IOException e) { return curPos; }
@@ -3792,10 +3966,10 @@
    88, 78, 81, 10, 87, 19, 20, 31, 32, 34, 42, 43, 45, 50, 32, 51, 
    66, 43, 67, 54, 57, 64, 71, 76, 22, 23, 24, 25, 35, 40, 47, 13, 
    14, 26, 27, 85, 86, 89, 90, 6, 11, 33, 16, 18, 3, 4, 20, 21, 
-   23, 24, 25, 26, 14, 15, 27, 28, 8, 9, 10, 11, 12, 13, 9, 10, 
-   11, 12, 38, 40, 41, 42, 52, 53, 38, 41, 47, 52, 22, 23, 26, 6, 
-   7, 8, 6, 11, 7, 8, 30, 31, 32, 33, 9, 10, 12, 14, 19, 20, 
-   34, 35, 45, 46, 50, 51, 54, 55, 
+   23, 24, 25, 26, 14, 15, 27, 28, 8, 9, 10, 11, 12, 13, 6, 11, 
+   27, 17, 18, 19, 20, 21, 22, 50, 52, 53, 54, 64, 65, 50, 53, 59, 
+   64, 6, 11, 48, 30, 31, 34, 14, 15, 16, 14, 19, 15, 16, 32, 33, 
+   38, 39, 40, 41, 17, 18, 20, 22, 27, 28, 42, 43, 57, 58, 62, 63, 
 };
 private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
 {
@@ -3824,8 +3998,8 @@
    "REFMOD2",
    "REFMODIFIER",
    "DEFAULT",
-   "PRE_DIRECTIVE",
    "REFERENCE",
+   "PRE_DIRECTIVE",
    "IN_MULTI_LINE_COMMENT",
    "IN_FORMAL_COMMENT",
    "IN_SINGLE_LINE_COMMENT",
@@ -3994,18 +4168,18 @@
          jjmatchedKind = 0x7fffffff;
          jjmatchedPos = 0;
          curPos = jjMoveStringLiteralDfa0_4();
-         if (jjmatchedPos == 0 && jjmatchedKind > 67)
+         if (jjmatchedPos == 0 && jjmatchedKind > 66)
          {
-            jjmatchedKind = 67;
+            jjmatchedKind = 66;
          }
          break;
        case 5:
          jjmatchedKind = 0x7fffffff;
          jjmatchedPos = 0;
          curPos = jjMoveStringLiteralDfa0_5();
-         if (jjmatchedPos == 0 && jjmatchedKind > 66)
+         if (jjmatchedPos == 0 && jjmatchedKind > 67)
          {
-            jjmatchedKind = 66;
+            jjmatchedKind = 67;
          }
          break;
        case 6:

Modified: velocity/engine/trunk/src/parser/Parser.jjt
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/parser/Parser.jjt?rev=705936&r1=705935&r2=705936&view=diff
==============================================================================
--- velocity/engine/trunk/src/parser/Parser.jjt (original)
+++ velocity/engine/trunk/src/parser/Parser.jjt Sat Oct 18 16:01:00 2008
@@ -613,7 +613,19 @@
  * to eat any preceeding whitespace so it is invisible in formatting.
  * (As it should be.)  If this works well, I am going to chuck the whole MORE:
  * token abomination.
+ *
+ * We added the lexical states REFERENCE, REFMODIFIER, REFMOD2 to
+ * address JIRA issue VELOCITY-631. With SET_DIRECTIVE only in the
+ * DEFAULT lexical state the following VTL fails "$a#set($b = 1)"
+ * because the Reference token uses LOOKAHEAD(2) combined with the
+ * fact that we explicity set the lex state to REFERENCE with the $
+ * token, which means we would never evaulate this token during the
+ * look ahead.  This general issue is disscussed here:
+ *
+ *  http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-ie.htm#tth_sEc3.12
+ *
  */
+<DEFAULT, REFERENCE, REFMODIFIER, REFMOD2>
 TOKEN:
 {
   <SET_DIRECTIVE: (" "|"\t")*  ("#set" | "#{set}")  (" ")* "(">

Added: velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity631TestCase.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity631TestCase.java?rev=705936&view=auto
==============================================================================
--- velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity631TestCase.java (added)
+++ velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity631TestCase.java Sat Oct 18 16:01:00 2008
@@ -0,0 +1,43 @@
+package org.apache.velocity.test.issues;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+import org.apache.velocity.test.BaseEvalTestCase;
+import org.apache.velocity.runtime.RuntimeConstants;
+
+/**
+ * This class tests VELOCITY-631.
+ */
+public class Velocity631TestCase extends BaseEvalTestCase
+{
+    public Velocity631TestCase(String name)
+    {
+        super(name);
+    }
+   
+    public void test631()
+    {
+        DEBUG = true;
+        assertEvalEquals("$a", "$a #set($b = 1)");
+        assertEvalEquals("$a", "$a#set($b = 1)");
+        assertEvalEquals("$a.b", "$a.b#set($b = 1)");
+        assertEvalEquals("$a.b(", "$a.b(#set($b = 1)");
+    }
+}

Propchange: velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity631TestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity631TestCase.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity631TestCase.java
------------------------------------------------------------------------------
    svn:keywords = Revision

Propchange: velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity631TestCase.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain