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


The following commit(s) were added to refs/heads/main by this push:
     new 9ab668b2e9 Partial fix for BZ 69338. Better performance for >2 operand 
And/Or
9ab668b2e9 is described below

commit 9ab668b2e9b21d5259acca3221a4554a6d41f158
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Sep 25 19:55:09 2024 +0100

    Partial fix for BZ 69338. Better performance for >2 operand And/Or
    
    https://bz.apache.org/bugzilla/show_bug.cgi?id=69338
---
 java/org/apache/el/parser/AstAnd.java              |  17 +-
 java/org/apache/el/parser/AstOr.java               |  17 +-
 java/org/apache/el/parser/ELParser.java            | 743 +++++++++++----------
 java/org/apache/el/parser/ELParser.jjt             |   4 +-
 .../apache/el/parser/TestELParserPerformance.java  |  51 ++
 5 files changed, 466 insertions(+), 366 deletions(-)

diff --git a/java/org/apache/el/parser/AstAnd.java 
b/java/org/apache/el/parser/AstAnd.java
index 8a87feaaaa..a55ca4cfc5 100644
--- a/java/org/apache/el/parser/AstAnd.java
+++ b/java/org/apache/el/parser/AstAnd.java
@@ -33,13 +33,16 @@ public final class AstAnd extends BooleanNode {
 
     @Override
     public Object getValue(EvaluationContext ctx) throws ELException {
-        Object obj = children[0].getValue(ctx);
-        Boolean b = ELSupport.coerceToBoolean(ctx, obj, true);
-        if (!b.booleanValue()) {
-            return b;
+        int i = 0;
+        while (i < children.length - 1) {
+            Object obj = children[i].getValue(ctx);
+            Boolean b = ELSupport.coerceToBoolean(ctx, obj, true);
+            if (!b.booleanValue()) {
+                return b;
+            }
+            i++;
         }
-        obj = children[1].getValue(ctx);
-        b = ELSupport.coerceToBoolean(ctx, obj, true);
-        return b;
+        Object obj = children[i].getValue(ctx);
+        return ELSupport.coerceToBoolean(ctx, obj, true);
     }
 }
diff --git a/java/org/apache/el/parser/AstOr.java 
b/java/org/apache/el/parser/AstOr.java
index d5e7d40120..eeecf8dd38 100644
--- a/java/org/apache/el/parser/AstOr.java
+++ b/java/org/apache/el/parser/AstOr.java
@@ -33,13 +33,16 @@ public final class AstOr extends BooleanNode {
 
     @Override
     public Object getValue(EvaluationContext ctx) throws ELException {
-        Object obj = this.children[0].getValue(ctx);
-        Boolean b = ELSupport.coerceToBoolean(ctx, obj, true);
-        if (b.booleanValue()) {
-            return b;
+        int i = 0;
+        while (i < children.length - 1) {
+            Object obj = children[i].getValue(ctx);
+            Boolean b = ELSupport.coerceToBoolean(ctx, obj, true);
+            if (b.booleanValue()) {
+                return b;
+            }
+            i++;
         }
-        obj = this.children[1].getValue(ctx);
-        b = ELSupport.coerceToBoolean(ctx, obj, true);
-        return b;
+        Object obj = children[i].getValue(ctx);
+        return ELSupport.coerceToBoolean(ctx, obj, true);
     }
 }
diff --git a/java/org/apache/el/parser/ELParser.java 
b/java/org/apache/el/parser/ELParser.java
index 6cf7168afe..6ba979629e 100644
--- a/java/org/apache/el/parser/ELParser.java
+++ b/java/org/apache/el/parser/ELParser.java
@@ -594,7 +594,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     jj_la1[10] = jj_gen;
                     break label_6;
             }
-            if (jj_2_5(2)) {
+            if (jj_2_5(3)) {
                 jj_consume_token(QUESTIONMARK);
                 jj_consume_token(COLON);
                 AstElvis jjtn001 = new AstElvis(JJTELVIS);
@@ -691,67 +691,76 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
      */
     final public void Or() throws ParseException {
         And();
-        label_7: while (true) {
-            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-                case OR0:
-                case OR1: {
-                    ;
-                    break;
-                }
-                default:
-                    jj_la1[12] = jj_gen;
-                    break label_7;
-            }
-            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-                case OR0: {
-                    jj_consume_token(OR0);
-                    break;
-                }
-                case OR1: {
-                    jj_consume_token(OR1);
-                    break;
-                }
-                default:
-                    jj_la1[13] = jj_gen;
-                    jj_consume_token(-1);
-                    throw new ParseException();
-            }
-            AstOr jjtn001 = new AstOr(JJTOR);
-            boolean jjtc001 = true;
-            jjtree.openNodeScope(jjtn001);
-            try {
-                And();
-            } catch (Throwable jjte001) {
-                if (jjtc001) {
-                    jjtree.clearNodeScope(jjtn001);
-                    jjtc001 = false;
-                } else {
-                    jjtree.popNode();
-                }
-                if (jjte001 instanceof RuntimeException) {
-                    {
-                        if (true) {
-                            throw (RuntimeException) jjte001;
+        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+            case OR0:
+            case OR1: {
+                AstOr jjtn001 = new AstOr(JJTOR);
+                boolean jjtc001 = true;
+                jjtree.openNodeScope(jjtn001);
+                try {
+                    label_7: while (true) {
+                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+                            case OR0: {
+                                jj_consume_token(OR0);
+                                break;
+                            }
+                            case OR1: {
+                                jj_consume_token(OR1);
+                                break;
+                            }
+                            default:
+                                jj_la1[12] = jj_gen;
+                                jj_consume_token(-1);
+                                throw new ParseException();
+                        }
+                        And();
+                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+                            case OR0:
+                            case OR1: {
+                                ;
+                                break;
+                            }
+                            default:
+                                jj_la1[13] = jj_gen;
+                                break label_7;
+                        }
+                    }
+                } 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, jjtree.nodeArity() + 1);
                     }
                 }
-            } finally {
-                if (jjtc001) {
-                    jjtree.closeNodeScope(jjtn001, 2);
-                }
+                break;
             }
+            default:
+                jj_la1[14] = jj_gen;
+                ;
         }
     }
 
@@ -760,67 +769,76 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
      */
     final public void And() throws ParseException {
         Equality();
-        label_8: while (true) {
-            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-                case AND0:
-                case AND1: {
-                    ;
-                    break;
-                }
-                default:
-                    jj_la1[14] = jj_gen;
-                    break label_8;
-            }
-            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
-                case AND0: {
-                    jj_consume_token(AND0);
-                    break;
-                }
-                case AND1: {
-                    jj_consume_token(AND1);
-                    break;
-                }
-                default:
-                    jj_la1[15] = jj_gen;
-                    jj_consume_token(-1);
-                    throw new ParseException();
-            }
-            AstAnd jjtn001 = new AstAnd(JJTAND);
-            boolean jjtc001 = true;
-            jjtree.openNodeScope(jjtn001);
-            try {
-                Equality();
-            } catch (Throwable jjte001) {
-                if (jjtc001) {
-                    jjtree.clearNodeScope(jjtn001);
-                    jjtc001 = false;
-                } else {
-                    jjtree.popNode();
-                }
-                if (jjte001 instanceof RuntimeException) {
-                    {
-                        if (true) {
-                            throw (RuntimeException) jjte001;
+        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+            case AND0:
+            case AND1: {
+                AstAnd jjtn001 = new AstAnd(JJTAND);
+                boolean jjtc001 = true;
+                jjtree.openNodeScope(jjtn001);
+                try {
+                    label_8: while (true) {
+                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+                            case AND0: {
+                                jj_consume_token(AND0);
+                                break;
+                            }
+                            case AND1: {
+                                jj_consume_token(AND1);
+                                break;
+                            }
+                            default:
+                                jj_la1[15] = jj_gen;
+                                jj_consume_token(-1);
+                                throw new ParseException();
+                        }
+                        Equality();
+                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
+                            case AND0:
+                            case AND1: {
+                                ;
+                                break;
+                            }
+                            default:
+                                jj_la1[16] = jj_gen;
+                                break label_8;
+                        }
+                    }
+                } 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, jjtree.nodeArity() + 1);
                     }
                 }
-            } finally {
-                if (jjtc001) {
-                    jjtree.closeNodeScope(jjtn001, 2);
-                }
+                break;
             }
+            default:
+                jj_la1[17] = jj_gen;
+                ;
         }
     }
 
@@ -839,7 +857,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[16] = jj_gen;
+                    jj_la1[18] = jj_gen;
                     break label_9;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -855,7 +873,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();
                     }
@@ -909,7 +927,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[18] = jj_gen;
+                            jj_la1[20] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -952,7 +970,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();
             }
@@ -978,7 +996,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[20] = jj_gen;
+                    jj_la1[22] = jj_gen;
                     break label_10;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -994,7 +1012,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();
                     }
@@ -1048,7 +1066,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();
                     }
@@ -1102,7 +1120,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();
                     }
@@ -1156,7 +1174,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                             break;
                         }
                         default:
-                            jj_la1[24] = jj_gen;
+                            jj_la1[26] = jj_gen;
                             jj_consume_token(-1);
                             throw new ParseException();
                     }
@@ -1199,7 +1217,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[25] = jj_gen;
+                    jj_la1[27] = jj_gen;
                     jj_consume_token(-1);
                     throw new ParseException();
             }
@@ -1219,7 +1237,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[26] = jj_gen;
+                    jj_la1[28] = jj_gen;
                     break label_11;
             }
             jj_consume_token(CONCAT);
@@ -1275,7 +1293,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[27] = jj_gen;
+                    jj_la1[29] = jj_gen;
                     break label_12;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -1360,7 +1378,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();
             }
@@ -1383,7 +1401,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[29] = jj_gen;
+                    jj_la1[31] = jj_gen;
                     break label_13;
             }
             switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -1439,7 +1457,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();
                     }
@@ -1493,7 +1511,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();
                     }
@@ -1536,7 +1554,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();
             }
@@ -1600,7 +1618,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                         break;
                     }
                     default:
-                        jj_la1[33] = jj_gen;
+                        jj_la1[35] = jj_gen;
                         jj_consume_token(-1);
                         throw new ParseException();
                 }
@@ -1696,7 +1714,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();
         }
@@ -1719,7 +1737,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                         break;
                     }
                     default:
-                        jj_la1[35] = jj_gen;
+                        jj_la1[37] = jj_gen;
                         break label_14;
                 }
                 ValueSuffix();
@@ -1779,7 +1797,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[36] = jj_gen;
+                jj_la1[38] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
         }
@@ -1799,7 +1817,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[37] = jj_gen;
+                jj_la1[39] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
         }
@@ -1809,7 +1827,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[38] = jj_gen;
+                jj_la1[40] = jj_gen;
                 ;
         }
     }
@@ -1911,7 +1929,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[39] = jj_gen;
+                                jj_la1[41] = jj_gen;
                                 break label_15;
                         }
                         jj_consume_token(COMMA);
@@ -1920,7 +1938,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[40] = jj_gen;
+                    jj_la1[42] = jj_gen;
                     ;
             }
             jj_consume_token(RPAREN);
@@ -1972,7 +1990,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[41] = jj_gen;
+                    jj_la1[43] = jj_gen;
                     if (jj_2_7(2147483647)) {
                         Function();
                     } else {
@@ -1982,7 +2000,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[42] = jj_gen;
+                                jj_la1[44] = jj_gen;
                                 if (jj_2_8(5)) {
                                     SetData();
                                 } else {
@@ -1996,7 +2014,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                             break;
                                         }
                                         default:
-                                            jj_la1[43] = jj_gen;
+                                            jj_la1[45] = jj_gen;
                                             jj_consume_token(-1);
                                             throw new ParseException();
                                     }
@@ -2040,7 +2058,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[44] = jj_gen;
+                                jj_la1[46] = jj_gen;
                                 break label_16;
                         }
                         jj_consume_token(COMMA);
@@ -2049,7 +2067,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[45] = jj_gen;
+                    jj_la1[47] = jj_gen;
                     ;
             }
             jj_consume_token(RBRACE);
@@ -2115,7 +2133,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[46] = jj_gen;
+                                jj_la1[48] = jj_gen;
                                 break label_17;
                         }
                         jj_consume_token(COMMA);
@@ -2124,7 +2142,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[47] = jj_gen;
+                    jj_la1[49] = jj_gen;
                     ;
             }
             jj_consume_token(RBRACK);
@@ -2194,7 +2212,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                                 break;
                             }
                             default:
-                                jj_la1[48] = jj_gen;
+                                jj_la1[50] = jj_gen;
                                 break label_18;
                         }
                         jj_consume_token(COMMA);
@@ -2203,7 +2221,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[49] = jj_gen;
+                    jj_la1[51] = jj_gen;
                     ;
             }
             jj_consume_token(RBRACE);
@@ -2319,7 +2337,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                     break;
                 }
                 default:
-                    jj_la1[50] = jj_gen;
+                    jj_la1[52] = jj_gen;
                     ;
             }
             if (t1 != null) {
@@ -2336,7 +2354,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                         break;
                     }
                     default:
-                        jj_la1[51] = jj_gen;
+                        jj_la1[53] = jj_gen;
                         break label_19;
                 }
             }
@@ -2400,7 +2418,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[52] = jj_gen;
+                jj_la1[54] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
         }
@@ -2438,7 +2456,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 break;
             }
             default:
-                jj_la1[53] = jj_gen;
+                jj_la1[55] = jj_gen;
                 jj_consume_token(-1);
                 throw new ParseException();
         }
@@ -2616,59 +2634,71 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         }
     }
 
-    private boolean jj_3R_LambdaExpressionOrInvocation_144_45_28() {
-        if (jj_3R_Ternary_155_5_30()) {
+    private boolean jj_3R_LambdaExpressionOrInvocation_144_45_30() {
+        if (jj_3R_Ternary_155_5_22()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_MapEntry_374_5_109() {
-        if (jj_3R_Expression_99_5_33()) {
+    private boolean jj_3R_MapEntry_374_5_111() {
+        if (jj_3R_Expression_99_5_35()) {
             return true;
         }
         if (jj_scan_token(COLON)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_33()) {
+        if (jj_3R_Expression_99_5_35()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_MapData_368_11_107() {
-        if (jj_3R_MapEntry_374_5_109()) {
+    private boolean jj_3R_MapData_368_11_109() {
+        if (jj_3R_MapEntry_374_5_111()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_And_179_5_40() {
-        if (jj_3R_Equality_188_5_45()) {
+    private boolean jj_3R_And_179_5_34() {
+        if (jj_3R_Equality_188_5_40()) {
             return true;
         }
         Token xsp;
-        while (true) {
-            xsp = jj_scanpos;
-            if (jj_3R_And_179_17_46()) {
-                jj_scanpos = xsp;
-                break;
-            }
+        xsp = jj_scanpos;
+        if (jj_3R_And_180_17_47()) {
+            jj_scanpos = xsp;
         }
         return false;
     }
 
-    private boolean jj_3R_SetData_349_26_34() {
+    private boolean jj_3R_SetData_349_26_36() {
         if (jj_scan_token(COMMA)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_33()) {
+        if (jj_3R_Expression_99_5_35()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Or_170_12_42() {
+    private boolean jj_3R_Or_171_12_43() {
+        Token xsp;
+        if (jj_3R_Or_170_13_48()) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_Or_170_13_48()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_Or_170_13_48() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(41)) {
@@ -2677,7 +2707,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_And_179_5_40()) {
+        if (jj_3R_And_179_5_34()) {
             return true;
         }
         return false;
@@ -2689,7 +2719,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_MapData_368_11_107()) {
+        if (jj_3R_MapData_368_11_109()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RBRACE)) {
@@ -2698,24 +2728,24 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_46_41() {
+    private boolean jj_3R_LambdaParameters_132_46_42() {
         if (jj_scan_token(COMMA)) {
             return true;
         }
-        if (jj_3R_Identifier_383_5_36()) {
+        if (jj_3R_Identifier_383_5_37()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ListData_356_11_106() {
-        if (jj_3R_Expression_99_5_33()) {
+    private boolean jj_3R_ListData_356_11_108() {
+        if (jj_3R_Expression_99_5_35()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_ListData_356_26_111()) {
+            if (jj_3R_ListData_356_26_113()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2723,17 +2753,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Or_170_5_35() {
-        if (jj_3R_And_179_5_40()) {
+    private boolean jj_3R_Or_170_5_29() {
+        if (jj_3R_And_179_5_34()) {
             return true;
         }
         Token xsp;
-        while (true) {
-            xsp = jj_scanpos;
-            if (jj_3R_Or_170_12_42()) {
-                jj_scanpos = xsp;
-                break;
-            }
+        xsp = jj_scanpos;
+        if (jj_3R_Or_171_12_43()) {
+            jj_scanpos = xsp;
         }
         return false;
     }
@@ -2744,7 +2771,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_ListData_356_11_106()) {
+        if (jj_3R_ListData_356_11_108()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RBRACK)) {
@@ -2753,11 +2780,11 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Ternary_160_9_43() {
+    private boolean jj_3R_Ternary_160_9_44() {
         if (jj_scan_token(QUESTIONMARK)) {
             return true;
         }
-        if (jj_3R_Ternary_155_5_30()) {
+        if (jj_3R_Ternary_155_5_22()) {
             return true;
         }
         if (jj_scan_token(COLON)) {
@@ -2766,14 +2793,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_SetData_349_11_29() {
-        if (jj_3R_Expression_99_5_33()) {
+    private boolean jj_3R_SetData_349_11_31() {
+        if (jj_3R_Expression_99_5_35()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_SetData_349_26_34()) {
+            if (jj_3R_SetData_349_26_36()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2781,21 +2808,21 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_MethodParameters_323_31_113() {
+    private boolean jj_3R_MethodParameters_323_31_115() {
         if (jj_scan_token(COMMA)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_31_37() {
-        if (jj_3R_Identifier_383_5_36()) {
+    private boolean jj_3R_LambdaParameters_132_31_38() {
+        if (jj_3R_Identifier_383_5_37()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_LambdaParameters_132_46_41()) {
+            if (jj_3R_LambdaParameters_132_46_42()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2803,12 +2830,12 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Ternary_157_5_38() {
+    private boolean jj_3R_Ternary_157_5_39() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_3_5()) {
             jj_scanpos = xsp;
-            if (jj_3R_Ternary_160_9_43()) {
+            if (jj_3R_Ternary_160_9_44()) {
                 return true;
             }
         }
@@ -2822,19 +2849,19 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         if (jj_scan_token(COLON)) {
             return true;
         }
-        if (jj_3R_Ternary_155_5_30()) {
+        if (jj_3R_Ternary_155_5_22()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_SetData_348_5_24() {
+    private boolean jj_3R_SetData_348_5_25() {
         if (jj_scan_token(START_SET_OR_MAP)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_SetData_349_11_29()) {
+        if (jj_3R_SetData_349_11_31()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RBRACE)) {
@@ -2843,7 +2870,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_null_334_18_23() {
+    private boolean jj_3R_null_334_18_24() {
         if (jj_scan_token(IDENTIFIER)) {
             return true;
         }
@@ -2853,14 +2880,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Ternary_155_5_30() {
-        if (jj_3R_Or_170_5_35()) {
+    private boolean jj_3R_Ternary_155_5_22() {
+        if (jj_3R_Or_170_5_29()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Ternary_157_5_38()) {
+            if (jj_3R_Ternary_157_5_39()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2871,7 +2898,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     private boolean jj_3_7() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_null_334_18_23()) {
+        if (jj_3R_null_334_18_24()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(IDENTIFIER)) {
@@ -2911,13 +2938,13 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_20_32() {
+    private boolean jj_3R_LambdaParameters_132_20_33() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_LambdaParameters_132_31_37()) {
+        if (jj_3R_LambdaParameters_132_31_38()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RPAREN)) {
@@ -2927,14 +2954,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     }
 
     private boolean jj_3_8() {
-        if (jj_3R_SetData_348_5_24()) {
+        if (jj_3R_SetData_348_5_25()) {
             return true;
         }
         return false;
     }
 
     private boolean jj_3R_NonLiteral_335_7_89() {
-        if (jj_3R_Identifier_383_5_36()) {
+        if (jj_3R_Identifier_383_5_37()) {
             return true;
         }
         return false;
@@ -2951,7 +2978,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         if (jj_scan_token(LPAREN)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_33()) {
+        if (jj_3R_Expression_99_5_35()) {
             return true;
         }
         if (jj_scan_token(RPAREN)) {
@@ -2960,14 +2987,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_MethodParameters_323_16_112() {
-        if (jj_3R_Expression_99_5_33()) {
+    private boolean jj_3R_MethodParameters_323_16_114() {
+        if (jj_3R_Expression_99_5_35()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_MethodParameters_323_31_113()) {
+            if (jj_3R_MethodParameters_323_31_115()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2975,14 +3002,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_297_41_110() {
-        if (jj_3R_MethodParameters_323_5_108()) {
+    private boolean jj_3R_ValueSuffix_297_41_112() {
+        if (jj_3R_MethodParameters_323_5_110()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_332_5_79() {
+    private boolean jj_3R_NonLiteral_332_5_80() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_3_6()) {
@@ -3009,11 +3036,11 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaExpressionOrInvocation_141_5_22() {
+    private boolean jj_3R_LambdaExpressionOrInvocation_141_5_23() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
-        if (jj_3R_LambdaParameters_132_5_26()) {
+        if (jj_3R_LambdaParameters_132_5_27()) {
             return true;
         }
         if (jj_scan_token(ARROW)) {
@@ -3023,7 +3050,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         xsp = jj_scanpos;
         if (jj_3_4()) {
             jj_scanpos = xsp;
-            if (jj_3R_LambdaExpressionOrInvocation_144_45_28()) {
+            if (jj_3R_LambdaExpressionOrInvocation_144_45_30()) {
                 return true;
             }
         }
@@ -3034,19 +3061,19 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     }
 
     private boolean jj_3_6() {
-        if (jj_3R_LambdaExpressionOrInvocation_141_5_22()) {
+        if (jj_3R_LambdaExpressionOrInvocation_141_5_23()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_MethodParameters_323_5_108() {
+    private boolean jj_3R_MethodParameters_323_5_110() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_MethodParameters_323_16_112()) {
+        if (jj_3R_MethodParameters_323_16_114()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RPAREN)) {
@@ -3055,19 +3082,19 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_5_31() {
-        if (jj_3R_Identifier_383_5_36()) {
+    private boolean jj_3R_LambdaParameters_132_5_32() {
+        if (jj_3R_Identifier_383_5_37()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_5_26() {
+    private boolean jj_3R_LambdaParameters_132_5_27() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_LambdaParameters_132_5_31()) {
+        if (jj_3R_LambdaParameters_132_5_32()) {
             jj_scanpos = xsp;
-            if (jj_3R_LambdaParameters_132_20_32()) {
+            if (jj_3R_LambdaParameters_132_20_33()) {
                 return true;
             }
         }
@@ -3084,11 +3111,11 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_BracketSuffix_315_5_93() {
+    private boolean jj_3R_BracketSuffix_315_5_103() {
         if (jj_scan_token(LBRACK)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_33()) {
+        if (jj_3R_Expression_99_5_35()) {
             return true;
         }
         if (jj_scan_token(RBRACK)) {
@@ -3098,7 +3125,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     }
 
     private boolean jj_3R_LambdaExpression_124_5_21() {
-        if (jj_3R_LambdaParameters_132_5_26()) {
+        if (jj_3R_LambdaParameters_132_5_27()) {
             return true;
         }
         if (jj_scan_token(ARROW)) {
@@ -3108,21 +3135,21 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         xsp = jj_scanpos;
         if (jj_3_3()) {
             jj_scanpos = xsp;
-            if (jj_3R_LambdaExpression_124_68_27()) {
+            if (jj_3R_LambdaExpression_124_68_28()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_297_21_81() {
-        if (jj_3R_BracketSuffix_315_5_93()) {
+    private boolean jj_3R_ValueSuffix_297_21_93() {
+        if (jj_3R_BracketSuffix_315_5_103()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Semicolon_107_20_44() {
+    private boolean jj_3R_Semicolon_107_20_46() {
         if (jj_scan_token(SEMICOLON)) {
             return true;
         }
@@ -3132,8 +3159,8 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Assignment_116_5_25() {
-        if (jj_3R_Ternary_155_5_30()) {
+    private boolean jj_3R_Assignment_116_5_26() {
+        if (jj_3R_Ternary_155_5_22()) {
             return true;
         }
         Token xsp;
@@ -3147,7 +3174,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_DotSuffix_306_5_92() {
+    private boolean jj_3R_DotSuffix_306_5_102() {
         if (jj_scan_token(DOT)) {
             return true;
         }
@@ -3169,28 +3196,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_25()) {
+            if (jj_3R_Assignment_116_5_26()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_297_7_80() {
-        if (jj_3R_DotSuffix_306_5_92()) {
+    private boolean jj_3R_ValueSuffix_297_7_92() {
+        if (jj_3R_DotSuffix_306_5_102()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Semicolon_107_5_39() {
+    private boolean jj_3R_Semicolon_107_5_41() {
         if (jj_3R_Assignment_115_5_20()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Semicolon_107_20_44()) {
+            if (jj_3R_Semicolon_107_20_46()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3198,70 +3225,70 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_297_5_77() {
+    private boolean jj_3R_ValueSuffix_297_5_81() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_ValueSuffix_297_7_80()) {
+        if (jj_3R_ValueSuffix_297_7_92()) {
             jj_scanpos = xsp;
-            if (jj_3R_ValueSuffix_297_21_81()) {
+            if (jj_3R_ValueSuffix_297_21_93()) {
                 return true;
             }
         }
         xsp = jj_scanpos;
-        if (jj_3R_ValueSuffix_297_41_110()) {
+        if (jj_3R_ValueSuffix_297_41_112()) {
             jj_scanpos = xsp;
         }
         return false;
     }
 
-    private boolean jj_3R_Value_278_21_74() {
-        if (jj_3R_ValueSuffix_297_5_77()) {
+    private boolean jj_3R_Value_278_21_78() {
+        if (jj_3R_ValueSuffix_297_5_81()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ValuePrefix_288_7_76() {
-        if (jj_3R_NonLiteral_332_5_79()) {
+    private boolean jj_3R_ValuePrefix_288_7_77() {
+        if (jj_3R_NonLiteral_332_5_80()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Expression_99_5_33() {
-        if (jj_3R_Semicolon_107_5_39()) {
+    private boolean jj_3R_Expression_99_5_35() {
+        if (jj_3R_Semicolon_107_5_41()) {
             return true;
         }
         return false;
     }
 
     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_287_5_75()) {
+        if (jj_3R_ValuePrefix_287_5_76()) {
             jj_scanpos = xsp;
-            if (jj_3R_ValuePrefix_288_7_76()) {
+            if (jj_3R_ValuePrefix_288_7_77()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Value_278_5_72() {
-        if (jj_3R_ValuePrefix_287_5_73()) {
+    private boolean jj_3R_ValuePrefix_287_5_76() {
+        if (jj_3R_Literal_414_5_79()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_Value_278_5_71() {
+        if (jj_3R_ValuePrefix_287_5_75()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Value_278_21_74()) {
+            if (jj_3R_Value_278_21_78()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3276,24 +3303,24 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Unary_269_9_68() {
-        if (jj_3R_Value_278_5_72()) {
+    private boolean jj_3R_Unary_269_9_67() {
+        if (jj_3R_Value_278_5_71()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_267_9_67() {
+    private boolean jj_3R_Unary_267_9_66() {
         if (jj_scan_token(EMPTY)) {
             return true;
         }
-        if (jj_3R_Unary_263_9_61()) {
+        if (jj_3R_Unary_263_9_62()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_265_9_66() {
+    private boolean jj_3R_Unary_265_9_65() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(37)) {
@@ -3302,22 +3329,22 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Unary_263_9_61()) {
+        if (jj_3R_Unary_263_9_62()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_263_9_61() {
+    private boolean jj_3R_Unary_263_9_62() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Unary_263_9_65()) {
+        if (jj_3R_Unary_263_9_64()) {
             jj_scanpos = xsp;
-            if (jj_3R_Unary_265_9_66()) {
+            if (jj_3R_Unary_265_9_65()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Unary_267_9_67()) {
+                if (jj_3R_Unary_267_9_66()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_Unary_269_9_68()) {
+                    if (jj_3R_Unary_269_9_67()) {
                         return true;
                     }
                 }
@@ -3326,11 +3353,11 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Unary_263_9_65() {
+    private boolean jj_3R_Unary_263_9_64() {
         if (jj_scan_token(MINUS)) {
             return true;
         }
-        if (jj_3R_Unary_263_9_61()) {
+        if (jj_3R_Unary_263_9_62()) {
             return true;
         }
         return false;
@@ -3343,7 +3370,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Multiplication_253_9_71() {
+    private boolean jj_3R_Multiplication_253_9_74() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(51)) {
@@ -3352,7 +3379,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Unary_263_9_61()) {
+        if (jj_3R_Unary_263_9_62()) {
             return true;
         }
         return false;
@@ -3365,7 +3392,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Multiplication_251_9_70() {
+    private boolean jj_3R_Multiplication_251_9_73() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(49)) {
@@ -3374,20 +3401,20 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Unary_263_9_61()) {
+        if (jj_3R_Unary_263_9_62()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_249_9_62() {
+    private boolean jj_3R_Multiplication_249_9_68() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Multiplication_249_9_69()) {
+        if (jj_3R_Multiplication_249_9_72()) {
             jj_scanpos = xsp;
-            if (jj_3R_Multiplication_251_9_70()) {
+            if (jj_3R_Multiplication_251_9_73()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Multiplication_253_9_71()) {
+                if (jj_3R_Multiplication_253_9_74()) {
                     return true;
                 }
             }
@@ -3395,24 +3422,24 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Multiplication_249_9_69() {
+    private boolean jj_3R_Multiplication_249_9_72() {
         if (jj_scan_token(MULT)) {
             return true;
         }
-        if (jj_3R_Unary_263_9_61()) {
+        if (jj_3R_Unary_263_9_62()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_247_5_59() {
-        if (jj_3R_Unary_263_9_61()) {
+    private boolean jj_3R_Multiplication_247_5_56() {
+        if (jj_3R_Unary_263_9_62()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Multiplication_249_9_62()) {
+            if (jj_3R_Multiplication_249_9_68()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3427,46 +3454,46 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Math_237_9_64() {
+    private boolean jj_3R_Math_237_9_70() {
         if (jj_scan_token(MINUS)) {
             return true;
         }
-        if (jj_3R_Multiplication_247_5_59()) {
+        if (jj_3R_Multiplication_247_5_56()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Boolean_429_7_103() {
+    private boolean jj_3R_Boolean_429_7_105() {
         if (jj_scan_token(FALSE)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Math_235_9_60() {
+    private boolean jj_3R_Math_235_9_63() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Math_235_9_63()) {
+        if (jj_3R_Math_235_9_69()) {
             jj_scanpos = xsp;
-            if (jj_3R_Math_237_9_64()) {
+            if (jj_3R_Math_237_9_70()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Math_235_9_63() {
+    private boolean jj_3R_Math_235_9_69() {
         if (jj_scan_token(PLUS)) {
             return true;
         }
-        if (jj_3R_Multiplication_247_5_59()) {
+        if (jj_3R_Multiplication_247_5_56()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Boolean_427_5_102() {
+    private boolean jj_3R_Boolean_427_5_104() {
         if (jj_scan_token(TRUE)) {
             return true;
         }
@@ -3476,23 +3503,23 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     private boolean jj_3R_Boolean_427_5_94() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Boolean_427_5_102()) {
+        if (jj_3R_Boolean_427_5_104()) {
             jj_scanpos = xsp;
-            if (jj_3R_Boolean_429_7_103()) {
+            if (jj_3R_Boolean_429_7_105()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Math_233_5_53() {
-        if (jj_3R_Multiplication_247_5_59()) {
+    private boolean jj_3R_Math_233_5_52() {
+        if (jj_3R_Multiplication_247_5_56()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Math_235_9_60()) {
+            if (jj_3R_Math_235_9_63()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3514,11 +3541,11 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Concatenation_223_10_54() {
+    private boolean jj_3R_Concatenation_223_10_57() {
         if (jj_scan_token(CONCAT)) {
             return true;
         }
-        if (jj_3R_Math_233_5_53()) {
+        if (jj_3R_Math_233_5_52()) {
             return true;
         }
         return false;
@@ -3538,7 +3565,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Function_396_24_104() {
+    private boolean jj_3R_Function_396_24_106() {
         if (jj_scan_token(COLON)) {
             return true;
         }
@@ -3555,7 +3582,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Literal_414_5_78() {
+    private boolean jj_3R_Literal_414_5_79() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_3R_Literal_414_5_82()) {
@@ -3577,13 +3604,13 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     }
 
     private boolean jj_3R_Concatenation_221_6_49() {
-        if (jj_3R_Math_233_5_53()) {
+        if (jj_3R_Math_233_5_52()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Concatenation_223_10_54()) {
+            if (jj_3R_Concatenation_223_10_57()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3591,14 +3618,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Function_405_7_105() {
-        if (jj_3R_MethodParameters_323_5_108()) {
+    private boolean jj_3R_Function_405_7_107() {
+        if (jj_3R_MethodParameters_323_5_110()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Compare_210_9_58() {
+    private boolean jj_3R_Compare_210_9_61() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(29)) {
@@ -3613,7 +3640,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Compare_208_9_57() {
+    private boolean jj_3R_Compare_208_9_60() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(31)) {
@@ -3628,7 +3655,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Compare_206_9_56() {
+    private boolean jj_3R_Compare_206_9_59() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(25)) {
@@ -3643,16 +3670,16 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Compare_204_9_50() {
+    private boolean jj_3R_Compare_204_9_53() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Compare_204_9_55()) {
+        if (jj_3R_Compare_204_9_58()) {
             jj_scanpos = xsp;
-            if (jj_3R_Compare_206_9_56()) {
+            if (jj_3R_Compare_206_9_59()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Compare_208_9_57()) {
+                if (jj_3R_Compare_208_9_60()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_Compare_210_9_58()) {
+                    if (jj_3R_Compare_210_9_61()) {
                         return true;
                     }
                 }
@@ -3661,7 +3688,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Compare_204_9_55() {
+    private boolean jj_3R_Compare_204_9_58() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(27)) {
@@ -3682,15 +3709,15 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Function_396_24_104()) {
+        if (jj_3R_Function_396_24_106()) {
             jj_scanpos = xsp;
         }
-        if (jj_3R_Function_405_7_105()) {
+        if (jj_3R_Function_405_7_107()) {
             return true;
         }
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Function_405_7_105()) {
+            if (jj_3R_Function_405_7_107()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3698,14 +3725,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Compare_202_5_47() {
+    private boolean jj_3R_Compare_202_5_45() {
         if (jj_3R_Concatenation_221_6_49()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Compare_204_9_50()) {
+            if (jj_3R_Compare_204_9_53()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3713,7 +3740,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Equality_192_9_52() {
+    private boolean jj_3R_Equality_192_9_55() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(35)) {
@@ -3722,25 +3749,25 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Compare_202_5_47()) {
+        if (jj_3R_Compare_202_5_45()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Equality_190_9_48() {
+    private boolean jj_3R_Equality_190_9_50() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Equality_190_9_51()) {
+        if (jj_3R_Equality_190_9_54()) {
             jj_scanpos = xsp;
-            if (jj_3R_Equality_192_9_52()) {
+            if (jj_3R_Equality_192_9_55()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Equality_190_9_51() {
+    private boolean jj_3R_Equality_190_9_54() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(33)) {
@@ -3749,20 +3776,28 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Compare_202_5_47()) {
+        if (jj_3R_Compare_202_5_45()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Identifier_383_5_36() {
-        if (jj_scan_token(IDENTIFIER)) {
+    private boolean jj_3R_And_180_17_47() {
+        Token xsp;
+        if (jj_3R_And_179_18_51()) {
             return true;
         }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_And_179_18_51()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
         return false;
     }
 
-    private boolean jj_3R_And_179_17_46() {
+    private boolean jj_3R_And_179_18_51() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(39)) {
@@ -3771,20 +3806,27 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Equality_188_5_45()) {
+        if (jj_3R_Equality_188_5_40()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_Identifier_383_5_37() {
+        if (jj_scan_token(IDENTIFIER)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Equality_188_5_45() {
-        if (jj_3R_Compare_202_5_47()) {
+    private boolean jj_3R_Equality_188_5_40() {
+        if (jj_3R_Compare_202_5_45()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Equality_190_9_48()) {
+            if (jj_3R_Equality_190_9_50()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3792,18 +3834,18 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaExpression_124_68_27() {
-        if (jj_3R_Ternary_155_5_30()) {
+    private boolean jj_3R_LambdaExpression_124_68_28() {
+        if (jj_3R_Ternary_155_5_22()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ListData_356_26_111() {
+    private boolean jj_3R_ListData_356_26_113() {
         if (jj_scan_token(COMMA)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_33()) {
+        if (jj_3R_Expression_99_5_35()) {
             return true;
         }
         return false;
@@ -3820,7 +3862,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[54];
+    final private int[] jj_la1 = new int[56];
     static private int[] jj_la1_0;
     static private int[] jj_la1_1;
     static {
@@ -3830,17 +3872,18 @@ 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, 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, };
+                0x0, 0x0, 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, 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, };
+                0x10000, 0x600, 0x600, 0x600, 0x180, 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];
@@ -3863,7 +3906,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         token = new Token();
         jj_ntk = -1;
         jj_gen = 0;
-        for (int i = 0; i < 54; i++) {
+        for (int i = 0; i < 56; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3888,7 +3931,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         jj_ntk = -1;
         jjtree.reset();
         jj_gen = 0;
-        for (int i = 0; i < 54; i++) {
+        for (int i = 0; i < 56; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3903,7 +3946,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         token = new Token();
         jj_ntk = -1;
         jj_gen = 0;
-        for (int i = 0; i < 54; i++) {
+        for (int i = 0; i < 56; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3927,7 +3970,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         jj_ntk = -1;
         jjtree.reset();
         jj_gen = 0;
-        for (int i = 0; i < 54; i++) {
+        for (int i = 0; i < 56; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3941,7 +3984,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         token = new Token();
         jj_ntk = -1;
         jj_gen = 0;
-        for (int i = 0; i < 54; i++) {
+        for (int i = 0; i < 56; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -3956,7 +3999,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         jj_ntk = -1;
         jjtree.reset();
         jj_gen = 0;
-        for (int i = 0; i < 54; i++) {
+        for (int i = 0; i < 56; i++) {
             jj_la1[i] = -1;
         }
         for (int i = 0; i < jj_2_rtns.length; i++) {
@@ -4120,7 +4163,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
             la1tokens[jj_kind] = true;
             jj_kind = -1;
         }
-        for (int i = 0; i < 54; i++) {
+        for (int i = 0; i < 56; 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 8983f65c9b..379de3058b 100644
--- a/java/org/apache/el/parser/ELParser.jjt
+++ b/java/org/apache/el/parser/ELParser.jjt
@@ -167,7 +167,7 @@ void Ternary() : {}
  */
 void Or() : {}
 {
-    And() ((<OR0>|<OR1>) And() #Or(2))*
+    And() [((<OR0>|<OR1>) And())+ #Or(jjtree.nodeArity() + 1)]
 }
 
 /*
@@ -176,7 +176,7 @@ void Or() : {}
  */
 void And() : {}
 {
-    Equality() ((<AND0>|<AND1>) Equality() #And(2))*
+    Equality() [((<AND0>|<AND1>) Equality())+ #And(jjtree.nodeArity() + 1)]
 }
 
 /*
diff --git a/test/org/apache/el/parser/TestELParserPerformance.java 
b/test/org/apache/el/parser/TestELParserPerformance.java
index eb860f4be9..424a6fe27f 100644
--- a/test/org/apache/el/parser/TestELParserPerformance.java
+++ b/test/org/apache/el/parser/TestELParserPerformance.java
@@ -19,8 +19,13 @@ package org.apache.el.parser;
 import java.io.StringReader;
 
 import jakarta.el.ELBaseTest;
+import jakarta.el.ELContext;
+import jakarta.el.ELManager;
+import jakarta.el.ExpressionFactory;
+import jakarta.el.ValueExpression;
 
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import org.apache.tomcat.util.collections.SynchronizedStack;
@@ -91,4 +96,50 @@ public class TestELParserPerformance extends ELBaseTest {
 
         Assert.assertTrue("Using new ElParser() was faster then using 
ELParser.ReInit", reinitTotalTime < newTotalTime);
     }
+
+
+    /*
+     * Ignored by default since this is an absolute test primarily for
+     * https://bz.apache.org/bugzilla/show_bug.cgi?id=69338
+     */
+    @Ignore
+    @Test
+    public void testAstAnd() {
+
+        ELManager manager = new ELManager();
+        ELContext context = manager.getELContext();
+        ExpressionFactory factory = ELManager.getExpressionFactory();
+
+        long durations[] = new long[9];
+        for (int j = 0; j < 5; j++) {
+            for (int operandCount = 2; operandCount < 11; operandCount ++) {
+
+                StringBuilder sb = new StringBuilder("${true");
+                for (int i = 2; i <= operandCount; i++) {
+                    sb.append(" && true");
+                }
+                sb.append("}");
+
+                String expression = sb.toString();
+
+                long start = System.nanoTime();
+
+                for (int i = 0; i < 2000000; i++) {
+                    ValueExpression ve = 
factory.createValueExpression(context, expression, Boolean.class);
+                    Boolean result = ve.getValue(context);
+                    Assert.assertEquals(Boolean.TRUE, result);
+                }
+
+                long duration = System.nanoTime() - start;
+
+                if (j > 0) {
+                    durations[operandCount - 2] += duration;
+                }
+            }
+        }
+        for (int operandCount = 2; operandCount < 11; operandCount ++) {
+            System.out.println("Operand count [" + operandCount + "], duration 
[" + durations[operandCount -2] + "]");
+        }
+        System.out.println("");
+    }
 }


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

Reply via email to