You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/07/13 21:28:03 UTC

svn commit: r1502847 [1/2] - /tomcat/trunk/java/org/apache/el/parser/

Author: markt
Date: Sat Jul 13 19:28:02 2013
New Revision: 1502847

URL: http://svn.apache.org/r1502847
Log:
Add support for defining Sets, Lists and Maps 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/AstListData.java
    tomcat/trunk/java/org/apache/el/parser/AstMapData.java
    tomcat/trunk/java/org/apache/el/parser/AstMapEntry.java
    tomcat/trunk/java/org/apache/el/parser/AstSetData.java
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
    tomcat/trunk/java/org/apache/el/parser/SimpleCharStream.java
    tomcat/trunk/java/org/apache/el/parser/Token.java

Added: tomcat/trunk/java/org/apache/el/parser/AstListData.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstListData.java?rev=1502847&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstListData.java (added)
+++ tomcat/trunk/java/org/apache/el/parser/AstListData.java Sat Jul 13 19:28:02 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. AstListData.java Version 4.3 */
+package org.apache.el.parser;
+
+public
+class AstListData extends SimpleNode {
+  public AstListData(int id) {
+    super(id);
+  }
+}
+/* JavaCC - OriginalChecksum=7f2694086a9ba64558ee39d1cd719db1 (do not edit this line) */

Added: tomcat/trunk/java/org/apache/el/parser/AstMapData.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstMapData.java?rev=1502847&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstMapData.java (added)
+++ tomcat/trunk/java/org/apache/el/parser/AstMapData.java Sat Jul 13 19:28:02 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. AstMapData.java Version 4.3 */
+package org.apache.el.parser;
+
+public
+class AstMapData extends SimpleNode {
+  public AstMapData(int id) {
+    super(id);
+  }
+}
+/* JavaCC - OriginalChecksum=a68b5c6f0a0708f478fdf8c0e6e1263e (do not edit this line) */

Added: tomcat/trunk/java/org/apache/el/parser/AstMapEntry.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstMapEntry.java?rev=1502847&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstMapEntry.java (added)
+++ tomcat/trunk/java/org/apache/el/parser/AstMapEntry.java Sat Jul 13 19:28:02 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. AstMapEntry.java Version 4.3 */
+package org.apache.el.parser;
+
+public
+class AstMapEntry extends SimpleNode {
+  public AstMapEntry(int id) {
+    super(id);
+  }
+}
+/* JavaCC - OriginalChecksum=6a7910e58a583371769800554113a8d3 (do not edit this line) */

Added: tomcat/trunk/java/org/apache/el/parser/AstSetData.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstSetData.java?rev=1502847&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/AstSetData.java (added)
+++ tomcat/trunk/java/org/apache/el/parser/AstSetData.java Sat Jul 13 19:28:02 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. AstSetData.java Version 4.3 */
+package org.apache.el.parser;
+
+public
+class AstSetData extends SimpleNode {
+  public AstSetData(int id) {
+    super(id);
+  }
+}
+/* JavaCC - OriginalChecksum=e1dc4e2011eee313491decfa9e0152fe (do not edit this line) */

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=1502847&r1=1502846&r2=1502847&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/ELParser.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/ELParser.java Sat Jul 13 19:28:02 2013
@@ -1,13 +1,11 @@
 /* Generated By:JJTree&JavaCC: Do not edit this line. ELParser.java */
 package org.apache.el.parser;
 import java.io.StringReader;
-
 import javax.el.ELException;
-
 @SuppressWarnings("all") // Ignore warnings in generated code
 public class ELParser/*@bgen(jjtree)*/implements ELParserTreeConstants, ELParserConstants {/*@bgen(jjtree)*/
-  protected JJTELParserState jjtree = new JJTELParserState();public static Node parse(String ref) throws ELException
-    {
+  protected JJTELParserState jjtree = new JJTELParserState();
+    public static Node parse(String ref) throws ELException {
         try {
             return (new ELParser(new StringReader(ref))).CompositeExpression();
         } catch (ParseException pe) {
@@ -55,9 +53,9 @@ public class ELParser/*@bgen(jjtree)*/im
         }
       }
       jj_consume_token(0);
-                                                                                jjtree.closeNodeScope(jjtn000, true);
-                                                                                jjtc000 = false;
-                                                                                {if (true) return jjtn000;}
+                                   jjtree.closeNodeScope(jjtn000, true);
+                                   jjtc000 = false;
+                                   {if (true) return jjtn000;}
     } catch (Throwable jjte000) {
       if (jjtc000) {
         jjtree.clearNodeScope(jjtn000);
@@ -103,7 +101,7 @@ public class ELParser/*@bgen(jjtree)*/im
 
 /*
  * DeferredExpression
- * #{..} Expressions
+ * #{...} Expressions
  */
   final public void DeferredExpression() throws ParseException {
                                                  /*@bgen(jjtree) DeferredExpression */
@@ -113,7 +111,7 @@ public class ELParser/*@bgen(jjtree)*/im
     try {
       jj_consume_token(START_DEFERRED_EXPRESSION);
       Expression();
-      jj_consume_token(END_EXPRESSION);
+      jj_consume_token(RCURL);
     } catch (Throwable jjte000) {
       if (jjtc000) {
         jjtree.clearNodeScope(jjtn000);
@@ -147,7 +145,7 @@ public class ELParser/*@bgen(jjtree)*/im
     try {
       jj_consume_token(START_DYNAMIC_EXPRESSION);
       Expression();
-      jj_consume_token(END_EXPRESSION);
+      jj_consume_token(RCURL);
     } catch (Throwable jjte000) {
       if (jjtc000) {
         jjtree.clearNodeScope(jjtn000);
@@ -939,6 +937,7 @@ public class ELParser/*@bgen(jjtree)*/im
                   }
       }
       break;
+    case START_SET_OR_MAP:
     case INTEGER_LITERAL:
     case FLOATING_POINT_LITERAL:
     case STRING_LITERAL:
@@ -946,6 +945,7 @@ public class ELParser/*@bgen(jjtree)*/im
     case FALSE:
     case NULL:
     case LPAREN:
+    case LBRACK:
     case IDENTIFIER:
       Value();
       break;
@@ -1014,7 +1014,9 @@ public class ELParser/*@bgen(jjtree)*/im
     case NULL:
       Literal();
       break;
+    case START_SET_OR_MAP:
     case LPAREN:
+    case LBRACK:
     case IDENTIFIER:
       NonLiteral();
       break;
@@ -1119,6 +1121,7 @@ public class ELParser/*@bgen(jjtree)*/im
     try {
       jj_consume_token(LPAREN);
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case START_SET_OR_MAP:
       case INTEGER_LITERAL:
       case FLOATING_POINT_LITERAL:
       case STRING_LITERAL:
@@ -1126,6 +1129,7 @@ public class ELParser/*@bgen(jjtree)*/im
       case FALSE:
       case NULL:
       case LPAREN:
+      case LBRACK:
       case NOT0:
       case NOT1:
       case EMPTY:
@@ -1194,9 +1198,242 @@ public class ELParser/*@bgen(jjtree)*/im
           break;
         default:
           jj_la1[31] = jj_gen;
-          jj_consume_token(-1);
-          throw new ParseException();
+          if (jj_2_3(3)) {
+            SetData();
+          } else {
+            switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+            case LBRACK:
+              ListData();
+              break;
+            case START_SET_OR_MAP:
+              MapData();
+              break;
+            default:
+              jj_la1[32] = jj_gen;
+              jj_consume_token(-1);
+              throw new ParseException();
+            }
+          }
+        }
+      }
+    }
+  }
+
+  final public void SetData() throws ParseException {
+                          /*@bgen(jjtree) SetData */
+  AstSetData jjtn000 = new AstSetData(JJTSETDATA);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+      jj_consume_token(START_SET_OR_MAP);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case START_SET_OR_MAP:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case TRUE:
+      case FALSE:
+      case NULL:
+      case LPAREN:
+      case LBRACK:
+      case NOT0:
+      case NOT1:
+      case EMPTY:
+      case MINUS:
+      case IDENTIFIER:
+        Expression();
+        label_11:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case COMMA:
+            ;
+            break;
+          default:
+            jj_la1[33] = jj_gen;
+            break label_11;
+          }
+          jj_consume_token(COMMA);
+          Expression();
+        }
+        break;
+      default:
+        jj_la1[34] = jj_gen;
+        ;
+      }
+      jj_consume_token(RCURL);
+    } catch (Throwable jjte000) {
+      if (jjtc000) {
+        jjtree.clearNodeScope(jjtn000);
+        jjtc000 = false;
+      } else {
+        jjtree.popNode();
+      }
+      if (jjte000 instanceof RuntimeException) {
+        {if (true) throw (RuntimeException)jjte000;}
+      }
+      if (jjte000 instanceof ParseException) {
+        {if (true) throw (ParseException)jjte000;}
+      }
+      {if (true) throw (Error)jjte000;}
+    } finally {
+      if (jjtc000) {
+        jjtree.closeNodeScope(jjtn000, true);
+      }
+    }
+  }
+
+  final public void ListData() throws ParseException {
+                            /*@bgen(jjtree) ListData */
+  AstListData jjtn000 = new AstListData(JJTLISTDATA);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+      jj_consume_token(LBRACK);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case START_SET_OR_MAP:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case TRUE:
+      case FALSE:
+      case NULL:
+      case LPAREN:
+      case LBRACK:
+      case NOT0:
+      case NOT1:
+      case EMPTY:
+      case MINUS:
+      case IDENTIFIER:
+        Expression();
+        label_12:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case COMMA:
+            ;
+            break;
+          default:
+            jj_la1[35] = jj_gen;
+            break label_12;
+          }
+          jj_consume_token(COMMA);
+          Expression();
+        }
+        break;
+      default:
+        jj_la1[36] = jj_gen;
+        ;
+      }
+      jj_consume_token(RBRACK);
+    } catch (Throwable jjte000) {
+      if (jjtc000) {
+        jjtree.clearNodeScope(jjtn000);
+        jjtc000 = false;
+      } else {
+        jjtree.popNode();
+      }
+      if (jjte000 instanceof RuntimeException) {
+        {if (true) throw (RuntimeException)jjte000;}
+      }
+      if (jjte000 instanceof ParseException) {
+        {if (true) throw (ParseException)jjte000;}
+      }
+      {if (true) throw (Error)jjte000;}
+    } finally {
+      if (jjtc000) {
+        jjtree.closeNodeScope(jjtn000, true);
+      }
+    }
+  }
+
+  final public void MapData() throws ParseException {
+                          /*@bgen(jjtree) MapData */
+  AstMapData jjtn000 = new AstMapData(JJTMAPDATA);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+      jj_consume_token(START_SET_OR_MAP);
+      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case START_SET_OR_MAP:
+      case INTEGER_LITERAL:
+      case FLOATING_POINT_LITERAL:
+      case STRING_LITERAL:
+      case TRUE:
+      case FALSE:
+      case NULL:
+      case LPAREN:
+      case LBRACK:
+      case NOT0:
+      case NOT1:
+      case EMPTY:
+      case MINUS:
+      case IDENTIFIER:
+        MapEntry();
+        label_13:
+        while (true) {
+          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+          case COMMA:
+            ;
+            break;
+          default:
+            jj_la1[37] = jj_gen;
+            break label_13;
+          }
+          jj_consume_token(COMMA);
+          MapEntry();
         }
+        break;
+      default:
+        jj_la1[38] = jj_gen;
+        ;
+      }
+      jj_consume_token(RCURL);
+    } catch (Throwable jjte000) {
+      if (jjtc000) {
+        jjtree.clearNodeScope(jjtn000);
+        jjtc000 = false;
+      } else {
+        jjtree.popNode();
+      }
+      if (jjte000 instanceof RuntimeException) {
+        {if (true) throw (RuntimeException)jjte000;}
+      }
+      if (jjte000 instanceof ParseException) {
+        {if (true) throw (ParseException)jjte000;}
+      }
+      {if (true) throw (Error)jjte000;}
+    } finally {
+      if (jjtc000) {
+        jjtree.closeNodeScope(jjtn000, true);
+      }
+    }
+  }
+
+  final public void MapEntry() throws ParseException {
+                            /*@bgen(jjtree) MapEntry */
+  AstMapEntry jjtn000 = new AstMapEntry(JJTMAPENTRY);
+  boolean jjtc000 = true;
+  jjtree.openNodeScope(jjtn000);
+    try {
+      Expression();
+      jj_consume_token(COLON);
+      Expression();
+    } catch (Throwable jjte000) {
+      if (jjtc000) {
+        jjtree.clearNodeScope(jjtn000);
+        jjtc000 = false;
+      } else {
+        jjtree.popNode();
+      }
+      if (jjte000 instanceof RuntimeException) {
+        {if (true) throw (RuntimeException)jjte000;}
+      }
+      if (jjte000 instanceof ParseException) {
+        {if (true) throw (ParseException)jjte000;}
+      }
+      {if (true) throw (Error)jjte000;}
+    } finally {
+      if (jjtc000) {
+        jjtree.closeNodeScope(jjtn000, true);
       }
     }
   }
@@ -1233,7 +1470,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jjtree.openNodeScope(jjtn000);Token t0 = null;
     Token t1 = null;
     try {
-      if (jj_2_3(2)) {
+      if (jj_2_4(2)) {
         t0 = jj_consume_token(IDENTIFIER);
         jj_consume_token(COLON);
       } else {
@@ -1248,6 +1485,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
       jj_consume_token(LPAREN);
       switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+      case START_SET_OR_MAP:
       case INTEGER_LITERAL:
       case FLOATING_POINT_LITERAL:
       case STRING_LITERAL:
@@ -1255,28 +1493,29 @@ public class ELParser/*@bgen(jjtree)*/im
       case FALSE:
       case NULL:
       case LPAREN:
+      case LBRACK:
       case NOT0:
       case NOT1:
       case EMPTY:
       case MINUS:
       case IDENTIFIER:
         Expression();
-        label_11:
+        label_14:
         while (true) {
           switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
           case COMMA:
             ;
             break;
           default:
-            jj_la1[32] = jj_gen;
-            break label_11;
+            jj_la1[39] = jj_gen;
+            break label_14;
           }
           jj_consume_token(COMMA);
           Expression();
         }
         break;
       default:
-        jj_la1[33] = jj_gen;
+        jj_la1[40] = jj_gen;
         ;
       }
       jj_consume_token(RPAREN);
@@ -1324,7 +1563,7 @@ public class ELParser/*@bgen(jjtree)*/im
       Null();
       break;
     default:
-      jj_la1[34] = jj_gen;
+      jj_la1[41] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1361,7 +1600,7 @@ public class ELParser/*@bgen(jjtree)*/im
       }
       break;
     default:
-      jj_la1[35] = jj_gen;
+      jj_la1[42] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -1469,363 +1708,427 @@ public class ELParser/*@bgen(jjtree)*/im
     finally { jj_save(2, xla); }
   }
 
-  private boolean jj_3R_13() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
-    return false;
-  }
-
-  private boolean jj_3_2() {
-    Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_13()) jj_scanpos = xsp;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_69() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    return false;
+  private boolean jj_2_4(int xla) {
+    jj_la = xla; jj_lastpos = jj_scanpos = token;
+    try { return !jj_3_4(); }
+    catch(LookaheadSuccess ls) { return true; }
+    finally { jj_save(3, xla); }
   }
 
-  private boolean jj_3R_25() {
-    if (jj_3R_31()) return true;
+  private boolean jj_3R_32() {
+    if (jj_3R_38()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_32()) { jj_scanpos = xsp; break; }
+      if (jj_3R_39()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_59() {
-    if (jj_3R_69()) return true;
+  private boolean jj_3R_73() {
+    if (jj_scan_token(INTEGER_LITERAL)) return true;
     return false;
   }
 
-  private boolean jj_3R_34() {
+  private boolean jj_3R_41() {
     if (jj_scan_token(MINUS)) return true;
     return false;
   }
 
-  private boolean jj_3R_58() {
-    if (jj_3R_68()) return true;
+  private boolean jj_3R_40() {
+    if (jj_scan_token(PLUS)) return true;
     return false;
   }
 
-  private boolean jj_3R_26() {
+  private boolean jj_3R_33() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_33()) {
+    if (jj_3R_40()) {
     jj_scanpos = xsp;
-    if (jj_3R_34()) return true;
+    if (jj_3R_41()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_33() {
-    if (jj_scan_token(PLUS)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_57() {
-    if (jj_scan_token(LPAREN)) return true;
-    if (jj_3R_67()) return true;
+  private boolean jj_3R_72() {
+    if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
     return false;
   }
 
-  private boolean jj_3R_49() {
+  private boolean jj_3R_28() {
+    if (jj_3R_32()) return true;
     Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_57()) {
-    jj_scanpos = xsp;
-    if (jj_3R_58()) {
-    jj_scanpos = xsp;
-    if (jj_3R_59()) return true;
-    }
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_33()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_66() {
-    if (jj_scan_token(NULL)) return true;
+  private boolean jj_3R_81() {
+    if (jj_scan_token(FALSE)) return true;
     return false;
   }
 
-  private boolean jj_3R_21() {
-    if (jj_3R_25()) return true;
+  private boolean jj_3R_37() {
     Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_26()) { jj_scanpos = xsp; break; }
+    xsp = jj_scanpos;
+    if (jj_scan_token(28)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(29)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_30() {
+  private boolean jj_3R_36() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(27)) {
+    if (jj_scan_token(30)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(28)) return true;
+    if (jj_scan_token(31)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_65() {
-    if (jj_scan_token(STRING_LITERAL)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_29() {
+  private boolean jj_3R_71() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(29)) {
+    if (jj_3R_80()) {
     jj_scanpos = xsp;
-    if (jj_scan_token(30)) return true;
+    if (jj_3R_81()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_28() {
+  private boolean jj_3R_80() {
+    if (jj_scan_token(TRUE)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_35() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(23)) {
+    if (jj_scan_token(24)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(24)) return true;
+    if (jj_scan_token(25)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_22() {
+  private boolean jj_3R_34() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_27()) {
-    jj_scanpos = xsp;
-    if (jj_3R_28()) {
-    jj_scanpos = xsp;
-    if (jj_3R_29()) {
+    if (jj_scan_token(26)) {
     jj_scanpos = xsp;
-    if (jj_3R_30()) return true;
-    }
-    }
+    if (jj_scan_token(27)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_27() {
+  private boolean jj_3R_29() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(25)) {
+    if (jj_3R_34()) {
+    jj_scanpos = xsp;
+    if (jj_3R_35()) {
+    jj_scanpos = xsp;
+    if (jj_3R_36()) {
     jj_scanpos = xsp;
-    if (jj_scan_token(26)) return true;
+    if (jj_3R_37()) return true;
+    }
+    }
     }
     return false;
   }
 
-  private boolean jj_3R_61() {
-    if (jj_scan_token(LBRACK)) return true;
+  private boolean jj_3R_63() {
+    if (jj_3R_75()) return true;
     return false;
   }
 
-  private boolean jj_3R_51() {
-    if (jj_3R_61()) return true;
+  private boolean jj_3R_62() {
+    if (jj_3R_74()) return true;
     return false;
   }
 
-  private boolean jj_3R_64() {
-    if (jj_scan_token(INTEGER_LITERAL)) return true;
+  private boolean jj_3R_61() {
+    if (jj_3R_73()) return true;
     return false;
   }
 
-  private boolean jj_3R_19() {
-    if (jj_3R_21()) return true;
+  private boolean jj_3R_26() {
+    if (jj_3R_28()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_22()) { jj_scanpos = xsp; break; }
+      if (jj_3R_29()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
   private boolean jj_3R_60() {
-    if (jj_scan_token(DOT)) return true;
+    if (jj_3R_72()) return true;
     return false;
   }
 
-  private boolean jj_3R_24() {
+  private boolean jj_3R_55() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(33)) {
+    if (jj_3R_59()) {
+    jj_scanpos = xsp;
+    if (jj_3R_60()) {
     jj_scanpos = xsp;
-    if (jj_scan_token(34)) return true;
+    if (jj_3R_61()) {
+    jj_scanpos = xsp;
+    if (jj_3R_62()) {
+    jj_scanpos = xsp;
+    if (jj_3R_63()) return true;
+    }
+    }
+    }
     }
     return false;
   }
 
-  private boolean jj_3R_63() {
-    if (jj_scan_token(FLOATING_POINT_LITERAL)) return true;
+  private boolean jj_3R_59() {
+    if (jj_3R_71()) return true;
     return false;
   }
 
-  private boolean jj_3R_23() {
+  private boolean jj_3R_31() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(31)) {
+    if (jj_scan_token(34)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(32)) return true;
+    if (jj_scan_token(35)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_20() {
+  private boolean jj_3R_30() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_23()) {
+    if (jj_scan_token(32)) {
     jj_scanpos = xsp;
-    if (jj_3R_24()) return true;
+    if (jj_scan_token(33)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_50() {
-    if (jj_3R_60()) return true;
-    return false;
-  }
-
-  private boolean jj_3R_18() {
+  private boolean jj_3R_27() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(37)) {
+    if (jj_3R_30()) {
     jj_scanpos = xsp;
-    if (jj_scan_token(38)) return true;
+    if (jj_3R_31()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_47() {
+  private boolean jj_3R_25() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_50()) {
+    if (jj_scan_token(38)) {
     jj_scanpos = xsp;
-    if (jj_3R_51()) return true;
+    if (jj_scan_token(39)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_71() {
-    if (jj_scan_token(FALSE)) return true;
-    return false;
-  }
-
-  private boolean jj_3R_17() {
-    if (jj_3R_19()) return true;
+  private boolean jj_3R_24() {
+    if (jj_3R_26()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_20()) { jj_scanpos = xsp; break; }
+      if (jj_3R_27()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_44() {
-    if (jj_3R_47()) return true;
+  private boolean jj_3_4() {
+    if (jj_scan_token(IDENTIFIER)) return true;
+    if (jj_scan_token(COLON)) return true;
     return false;
   }
 
-  private boolean jj_3R_70() {
-    if (jj_scan_token(TRUE)) return true;
+  private boolean jj_3R_76() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3_4()) jj_scanpos = xsp;
+    if (jj_scan_token(IDENTIFIER)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_62() {
+  private boolean jj_3R_20() {
+    if (jj_3R_24()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_25()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_21() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_70()) {
+    if (jj_scan_token(40)) {
     jj_scanpos = xsp;
-    if (jj_3R_71()) return true;
+    if (jj_scan_token(41)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_46() {
-    if (jj_3R_49()) return true;
+  private boolean jj_3R_18() {
+    if (jj_3R_20()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_21()) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
-  private boolean jj_3R_45() {
-    if (jj_3R_48()) return true;
+  private boolean jj_3R_77() {
+    if (jj_scan_token(IDENTIFIER)) return true;
+    return false;
+  }
+
+  private boolean jj_3_1() {
+    if (jj_scan_token(QUESTIONMARK)) return true;
+    if (jj_3R_15()) return true;
+    if (jj_scan_token(COLON)) return true;
     return false;
   }
 
   private boolean jj_3R_15() {
-    if (jj_3R_17()) return true;
+    if (jj_3R_18()) return true;
     Token xsp;
     while (true) {
       xsp = jj_scanpos;
-      if (jj_3R_18()) { jj_scanpos = xsp; break; }
+      if (jj_3_1()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_43() {
+  private boolean jj_3R_23() {
+    if (jj_scan_token(COMMA)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_84() {
+    if (jj_3R_22()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_83() {
+    if (jj_3R_84()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_82() {
+    if (jj_3R_22()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_22() {
+    if (jj_3R_15()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_79() {
+    if (jj_scan_token(START_SET_OR_MAP)) return true;
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_45()) {
-    jj_scanpos = xsp;
-    if (jj_3R_46()) return true;
+    if (jj_3R_83()) jj_scanpos = xsp;
+    if (jj_scan_token(RCURL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_19() {
+    if (jj_3R_22()) return true;
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_23()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_56() {
-    if (jj_3R_66()) return true;
+  private boolean jj_3R_78() {
+    if (jj_scan_token(LBRACK)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_82()) jj_scanpos = xsp;
+    if (jj_scan_token(RBRACK)) return true;
     return false;
   }
 
   private boolean jj_3R_16() {
+    if (jj_scan_token(IDENTIFIER)) return true;
+    if (jj_scan_token(COLON)) return true;
+    return false;
+  }
+
+  private boolean jj_3_2() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(39)) {
-    jj_scanpos = xsp;
-    if (jj_scan_token(40)) return true;
-    }
+    if (jj_3R_16()) jj_scanpos = xsp;
+    if (jj_scan_token(IDENTIFIER)) return true;
+    if (jj_scan_token(LPAREN)) return true;
     return false;
   }
 
-  private boolean jj_3R_55() {
-    if (jj_3R_65()) return true;
+  private boolean jj_3R_17() {
+    if (jj_scan_token(START_SET_OR_MAP)) return true;
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_19()) jj_scanpos = xsp;
+    if (jj_scan_token(RCURL)) return true;
     return false;
   }
 
-  private boolean jj_3R_54() {
-    if (jj_3R_64()) return true;
+  private boolean jj_3R_68() {
+    if (jj_3R_79()) return true;
     return false;
   }
 
-  private boolean jj_3R_53() {
-    if (jj_3R_63()) return true;
+  private boolean jj_3R_67() {
+    if (jj_3R_78()) return true;
     return false;
   }
 
-  private boolean jj_3R_52() {
-    if (jj_3R_62()) return true;
+  private boolean jj_3_3() {
+    if (jj_3R_17()) return true;
     return false;
   }
 
-  private boolean jj_3R_48() {
+  private boolean jj_3R_66() {
+    if (jj_3R_77()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_65() {
+    if (jj_3R_76()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_56() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_52()) {
+    if (jj_3R_64()) {
     jj_scanpos = xsp;
-    if (jj_3R_53()) {
+    if (jj_3R_65()) {
     jj_scanpos = xsp;
-    if (jj_3R_54()) {
+    if (jj_3R_66()) {
     jj_scanpos = xsp;
-    if (jj_3R_55()) {
+    if (jj_3_3()) {
     jj_scanpos = xsp;
-    if (jj_3R_56()) return true;
+    if (jj_3R_67()) {
+    jj_scanpos = xsp;
+    if (jj_3R_68()) return true;
+    }
     }
     }
     }
@@ -1833,145 +2136,169 @@ public class ELParser/*@bgen(jjtree)*/im
     return false;
   }
 
-  private boolean jj_3R_14() {
-    if (jj_3R_15()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_16()) { jj_scanpos = xsp; break; }
-    }
+  private boolean jj_3R_64() {
+    if (jj_scan_token(LPAREN)) return true;
+    if (jj_3R_22()) return true;
     return false;
   }
 
-  private boolean jj_3R_42() {
-    if (jj_3R_43()) return true;
-    Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3R_44()) { jj_scanpos = xsp; break; }
-    }
+  private boolean jj_3R_70() {
+    if (jj_scan_token(LBRACK)) return true;
     return false;
   }
 
-  private boolean jj_3_1() {
-    if (jj_scan_token(QUESTIONMARK)) return true;
-    if (jj_3R_12()) return true;
-    if (jj_scan_token(COLON)) return true;
+  private boolean jj_3R_58() {
+    if (jj_3R_70()) return true;
     return false;
   }
 
-  private boolean jj_3R_38() {
-    if (jj_3R_42()) return true;
+  private boolean jj_3R_69() {
+    if (jj_scan_token(DOT)) return true;
     return false;
   }
 
-  private boolean jj_3R_37() {
-    if (jj_scan_token(EMPTY)) return true;
-    if (jj_3R_31()) return true;
+  private boolean jj_3R_57() {
+    if (jj_3R_69()) return true;
     return false;
   }
 
-  private boolean jj_3R_12() {
-    if (jj_3R_14()) return true;
+  private boolean jj_3R_54() {
     Token xsp;
-    while (true) {
-      xsp = jj_scanpos;
-      if (jj_3_1()) { jj_scanpos = xsp; break; }
+    xsp = jj_scanpos;
+    if (jj_3R_57()) {
+    jj_scanpos = xsp;
+    if (jj_3R_58()) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_36() {
+  private boolean jj_3R_51() {
+    if (jj_3R_54()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_53() {
+    if (jj_3R_56()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_50() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(35)) {
+    if (jj_3R_52()) {
     jj_scanpos = xsp;
-    if (jj_scan_token(36)) return true;
+    if (jj_3R_53()) return true;
     }
-    if (jj_3R_31()) return true;
     return false;
   }
 
-  private boolean jj_3R_31() {
+  private boolean jj_3R_52() {
+    if (jj_3R_55()) return true;
+    return false;
+  }
+
+  private boolean jj_3R_49() {
+    if (jj_3R_50()) return true;
     Token xsp;
-    xsp = jj_scanpos;
-    if (jj_3R_35()) {
-    jj_scanpos = xsp;
-    if (jj_3R_36()) {
-    jj_scanpos = xsp;
-    if (jj_3R_37()) {
-    jj_scanpos = xsp;
-    if (jj_3R_38()) return true;
-    }
-    }
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_51()) { jj_scanpos = xsp; break; }
     }
     return false;
   }
 
-  private boolean jj_3R_35() {
-    if (jj_scan_token(MINUS)) return true;
-    if (jj_3R_31()) return true;
+  private boolean jj_3R_45() {
+    if (jj_3R_49()) return true;
     return false;
   }
 
-  private boolean jj_3_3() {
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(COLON)) return true;
+  private boolean jj_3R_44() {
+    if (jj_scan_token(EMPTY)) return true;
+    if (jj_3R_38()) return true;
     return false;
   }
 
-  private boolean jj_3R_68() {
+  private boolean jj_3R_43() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3_3()) jj_scanpos = xsp;
-    if (jj_scan_token(IDENTIFIER)) return true;
-    if (jj_scan_token(LPAREN)) return true;
+    if (jj_scan_token(36)) {
+    jj_scanpos = xsp;
+    if (jj_scan_token(37)) return true;
+    }
+    if (jj_3R_38()) return true;
     return false;
   }
 
-  private boolean jj_3R_67() {
-    if (jj_3R_12()) return true;
+  private boolean jj_3R_42() {
+    if (jj_scan_token(MINUS)) return true;
+    if (jj_3R_38()) return true;
     return false;
   }
 
-  private boolean jj_3R_41() {
+  private boolean jj_3R_38() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(49)) {
+    if (jj_3R_42()) {
+    jj_scanpos = xsp;
+    if (jj_3R_43()) {
+    jj_scanpos = xsp;
+    if (jj_3R_44()) {
     jj_scanpos = xsp;
-    if (jj_scan_token(50)) return true;
+    if (jj_3R_45()) return true;
+    }
+    }
     }
     return false;
   }
 
-  private boolean jj_3R_40() {
+  private boolean jj_3R_75() {
+    if (jj_scan_token(NULL)) return true;
+    return false;
+  }
+
+  private boolean jj_3R_48() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_scan_token(47)) {
+    if (jj_scan_token(50)) {
     jj_scanpos = xsp;
-    if (jj_scan_token(48)) return true;
+    if (jj_scan_token(51)) return true;
     }
     return false;
   }
 
-  private boolean jj_3R_32() {
+  private boolean jj_3R_47() {
     Token xsp;
     xsp = jj_scanpos;
-    if (jj_3R_39()) {
+    if (jj_scan_token(48)) {
     jj_scanpos = xsp;
-    if (jj_3R_40()) {
+    if (jj_scan_token(49)) return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_39() {
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_46()) {
     jj_scanpos = xsp;
-    if (jj_3R_41()) return true;
+    if (jj_3R_47()) {
+    jj_scanpos = xsp;
+    if (jj_3R_48()) return true;
     }
     }
     return false;
   }
 
-  private boolean jj_3R_39() {
+  private boolean jj_3R_46() {
     if (jj_scan_token(MULT)) return true;
     return false;
   }
 
+  private boolean jj_3R_74() {
+    if (jj_scan_token(STRING_LITERAL)) return true;
+    return false;
+  }
+
   /** Generated Token Manager. */
   public ELParserTokenManager token_source;
   SimpleCharStream jj_input_stream;
@@ -1983,7 +2310,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[36];
+  final private int[] jj_la1 = new int[43];
   static private int[] jj_la1_0;
   static private int[] jj_la1_1;
   static {
@@ -1991,12 +2318,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,0x80000000,0x80000000,0x0,0x80000000,0x7f800000,0x6000000,0x1800000,0x60000000,0x18000000,0x7f800000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x27b00,0x90000,0x27b00,0x90000,0x20000,0x400000,0x27b00,0x20000,0x0,0x400000,0x27b00,0x7b00,0x3000,};
+      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,};
    }
    private static void jj_la1_init_1() {
-      jj_la1_1 = new int[] {0x0,0x0,0x180,0x180,0x60,0x60,0x7,0x1,0x6,0x7,0x0,0x0,0x0,0x0,0x0,0x0,0x3000,0x3000,0x78800,0x18000,0x60000,0x78800,0x18,0x82218,0x0,0x80000,0x0,0x0,0x0,0x82218,0x0,0x80000,0x0,0x82218,0x0,0x0,};
+      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,};
    }
-  final private JJCalls[] jj_2_rtns = new JJCalls[3];
+  final private JJCalls[] jj_2_rtns = new JJCalls[4];
   private boolean jj_rescan = false;
   private int jj_gc = 0;
 
@@ -2011,7 +2338,7 @@ public class ELParser/*@bgen(jjtree)*/im
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2027,7 +2354,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2038,7 +2365,7 @@ public class ELParser/*@bgen(jjtree)*/im
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2050,7 +2377,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2060,7 +2387,7 @@ public class ELParser/*@bgen(jjtree)*/im
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2071,7 +2398,7 @@ public class ELParser/*@bgen(jjtree)*/im
     jj_ntk = -1;
     jjtree.reset();
     jj_gen = 0;
-    for (int i = 0; i < 36; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 43; i++) jj_la1[i] = -1;
     for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
   }
 
@@ -2183,12 +2510,12 @@ public class ELParser/*@bgen(jjtree)*/im
   /** Generate ParseException. */
   public ParseException generateParseException() {
     jj_expentries.clear();
-    boolean[] la1tokens = new boolean[57];
+    boolean[] la1tokens = new boolean[58];
     if (jj_kind >= 0) {
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 36; i++) {
+    for (int i = 0; i < 43; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
@@ -2200,7 +2527,7 @@ public class ELParser/*@bgen(jjtree)*/im
         }
       }
     }
-    for (int i = 0; i < 57; i++) {
+    for (int i = 0; i < 58; i++) {
       if (la1tokens[i]) {
         jj_expentry = new int[1];
         jj_expentry[0] = i;
@@ -2227,7 +2554,7 @@ public class ELParser/*@bgen(jjtree)*/im
 
   private void jj_rescan_token() {
     jj_rescan = true;
-    for (int i = 0; i < 3; i++) {
+    for (int i = 0; i < 4; i++) {
     try {
       JJCalls p = jj_2_rtns[i];
       do {
@@ -2237,6 +2564,7 @@ public class ELParser/*@bgen(jjtree)*/im
             case 0: jj_3_1(); break;
             case 1: jj_3_2(); break;
             case 2: jj_3_3(); break;
+            case 3: jj_3_4(); 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=1502847&r1=1502846&r2=1502847&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/ELParser.jjt (original)
+++ tomcat/trunk/java/org/apache/el/parser/ELParser.jjt Sat Jul 13 19:28:02 2013
@@ -78,7 +78,7 @@ void LiteralExpression() #LiteralExpress
  */
 void DeferredExpression() #DeferredExpression : {}
 {
-    <START_DEFERRED_EXPRESSION> Expression() <END_EXPRESSION>
+    <START_DEFERRED_EXPRESSION> Expression() <RCURL>
 }
 
 /*
@@ -87,7 +87,7 @@ void DeferredExpression() #DeferredExpre
  */
 void DynamicExpression() #DynamicExpression : {}
 {
-    <START_DYNAMIC_EXPRESSION> Expression() <END_EXPRESSION>
+    <START_DYNAMIC_EXPRESSION> Expression() <RCURL>
 }
 
 /*
@@ -266,6 +266,35 @@ void NonLiteral() : {}
     <LPAREN> Expression() <RPAREN>
     | LOOKAHEAD((<IDENTIFIER> <COLON>)? <IDENTIFIER> <LPAREN>) Function()
     | Identifier()
+    | LOOKAHEAD(3)SetData()
+    | ListData()
+    | MapData()
+}
+
+void SetData() #SetData: {}
+{
+    <START_SET_OR_MAP>
+        ( Expression() ( <COMMA> Expression() )* )?
+    <RCURL>
+}
+
+void ListData() #ListData: {}
+{
+    <LBRACK>
+        ( Expression() ( <COMMA> Expression() )* )?
+    <RBRACK>
+}
+
+void MapData() #MapData: {}
+{
+    <START_SET_OR_MAP>
+        ( MapEntry() ( <COMMA> MapEntry() )* )?
+    <RCURL>
+}
+
+void MapEntry() #MapEntry: {}
+{
+    Expression() <COLON> Expression()
 }
 
 /*
@@ -360,6 +389,10 @@ void Null() #Null : {}
 
 
 /* ========================================================================== */
+TOKEN_MGR_DECLS:
+{
+java.util.Deque<Integer> deque = new java.util.ArrayDeque<Integer>();
+}
 <DEFAULT> TOKEN :
 {
   /*
@@ -376,16 +409,18 @@ void Null() #Null : {}
     | "#"
   >
 |
-  < START_DYNAMIC_EXPRESSION: "${" > : IN_EXPRESSION
+  < START_DYNAMIC_EXPRESSION: "${" > {deque.push(DEFAULT);}: IN_EXPRESSION
 |
-  < START_DEFERRED_EXPRESSION: "#{" > : IN_EXPRESSION
+  < START_DEFERRED_EXPRESSION: "#{" > {deque.push(DEFAULT);}: IN_EXPRESSION
 }
 
 <IN_EXPRESSION> SKIP : { " " | "\t" | "\n" | "\r" }
 
-<IN_EXPRESSION> TOKEN :
+<IN_EXPRESSION, IN_SET_OR_MAP> TOKEN :
 {
-     < INTEGER_LITERAL: ["0"-"9"] (["0"-"9"])* >
+     < START_SET_OR_MAP : "{" > {deque.push(curLexState);}: IN_SET_OR_MAP
+|    < RCURL: "}" > {SwitchTo(deque.pop());}
+|    < INTEGER_LITERAL: ["0"-"9"] (["0"-"9"])* >
 |    < FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)?
         | "." (["0"-"9"])+ (<EXPONENT>)?
         | (["0"-"9"])+ <EXPONENT>
@@ -399,7 +434,6 @@ void Null() #Null : {}
 |    < TRUE : "true" >
 |    < FALSE : "false" >
 |    < NULL : "null" >
-|    < END_EXPRESSION : "}" > : DEFAULT
 |    < DOT : "." >
 |    < LPAREN : "(" >
 |    < RPAREN : ")" >

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=1502847&r1=1502846&r2=1502847&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/parser/ELParserConstants.java (original)
+++ tomcat/trunk/java/org/apache/el/parser/ELParserConstants.java Sat Jul 13 19:28:02 2013
@@ -17,108 +17,112 @@ public interface ELParserConstants {
   /** RegularExpression Id. */
   int START_DEFERRED_EXPRESSION = 3;
   /** RegularExpression Id. */
-  int INTEGER_LITERAL = 8;
+  int START_SET_OR_MAP = 8;
   /** RegularExpression Id. */
-  int FLOATING_POINT_LITERAL = 9;
+  int RCURL = 9;
   /** RegularExpression Id. */
-  int EXPONENT = 10;
+  int INTEGER_LITERAL = 10;
   /** RegularExpression Id. */
-  int STRING_LITERAL = 11;
+  int FLOATING_POINT_LITERAL = 11;
   /** RegularExpression Id. */
-  int TRUE = 12;
+  int EXPONENT = 12;
   /** RegularExpression Id. */
-  int FALSE = 13;
+  int STRING_LITERAL = 13;
   /** RegularExpression Id. */
-  int NULL = 14;
+  int TRUE = 14;
   /** RegularExpression Id. */
-  int END_EXPRESSION = 15;
+  int FALSE = 15;
   /** RegularExpression Id. */
-  int DOT = 16;
+  int NULL = 16;
   /** RegularExpression Id. */
-  int LPAREN = 17;
+  int DOT = 17;
   /** RegularExpression Id. */
-  int RPAREN = 18;
+  int LPAREN = 18;
   /** RegularExpression Id. */
-  int LBRACK = 19;
+  int RPAREN = 19;
   /** RegularExpression Id. */
-  int RBRACK = 20;
+  int LBRACK = 20;
   /** RegularExpression Id. */
-  int COLON = 21;
+  int RBRACK = 21;
   /** RegularExpression Id. */
-  int COMMA = 22;
+  int COLON = 22;
   /** RegularExpression Id. */
-  int GT0 = 23;
+  int COMMA = 23;
   /** RegularExpression Id. */
-  int GT1 = 24;
+  int GT0 = 24;
   /** RegularExpression Id. */
-  int LT0 = 25;
+  int GT1 = 25;
   /** RegularExpression Id. */
-  int LT1 = 26;
+  int LT0 = 26;
   /** RegularExpression Id. */
-  int GE0 = 27;
+  int LT1 = 27;
   /** RegularExpression Id. */
-  int GE1 = 28;
+  int GE0 = 28;
   /** RegularExpression Id. */
-  int LE0 = 29;
+  int GE1 = 29;
   /** RegularExpression Id. */
-  int LE1 = 30;
+  int LE0 = 30;
   /** RegularExpression Id. */
-  int EQ0 = 31;
+  int LE1 = 31;
   /** RegularExpression Id. */
-  int EQ1 = 32;
+  int EQ0 = 32;
   /** RegularExpression Id. */
-  int NE0 = 33;
+  int EQ1 = 33;
   /** RegularExpression Id. */
-  int NE1 = 34;
+  int NE0 = 34;
   /** RegularExpression Id. */
-  int NOT0 = 35;
+  int NE1 = 35;
   /** RegularExpression Id. */
-  int NOT1 = 36;
+  int NOT0 = 36;
   /** RegularExpression Id. */
-  int AND0 = 37;
+  int NOT1 = 37;
   /** RegularExpression Id. */
-  int AND1 = 38;
+  int AND0 = 38;
   /** RegularExpression Id. */
-  int OR0 = 39;
+  int AND1 = 39;
   /** RegularExpression Id. */
-  int OR1 = 40;
+  int OR0 = 40;
   /** RegularExpression Id. */
-  int EMPTY = 41;
+  int OR1 = 41;
   /** RegularExpression Id. */
-  int INSTANCEOF = 42;
+  int EMPTY = 42;
   /** RegularExpression Id. */
-  int MULT = 43;
+  int INSTANCEOF = 43;
   /** RegularExpression Id. */
-  int PLUS = 44;
+  int MULT = 44;
   /** RegularExpression Id. */
-  int MINUS = 45;
+  int PLUS = 45;
   /** RegularExpression Id. */
-  int QUESTIONMARK = 46;
+  int MINUS = 46;
   /** RegularExpression Id. */
-  int DIV0 = 47;
+  int QUESTIONMARK = 47;
   /** RegularExpression Id. */
-  int DIV1 = 48;
+  int DIV0 = 48;
   /** RegularExpression Id. */
-  int MOD0 = 49;
+  int DIV1 = 49;
   /** RegularExpression Id. */
-  int MOD1 = 50;
+  int MOD0 = 50;
   /** RegularExpression Id. */
-  int IDENTIFIER = 51;
+  int MOD1 = 51;
   /** RegularExpression Id. */
-  int FUNCTIONSUFFIX = 52;
+  int IDENTIFIER = 52;
   /** RegularExpression Id. */
-  int IMPL_OBJ_START = 53;
+  int FUNCTIONSUFFIX = 53;
   /** RegularExpression Id. */
-  int LETTER = 54;
+  int IMPL_OBJ_START = 54;
   /** RegularExpression Id. */
-  int DIGIT = 55;
+  int LETTER = 55;
   /** RegularExpression Id. */
-  int ILLEGAL_CHARACTER = 56;
+  int DIGIT = 56;
+  /** RegularExpression Id. */
+  int ILLEGAL_CHARACTER = 57;
 
   /** Lexical state. */
   int DEFAULT = 0;
   /** Lexical state. */
   int IN_EXPRESSION = 1;
+  /** Lexical state. */
+  int IN_SET_OR_MAP = 2;
 
   /** Literal token values. */
   String[] tokenImage = {
@@ -130,6 +134,8 @@ public interface ELParserConstants {
     "\"\\t\"",
     "\"\\n\"",
     "\"\\r\"",
+    "\"{\"",
+    "\"}\"",
     "<INTEGER_LITERAL>",
     "<FLOATING_POINT_LITERAL>",
     "<EXPONENT>",
@@ -137,7 +143,6 @@ public interface ELParserConstants {
     "\"true\"",
     "\"false\"",
     "\"null\"",
-    "\"}\"",
     "\".\"",
     "\"(\"",
     "\")\"",



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