This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 1242677516fb4bc2a5b41a92f2bf7b56945b492f
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Aug 12 19:54:31 2024 +0100

    Add support for the Elvis operator
---
 java/org/apache/el/parser/AstElvis.java            |  46 +
 java/org/apache/el/parser/ELParser.java            | 921 +++++++++++----------
 java/org/apache/el/parser/ELParser.jjt             |  20 +-
 .../org/apache/el/parser/ELParserTokenManager.java |   3 +
 .../apache/el/parser/ELParserTreeConstants.java    |  77 +-
 test/org/apache/el/TestELEvaluation.java           |  11 +
 webapps/docs/changelog.xml                         |   4 +
 7 files changed, 616 insertions(+), 466 deletions(-)

diff --git a/java/org/apache/el/parser/AstElvis.java 
b/java/org/apache/el/parser/AstElvis.java
new file mode 100644
index 0000000000..eec28fbcf0
--- /dev/null
+++ b/java/org/apache/el/parser/AstElvis.java
@@ -0,0 +1,46 @@
+/*
+ * 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. AstElvis.java Version 7.0 */
+/* 
JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=Ast,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true
 */
+package org.apache.el.parser;
+
+import org.apache.el.lang.EvaluationContext;
+
+import jakarta.el.ELException;
+
+public class AstElvis extends SimpleNode {
+    public AstElvis(int id) {
+        super(id);
+    }
+
+    @Override
+    public Class<?> getType(EvaluationContext ctx) throws ELException {
+        Object val = this.getValue(ctx);
+        return (val != null) ? val.getClass() : null;
+    }
+
+    @Override
+    public Object getValue(EvaluationContext ctx) throws ELException {
+        Object obj0 = this.children[0].getValue(ctx);
+        if (obj0 == null) {
+            return this.children[1].getValue(ctx);
+        } else {
+            return obj0;
+        }
+    }
+}
+/* JavaCC - OriginalChecksum=e0633cc57b29ec4931c19e4a07e0611e (do not edit 
this line) */
diff --git a/java/org/apache/el/parser/ELParser.java 
b/java/org/apache/el/parser/ELParser.java
index b80fd01b6c..6cf7168afe 100644
--- a/java/org/apache/el/parser/ELParser.java
+++ b/java/org/apache/el/parser/ELParser.java
@@ -291,7 +291,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 case EMPTY:
                 case MINUS:
                 case IDENTIFIER: {
-                    Choice();
+                    Ternary();
                     label_3: while (true) {
                         if (jj_2_1(2)) {
                             ;
@@ -374,7 +374,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     case EMPTY:
                     case MINUS:
                     case IDENTIFIER: {
-                        Choice();
+                        Ternary();
                         break;
                     }
                     default:
@@ -524,7 +524,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     case EMPTY:
                     case MINUS:
                     case IDENTIFIER: {
-                        Choice();
+                        Ternary();
                         break;
                     }
                     default:
@@ -580,53 +580,107 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     }
 
     /*
-     * Choice For Choice markup a ? b : c, then Or
+     * Ternary For '?:' '? :', then Or
      */
-    final public void Choice() throws ParseException {
+    final public void Ternary() throws ParseException {
         Or();
         label_6: while (true) {
-            if (jj_2_5(3)) {
-                ;
-            } else {
-                break label_6;
-            }
-            jj_consume_token(QUESTIONMARK);
-            Choice();
-            jj_consume_token(COLON);
-            AstChoice jjtn001 = new AstChoice(JJTCHOICE);
-            boolean jjtc001 = true;
-            jjtree.openNodeScope(jjtn001);
-            try {
-                Choice();
-            } catch (Throwable jjte001) {
-                if (jjtc001) {
-                    jjtree.clearNodeScope(jjtn001);
-                    jjtc001 = false;
-                } else {
-                    jjtree.popNode();
+            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+                case QUESTIONMARK: {
+                    ;
+                    break;
                 }
-                if (jjte001 instanceof RuntimeException) {
-                    {
-                        if (true) {
-                            throw (RuntimeException) jjte001;
+                default:
+                    jj_la1[10] = jj_gen;
+                    break label_6;
+            }
+            if (jj_2_5(2)) {
+                jj_consume_token(QUESTIONMARK);
+                jj_consume_token(COLON);
+                AstElvis jjtn001 = new AstElvis(JJTELVIS);
+                boolean jjtc001 = true;
+                jjtree.openNodeScope(jjtn001);
+                try {
+                    Ternary();
+                } 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 (jjte001 instanceof ParseException) {
                     {
                         if (true) {
-                            throw (ParseException) jjte001;
+                            throw (Error) jjte001;
                         }
                     }
-                }
-                {
-                    if (true) {
-                        throw (Error) jjte001;
+                } finally {
+                    if (jjtc001) {
+                        jjtree.closeNodeScope(jjtn001, 2);
                     }
                 }
-            } finally {
-                if (jjtc001) {
-                    jjtree.closeNodeScope(jjtn001, 3);
+            } else {
+                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+                    case QUESTIONMARK: {
+                        jj_consume_token(QUESTIONMARK);
+                        Ternary();
+                        jj_consume_token(COLON);
+                        AstChoice jjtn002 = new AstChoice(JJTCHOICE);
+                        boolean jjtc002 = true;
+                        jjtree.openNodeScope(jjtn002);
+                        try {
+                            Ternary();
+                        } catch (Throwable jjte002) {
+                            if (jjtc002) {
+                                jjtree.clearNodeScope(jjtn002);
+                                jjtc002 = false;
+                            } else {
+                                jjtree.popNode();
+                            }
+                            if (jjte002 instanceof RuntimeException) {
+                                {
+                                    if (true) {
+                                        throw (RuntimeException) jjte002;
+                                    }
+                                }
+                            }
+                            if (jjte002 instanceof ParseException) {
+                                {
+                                    if (true) {
+                                        throw (ParseException) jjte002;
+                                    }
+                                }
+                            }
+                            {
+                                if (true) {
+                                    throw (Error) jjte002;
+                                }
+                            }
+                        } finally {
+                            if (jjtc002) {
+                                jjtree.closeNodeScope(jjtn002, 3);
+                            }
+                        }
+                        break;
+                    }
+                    default:
+                        jj_la1[11] = jj_gen;
+                        jj_consume_token(-1);
+                        throw new ParseException();
                 }
             }
         }
@@ -645,7 +699,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[10] = jj_gen;
+                    jj_la1[12] = jj_gen;
                     break label_7;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -658,7 +712,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[11] = jj_gen;
+                    jj_la1[13] = jj_gen;
                     jj_consume_token(-1);
                     throw new ParseException();
             }
@@ -714,7 +768,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[12] = jj_gen;
+                    jj_la1[14] = jj_gen;
                     break label_8;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -727,7 +781,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[13] = jj_gen;
+                    jj_la1[15] = jj_gen;
                     jj_consume_token(-1);
                     throw new ParseException();
             }
@@ -785,7 +839,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[14] = jj_gen;
+                    jj_la1[16] = jj_gen;
                     break label_9;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -801,7 +855,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[15] = jj_gen;
+                            jj_la1[17] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -855,7 +909,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[16] = jj_gen;
+                            jj_la1[18] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -898,7 +952,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[17] = jj_gen;
+                    jj_la1[19] = jj_gen;
                     jj_consume_token(-1);
                     throw new ParseException();
             }
@@ -924,7 +978,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[18] = jj_gen;
+                    jj_la1[20] = jj_gen;
                     break label_10;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -940,7 +994,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[19] = jj_gen;
+                            jj_la1[21] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -994,7 +1048,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[20] = jj_gen;
+                            jj_la1[22] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -1048,7 +1102,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[21] = jj_gen;
+                            jj_la1[23] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -1102,7 +1156,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[22] = jj_gen;
+                            jj_la1[24] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -1145,7 +1199,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[23] = jj_gen;
+                    jj_la1[25] = jj_gen;
                     jj_consume_token(-1);
                     throw new ParseException();
             }
@@ -1165,7 +1219,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[24] = jj_gen;
+                    jj_la1[26] = jj_gen;
                     break label_11;
             }
             jj_consume_token(CONCAT);
@@ -1221,7 +1275,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[25] = jj_gen;
+                    jj_la1[27] = jj_gen;
                     break label_12;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -1306,7 +1360,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[26] = jj_gen;
+                    jj_la1[28] = jj_gen;
                     jj_consume_token(-1);
                     throw new ParseException();
             }
@@ -1329,7 +1383,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[27] = jj_gen;
+                    jj_la1[29] = jj_gen;
                     break label_13;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -1385,7 +1439,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[28] = jj_gen;
+                            jj_la1[30] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -1439,7 +1493,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[29] = jj_gen;
+                            jj_la1[31] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -1482,7 +1536,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[30] = jj_gen;
+                    jj_la1[32] = jj_gen;
                     jj_consume_token(-1);
                     throw new ParseException();
             }
@@ -1546,7 +1600,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                         break;
                     }
                     default:
-                        jj_la1[31] = jj_gen;
+                        jj_la1[33] = jj_gen;
                         jj_consume_token(-1);
                         throw new ParseException();
                 }
@@ -1642,7 +1696,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[32] = jj_gen;
+                jj_la1[34] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
         }
@@ -1665,7 +1719,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                         break;
                     }
                     default:
-                        jj_la1[33] = jj_gen;
+                        jj_la1[35] = jj_gen;
                         break label_14;
                 }
                 ValueSuffix();
@@ -1725,7 +1779,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[34] = jj_gen;
+                jj_la1[36] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
         }
@@ -1745,7 +1799,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[35] = jj_gen;
+                jj_la1[37] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
         }
@@ -1755,7 +1809,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[36] = jj_gen;
+                jj_la1[38] = jj_gen;
                 ;
         }
     }
@@ -1857,7 +1911,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[37] = jj_gen;
+                                jj_la1[39] = jj_gen;
                                 break label_15;
                         }
                         jj_consume_token(COMMA);
@@ -1866,7 +1920,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[38] = jj_gen;
+                    jj_la1[40] = jj_gen;
                     ;
             }
             jj_consume_token(RPAREN);
@@ -1918,7 +1972,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[39] = jj_gen;
+                    jj_la1[41] = jj_gen;
                     if (jj_2_7(2147483647)) {
                         Function();
                     } else {
@@ -1928,7 +1982,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[40] = jj_gen;
+                                jj_la1[42] = jj_gen;
                                 if (jj_2_8(5)) {
                                     SetData();
                                 } else {
@@ -1942,7 +1996,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                             break;
                                         }
                                         default:
-                                            jj_la1[41] = jj_gen;
+                                            jj_la1[43] = jj_gen;
                                             jj_consume_token(-1);
                                             throw new ParseException();
                                     }
@@ -1986,7 +2040,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[42] = jj_gen;
+                                jj_la1[44] = jj_gen;
                                 break label_16;
                         }
                         jj_consume_token(COMMA);
@@ -1995,7 +2049,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[43] = jj_gen;
+                    jj_la1[45] = jj_gen;
                     ;
             }
             jj_consume_token(RBRACE);
@@ -2061,7 +2115,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[44] = jj_gen;
+                                jj_la1[46] = jj_gen;
                                 break label_17;
                         }
                         jj_consume_token(COMMA);
@@ -2070,7 +2124,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[45] = jj_gen;
+                    jj_la1[47] = jj_gen;
                     ;
             }
             jj_consume_token(RBRACK);
@@ -2140,7 +2194,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[46] = jj_gen;
+                                jj_la1[48] = jj_gen;
                                 break label_18;
                         }
                         jj_consume_token(COMMA);
@@ -2149,7 +2203,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[47] = jj_gen;
+                    jj_la1[49] = jj_gen;
                     ;
             }
             jj_consume_token(RBRACE);
@@ -2265,7 +2319,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[48] = jj_gen;
+                    jj_la1[50] = jj_gen;
                     ;
             }
             if (t1 != null) {
@@ -2282,7 +2336,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                         break;
                     }
                     default:
-                        jj_la1[49] = jj_gen;
+                        jj_la1[51] = jj_gen;
                         break label_19;
                 }
             }
@@ -2346,7 +2400,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[50] = jj_gen;
+                jj_la1[52] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
         }
@@ -2384,7 +2438,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[51] = jj_gen;
+                jj_la1[53] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
         }
@@ -2562,91 +2616,41 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         }
     }
 
-    private boolean jj_3R_And_173_17_41() {
-        Token xsp;
-        xsp = jj_scanpos;
-        if (jj_scan_token(39)) {
-            jj_scanpos = xsp;
-            if (jj_scan_token(40)) {
-                return true;
-            }
-        }
-        if (jj_3R_Equality_182_5_40()) {
+    private boolean jj_3R_LambdaExpressionOrInvocation_144_45_28() {
+        if (jj_3R_Ternary_155_5_30()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaExpressionOrInvocation_144_45_30() {
-        if (jj_3R_Choice_155_5_22()) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean jj_3R_Equality_182_5_40() {
-        if (jj_3R_Compare_196_5_44()) {
-            return true;
-        }
-        Token xsp;
-        while (true) {
-            xsp = jj_scanpos;
-            if (jj_3R_Equality_184_9_45()) {
-                jj_scanpos = xsp;
-                break;
-            }
-        }
-        return false;
-    }
-
-    private boolean jj_3R_ListData_350_26_109() {
-        if (jj_scan_token(COMMA)) {
-            return true;
-        }
-        if (jj_3R_Expression_99_5_36()) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean jj_3R_MapEntry_368_5_107() {
-        if (jj_3R_Expression_99_5_36()) {
+    private boolean jj_3R_MapEntry_374_5_109() {
+        if (jj_3R_Expression_99_5_33()) {
             return true;
         }
         if (jj_scan_token(COLON)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_36()) {
+        if (jj_3R_Expression_99_5_33()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_MapData_362_11_105() {
-        if (jj_3R_MapEntry_368_5_107()) {
+    private boolean jj_3R_MapData_368_11_107() {
+        if (jj_3R_MapEntry_374_5_109()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_46_43() {
-        if (jj_scan_token(COMMA)) {
-            return true;
-        }
-        if (jj_3R_Identifier_377_5_38()) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean jj_3R_And_173_5_34() {
-        if (jj_3R_Equality_182_5_40()) {
+    private boolean jj_3R_And_179_5_40() {
+        if (jj_3R_Equality_188_5_45()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_And_173_17_41()) {
+            if (jj_3R_And_179_17_46()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2654,17 +2658,17 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_SetData_343_26_37() {
+    private boolean jj_3R_SetData_349_26_34() {
         if (jj_scan_token(COMMA)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_36()) {
+        if (jj_3R_Expression_99_5_33()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Or_164_12_35() {
+    private boolean jj_3R_Or_170_12_42() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(41)) {
@@ -2673,19 +2677,19 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_And_173_5_34()) {
+        if (jj_3R_And_179_5_40()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_MapData_361_5_99() {
+    private boolean jj_3R_MapData_367_5_101() {
         if (jj_scan_token(START_SET_OR_MAP)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_MapData_362_11_105()) {
+        if (jj_3R_MapData_368_11_107()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RBRACE)) {
@@ -2694,14 +2698,24 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_ListData_350_11_104() {
-        if (jj_3R_Expression_99_5_36()) {
+    private boolean jj_3R_LambdaParameters_132_46_41() {
+        if (jj_scan_token(COMMA)) {
+            return true;
+        }
+        if (jj_3R_Identifier_383_5_36()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_ListData_356_11_106() {
+        if (jj_3R_Expression_99_5_33()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_ListData_350_26_109()) {
+            if (jj_3R_ListData_356_26_111()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2709,14 +2723,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Or_164_5_29() {
-        if (jj_3R_And_173_5_34()) {
+    private boolean jj_3R_Or_170_5_35() {
+        if (jj_3R_And_179_5_40()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Or_164_12_35()) {
+            if (jj_3R_Or_170_12_42()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2724,42 +2738,42 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3_5() {
-        if (jj_scan_token(QUESTIONMARK)) {
+    private boolean jj_3R_ListData_355_5_100() {
+        if (jj_scan_token(LBRACK)) {
             return true;
         }
-        if (jj_3R_Choice_155_5_22()) {
-            return true;
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_ListData_356_11_106()) {
+            jj_scanpos = xsp;
         }
-        if (jj_scan_token(COLON)) {
+        if (jj_scan_token(RBRACK)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ListData_349_5_98() {
-        if (jj_scan_token(LBRACK)) {
+    private boolean jj_3R_Ternary_160_9_43() {
+        if (jj_scan_token(QUESTIONMARK)) {
             return true;
         }
-        Token xsp;
-        xsp = jj_scanpos;
-        if (jj_3R_ListData_350_11_104()) {
-            jj_scanpos = xsp;
+        if (jj_3R_Ternary_155_5_30()) {
+            return true;
         }
-        if (jj_scan_token(RBRACK)) {
+        if (jj_scan_token(COLON)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_31_39() {
-        if (jj_3R_Identifier_377_5_38()) {
+    private boolean jj_3R_SetData_349_11_29() {
+        if (jj_3R_Expression_99_5_33()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_LambdaParameters_132_46_43()) {
+            if (jj_3R_SetData_349_26_34()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2767,29 +2781,21 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_SetData_343_11_31() {
-        if (jj_3R_Expression_99_5_36()) {
+    private boolean jj_3R_MethodParameters_323_31_113() {
+        if (jj_scan_token(COMMA)) {
             return true;
         }
-        Token xsp;
-        while (true) {
-            xsp = jj_scanpos;
-            if (jj_3R_SetData_343_26_37()) {
-                jj_scanpos = xsp;
-                break;
-            }
-        }
         return false;
     }
 
-    private boolean jj_3R_Choice_155_5_22() {
-        if (jj_3R_Or_164_5_29()) {
+    private boolean jj_3R_LambdaParameters_132_31_37() {
+        if (jj_3R_Identifier_383_5_36()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3_5()) {
+            if (jj_3R_LambdaParameters_132_46_41()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2797,27 +2803,38 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3_3() {
-        if (jj_3R_LambdaExpression_124_5_21()) {
-            return true;
+    private boolean jj_3R_Ternary_157_5_38() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3_5()) {
+            jj_scanpos = xsp;
+            if (jj_3R_Ternary_160_9_43()) {
+                return true;
+            }
         }
         return false;
     }
 
-    private boolean jj_3R_MethodParameters_317_31_111() {
-        if (jj_scan_token(COMMA)) {
+    private boolean jj_3_5() {
+        if (jj_scan_token(QUESTIONMARK)) {
+            return true;
+        }
+        if (jj_scan_token(COLON)) {
+            return true;
+        }
+        if (jj_3R_Ternary_155_5_30()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_SetData_342_5_25() {
+    private boolean jj_3R_SetData_348_5_24() {
         if (jj_scan_token(START_SET_OR_MAP)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_SetData_343_11_31()) {
+        if (jj_3R_SetData_349_11_29()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RBRACE)) {
@@ -2826,19 +2843,27 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3_4() {
-        if (jj_3R_LambdaExpression_124_5_21()) {
+    private boolean jj_3R_null_334_18_23() {
+        if (jj_scan_token(IDENTIFIER)) {
+            return true;
+        }
+        if (jj_scan_token(COLON)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_null_328_18_24() {
-        if (jj_scan_token(IDENTIFIER)) {
+    private boolean jj_3R_Ternary_155_5_30() {
+        if (jj_3R_Or_170_5_35()) {
             return true;
         }
-        if (jj_scan_token(COLON)) {
-            return true;
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_Ternary_157_5_38()) {
+                jj_scanpos = xsp;
+                break;
+            }
         }
         return false;
     }
@@ -2846,7 +2871,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     private boolean jj_3_7() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_null_328_18_24()) {
+        if (jj_3R_null_334_18_23()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(IDENTIFIER)) {
@@ -2858,52 +2883,42 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_20_33() {
-        if (jj_scan_token(LPAREN)) {
+    private boolean jj_3_3() {
+        if (jj_3R_LambdaExpression_124_5_21()) {
             return true;
         }
-        Token xsp;
-        xsp = jj_scanpos;
-        if (jj_3R_LambdaParameters_132_31_39()) {
-            jj_scanpos = xsp;
-        }
-        if (jj_scan_token(RPAREN)) {
+        return false;
+    }
+
+    private boolean jj_3_4() {
+        if (jj_3R_LambdaExpression_124_5_21()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_332_7_89() {
-        if (jj_3R_MapData_361_5_99()) {
+    private boolean jj_3R_NonLiteral_338_7_91() {
+        if (jj_3R_MapData_367_5_101()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_331_7_88() {
-        if (jj_3R_ListData_349_5_98()) {
+    private boolean jj_3R_NonLiteral_337_7_90() {
+        if (jj_3R_ListData_355_5_100()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaExpressionOrInvocation_141_5_23() {
+    private boolean jj_3R_LambdaParameters_132_20_32() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
-        if (jj_3R_LambdaParameters_132_5_27()) {
-            return true;
-        }
-        if (jj_scan_token(ARROW)) {
-            return true;
-        }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3_4()) {
+        if (jj_3R_LambdaParameters_132_31_37()) {
             jj_scanpos = xsp;
-            if (jj_3R_LambdaExpressionOrInvocation_144_45_30()) {
-                return true;
-            }
         }
         if (jj_scan_token(RPAREN)) {
             return true;
@@ -2912,31 +2927,31 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     }
 
     private boolean jj_3_8() {
-        if (jj_3R_SetData_342_5_25()) {
+        if (jj_3R_SetData_348_5_24()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_329_7_87() {
-        if (jj_3R_Identifier_377_5_38()) {
+    private boolean jj_3R_NonLiteral_335_7_89() {
+        if (jj_3R_Identifier_383_5_36()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_328_7_86() {
-        if (jj_3R_Function_390_5_97()) {
+    private boolean jj_3R_NonLiteral_334_7_88() {
+        if (jj_3R_Function_396_5_99()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_327_7_85() {
+    private boolean jj_3R_NonLiteral_333_7_87() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_36()) {
+        if (jj_3R_Expression_99_5_33()) {
             return true;
         }
         if (jj_scan_token(RPAREN)) {
@@ -2945,14 +2960,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_MethodParameters_317_16_110() {
-        if (jj_3R_Expression_99_5_36()) {
+    private boolean jj_3R_MethodParameters_323_16_112() {
+        if (jj_3R_Expression_99_5_33()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_MethodParameters_317_31_111()) {
+            if (jj_3R_MethodParameters_323_31_113()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2960,29 +2975,29 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_291_41_108() {
-        if (jj_3R_MethodParameters_317_5_106()) {
+    private boolean jj_3R_ValueSuffix_297_41_110() {
+        if (jj_3R_MethodParameters_323_5_108()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_326_5_77() {
+    private boolean jj_3R_NonLiteral_332_5_79() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_3_6()) {
             jj_scanpos = xsp;
-            if (jj_3R_NonLiteral_327_7_85()) {
+            if (jj_3R_NonLiteral_333_7_87()) {
                 jj_scanpos = xsp;
-                if (jj_3R_NonLiteral_328_7_86()) {
+                if (jj_3R_NonLiteral_334_7_88()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_NonLiteral_329_7_87()) {
+                    if (jj_3R_NonLiteral_335_7_89()) {
                         jj_scanpos = xsp;
                         if (jj_3_8()) {
                             jj_scanpos = xsp;
-                            if (jj_3R_NonLiteral_331_7_88()) {
+                            if (jj_3R_NonLiteral_337_7_90()) {
                                 jj_scanpos = xsp;
-                                if (jj_3R_NonLiteral_332_7_89()) {
+                                if (jj_3R_NonLiteral_338_7_91()) {
                                     return true;
                                 }
                             }
@@ -2994,49 +3009,44 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3_6() {
-        if (jj_3R_LambdaExpressionOrInvocation_141_5_23()) {
+    private boolean jj_3R_LambdaExpressionOrInvocation_141_5_22() {
+        if (jj_scan_token(LPAREN)) {
             return true;
         }
-        return false;
-    }
-
-    private boolean jj_3R_LambdaParameters_132_5_32() {
-        if (jj_3R_Identifier_377_5_38()) {
+        if (jj_3R_LambdaParameters_132_5_26()) {
+            return true;
+        }
+        if (jj_scan_token(ARROW)) {
             return true;
         }
-        return false;
-    }
-
-    private boolean jj_3R_LambdaParameters_132_5_27() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_LambdaParameters_132_5_32()) {
+        if (jj_3_4()) {
             jj_scanpos = xsp;
-            if (jj_3R_LambdaParameters_132_20_33()) {
+            if (jj_3R_LambdaExpressionOrInvocation_144_45_28()) {
                 return true;
             }
         }
+        if (jj_scan_token(RPAREN)) {
+            return true;
+        }
         return false;
     }
 
-    private boolean jj_3_1() {
-        if (jj_scan_token(ASSIGN)) {
-            return true;
-        }
-        if (jj_3R_Assignment_115_5_20()) {
+    private boolean jj_3_6() {
+        if (jj_3R_LambdaExpressionOrInvocation_141_5_22()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_MethodParameters_317_5_106() {
+    private boolean jj_3R_MethodParameters_323_5_108() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_MethodParameters_317_16_110()) {
+        if (jj_3R_MethodParameters_323_16_112()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RPAREN)) {
@@ -3045,26 +3055,27 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaExpression_124_5_21() {
-        if (jj_3R_LambdaParameters_132_5_27()) {
-            return true;
-        }
-        if (jj_scan_token(ARROW)) {
+    private boolean jj_3R_LambdaParameters_132_5_31() {
+        if (jj_3R_Identifier_383_5_36()) {
             return true;
         }
+        return false;
+    }
+
+    private boolean jj_3R_LambdaParameters_132_5_26() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3_3()) {
+        if (jj_3R_LambdaParameters_132_5_31()) {
             jj_scanpos = xsp;
-            if (jj_3R_LambdaExpression_124_68_28()) {
+            if (jj_3R_LambdaParameters_132_20_32()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Semicolon_107_20_46() {
-        if (jj_scan_token(SEMICOLON)) {
+    private boolean jj_3_1() {
+        if (jj_scan_token(ASSIGN)) {
             return true;
         }
         if (jj_3R_Assignment_115_5_20()) {
@@ -3073,11 +3084,11 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_BracketSuffix_309_5_91() {
+    private boolean jj_3R_BracketSuffix_315_5_93() {
         if (jj_scan_token(LBRACK)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_36()) {
+        if (jj_3R_Expression_99_5_33()) {
             return true;
         }
         if (jj_scan_token(RBRACK)) {
@@ -3086,15 +3097,43 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_291_21_79() {
-        if (jj_3R_BracketSuffix_309_5_91()) {
+    private boolean jj_3R_LambdaExpression_124_5_21() {
+        if (jj_3R_LambdaParameters_132_5_26()) {
+            return true;
+        }
+        if (jj_scan_token(ARROW)) {
+            return true;
+        }
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3_3()) {
+            jj_scanpos = xsp;
+            if (jj_3R_LambdaExpression_124_68_27()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_ValueSuffix_297_21_81() {
+        if (jj_3R_BracketSuffix_315_5_93()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_Semicolon_107_20_44() {
+        if (jj_scan_token(SEMICOLON)) {
+            return true;
+        }
+        if (jj_3R_Assignment_115_5_20()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Assignment_116_5_26() {
-        if (jj_3R_Choice_155_5_22()) {
+    private boolean jj_3R_Assignment_116_5_25() {
+        if (jj_3R_Ternary_155_5_30()) {
             return true;
         }
         Token xsp;
@@ -3108,6 +3147,16 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
+    private boolean jj_3R_DotSuffix_306_5_92() {
+        if (jj_scan_token(DOT)) {
+            return true;
+        }
+        if (jj_scan_token(IDENTIFIER)) {
+            return true;
+        }
+        return false;
+    }
+
     private boolean jj_3_2() {
         if (jj_3R_LambdaExpression_124_5_21()) {
             return true;
@@ -3120,31 +3169,28 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         xsp = jj_scanpos;
         if (jj_3_2()) {
             jj_scanpos = xsp;
-            if (jj_3R_Assignment_116_5_26()) {
+            if (jj_3R_Assignment_116_5_25()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_DotSuffix_300_5_90() {
-        if (jj_scan_token(DOT)) {
-            return true;
-        }
-        if (jj_scan_token(IDENTIFIER)) {
+    private boolean jj_3R_ValueSuffix_297_7_80() {
+        if (jj_3R_DotSuffix_306_5_92()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Semicolon_107_5_42() {
+    private boolean jj_3R_Semicolon_107_5_39() {
         if (jj_3R_Assignment_115_5_20()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Semicolon_107_20_46()) {
+            if (jj_3R_Semicolon_107_20_44()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3152,77 +3198,70 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_291_7_78() {
-        if (jj_3R_DotSuffix_300_5_90()) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean jj_3R_ValueSuffix_291_5_75() {
+    private boolean jj_3R_ValueSuffix_297_5_77() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_ValueSuffix_291_7_78()) {
+        if (jj_3R_ValueSuffix_297_7_80()) {
             jj_scanpos = xsp;
-            if (jj_3R_ValueSuffix_291_21_79()) {
+            if (jj_3R_ValueSuffix_297_21_81()) {
                 return true;
             }
         }
         xsp = jj_scanpos;
-        if (jj_3R_ValueSuffix_291_41_108()) {
+        if (jj_3R_ValueSuffix_297_41_110()) {
             jj_scanpos = xsp;
         }
         return false;
     }
 
-    private boolean jj_3R_Expression_99_5_36() {
-        if (jj_3R_Semicolon_107_5_42()) {
+    private boolean jj_3R_Value_278_21_74() {
+        if (jj_3R_ValueSuffix_297_5_77()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Value_272_21_72() {
-        if (jj_3R_ValueSuffix_291_5_75()) {
+    private boolean jj_3R_ValuePrefix_288_7_76() {
+        if (jj_3R_NonLiteral_332_5_79()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ValuePrefix_282_7_74() {
-        if (jj_3R_NonLiteral_326_5_77()) {
+    private boolean jj_3R_Expression_99_5_33() {
+        if (jj_3R_Semicolon_107_5_39()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ValuePrefix_281_5_71() {
+    private boolean jj_3R_ValuePrefix_287_5_75() {
+        if (jj_3R_Literal_414_5_78()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_ValuePrefix_287_5_73() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_ValuePrefix_281_5_73()) {
+        if (jj_3R_ValuePrefix_287_5_75()) {
             jj_scanpos = xsp;
-            if (jj_3R_ValuePrefix_282_7_74()) {
+            if (jj_3R_ValuePrefix_288_7_76()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_ValuePrefix_281_5_73() {
-        if (jj_3R_Literal_408_5_76()) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean jj_3R_Value_272_5_70() {
-        if (jj_3R_ValuePrefix_281_5_71()) {
+    private boolean jj_3R_Value_278_5_72() {
+        if (jj_3R_ValuePrefix_287_5_73()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Value_272_21_72()) {
+            if (jj_3R_Value_278_21_74()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3230,31 +3269,31 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Null_458_5_96() {
+    private boolean jj_3R_Null_464_5_98() {
         if (jj_scan_token(NULL)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_263_9_66() {
-        if (jj_3R_Value_272_5_70()) {
+    private boolean jj_3R_Unary_269_9_68() {
+        if (jj_3R_Value_278_5_72()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_261_9_65() {
+    private boolean jj_3R_Unary_267_9_67() {
         if (jj_scan_token(EMPTY)) {
             return true;
         }
-        if (jj_3R_Unary_257_9_59()) {
+        if (jj_3R_Unary_263_9_61()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_259_9_64() {
+    private boolean jj_3R_Unary_265_9_66() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(37)) {
@@ -3263,22 +3302,22 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Unary_257_9_59()) {
+        if (jj_3R_Unary_263_9_61()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_257_9_59() {
+    private boolean jj_3R_Unary_263_9_61() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Unary_257_9_63()) {
+        if (jj_3R_Unary_263_9_65()) {
             jj_scanpos = xsp;
-            if (jj_3R_Unary_259_9_64()) {
+            if (jj_3R_Unary_265_9_66()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Unary_261_9_65()) {
+                if (jj_3R_Unary_267_9_67()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_Unary_263_9_66()) {
+                    if (jj_3R_Unary_269_9_68()) {
                         return true;
                     }
                 }
@@ -3287,24 +3326,24 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Unary_257_9_63() {
+    private boolean jj_3R_Unary_263_9_65() {
         if (jj_scan_token(MINUS)) {
             return true;
         }
-        if (jj_3R_Unary_257_9_59()) {
+        if (jj_3R_Unary_263_9_61()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_String_449_5_95() {
+    private boolean jj_3R_String_455_5_97() {
         if (jj_scan_token(STRING_LITERAL)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_247_9_69() {
+    private boolean jj_3R_Multiplication_253_9_71() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(51)) {
@@ -3313,20 +3352,20 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Unary_257_9_59()) {
+        if (jj_3R_Unary_263_9_61()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Integer_440_5_94() {
+    private boolean jj_3R_Integer_446_5_96() {
         if (jj_scan_token(INTEGER_LITERAL)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_245_9_68() {
+    private boolean jj_3R_Multiplication_251_9_70() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(49)) {
@@ -3335,20 +3374,20 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Unary_257_9_59()) {
+        if (jj_3R_Unary_263_9_61()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_243_9_60() {
+    private boolean jj_3R_Multiplication_249_9_62() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Multiplication_243_9_67()) {
+        if (jj_3R_Multiplication_249_9_69()) {
             jj_scanpos = xsp;
-            if (jj_3R_Multiplication_245_9_68()) {
+            if (jj_3R_Multiplication_251_9_70()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Multiplication_247_9_69()) {
+                if (jj_3R_Multiplication_253_9_71()) {
                     return true;
                 }
             }
@@ -3356,24 +3395,24 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Multiplication_243_9_67() {
+    private boolean jj_3R_Multiplication_249_9_69() {
         if (jj_scan_token(MULT)) {
             return true;
         }
-        if (jj_3R_Unary_257_9_59()) {
+        if (jj_3R_Unary_263_9_61()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_241_5_57() {
-        if (jj_3R_Unary_257_9_59()) {
+    private boolean jj_3R_Multiplication_247_5_59() {
+        if (jj_3R_Unary_263_9_61()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Multiplication_243_9_60()) {
+            if (jj_3R_Multiplication_249_9_62()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3381,79 +3420,79 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_FloatingPoint_431_5_93() {
+    private boolean jj_3R_FloatingPoint_437_5_95() {
         if (jj_scan_token(FLOATING_POINT_LITERAL)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Math_231_9_62() {
+    private boolean jj_3R_Math_237_9_64() {
         if (jj_scan_token(MINUS)) {
             return true;
         }
-        if (jj_3R_Multiplication_241_5_57()) {
+        if (jj_3R_Multiplication_247_5_59()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Boolean_423_7_101() {
+    private boolean jj_3R_Boolean_429_7_103() {
         if (jj_scan_token(FALSE)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Math_229_9_58() {
+    private boolean jj_3R_Math_235_9_60() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Math_229_9_61()) {
+        if (jj_3R_Math_235_9_63()) {
             jj_scanpos = xsp;
-            if (jj_3R_Math_231_9_62()) {
+            if (jj_3R_Math_237_9_64()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Math_229_9_61() {
+    private boolean jj_3R_Math_235_9_63() {
         if (jj_scan_token(PLUS)) {
             return true;
         }
-        if (jj_3R_Multiplication_241_5_57()) {
+        if (jj_3R_Multiplication_247_5_59()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Boolean_421_5_100() {
+    private boolean jj_3R_Boolean_427_5_102() {
         if (jj_scan_token(TRUE)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Boolean_421_5_92() {
+    private boolean jj_3R_Boolean_427_5_94() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Boolean_421_5_100()) {
+        if (jj_3R_Boolean_427_5_102()) {
             jj_scanpos = xsp;
-            if (jj_3R_Boolean_423_7_101()) {
+            if (jj_3R_Boolean_429_7_103()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Math_227_5_51() {
-        if (jj_3R_Multiplication_241_5_57()) {
+    private boolean jj_3R_Math_233_5_53() {
+        if (jj_3R_Multiplication_247_5_59()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Math_229_9_58()) {
+            if (jj_3R_Math_235_9_60()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3461,45 +3500,45 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Literal_412_7_84() {
-        if (jj_3R_Null_458_5_96()) {
+    private boolean jj_3R_Literal_418_7_86() {
+        if (jj_3R_Null_464_5_98()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Literal_411_7_83() {
-        if (jj_3R_String_449_5_95()) {
+    private boolean jj_3R_Literal_417_7_85() {
+        if (jj_3R_String_455_5_97()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Concatenation_217_10_52() {
+    private boolean jj_3R_Concatenation_223_10_54() {
         if (jj_scan_token(CONCAT)) {
             return true;
         }
-        if (jj_3R_Math_227_5_51()) {
+        if (jj_3R_Math_233_5_53()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Literal_410_7_82() {
-        if (jj_3R_Integer_440_5_94()) {
+    private boolean jj_3R_Literal_416_7_84() {
+        if (jj_3R_Integer_446_5_96()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Literal_409_7_81() {
-        if (jj_3R_FloatingPoint_431_5_93()) {
+    private boolean jj_3R_Literal_415_7_83() {
+        if (jj_3R_FloatingPoint_437_5_95()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Function_390_24_102() {
+    private boolean jj_3R_Function_396_24_104() {
         if (jj_scan_token(COLON)) {
             return true;
         }
@@ -3509,25 +3548,25 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Literal_408_5_80() {
-        if (jj_3R_Boolean_421_5_92()) {
+    private boolean jj_3R_Literal_414_5_82() {
+        if (jj_3R_Boolean_427_5_94()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Literal_408_5_76() {
+    private boolean jj_3R_Literal_414_5_78() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Literal_408_5_80()) {
+        if (jj_3R_Literal_414_5_82()) {
             jj_scanpos = xsp;
-            if (jj_3R_Literal_409_7_81()) {
+            if (jj_3R_Literal_415_7_83()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Literal_410_7_82()) {
+                if (jj_3R_Literal_416_7_84()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_Literal_411_7_83()) {
+                    if (jj_3R_Literal_417_7_85()) {
                         jj_scanpos = xsp;
-                        if (jj_3R_Literal_412_7_84()) {
+                        if (jj_3R_Literal_418_7_86()) {
                             return true;
                         }
                     }
@@ -3537,14 +3576,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Concatenation_215_6_47() {
-        if (jj_3R_Math_227_5_51()) {
+    private boolean jj_3R_Concatenation_221_6_49() {
+        if (jj_3R_Math_233_5_53()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Concatenation_217_10_52()) {
+            if (jj_3R_Concatenation_223_10_54()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3552,14 +3591,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Function_399_7_103() {
-        if (jj_3R_MethodParameters_317_5_106()) {
+    private boolean jj_3R_Function_405_7_105() {
+        if (jj_3R_MethodParameters_323_5_108()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Compare_204_9_56() {
+    private boolean jj_3R_Compare_210_9_58() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(29)) {
@@ -3568,13 +3607,13 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Concatenation_215_6_47()) {
+        if (jj_3R_Concatenation_221_6_49()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Compare_202_9_55() {
+    private boolean jj_3R_Compare_208_9_57() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(31)) {
@@ -3583,13 +3622,13 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Concatenation_215_6_47()) {
+        if (jj_3R_Concatenation_221_6_49()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Compare_200_9_54() {
+    private boolean jj_3R_Compare_206_9_56() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(25)) {
@@ -3598,22 +3637,22 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Concatenation_215_6_47()) {
+        if (jj_3R_Concatenation_221_6_49()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Compare_198_9_48() {
+    private boolean jj_3R_Compare_204_9_50() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Compare_198_9_53()) {
+        if (jj_3R_Compare_204_9_55()) {
             jj_scanpos = xsp;
-            if (jj_3R_Compare_200_9_54()) {
+            if (jj_3R_Compare_206_9_56()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Compare_202_9_55()) {
+                if (jj_3R_Compare_208_9_57()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_Compare_204_9_56()) {
+                    if (jj_3R_Compare_210_9_58()) {
                         return true;
                     }
                 }
@@ -3622,7 +3661,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Compare_198_9_53() {
+    private boolean jj_3R_Compare_204_9_55() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(27)) {
@@ -3631,27 +3670,27 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Concatenation_215_6_47()) {
+        if (jj_3R_Concatenation_221_6_49()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Function_390_5_97() {
+    private boolean jj_3R_Function_396_5_99() {
         if (jj_scan_token(IDENTIFIER)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Function_390_24_102()) {
+        if (jj_3R_Function_396_24_104()) {
             jj_scanpos = xsp;
         }
-        if (jj_3R_Function_399_7_103()) {
+        if (jj_3R_Function_405_7_105()) {
             return true;
         }
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Function_399_7_103()) {
+            if (jj_3R_Function_405_7_105()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3659,14 +3698,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Compare_196_5_44() {
-        if (jj_3R_Concatenation_215_6_47()) {
+    private boolean jj_3R_Compare_202_5_47() {
+        if (jj_3R_Concatenation_221_6_49()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Compare_198_9_48()) {
+            if (jj_3R_Compare_204_9_50()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3674,7 +3713,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Equality_186_9_50() {
+    private boolean jj_3R_Equality_192_9_52() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(35)) {
@@ -3683,25 +3722,25 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Compare_196_5_44()) {
+        if (jj_3R_Compare_202_5_47()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Equality_184_9_45() {
+    private boolean jj_3R_Equality_190_9_48() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Equality_184_9_49()) {
+        if (jj_3R_Equality_190_9_51()) {
             jj_scanpos = xsp;
-            if (jj_3R_Equality_186_9_50()) {
+            if (jj_3R_Equality_192_9_52()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Equality_184_9_49() {
+    private boolean jj_3R_Equality_190_9_51() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(33)) {
@@ -3710,21 +3749,61 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Compare_196_5_44()) {
+        if (jj_3R_Compare_202_5_47()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaExpression_124_68_28() {
-        if (jj_3R_Choice_155_5_22()) {
+    private boolean jj_3R_Identifier_383_5_36() {
+        if (jj_scan_token(IDENTIFIER)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Identifier_377_5_38() {
-        if (jj_scan_token(IDENTIFIER)) {
+    private boolean jj_3R_And_179_17_46() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_scan_token(39)) {
+            jj_scanpos = xsp;
+            if (jj_scan_token(40)) {
+                return true;
+            }
+        }
+        if (jj_3R_Equality_188_5_45()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_Equality_188_5_45() {
+        if (jj_3R_Compare_202_5_47()) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_Equality_190_9_48()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_LambdaExpression_124_68_27() {
+        if (jj_3R_Ternary_155_5_30()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_ListData_356_26_111() {
+        if (jj_scan_token(COMMA)) {
+            return true;
+        }
+        if (jj_3R_Expression_99_5_33()) {
             return true;
         }
         return false;
@@ -3741,7 +3820,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     private Token jj_scanpos, jj_lastpos;
     private int jj_la;
     private int jj_gen;
-    final private int[] jj_la1 = new int[52];
+    final private int[] jj_la1 = new int[54];
     static private int[] jj_la1_0;
     static private int[] jj_la1_1;
     static {
@@ -3751,17 +3830,17 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
 
     private static void jj_la1_init_0() {
         jj_la1_0 = new int[] { 0xe, 0xe, 0x800000, 0x15ed00, 0x15ed00, 
0x1000000, 0x0, 0x40000, 0x15ed00, 0x40000, 0x0,
-                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe000000, 0x18000000, 
0x6000000, 0x80000000, 0x60000000,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe000000, 
0x18000000, 0x6000000, 0x80000000, 0x60000000,
                 0xfe000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15ed00, 
0x120000, 0x15ed00, 0x120000, 0x40000,
                 0x1000000, 0x15ed00, 0x40000, 0x0, 0x100100, 0x1000000, 
0x15ed00, 0x1000000, 0x15ed00, 0x1000000,
                 0x15ed00, 0x400000, 0x40000, 0x1ec00, 0xc000, };
     }
 
     private static void jj_la1_init_1() {
-        jj_la1_1 = new int[] { 0x0, 0x0, 0x0, 0x1008860, 0x1008860, 0x0, 
0x1000000, 0x1000000, 0x1008860, 0x0, 0x600,
-                0x600, 0x180, 0x180, 0x1e, 0x6, 0x18, 0x1e, 0x1, 0x0, 0x0, 
0x1, 0x0, 0x1, 0x200000, 0xc000, 0xc000,
-                0x1e2000, 0x60000, 0x180000, 0x1e2000, 0x60, 0x1008860, 0x0, 
0x1000000, 0x0, 0x0, 0x0, 0x1008860, 0x0,
-                0x1000000, 0x0, 0x0, 0x1008860, 0x0, 0x1008860, 0x0, 
0x1008860, 0x0, 0x0, 0x0, 0x0, };
+        jj_la1_1 = new int[] { 0x0, 0x0, 0x0, 0x1008860, 0x1008860, 0x0, 
0x1000000, 0x1000000, 0x1008860, 0x0, 0x10000,
+                0x10000, 0x600, 0x600, 0x180, 0x180, 0x1e, 0x6, 0x18, 0x1e, 
0x1, 0x0, 0x0, 0x1, 0x0, 0x1, 0x200000,
+                0xc000, 0xc000, 0x1e2000, 0x60000, 0x180000, 0x1e2000, 0x60, 
0x1008860, 0x0, 0x1000000, 0x0, 0x0, 0x0,
+                0x1008860, 0x0, 0x1000000, 0x0, 0x0, 0x1008860, 0x0, 
0x1008860, 0x0, 0x1008860, 0x0, 0x0, 0x0, 0x0, };
     }
 
     final private JJCalls[] jj_2_rtns = new JJCalls[8];
@@ -3784,7 +3863,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         token = new Token();
         jj_ntk = -1;
         jj_gen = 0;
-        for (int i = 0; i < 52; i++) {
+        for (int i = 0; i < 54; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3809,7 +3888,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         jj_ntk = -1;
         jjtree.reset();
         jj_gen = 0;
-        for (int i = 0; i < 52; i++) {
+        for (int i = 0; i < 54; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3824,7 +3903,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         token = new Token();
         jj_ntk = -1;
         jj_gen = 0;
-        for (int i = 0; i < 52; i++) {
+        for (int i = 0; i < 54; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3848,7 +3927,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         jj_ntk = -1;
         jjtree.reset();
         jj_gen = 0;
-        for (int i = 0; i < 52; i++) {
+        for (int i = 0; i < 54; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3862,7 +3941,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         token = new Token();
         jj_ntk = -1;
         jj_gen = 0;
-        for (int i = 0; i < 52; i++) {
+        for (int i = 0; i < 54; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3877,7 +3956,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         jj_ntk = -1;
         jjtree.reset();
         jj_gen = 0;
-        for (int i = 0; i < 52; i++) {
+        for (int i = 0; i < 54; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -4041,7 +4120,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
             la1tokens[jj_kind] = true;
             jj_kind = -1;
         }
-        for (int i = 0; i < 52; i++) {
+        for (int i = 0; i < 54; i++) {
             if (jj_la1[i] == jj_gen) {
                 for (int j = 0; j < 32; j++) {
                     if ((jj_la1_0[i] & (1 << j)) != 0) {
diff --git a/java/org/apache/el/parser/ELParser.jjt 
b/java/org/apache/el/parser/ELParser.jjt
index ce9c7fe431..8983f65c9b 100644
--- a/java/org/apache/el/parser/ELParser.jjt
+++ b/java/org/apache/el/parser/ELParser.jjt
@@ -113,7 +113,7 @@ void Semicolon() : {}
 void Assignment() : {}
 {
     LOOKAHEAD(4) LambdaExpression() |
-    Choice() ( LOOKAHEAD(2) <ASSIGN> Assignment() #Assign(2) )*
+    Ternary() ( LOOKAHEAD(2) <ASSIGN> Assignment() #Assign(2) )*
 }
 
 /*
@@ -121,7 +121,7 @@ void Assignment() : {}
  */
 void LambdaExpression() #LambdaExpression : {}
 {
-    LambdaParameters() <ARROW> ( LOOKAHEAD(3) LambdaExpression() | Choice() )
+    LambdaParameters() <ARROW> ( LOOKAHEAD(3) LambdaExpression() | Ternary() )
 }
 
 /*
@@ -141,18 +141,24 @@ void LambdaExpressionOrInvocation() #LambdaExpression : {}
     <LPAREN>
         LambdaParameters()
         <ARROW>
-        ( LOOKAHEAD(3) LambdaExpression() | Choice() )
+        ( LOOKAHEAD(3) LambdaExpression() | Ternary() )
     <RPAREN>
     ( MethodParameters() )*
 }
 
 /*
- * Choice
- * For Choice markup a ? b : c, then Or
+ * Ternary
+ * For '?:' '? :', then Or
  */
-void Choice() : {}
+void Ternary() : {}
 {
-    Or() (LOOKAHEAD(3) <QUESTIONMARK> Choice() <COLON> Choice() #Choice(3))*
+    Or()
+    (
+    LOOKAHEAD(3)
+        (<QUESTIONMARK><COLON> Ternary() #Elvis(2))
+    |
+        (<QUESTIONMARK> Ternary() <COLON> Ternary() #Choice(3))
+    )*
 }
 
 /*
diff --git a/java/org/apache/el/parser/ELParserTokenManager.java 
b/java/org/apache/el/parser/ELParserTokenManager.java
index cc51f5a573..a70d4b3e9a 100644
--- a/java/org/apache/el/parser/ELParserTokenManager.java
+++ b/java/org/apache/el/parser/ELParserTokenManager.java
@@ -2,6 +2,9 @@
 /* Generated By:JJTree&JavaCC: Do not edit this line. 
ELParserTokenManager.java */
 package org.apache.el.parser;
 
+import java.io.StringReader;
+import jakarta.el.ELException;
+
 /** Token Manager. */
 @SuppressWarnings("all") // Ignore warnings in generated code
 public class ELParserTokenManager implements ELParserConstants {
diff --git a/java/org/apache/el/parser/ELParserTreeConstants.java 
b/java/org/apache/el/parser/ELParserTreeConstants.java
index 240eaf2c90..bbb1e2df22 100644
--- a/java/org/apache/el/parser/ELParserTreeConstants.java
+++ b/java/org/apache/el/parser/ELParserTreeConstants.java
@@ -11,47 +11,48 @@ public interface ELParserTreeConstants {
     int JJTASSIGN = 6;
     int JJTLAMBDAEXPRESSION = 7;
     int JJTLAMBDAPARAMETERS = 8;
-    int JJTCHOICE = 9;
-    int JJTOR = 10;
-    int JJTAND = 11;
-    int JJTEQUAL = 12;
-    int JJTNOTEQUAL = 13;
-    int JJTLESSTHAN = 14;
-    int JJTGREATERTHAN = 15;
-    int JJTLESSTHANEQUAL = 16;
-    int JJTGREATERTHANEQUAL = 17;
-    int JJTCONCATENATION = 18;
-    int JJTPLUS = 19;
-    int JJTMINUS = 20;
-    int JJTMULT = 21;
-    int JJTDIV = 22;
-    int JJTMOD = 23;
-    int JJTNEGATIVE = 24;
-    int JJTNOT = 25;
-    int JJTEMPTY = 26;
-    int JJTVALUE = 27;
-    int JJTDOTSUFFIX = 28;
-    int JJTBRACKETSUFFIX = 29;
-    int JJTMETHODPARAMETERS = 30;
-    int JJTSETDATA = 31;
-    int JJTLISTDATA = 32;
-    int JJTMAPDATA = 33;
-    int JJTMAPENTRY = 34;
-    int JJTIDENTIFIER = 35;
-    int JJTFUNCTION = 36;
-    int JJTTRUE = 37;
-    int JJTFALSE = 38;
-    int JJTFLOATINGPOINT = 39;
-    int JJTINTEGER = 40;
-    int JJTSTRING = 41;
-    int JJTNULL = 42;
+    int JJTELVIS = 9;
+    int JJTCHOICE = 10;
+    int JJTOR = 11;
+    int JJTAND = 12;
+    int JJTEQUAL = 13;
+    int JJTNOTEQUAL = 14;
+    int JJTLESSTHAN = 15;
+    int JJTGREATERTHAN = 16;
+    int JJTLESSTHANEQUAL = 17;
+    int JJTGREATERTHANEQUAL = 18;
+    int JJTCONCATENATION = 19;
+    int JJTPLUS = 20;
+    int JJTMINUS = 21;
+    int JJTMULT = 22;
+    int JJTDIV = 23;
+    int JJTMOD = 24;
+    int JJTNEGATIVE = 25;
+    int JJTNOT = 26;
+    int JJTEMPTY = 27;
+    int JJTVALUE = 28;
+    int JJTDOTSUFFIX = 29;
+    int JJTBRACKETSUFFIX = 30;
+    int JJTMETHODPARAMETERS = 31;
+    int JJTSETDATA = 32;
+    int JJTLISTDATA = 33;
+    int JJTMAPDATA = 34;
+    int JJTMAPENTRY = 35;
+    int JJTIDENTIFIER = 36;
+    int JJTFUNCTION = 37;
+    int JJTTRUE = 38;
+    int JJTFALSE = 39;
+    int JJTFLOATINGPOINT = 40;
+    int JJTINTEGER = 41;
+    int JJTSTRING = 42;
+    int JJTNULL = 43;
 
 
     String[] jjtNodeName = { "CompositeExpression", "LiteralExpression", 
"DeferredExpression", "DynamicExpression",
-            "void", "Semicolon", "Assign", "LambdaExpression", 
"LambdaParameters", "Choice", "Or", "And", "Equal",
-            "NotEqual", "LessThan", "GreaterThan", "LessThanEqual", 
"GreaterThanEqual", "Concatenation", "Plus",
-            "Minus", "Mult", "Div", "Mod", "Negative", "Not", "Empty", 
"Value", "DotSuffix", "BracketSuffix",
+            "void", "Semicolon", "Assign", "LambdaExpression", 
"LambdaParameters", "Elvis", "Choice", "Or", "And",
+            "Equal", "NotEqual", "LessThan", "GreaterThan", "LessThanEqual", 
"GreaterThanEqual", "Concatenation",
+            "Plus", "Minus", "Mult", "Div", "Mod", "Negative", "Not", "Empty", 
"Value", "DotSuffix", "BracketSuffix",
             "MethodParameters", "SetData", "ListData", "MapData", "MapEntry", 
"Identifier", "Function", "True", "False",
             "FloatingPoint", "Integer", "String", "Null", };
 }
-/* JavaCC - OriginalChecksum=40650ef76eedbdb11f7d9a6683a802ca (do not edit 
this line) */
+/* JavaCC - OriginalChecksum=993ae4858a4f3806b4217fe368faaecf (do not edit 
this line) */
diff --git a/test/org/apache/el/TestELEvaluation.java 
b/test/org/apache/el/TestELEvaluation.java
index 71f08cb818..ada44c4b2c 100644
--- a/test/org/apache/el/TestELEvaluation.java
+++ b/test/org/apache/el/TestELEvaluation.java
@@ -245,6 +245,17 @@ public class TestELEvaluation {
         Assert.assertEquals("RUOK", evaluateExpression("${fn:concat2('RU', 
fn:toArray('O','K'))}"));
     }
 
+    @Test
+    public void testElvis01() throws Exception {
+        Assert.assertEquals("OK", evaluateExpression("${'OK'?:'FAIL'}"));
+    }
+
+    @Test
+    public void testElvis02() throws Exception {
+        Assert.assertEquals("OK", evaluateExpression("${null?:'OK'}"));
+    }
+
+
     // ************************************************************************
 
     private String evaluateExpression(String expression) {
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 18b4733a82..8e9fd48547 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -134,6 +134,10 @@
   </subsection>
   <subsection name="Jasper">
     <changelog>
+      <add>
+        Add support for the new Elvis operator (<code>:?</code>) in Jakarta
+        Expression language. (markt)
+      </add>
       <fix>
         Switch the <code>TldScanner</code> back to logging detailed scan
         results at debug level rather than trace level. (markt)


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

Reply via email to