Author: markt
Date: Sat Jul 13 20:40:39 2013
New Revision: 1502876

URL: http://svn.apache.org/r1502876
Log:
Add support for the assignment and semicolon operator to the parser. The new 
nodes (the Ast*.java files) are just the auto-generated skeletons and some - if 
not all - will need some work before these new expression elements are fully 
implemented.

Added:
    tomcat/trunk/java/org/apache/el/parser/AstAssign.java   (with props)
    tomcat/trunk/java/org/apache/el/parser/AstSemicolon.java   (with props)
Modified:
    tomcat/trunk/java/org/apache/el/parser/ELParser.java
    tomcat/trunk/java/org/apache/el/parser/ELParser.jjt
    tomcat/trunk/java/org/apache/el/parser/ELParserConstants.java
    tomcat/trunk/java/org/apache/el/parser/ELParserTokenManager.java
    tomcat/trunk/java/org/apache/el/parser/ELParserTreeConstants.java

Added: tomcat/trunk/java/org/apache/el/parser/AstAssign.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstAssign.java?rev=1502876&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstAssign.java (added)
+++ tomcat/trunk/java/org/apache/el/parser/AstAssign.java Sat Jul 13 20:40:39 
2013
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+/* Generated By:JJTree: Do not edit this line. AstAssign.java Version 4.3 */
+package org.apache.el.parser;
+
+public
+class AstAssign extends SimpleNode {
+  public AstAssign(int id) {
+    super(id);
+  }
+}
+/* JavaCC - OriginalChecksum=151e58546054b618e758d7dc172cc7b5 (do not edit 
this line) */

Propchange: tomcat/trunk/java/org/apache/el/parser/AstAssign.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tomcat/trunk/java/org/apache/el/parser/AstSemicolon.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstSemicolon.java?rev=1502876&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstSemicolon.java (added)
+++ tomcat/trunk/java/org/apache/el/parser/AstSemicolon.java Sat Jul 13 
20:40:39 2013
@@ -0,0 +1,26 @@
+/*
+ * 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.
+ */
+/* Generated By:JJTree: Do not edit this line. AstSemicolon.java Version 4.3 */
+package org.apache.el.parser;
+
+public
+class AstSemicolon extends SimpleNode {
+  public AstSemicolon(int id) {
+    super(id);
+  }
+}
+/* JavaCC - OriginalChecksum=ce956594ca572a4e452fe4f084a03099 (do not edit 
this line) */

Propchange: tomcat/trunk/java/org/apache/el/parser/AstSemicolon.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/java/org/apache/el/parser/ELParser.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/ELParser.java?rev=1502876&r1=1502875&r2=1502876&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/ELParser.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/ELParser.java Sat Jul 13 20:40:39 
2013
@@ -135,7 +135,7 @@ public class ELParser/*@bgen(jjtree)*/im
 
 /*
  * DynamicExpression
- * ${..} Expressions
+ * ${...} Expressions
  */
   final public void DynamicExpression() throws ParseException {
                                                /*@bgen(jjtree) 
DynamicExpression */
@@ -172,7 +172,90 @@ public class ELParser/*@bgen(jjtree)*/im
  * EL Expression Language Root, goes to Choice
  */
   final public void Expression() throws ParseException {
+    Semicolon();
+  }
+
+/*
+ * Semicolon
+ */
+  final public void Semicolon() throws ParseException {
+    Assignment();
+    label_2:
+    while (true) {
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case SEMICOLON:
+        ;
+        break;
+      default:
+        jj_la1[2] = jj_gen;
+        break label_2;
+      }
+      jj_consume_token(SEMICOLON);
+                                 AstSemicolon jjtn001 = new 
AstSemicolon(JJTSEMICOLON);
+                                 boolean jjtc001 = true;
+                                 jjtree.openNodeScope(jjtn001);
+      try {
+        Assignment();
+      } catch (Throwable jjte001) {
+                                 if (jjtc001) {
+                                   jjtree.clearNodeScope(jjtn001);
+                                   jjtc001 = false;
+                                 } else {
+                                   jjtree.popNode();
+                                 }
+                                 if (jjte001 instanceof RuntimeException) {
+                                   {if (true) throw (RuntimeException)jjte001;}
+                                 }
+                                 if (jjte001 instanceof ParseException) {
+                                   {if (true) throw (ParseException)jjte001;}
+                                 }
+                                 {if (true) throw (Error)jjte001;}
+      } finally {
+                                 if (jjtc001) {
+                                   jjtree.closeNodeScope(jjtn001,  2);
+                                 }
+      }
+    }
+  }
+
+/*
+ * Assignment
+ */
+  final public void Assignment() throws ParseException {
     Choice();
+    label_3:
+    while (true) {
+      if (jj_2_1(2)) {
+        ;
+      } else {
+        break label_3;
+      }
+      jj_consume_token(ASSIGN);
+                                       AstAssign jjtn001 = new 
AstAssign(JJTASSIGN);
+                                       boolean jjtc001 = true;
+                                       jjtree.openNodeScope(jjtn001);
+      try {
+        Assignment();
+      } catch (Throwable jjte001) {
+                                       if (jjtc001) {
+                                         jjtree.clearNodeScope(jjtn001);
+                                         jjtc001 = false;
+                                       } else {
+                                         jjtree.popNode();
+                                       }
+                                       if (jjte001 instanceof 
RuntimeException) {
+                                         {if (true) throw 
(RuntimeException)jjte001;}
+                                       }
+                                       if (jjte001 instanceof ParseException) {
+                                         {if (true) throw 
(ParseException)jjte001;}
+                                       }
+                                       {if (true) throw (Error)jjte001;}
+      } finally {
+                                       if (jjtc001) {
+                                         jjtree.closeNodeScope(jjtn001,  2);
+                                       }
+      }
+    }
   }
 
 /*
@@ -181,12 +264,12 @@ public class ELParser/*@bgen(jjtree)*/im
  */
   final public void Choice() throws ParseException {
     Or();
-    label_2:
+    label_4:
     while (true) {
-      if (jj_2_1(3)) {
+      if (jj_2_2(3)) {
         ;
       } else {
-        break label_2;
+        break label_4;
       }
       jj_consume_token(QUESTIONMARK);
       Choice();
@@ -224,7 +307,7 @@ public class ELParser/*@bgen(jjtree)*/im
  */
   final public void Or() throws ParseException {
     And();
-    label_3:
+    label_5:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case OR0:
@@ -232,8 +315,8 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[2] = jj_gen;
-        break label_3;
+        jj_la1[3] = jj_gen;
+        break label_5;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case OR0:
@@ -243,7 +326,7 @@ public class ELParser/*@bgen(jjtree)*/im
         jj_consume_token(OR1);
         break;
       default:
-        jj_la1[3] = jj_gen;
+        jj_la1[4] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -280,7 +363,7 @@ public class ELParser/*@bgen(jjtree)*/im
  */
   final public void And() throws ParseException {
     Equality();
-    label_4:
+    label_6:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case AND0:
@@ -288,8 +371,8 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[4] = jj_gen;
-        break label_4;
+        jj_la1[5] = jj_gen;
+        break label_6;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case AND0:
@@ -299,7 +382,7 @@ public class ELParser/*@bgen(jjtree)*/im
         jj_consume_token(AND1);
         break;
       default:
-        jj_la1[5] = jj_gen;
+        jj_la1[6] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -336,7 +419,7 @@ public class ELParser/*@bgen(jjtree)*/im
  */
   final public void Equality() throws ParseException {
     Compare();
-    label_5:
+    label_7:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case EQ0:
@@ -346,8 +429,8 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[6] = jj_gen;
-        break label_5;
+        jj_la1[7] = jj_gen;
+        break label_7;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case EQ0:
@@ -360,7 +443,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(EQ1);
           break;
         default:
-          jj_la1[7] = jj_gen;
+          jj_la1[8] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -399,7 +482,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(NE1);
           break;
         default:
-          jj_la1[8] = jj_gen;
+          jj_la1[9] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -429,7 +512,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[9] = jj_gen;
+        jj_la1[10] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -442,7 +525,7 @@ public class ELParser/*@bgen(jjtree)*/im
  */
   final public void Compare() throws ParseException {
     Math();
-    label_6:
+    label_8:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case GT0:
@@ -456,8 +539,8 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[10] = jj_gen;
-        break label_6;
+        jj_la1[11] = jj_gen;
+        break label_8;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case LT0:
@@ -470,7 +553,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(LT1);
           break;
         default:
-          jj_la1[11] = jj_gen;
+          jj_la1[12] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -509,7 +592,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(GT1);
           break;
         default:
-          jj_la1[12] = jj_gen;
+          jj_la1[13] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -548,7 +631,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(LE1);
           break;
         default:
-          jj_la1[13] = jj_gen;
+          jj_la1[14] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -587,7 +670,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(GE1);
           break;
         default:
-          jj_la1[14] = jj_gen;
+          jj_la1[15] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -617,7 +700,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[15] = jj_gen;
+        jj_la1[16] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -630,7 +713,7 @@ public class ELParser/*@bgen(jjtree)*/im
  */
   final public void Math() throws ParseException {
     Multiplication();
-    label_7:
+    label_9:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PLUS:
@@ -638,8 +721,8 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[16] = jj_gen;
-        break label_7;
+        jj_la1[17] = jj_gen;
+        break label_9;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case PLUS:
@@ -697,7 +780,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[17] = jj_gen;
+        jj_la1[18] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -710,7 +793,7 @@ public class ELParser/*@bgen(jjtree)*/im
  */
   final public void Multiplication() throws ParseException {
     Unary();
-    label_8:
+    label_10:
     while (true) {
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case MULT:
@@ -721,8 +804,8 @@ public class ELParser/*@bgen(jjtree)*/im
         ;
         break;
       default:
-        jj_la1[18] = jj_gen;
-        break label_8;
+        jj_la1[19] = jj_gen;
+        break label_10;
       }
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
       case MULT:
@@ -762,7 +845,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(DIV1);
           break;
         default:
-          jj_la1[19] = jj_gen;
+          jj_la1[20] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -801,7 +884,7 @@ public class ELParser/*@bgen(jjtree)*/im
           jj_consume_token(MOD1);
           break;
         default:
-          jj_la1[20] = jj_gen;
+          jj_la1[21] = jj_gen;
           jj_consume_token(-1);
           throw new ParseException();
         }
@@ -831,7 +914,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
         break;
       default:
-        jj_la1[21] = jj_gen;
+        jj_la1[22] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -881,7 +964,7 @@ public class ELParser/*@bgen(jjtree)*/im
         jj_consume_token(NOT1);
         break;
       default:
-        jj_la1[22] = jj_gen;
+        jj_la1[23] = jj_gen;
         jj_consume_token(-1);
         throw new ParseException();
       }
@@ -950,7 +1033,7 @@ public class ELParser/*@bgen(jjtree)*/im
       Value();
       break;
     default:
-      jj_la1[23] = jj_gen;
+      jj_la1[24] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -966,7 +1049,7 @@ public class ELParser/*@bgen(jjtree)*/im
       jjtree.openNodeScope(jjtn001);
     try {
       ValuePrefix();
-      label_9:
+      label_11:
       while (true) {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
         case DOT:
@@ -974,8 +1057,8 @@ public class ELParser/*@bgen(jjtree)*/im
           ;
           break;
         default:
-          jj_la1[24] = jj_gen;
-          break label_9;
+          jj_la1[25] = jj_gen;
+          break label_11;
         }
         ValueSuffix();
       }
@@ -1021,7 +1104,7 @@ public class ELParser/*@bgen(jjtree)*/im
       NonLiteral();
       break;
     default:
-      jj_la1[25] = jj_gen;
+      jj_la1[26] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1040,7 +1123,7 @@ public class ELParser/*@bgen(jjtree)*/im
       BracketSuffix();
       break;
     default:
-      jj_la1[26] = jj_gen;
+      jj_la1[27] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1049,7 +1132,7 @@ public class ELParser/*@bgen(jjtree)*/im
       MethodParameters();
       break;
     default:
-      jj_la1[27] = jj_gen;
+      jj_la1[28] = jj_gen;
       ;
     }
   }
@@ -1136,22 +1219,22 @@ public class ELParser/*@bgen(jjtree)*/im
       case MINUS:
       case IDENTIFIER:
         Expression();
-        label_10:
+        label_12:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case COMMA:
             ;
             break;
           default:
-            jj_la1[28] = jj_gen;
-            break label_10;
+            jj_la1[29] = jj_gen;
+            break label_12;
           }
           jj_consume_token(COMMA);
           Expression();
         }
         break;
       default:
-        jj_la1[29] = jj_gen;
+        jj_la1[30] = jj_gen;
         ;
       }
       jj_consume_token(RPAREN);
@@ -1188,8 +1271,8 @@ public class ELParser/*@bgen(jjtree)*/im
       jj_consume_token(RPAREN);
       break;
     default:
-      jj_la1[30] = jj_gen;
-      if (jj_2_2(2147483647)) {
+      jj_la1[31] = jj_gen;
+      if (jj_2_3(2147483647)) {
         Function();
       } else {
         switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1197,8 +1280,8 @@ public class ELParser/*@bgen(jjtree)*/im
           Identifier();
           break;
         default:
-          jj_la1[31] = jj_gen;
-          if (jj_2_3(3)) {
+          jj_la1[32] = jj_gen;
+          if (jj_2_4(3)) {
             SetData();
           } else {
             switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
@@ -1209,7 +1292,7 @@ public class ELParser/*@bgen(jjtree)*/im
               MapData();
               break;
             default:
-              jj_la1[32] = jj_gen;
+              jj_la1[33] = jj_gen;
               jj_consume_token(-1);
               throw new ParseException();
             }
@@ -1242,22 +1325,22 @@ public class ELParser/*@bgen(jjtree)*/im
       case MINUS:
       case IDENTIFIER:
         Expression();
-        label_11:
+        label_13:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case COMMA:
             ;
             break;
           default:
-            jj_la1[33] = jj_gen;
-            break label_11;
+            jj_la1[34] = jj_gen;
+            break label_13;
           }
           jj_consume_token(COMMA);
           Expression();
         }
         break;
       default:
-        jj_la1[34] = jj_gen;
+        jj_la1[35] = jj_gen;
         ;
       }
       jj_consume_token(RCURL);
@@ -1305,22 +1388,22 @@ public class ELParser/*@bgen(jjtree)*/im
       case MINUS:
       case IDENTIFIER:
         Expression();
-        label_12:
+        label_14:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case COMMA:
             ;
             break;
           default:
-            jj_la1[35] = jj_gen;
-            break label_12;
+            jj_la1[36] = jj_gen;
+            break label_14;
           }
           jj_consume_token(COMMA);
           Expression();
         }
         break;
       default:
-        jj_la1[36] = jj_gen;
+        jj_la1[37] = jj_gen;
         ;
       }
       jj_consume_token(RBRACK);
@@ -1368,22 +1451,22 @@ public class ELParser/*@bgen(jjtree)*/im
       case MINUS:
       case IDENTIFIER:
         MapEntry();
-        label_13:
+        label_15:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case COMMA:
             ;
             break;
           default:
-            jj_la1[37] = jj_gen;
-            break label_13;
+            jj_la1[38] = jj_gen;
+            break label_15;
           }
           jj_consume_token(COMMA);
           MapEntry();
         }
         break;
       default:
-        jj_la1[38] = jj_gen;
+        jj_la1[39] = jj_gen;
         ;
       }
       jj_consume_token(RCURL);
@@ -1470,7 +1553,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jjtree.openNodeScope(jjtn000);Token t0 = null;
     Token t1 = null;
     try {
-      if (jj_2_4(2)) {
+      if (jj_2_5(2)) {
         t0 = jj_consume_token(IDENTIFIER);
         jj_consume_token(COLON);
       } else {
@@ -1500,22 +1583,22 @@ public class ELParser/*@bgen(jjtree)*/im
       case MINUS:
       case IDENTIFIER:
         Expression();
-        label_14:
+        label_16:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case COMMA:
             ;
             break;
           default:
-            jj_la1[39] = jj_gen;
-            break label_14;
+            jj_la1[40] = jj_gen;
+            break label_16;
           }
           jj_consume_token(COMMA);
           Expression();
         }
         break;
       default:
-        jj_la1[40] = jj_gen;
+        jj_la1[41] = jj_gen;
         ;
       }
       jj_consume_token(RPAREN);
@@ -1563,7 +1646,7 @@ public class ELParser/*@bgen(jjtree)*/im
       Null();
       break;
     default:
-      jj_la1[41] = jj_gen;
+      jj_la1[42] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1600,7 +1683,7 @@ public class ELParser/*@bgen(jjtree)*/im
       }
       break;
     default:
-      jj_la1[42] = jj_gen;
+      jj_la1[43] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1715,174 +1798,146 @@ public class ELParser/*@bgen(jjtree)*/im
     finally { jj_save(3, xla); }
   }
 
-  private boolean jj_3R_32() {
-    if (jj_3R_38()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_39()) { jj_scanpos = xsp; break; }
-    }
-    return false;
-  }
-
-  private boolean jj_3R_73() {
-    if (jj_scan_token(INTEGER_LITERAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_41() {
-    if (jj_scan_token(MINUS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_40() {
-    if (jj_scan_token(PLUS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_33() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_40()) {
-    jj_scanpos = xsp;
-    if (jj_3R_41()) return true;
-    }
-    return false;
+  private boolean jj_2_5(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_5(); }
+    catch(LookaheadSuccess ls) { return true; }
+    finally { jj_save(4, xla); }
   }
 
-  private boolean jj_3R_72() {
+  private boolean jj_3R_77() {
     if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
     return false;
   }
 
-  private boolean jj_3R_28() {
-    if (jj_3R_32()) return true;
+  private boolean jj_3R_33() {
+    if (jj_3R_37()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_33()) { jj_scanpos = xsp; break; }
+      if (jj_3R_38()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_81() {
+  private boolean jj_3R_86() {
     if (jj_scan_token(FALSE)) return true;
     return false;
   }
 
-  private boolean jj_3R_37() {
+  private boolean jj_3R_42() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(28)) {
+    if (jj_scan_token(29)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(29)) return true;
+    if (jj_scan_token(30)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_36() {
+  private boolean jj_3R_85() {
+    if (jj_scan_token(TRUE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_41() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(30)) {
+    if (jj_scan_token(31)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(31)) return true;
+    if (jj_scan_token(32)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_71() {
+  private boolean jj_3R_76() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_80()) {
+    if (jj_3R_85()) {
     jj_scanpos = xsp;
-    if (jj_3R_81()) return true;
+    if (jj_3R_86()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_80() {
-    if (jj_scan_token(TRUE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_35() {
+  private boolean jj_3R_40() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(24)) {
+    if (jj_scan_token(25)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(25)) return true;
+    if (jj_scan_token(26)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_34() {
+  private boolean jj_3R_39() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(26)) {
+    if (jj_scan_token(27)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(27)) return true;
+    if (jj_scan_token(28)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_29() {
+  private boolean jj_3R_34() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_34()) {
+    if (jj_3R_39()) {
     jj_scanpos = xsp;
-    if (jj_3R_35()) {
+    if (jj_3R_40()) {
     jj_scanpos = xsp;
-    if (jj_3R_36()) {
+    if (jj_3R_41()) {
     jj_scanpos = xsp;
-    if (jj_3R_37()) return true;
+    if (jj_3R_42()) return true;
     }
     }
     }
     return false;
   }
 
-  private boolean jj_3R_63() {
-    if (jj_3R_75()) return true;
+  private boolean jj_3R_68() {
+    if (jj_3R_80()) return true;
     return false;
   }
 
-  private boolean jj_3R_62() {
-    if (jj_3R_74()) return true;
+  private boolean jj_3R_67() {
+    if (jj_3R_79()) return true;
     return false;
   }
 
-  private boolean jj_3R_61() {
-    if (jj_3R_73()) return true;
+  private boolean jj_3R_66() {
+    if (jj_3R_78()) return true;
     return false;
   }
 
-  private boolean jj_3R_26() {
-    if (jj_3R_28()) return true;
+  private boolean jj_3R_30() {
+    if (jj_3R_33()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_29()) { jj_scanpos = xsp; break; }
+      if (jj_3R_34()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_60() {
-    if (jj_3R_72()) return true;
+  private boolean jj_3R_65() {
+    if (jj_3R_77()) return true;
     return false;
   }
 
-  private boolean jj_3R_55() {
+  private boolean jj_3R_60() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_59()) {
+    if (jj_3R_64()) {
     jj_scanpos = xsp;
-    if (jj_3R_60()) {
+    if (jj_3R_65()) {
     jj_scanpos = xsp;
-    if (jj_3R_61()) {
+    if (jj_3R_66()) {
     jj_scanpos = xsp;
-    if (jj_3R_62()) {
+    if (jj_3R_67()) {
     jj_scanpos = xsp;
-    if (jj_3R_63()) return true;
+    if (jj_3R_68()) return true;
     }
     }
     }
@@ -1890,244 +1945,275 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_59() {
-    if (jj_3R_71()) return true;
+  private boolean jj_3R_64() {
+    if (jj_3R_76()) return true;
     return false;
   }
 
-  private boolean jj_3R_31() {
+  private boolean jj_3R_36() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(34)) {
+    if (jj_scan_token(35)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(35)) return true;
+    if (jj_scan_token(36)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_30() {
+  private boolean jj_3R_35() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(32)) {
+    if (jj_scan_token(33)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(33)) return true;
+    if (jj_scan_token(34)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_27() {
+  private boolean jj_3R_31() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_30()) {
+    if (jj_3R_35()) {
     jj_scanpos = xsp;
-    if (jj_3R_31()) return true;
+    if (jj_3R_36()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_25() {
+  private boolean jj_3R_28() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(38)) {
+    if (jj_scan_token(39)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(39)) return true;
+    if (jj_scan_token(40)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_24() {
-    if (jj_3R_26()) return true;
+  private boolean jj_3R_27() {
+    if (jj_3R_30()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_27()) { jj_scanpos = xsp; break; }
+      if (jj_3R_31()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3_4() {
+  private boolean jj_3_5() {
     if (jj_scan_token(IDENTIFIER)) return true;
     if (jj_scan_token(COLON)) return true;
     return false;
   }
 
-  private boolean jj_3R_76() {
+  private boolean jj_3R_81() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3_4()) jj_scanpos = xsp;
+    if (jj_3_5()) jj_scanpos = xsp;
     if (jj_scan_token(IDENTIFIER)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_20() {
-    if (jj_3R_24()) return true;
+  private boolean jj_3R_23() {
+    if (jj_3R_27()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_25()) { jj_scanpos = xsp; break; }
+      if (jj_3R_28()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_21() {
+  private boolean jj_3R_24() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(40)) {
+    if (jj_scan_token(41)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(41)) return true;
+    if (jj_scan_token(42)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_18() {
-    if (jj_3R_20()) return true;
+  private boolean jj_3R_21() {
+    if (jj_3R_23()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_21()) { jj_scanpos = xsp; break; }
+      if (jj_3R_24()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_77() {
+  private boolean jj_3R_82() {
     if (jj_scan_token(IDENTIFIER)) return true;
     return false;
   }
 
-  private boolean jj_3_1() {
+  private boolean jj_3_2() {
     if (jj_scan_token(QUESTIONMARK)) return true;
-    if (jj_3R_15()) return true;
+    if (jj_3R_18()) return true;
     if (jj_scan_token(COLON)) return true;
     return false;
   }
 
-  private boolean jj_3R_15() {
-    if (jj_3R_18()) return true;
+  private boolean jj_3_1() {
+    if (jj_scan_token(ASSIGN)) return true;
+    if (jj_3R_17()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_18() {
+    if (jj_3R_21()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3_1()) { jj_scanpos = xsp; break; }
+      if (jj_3_2()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_23() {
+  private boolean jj_3R_26() {
     if (jj_scan_token(COMMA)) return true;
     return false;
   }
 
-  private boolean jj_3R_84() {
-    if (jj_3R_22()) return true;
+  private boolean jj_3R_89() {
+    if (jj_3R_25()) return true;
     return false;
   }
 
-  private boolean jj_3R_83() {
-    if (jj_3R_84()) return true;
+  private boolean jj_3R_88() {
+    if (jj_3R_89()) return true;
     return false;
   }
 
-  private boolean jj_3R_82() {
-    if (jj_3R_22()) return true;
+  private boolean jj_3R_32() {
+    if (jj_scan_token(SEMICOLON)) return true;
     return false;
   }
 
-  private boolean jj_3R_22() {
-    if (jj_3R_15()) return true;
+  private boolean jj_3R_87() {
+    if (jj_3R_25()) return true;
     return false;
   }
 
-  private boolean jj_3R_79() {
+  private boolean jj_3R_84() {
     if (jj_scan_token(START_SET_OR_MAP)) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_83()) jj_scanpos = xsp;
+    if (jj_3R_88()) jj_scanpos = xsp;
     if (jj_scan_token(RCURL)) return true;
     return false;
   }
 
-  private boolean jj_3R_19() {
-    if (jj_3R_22()) return true;
+  private boolean jj_3R_17() {
+    if (jj_3R_18()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_23()) { jj_scanpos = xsp; break; }
+      if (jj_3_1()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_78() {
+  private boolean jj_3R_83() {
     if (jj_scan_token(LBRACK)) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_82()) jj_scanpos = xsp;
+    if (jj_3R_87()) jj_scanpos = xsp;
     if (jj_scan_token(RBRACK)) return true;
     return false;
   }
 
-  private boolean jj_3R_16() {
+  private boolean jj_3R_22() {
+    if (jj_3R_25()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_26()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_29() {
+    if (jj_3R_17()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_32()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_19() {
     if (jj_scan_token(IDENTIFIER)) return true;
     if (jj_scan_token(COLON)) return true;
     return false;
   }
 
-  private boolean jj_3_2() {
+  private boolean jj_3_3() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_16()) jj_scanpos = xsp;
+    if (jj_3R_19()) jj_scanpos = xsp;
     if (jj_scan_token(IDENTIFIER)) return true;
     if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_17() {
+  private boolean jj_3R_20() {
     if (jj_scan_token(START_SET_OR_MAP)) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_19()) jj_scanpos = xsp;
+    if (jj_3R_22()) jj_scanpos = xsp;
     if (jj_scan_token(RCURL)) return true;
     return false;
   }
 
-  private boolean jj_3R_68() {
-    if (jj_3R_79()) return true;
+  private boolean jj_3R_25() {
+    if (jj_3R_29()) return true;
     return false;
   }
 
-  private boolean jj_3R_67() {
-    if (jj_3R_78()) return true;
+  private boolean jj_3R_73() {
+    if (jj_3R_84()) return true;
     return false;
   }
 
-  private boolean jj_3_3() {
-    if (jj_3R_17()) return true;
+  private boolean jj_3R_72() {
+    if (jj_3R_83()) return true;
     return false;
   }
 
-  private boolean jj_3R_66() {
-    if (jj_3R_77()) return true;
+  private boolean jj_3_4() {
+    if (jj_3R_20()) return true;
     return false;
   }
 
-  private boolean jj_3R_65() {
-    if (jj_3R_76()) return true;
+  private boolean jj_3R_71() {
+    if (jj_3R_82()) return true;
     return false;
   }
 
-  private boolean jj_3R_56() {
+  private boolean jj_3R_70() {
+    if (jj_3R_81()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_61() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_64()) {
+    if (jj_3R_69()) {
     jj_scanpos = xsp;
-    if (jj_3R_65()) {
+    if (jj_3R_70()) {
     jj_scanpos = xsp;
-    if (jj_3R_66()) {
+    if (jj_3R_71()) {
     jj_scanpos = xsp;
-    if (jj_3_3()) {
+    if (jj_3_4()) {
     jj_scanpos = xsp;
-    if (jj_3R_67()) {
+    if (jj_3R_72()) {
     jj_scanpos = xsp;
-    if (jj_3R_68()) return true;
+    if (jj_3R_73()) return true;
     }
     }
     }
@@ -2136,169 +2222,204 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_64() {
+  private boolean jj_3R_69() {
     if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_22()) return true;
+    if (jj_3R_25()) return true;
     return false;
   }
 
-  private boolean jj_3R_70() {
+  private boolean jj_3R_75() {
     if (jj_scan_token(LBRACK)) return true;
     return false;
   }
 
-  private boolean jj_3R_58() {
-    if (jj_3R_70()) return true;
+  private boolean jj_3R_63() {
+    if (jj_3R_75()) return true;
     return false;
   }
 
-  private boolean jj_3R_69() {
+  private boolean jj_3R_74() {
     if (jj_scan_token(DOT)) return true;
     return false;
   }
 
-  private boolean jj_3R_57() {
-    if (jj_3R_69()) return true;
+  private boolean jj_3R_62() {
+    if (jj_3R_74()) return true;
     return false;
   }
 
-  private boolean jj_3R_54() {
+  private boolean jj_3R_59() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_57()) {
+    if (jj_3R_62()) {
     jj_scanpos = xsp;
-    if (jj_3R_58()) return true;
+    if (jj_3R_63()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_51() {
-    if (jj_3R_54()) return true;
+  private boolean jj_3R_56() {
+    if (jj_3R_59()) return true;
     return false;
   }
 
-  private boolean jj_3R_53() {
-    if (jj_3R_56()) return true;
+  private boolean jj_3R_58() {
+    if (jj_3R_61()) return true;
     return false;
   }
 
-  private boolean jj_3R_50() {
+  private boolean jj_3R_55() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_52()) {
+    if (jj_3R_57()) {
     jj_scanpos = xsp;
-    if (jj_3R_53()) return true;
+    if (jj_3R_58()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_52() {
-    if (jj_3R_55()) return true;
+  private boolean jj_3R_57() {
+    if (jj_3R_60()) return true;
     return false;
   }
 
-  private boolean jj_3R_49() {
-    if (jj_3R_50()) return true;
+  private boolean jj_3R_54() {
+    if (jj_3R_55()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_51()) { jj_scanpos = xsp; break; }
+      if (jj_3R_56()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_45() {
-    if (jj_3R_49()) return true;
+  private boolean jj_3R_50() {
+    if (jj_3R_54()) return true;
     return false;
   }
 
-  private boolean jj_3R_44() {
+  private boolean jj_3R_49() {
     if (jj_scan_token(EMPTY)) return true;
-    if (jj_3R_38()) return true;
+    if (jj_3R_43()) return true;
     return false;
   }
 
-  private boolean jj_3R_43() {
+  private boolean jj_3R_48() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(36)) {
+    if (jj_scan_token(37)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(37)) return true;
+    if (jj_scan_token(38)) return true;
     }
-    if (jj_3R_38()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_42() {
-    if (jj_scan_token(MINUS)) return true;
-    if (jj_3R_38()) return true;
+    if (jj_3R_43()) return true;
     return false;
   }
 
-  private boolean jj_3R_38() {
+  private boolean jj_3R_43() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_42()) {
+    if (jj_3R_47()) {
     jj_scanpos = xsp;
-    if (jj_3R_43()) {
+    if (jj_3R_48()) {
     jj_scanpos = xsp;
-    if (jj_3R_44()) {
+    if (jj_3R_49()) {
     jj_scanpos = xsp;
-    if (jj_3R_45()) return true;
+    if (jj_3R_50()) return true;
     }
     }
     }
     return false;
   }
 
-  private boolean jj_3R_75() {
+  private boolean jj_3R_47() {
+    if (jj_scan_token(MINUS)) return true;
+    if (jj_3R_43()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_80() {
     if (jj_scan_token(NULL)) return true;
     return false;
   }
 
-  private boolean jj_3R_48() {
+  private boolean jj_3R_53() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(50)) {
+    if (jj_scan_token(51)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(51)) return true;
+    if (jj_scan_token(52)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_47() {
+  private boolean jj_3R_52() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(48)) {
+    if (jj_scan_token(49)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(49)) return true;
+    if (jj_scan_token(50)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_39() {
+  private boolean jj_3R_44() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_46()) {
+    if (jj_3R_51()) {
     jj_scanpos = xsp;
-    if (jj_3R_47()) {
+    if (jj_3R_52()) {
     jj_scanpos = xsp;
-    if (jj_3R_48()) return true;
+    if (jj_3R_53()) return true;
     }
     }
     return false;
   }
 
-  private boolean jj_3R_46() {
+  private boolean jj_3R_51() {
     if (jj_scan_token(MULT)) return true;
     return false;
   }
 
-  private boolean jj_3R_74() {
+  private boolean jj_3R_79() {
     if (jj_scan_token(STRING_LITERAL)) return true;
     return false;
   }
 
+  private boolean jj_3R_37() {
+    if (jj_3R_43()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_44()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_78() {
+    if (jj_scan_token(INTEGER_LITERAL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_46() {
+    if (jj_scan_token(MINUS)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_45() {
+    if (jj_scan_token(PLUS)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_38() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_45()) {
+    jj_scanpos = xsp;
+    if (jj_3R_46()) return true;
+    }
+    return false;
+  }
+
   /** Generated Token Manager. */
   public ELParserTokenManager token_source;
   SimpleCharStream jj_input_stream;
@@ -2310,7 +2431,7 @@ public class ELParser/*@bgen(jjtree)*/im
   private Token jj_scanpos, jj_lastpos;
   private int jj_la;
   private int jj_gen;
-  final private int[] jj_la1 = new int[43];
+  final private int[] jj_la1 = new int[44];
   static private int[] jj_la1_0;
   static private int[] jj_la1_1;
   static {
@@ -2318,12 +2439,12 @@ public class ELParser/*@bgen(jjtree)*/im
       jj_la1_init_1();
    }
    private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] 
{0xe,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff000000,0xc000000,0x3000000,0xc0000000,0x30000000,0xff000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x15ed00,0x120000,0x15ed00,0x120000,0x40000,0x800000,0x15ed00,0x40000,0x0,0x100100,0x800000,0x15ed00,0x800000,0x15ed00,0x800000,0x15ed00,0x800000,0x15ed00,0x1ec00,0xc000,};
+      jj_la1_0 = new int[] 
{0xe,0xe,0x800000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfe000000,0x18000000,0x6000000,0x80000000,0x60000000,0xfe000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x15ed00,0x120000,0x15ed00,0x120000,0x40000,0x1000000,0x15ed00,0x40000,0x0,0x100100,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1ec00,0xc000,};
    }
    private static void jj_la1_init_1() {
-      jj_la1_1 = new int[] 
{0x0,0x0,0x300,0x300,0xc0,0xc0,0xf,0x3,0xc,0xf,0x0,0x0,0x0,0x0,0x0,0x0,0x6000,0x6000,0xf1000,0x30000,0xc0000,0xf1000,0x30,0x104430,0x0,0x100000,0x0,0x0,0x0,0x104430,0x0,0x100000,0x0,0x0,0x104430,0x0,0x104430,0x0,0x104430,0x0,0x104430,0x0,0x0,};
+      jj_la1_1 = new int[] 
{0x0,0x0,0x0,0x600,0x600,0x180,0x180,0x1e,0x6,0x18,0x1e,0x1,0x0,0x0,0x1,0x0,0x1,0xc000,0xc000,0x1e2000,0x60000,0x180000,0x1e2000,0x60,0x408860,0x0,0x400000,0x0,0x0,0x0,0x408860,0x0,0x400000,0x0,0x0,0x408860,0x0,0x408860,0x0,0x408860,0x0,0x408860,0x0,0x0,};
    }
-  final private JJCalls[] jj_2_rtns = new JJCalls[4];
+  final private JJCalls[] jj_2_rtns = new JJCalls[5];
   private boolean jj_rescan = false;
   private int jj_gc = 0;
 
@@ -2338,7 +2459,7 @@ public class ELParser/*@bgen(jjtree)*/im
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2354,7 +2475,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2365,7 +2486,7 @@ public class ELParser/*@bgen(jjtree)*/im
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2377,7 +2498,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2387,7 +2508,7 @@ public class ELParser/*@bgen(jjtree)*/im
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2398,7 +2519,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 44; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2510,12 +2631,12 @@ public class ELParser/*@bgen(jjtree)*/im
   /** Generate ParseException. */
   public ParseException generateParseException() {
     jj_expentries.clear();
-    boolean[] la1tokens = new boolean[58];
+    boolean[] la1tokens = new boolean[60];
     if (jj_kind >= 0) {
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 43; i++) {
+    for (int i = 0; i < 44; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
@@ -2527,7 +2648,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
       }
     }
-    for (int i = 0; i < 58; i++) {
+    for (int i = 0; i < 60; i++) {
       if (la1tokens[i]) {
         jj_expentry = new int[1];
         jj_expentry[0] = i;
@@ -2554,7 +2675,7 @@ public class ELParser/*@bgen(jjtree)*/im
 
   private void jj_rescan_token() {
     jj_rescan = true;
-    for (int i = 0; i < 4; i++) {
+    for (int i = 0; i < 5; i++) {
     try {
       JJCalls p = jj_2_rtns[i];
       do {
@@ -2565,6 +2686,7 @@ public class ELParser/*@bgen(jjtree)*/im
             case 1: jj_3_2(); break;
             case 2: jj_3_3(); break;
             case 3: jj_3_4(); break;
+            case 4: jj_3_5(); break;
           }
         }
         p = p.next;

Modified: tomcat/trunk/java/org/apache/el/parser/ELParser.jjt
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/ELParser.jjt?rev=1502876&r1=1502875&r2=1502876&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/ELParser.jjt (original)
+++ tomcat/trunk/java/org/apache/el/parser/ELParser.jjt Sat Jul 13 20:40:39 2013
@@ -83,7 +83,7 @@ void DeferredExpression() #DeferredExpre
 
 /*
  * DynamicExpression
- * ${..} Expressions
+ * ${...} Expressions
  */
 void DynamicExpression() #DynamicExpression : {}
 {
@@ -96,7 +96,23 @@ void DynamicExpression() #DynamicExpress
  */
 void Expression() : {}
 {
-    Choice()
+    Semicolon()
+}
+
+/*
+ * Semicolon
+ */
+void Semicolon() : {}
+{
+    Assignment() ( <SEMICOLON> Assignment() #Semicolon(2) )*
+}
+
+/*
+ * Assignment
+ */
+void Assignment() : {}
+{
+    Choice() ( LOOKAHEAD(2) <ASSIGN> Assignment() #Assign(2) )*
 }
 
 /*
@@ -440,6 +456,7 @@ java.util.Deque<Integer> deque = new jav
 |    < LBRACK : "[" >
 |    < RBRACK : "]" >
 |    < COLON : ":" >
+|    < SEMICOLON : ";" >
 |    < COMMA : "," >
 |    < GT0 : ">" >
 |    < GT1 : "gt" >
@@ -469,6 +486,7 @@ java.util.Deque<Integer> deque = new jav
 |    < DIV1 : "div" >
 |    < MOD0 : "%" >
 |    < MOD1 : "mod" >
+|    < ASSIGN : "=" >
 |    < IDENTIFIER : (<LETTER>|<IMPL_OBJ_START>) (<LETTER>|<DIGIT>)* >
 |    < FUNCTIONSUFFIX : (<IDENTIFIER>) >
 |    < #IMPL_OBJ_START: "#" >

Modified: tomcat/trunk/java/org/apache/el/parser/ELParserConstants.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/ELParserConstants.java?rev=1502876&r1=1502875&r2=1502876&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/ELParserConstants.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/ELParserConstants.java Sat Jul 13 
20:40:39 2013
@@ -47,75 +47,79 @@ public interface ELParserConstants {
   /** RegularExpression Id. */
   int COLON = 22;
   /** RegularExpression Id. */
-  int COMMA = 23;
+  int SEMICOLON = 23;
   /** RegularExpression Id. */
-  int GT0 = 24;
+  int COMMA = 24;
   /** RegularExpression Id. */
-  int GT1 = 25;
+  int GT0 = 25;
   /** RegularExpression Id. */
-  int LT0 = 26;
+  int GT1 = 26;
   /** RegularExpression Id. */
-  int LT1 = 27;
+  int LT0 = 27;
   /** RegularExpression Id. */
-  int GE0 = 28;
+  int LT1 = 28;
   /** RegularExpression Id. */
-  int GE1 = 29;
+  int GE0 = 29;
   /** RegularExpression Id. */
-  int LE0 = 30;
+  int GE1 = 30;
   /** RegularExpression Id. */
-  int LE1 = 31;
+  int LE0 = 31;
   /** RegularExpression Id. */
-  int EQ0 = 32;
+  int LE1 = 32;
   /** RegularExpression Id. */
-  int EQ1 = 33;
+  int EQ0 = 33;
   /** RegularExpression Id. */
-  int NE0 = 34;
+  int EQ1 = 34;
   /** RegularExpression Id. */
-  int NE1 = 35;
+  int NE0 = 35;
   /** RegularExpression Id. */
-  int NOT0 = 36;
+  int NE1 = 36;
   /** RegularExpression Id. */
-  int NOT1 = 37;
+  int NOT0 = 37;
   /** RegularExpression Id. */
-  int AND0 = 38;
+  int NOT1 = 38;
   /** RegularExpression Id. */
-  int AND1 = 39;
+  int AND0 = 39;
   /** RegularExpression Id. */
-  int OR0 = 40;
+  int AND1 = 40;
   /** RegularExpression Id. */
-  int OR1 = 41;
+  int OR0 = 41;
   /** RegularExpression Id. */
-  int EMPTY = 42;
+  int OR1 = 42;
   /** RegularExpression Id. */
-  int INSTANCEOF = 43;
+  int EMPTY = 43;
   /** RegularExpression Id. */
-  int MULT = 44;
+  int INSTANCEOF = 44;
   /** RegularExpression Id. */
-  int PLUS = 45;
+  int MULT = 45;
   /** RegularExpression Id. */
-  int MINUS = 46;
+  int PLUS = 46;
   /** RegularExpression Id. */
-  int QUESTIONMARK = 47;
+  int MINUS = 47;
   /** RegularExpression Id. */
-  int DIV0 = 48;
+  int QUESTIONMARK = 48;
   /** RegularExpression Id. */
-  int DIV1 = 49;
+  int DIV0 = 49;
   /** RegularExpression Id. */
-  int MOD0 = 50;
+  int DIV1 = 50;
   /** RegularExpression Id. */
-  int MOD1 = 51;
+  int MOD0 = 51;
   /** RegularExpression Id. */
-  int IDENTIFIER = 52;
+  int MOD1 = 52;
   /** RegularExpression Id. */
-  int FUNCTIONSUFFIX = 53;
+  int ASSIGN = 53;
   /** RegularExpression Id. */
-  int IMPL_OBJ_START = 54;
+  int IDENTIFIER = 54;
   /** RegularExpression Id. */
-  int LETTER = 55;
+  int FUNCTIONSUFFIX = 55;
   /** RegularExpression Id. */
-  int DIGIT = 56;
+  int IMPL_OBJ_START = 56;
   /** RegularExpression Id. */
-  int ILLEGAL_CHARACTER = 57;
+  int LETTER = 57;
+  /** RegularExpression Id. */
+  int DIGIT = 58;
+  /** RegularExpression Id. */
+  int ILLEGAL_CHARACTER = 59;
 
   /** Lexical state. */
   int DEFAULT = 0;
@@ -149,6 +153,7 @@ public interface ELParserConstants {
     "\"[\"",
     "\"]\"",
     "\":\"",
+    "\";\"",
     "\",\"",
     "\">\"",
     "\"gt\"",
@@ -178,6 +183,7 @@ public interface ELParserConstants {
     "\"div\"",
     "\"%\"",
     "\"mod\"",
+    "\"=\"",
     "<IDENTIFIER>",
     "<FUNCTIONSUFFIX>",
     "\"#\"",



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to