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

markt-asf 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 4b67be6578 Ensure internal state is reset before re-using ELParser
4b67be6578 is described below

commit 4b67be657895fb080307b3539d68a2eb35910b40
Author: Mark Thomas <[email protected]>
AuthorDate: Thu Jul 9 15:22:01 2026 +0100

    Ensure internal state is reset before re-using ELParser
---
 java/org/apache/el/parser/ELParser.java            | 537 +++++++++++----------
 java/org/apache/el/parser/ELParser.jjt             |  10 +
 .../org/apache/el/parser/ELParserTokenManager.java |   9 +
 java/org/apache/el/parser/NodeVisitor.java         |   1 +
 webapps/docs/changelog.xml                         |   3 +
 5 files changed, 292 insertions(+), 268 deletions(-)

diff --git a/java/org/apache/el/parser/ELParser.java 
b/java/org/apache/el/parser/ELParser.java
index 094373b47e..d4f679a85f 100644
--- a/java/org/apache/el/parser/ELParser.java
+++ b/java/org/apache/el/parser/ELParser.java
@@ -35,6 +35,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         boolean jjtc000 = true;
         jjtree.openNodeScope(jjtn000);
         try {
+            token_source.reset();
             label_1:
             while (true) {
                 switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
@@ -594,7 +595,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     }
 
     /*
-     * Ternary For '?:' '? :', then Or
+     * Ternary For '??' '?:' '? :', then Or
      */
     final public void Ternary() throws ParseException {
         Or();
@@ -2783,30 +2784,72 @@ 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_Equality_185_5_45() {
+        if (jj_3R_Compare_199_5_48()) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_Equality_187_9_49()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_MapEntry_374_5_111() {
+        if (jj_3R_Expression_95_5_33()) {
+            return true;
+        }
+        if (jj_scan_token(COLON)) {
+            return true;
+        }
+        if (jj_3R_Expression_95_5_33()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_MapData_368_11_109() {
+        if (jj_3R_MapEntry_374_5_111()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_LambdaExpression_120_68_27() {
+        if (jj_3R_Ternary_151_5_30()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_LambdaExpressionOrInvocation_140_45_28() {
+        if (jj_3R_Ternary_151_5_30()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_SetData_353_26_34() {
+    private boolean jj_3R_SetData_349_26_34() {
         if (jj_scan_token(COMMA)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_33()) {
+        if (jj_3R_Expression_95_5_33()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_MapData_371_5_103() {
+    private boolean jj_3R_MapData_367_5_103() {
         if (jj_scan_token(START_SET_OR_MAP)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_MapData_372_11_109()) {
+        if (jj_3R_MapData_368_11_109()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RBRACE)) {
@@ -2815,26 +2858,26 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_And_180_5_40() {
-        if (jj_3R_Equality_189_5_45()) {
+    private boolean jj_3R_And_176_5_40() {
+        if (jj_3R_Equality_185_5_45()) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_And_181_17_46()) {
+        if (jj_3R_And_177_17_46()) {
             jj_scanpos = xsp;
         }
         return false;
     }
 
-    private boolean jj_3R_Or_172_12_42() {
+    private boolean jj_3R_Or_168_12_42() {
         Token xsp;
-        if (jj_3R_Or_171_13_47()) {
+        if (jj_3R_Or_167_13_47()) {
             return true;
         }
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Or_171_13_47()) {
+            if (jj_3R_Or_167_13_47()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2842,7 +2885,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Or_171_13_47() {
+    private boolean jj_3R_Or_167_13_47() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(41)) {
@@ -2851,20 +2894,20 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_And_180_5_40()) {
+        if (jj_3R_And_176_5_40()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ListData_360_11_108() {
-        if (jj_3R_Expression_99_5_33()) {
+    private boolean jj_3R_ListData_356_11_108() {
+        if (jj_3R_Expression_95_5_33()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_ListData_360_26_113()) {
+            if (jj_3R_ListData_356_26_113()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2872,35 +2915,35 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_46_41() {
+    private boolean jj_3R_LambdaParameters_128_46_41() {
         if (jj_scan_token(COMMA)) {
             return true;
         }
-        if (jj_3R_Identifier_387_5_36()) {
+        if (jj_3R_Identifier_383_5_36()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Or_171_5_35() {
-        if (jj_3R_And_180_5_40()) {
+    private boolean jj_3R_Or_167_5_35() {
+        if (jj_3R_And_176_5_40()) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Or_172_12_42()) {
+        if (jj_3R_Or_168_12_42()) {
             jj_scanpos = xsp;
         }
         return false;
     }
 
-    private boolean jj_3R_ListData_359_5_102() {
+    private boolean jj_3R_ListData_355_5_102() {
         if (jj_scan_token(LBRACK)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_ListData_360_11_108()) {
+        if (jj_3R_ListData_356_11_108()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RBRACK)) {
@@ -2909,14 +2952,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_SetData_353_11_29() {
-        if (jj_3R_Expression_99_5_33()) {
+    private boolean jj_3R_SetData_349_11_29() {
+        if (jj_3R_Expression_95_5_33()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_SetData_353_26_34()) {
+            if (jj_3R_SetData_349_26_34()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -2924,11 +2967,11 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Ternary_161_9_43() {
+    private boolean jj_3R_Ternary_157_9_43() {
         if (jj_scan_token(QUESTIONMARK)) {
             return true;
         }
-        if (jj_3R_Ternary_155_5_30()) {
+        if (jj_3R_Ternary_151_5_30()) {
             return true;
         }
         if (jj_scan_token(COLON)) {
@@ -2944,27 +2987,27 @@ 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_151_5_30()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_MethodParameters_327_31_115() {
+    private boolean jj_3R_MethodParameters_323_31_115() {
         if (jj_scan_token(COMMA)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Ternary_157_9_38() {
+    private boolean jj_3R_Ternary_153_9_38() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_3_5()) {
             jj_scanpos = xsp;
             if (jj_3_6()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Ternary_161_9_43()) {
+                if (jj_3R_Ternary_157_9_43()) {
                     return true;
                 }
             }
@@ -2979,19 +3022,19 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         if (jj_scan_token(QUESTIONMARK)) {
             return true;
         }
-        if (jj_3R_Ternary_155_5_30()) {
+        if (jj_3R_Ternary_151_5_30()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_SetData_352_5_24() {
+    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_353_11_29()) {
+        if (jj_3R_SetData_349_11_29()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RBRACE)) {
@@ -3000,7 +3043,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_null_338_18_23() {
+    private boolean jj_3R_null_334_18_23() {
         if (jj_scan_token(IDENTIFIER)) {
             return true;
         }
@@ -3013,7 +3056,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     private boolean jj_3_9() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_null_338_18_23()) {
+        if (jj_3R_null_334_18_23()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(IDENTIFIER)) {
@@ -3025,14 +3068,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_31_37() {
-        if (jj_3R_Identifier_387_5_36()) {
+    private boolean jj_3R_LambdaParameters_128_31_37() {
+        if (jj_3R_Identifier_383_5_36()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_LambdaParameters_132_46_41()) {
+            if (jj_3R_LambdaParameters_128_46_41()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3040,14 +3083,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Ternary_155_5_30() {
-        if (jj_3R_Or_171_5_35()) {
+    private boolean jj_3R_Ternary_151_5_30() {
+        if (jj_3R_Or_167_5_35()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Ternary_157_9_38()) {
+            if (jj_3R_Ternary_153_9_38()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3055,60 +3098,60 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_342_7_93() {
-        if (jj_3R_MapData_371_5_103()) {
+    private boolean jj_3R_NonLiteral_338_7_93() {
+        if (jj_3R_MapData_367_5_103()) {
             return true;
         }
         return false;
     }
 
     private boolean jj_3_3() {
-        if (jj_3R_LambdaExpression_124_5_21()) {
+        if (jj_3R_LambdaExpression_120_5_21()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_341_7_92() {
-        if (jj_3R_ListData_359_5_102()) {
+    private boolean jj_3R_NonLiteral_337_7_92() {
+        if (jj_3R_ListData_355_5_102()) {
             return true;
         }
         return false;
     }
 
     private boolean jj_3_10() {
-        if (jj_3R_SetData_352_5_24()) {
+        if (jj_3R_SetData_348_5_24()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_339_7_91() {
-        if (jj_3R_Identifier_387_5_36()) {
+    private boolean jj_3R_NonLiteral_335_7_91() {
+        if (jj_3R_Identifier_383_5_36()) {
             return true;
         }
         return false;
     }
 
     private boolean jj_3_4() {
-        if (jj_3R_LambdaExpression_124_5_21()) {
+        if (jj_3R_LambdaExpression_120_5_21()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_338_7_90() {
-        if (jj_3R_Function_400_5_101()) {
+    private boolean jj_3R_NonLiteral_334_7_90() {
+        if (jj_3R_Function_396_5_101()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_337_7_89() {
+    private boolean jj_3R_NonLiteral_333_7_89() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_33()) {
+        if (jj_3R_Expression_95_5_33()) {
             return true;
         }
         if (jj_scan_token(RPAREN)) {
@@ -3117,14 +3160,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_MethodParameters_327_16_114() {
-        if (jj_3R_Expression_99_5_33()) {
+    private boolean jj_3R_MethodParameters_323_16_114() {
+        if (jj_3R_Expression_95_5_33()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_MethodParameters_327_31_115()) {
+            if (jj_3R_MethodParameters_323_31_115()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3132,13 +3175,13 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_20_32() {
+    private boolean jj_3R_LambdaParameters_128_20_32() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_LambdaParameters_132_31_37()) {
+        if (jj_3R_LambdaParameters_128_31_37()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RPAREN)) {
@@ -3147,29 +3190,29 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_301_41_112() {
-        if (jj_3R_MethodParameters_327_5_110()) {
+    private boolean jj_3R_ValueSuffix_297_41_112() {
+        if (jj_3R_MethodParameters_323_5_110()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_NonLiteral_336_5_81() {
+    private boolean jj_3R_NonLiteral_332_5_81() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_3_8()) {
             jj_scanpos = xsp;
-            if (jj_3R_NonLiteral_337_7_89()) {
+            if (jj_3R_NonLiteral_333_7_89()) {
                 jj_scanpos = xsp;
-                if (jj_3R_NonLiteral_338_7_90()) {
+                if (jj_3R_NonLiteral_334_7_90()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_NonLiteral_339_7_91()) {
+                    if (jj_3R_NonLiteral_335_7_91()) {
                         jj_scanpos = xsp;
                         if (jj_3_10()) {
                             jj_scanpos = xsp;
-                            if (jj_3R_NonLiteral_341_7_92()) {
+                            if (jj_3R_NonLiteral_337_7_92()) {
                                 jj_scanpos = xsp;
-                                if (jj_3R_NonLiteral_342_7_93()) {
+                                if (jj_3R_NonLiteral_338_7_93()) {
                                     return true;
                                 }
                             }
@@ -3182,17 +3225,17 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     }
 
     private boolean jj_3_8() {
-        if (jj_3R_LambdaExpressionOrInvocation_141_5_22()) {
+        if (jj_3R_LambdaExpressionOrInvocation_137_5_22()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaExpressionOrInvocation_141_5_22() {
+    private boolean jj_3R_LambdaExpressionOrInvocation_137_5_22() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
-        if (jj_3R_LambdaParameters_132_5_26()) {
+        if (jj_3R_LambdaParameters_128_5_26()) {
             return true;
         }
         if (jj_scan_token(ARROW)) {
@@ -3202,7 +3245,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_140_45_28()) {
                 return true;
             }
         }
@@ -3212,13 +3255,13 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_MethodParameters_327_5_110() {
+    private boolean jj_3R_MethodParameters_323_5_110() {
         if (jj_scan_token(LPAREN)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_MethodParameters_327_16_114()) {
+        if (jj_3R_MethodParameters_323_16_114()) {
             jj_scanpos = xsp;
         }
         if (jj_scan_token(RPAREN)) {
@@ -3227,30 +3270,30 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_5_31() {
-        if (jj_3R_Identifier_387_5_36()) {
+    private boolean jj_3R_LambdaParameters_128_5_31() {
+        if (jj_3R_Identifier_383_5_36()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaParameters_132_5_26() {
+    private boolean jj_3R_LambdaParameters_128_5_26() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_LambdaParameters_132_5_31()) {
+        if (jj_3R_LambdaParameters_128_5_31()) {
             jj_scanpos = xsp;
-            if (jj_3R_LambdaParameters_132_20_32()) {
+            if (jj_3R_LambdaParameters_128_20_32()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_BracketSuffix_319_5_95() {
+    private boolean jj_3R_BracketSuffix_315_5_95() {
         if (jj_scan_token(LBRACK)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_33()) {
+        if (jj_3R_Expression_95_5_33()) {
             return true;
         }
         if (jj_scan_token(RBRACK)) {
@@ -3263,21 +3306,21 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         if (jj_scan_token(ASSIGN)) {
             return true;
         }
-        if (jj_3R_Assignment_115_5_20()) {
+        if (jj_3R_Assignment_111_5_20()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_301_21_83() {
-        if (jj_3R_BracketSuffix_319_5_95()) {
+    private boolean jj_3R_ValueSuffix_297_21_83() {
+        if (jj_3R_BracketSuffix_315_5_95()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_LambdaExpression_124_5_21() {
-        if (jj_3R_LambdaParameters_132_5_26()) {
+    private boolean jj_3R_LambdaExpression_120_5_21() {
+        if (jj_3R_LambdaParameters_128_5_26()) {
             return true;
         }
         if (jj_scan_token(ARROW)) {
@@ -3287,24 +3330,24 @@ 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_120_68_27()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Semicolon_107_20_44() {
+    private boolean jj_3R_Semicolon_103_20_44() {
         if (jj_scan_token(SEMICOLON)) {
             return true;
         }
-        if (jj_3R_Assignment_115_5_20()) {
+        if (jj_3R_Assignment_111_5_20()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_DotSuffix_310_5_94() {
+    private boolean jj_3R_DotSuffix_306_5_94() {
         if (jj_scan_token(DOT)) {
             return true;
         }
@@ -3314,8 +3357,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_112_5_25() {
+        if (jj_3R_Ternary_151_5_30()) {
             return true;
         }
         Token xsp;
@@ -3330,62 +3373,62 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
     }
 
     private boolean jj_3_2() {
-        if (jj_3R_LambdaExpression_124_5_21()) {
+        if (jj_3R_LambdaExpression_120_5_21()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Assignment_115_5_20() {
+    private boolean jj_3R_Assignment_111_5_20() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_3_2()) {
             jj_scanpos = xsp;
-            if (jj_3R_Assignment_116_5_25()) {
+            if (jj_3R_Assignment_112_5_25()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_301_7_82() {
-        if (jj_3R_DotSuffix_310_5_94()) {
+    private boolean jj_3R_ValueSuffix_297_7_82() {
+        if (jj_3R_DotSuffix_306_5_94()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ValueSuffix_301_5_79() {
+    private boolean jj_3R_ValueSuffix_297_5_79() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_ValueSuffix_301_7_82()) {
+        if (jj_3R_ValueSuffix_297_7_82()) {
             jj_scanpos = xsp;
-            if (jj_3R_ValueSuffix_301_21_83()) {
+            if (jj_3R_ValueSuffix_297_21_83()) {
                 return true;
             }
         }
         xsp = jj_scanpos;
-        if (jj_3R_ValueSuffix_301_41_112()) {
+        if (jj_3R_ValueSuffix_297_41_112()) {
             jj_scanpos = xsp;
         }
         return false;
     }
 
-    private boolean jj_3R_Value_282_21_76() {
-        if (jj_3R_ValueSuffix_301_5_79()) {
+    private boolean jj_3R_Value_278_21_76() {
+        if (jj_3R_ValueSuffix_297_5_79()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Semicolon_107_5_39() {
-        if (jj_3R_Assignment_115_5_20()) {
+    private boolean jj_3R_Semicolon_103_5_39() {
+        if (jj_3R_Assignment_111_5_20()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Semicolon_107_20_44()) {
+            if (jj_3R_Semicolon_103_20_44()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3393,47 +3436,47 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_ValuePrefix_292_7_78() {
-        if (jj_3R_NonLiteral_336_5_81()) {
+    private boolean jj_3R_ValuePrefix_288_7_78() {
+        if (jj_3R_NonLiteral_332_5_81()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ValuePrefix_291_5_77() {
-        if (jj_3R_Literal_418_5_80()) {
+    private boolean jj_3R_ValuePrefix_287_5_77() {
+        if (jj_3R_Literal_414_5_80()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ValuePrefix_291_5_75() {
+    private boolean jj_3R_ValuePrefix_287_5_75() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_ValuePrefix_291_5_77()) {
+        if (jj_3R_ValuePrefix_287_5_77()) {
             jj_scanpos = xsp;
-            if (jj_3R_ValuePrefix_292_7_78()) {
+            if (jj_3R_ValuePrefix_288_7_78()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Expression_99_5_33() {
-        if (jj_3R_Semicolon_107_5_39()) {
+    private boolean jj_3R_Expression_95_5_33() {
+        if (jj_3R_Semicolon_103_5_39()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Value_282_5_74() {
-        if (jj_3R_ValuePrefix_291_5_75()) {
+    private boolean jj_3R_Value_278_5_74() {
+        if (jj_3R_ValuePrefix_287_5_75()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Value_282_21_76()) {
+            if (jj_3R_Value_278_21_76()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3441,31 +3484,31 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Null_468_5_100() {
+    private boolean jj_3R_Null_464_5_100() {
         if (jj_scan_token(NULL)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_273_9_70() {
-        if (jj_3R_Value_282_5_74()) {
+    private boolean jj_3R_Unary_269_9_70() {
+        if (jj_3R_Value_278_5_74()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_271_9_69() {
+    private boolean jj_3R_Unary_267_9_69() {
         if (jj_scan_token(EMPTY)) {
             return true;
         }
-        if (jj_3R_Unary_264_9_63()) {
+        if (jj_3R_Unary_260_9_63()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_269_9_68() {
+    private boolean jj_3R_Unary_265_9_68() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(37)) {
@@ -3474,7 +3517,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Unary_264_9_63()) {
+        if (jj_3R_Unary_260_9_63()) {
             return true;
         }
         return false;
@@ -3492,31 +3535,31 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         if (jj_scan_token(EMPTY)) {
             return true;
         }
-        if (jj_3R_Unary_264_9_63()) {
+        if (jj_3R_Unary_260_9_63()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_String_459_5_99() {
+    private boolean jj_3R_String_455_5_99() {
         if (jj_scan_token(STRING_LITERAL)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Unary_264_9_63() {
+    private boolean jj_3R_Unary_260_9_63() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Unary_264_9_67()) {
+        if (jj_3R_Unary_260_9_67()) {
             jj_scanpos = xsp;
             if (jj_3_7()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Unary_269_9_68()) {
+                if (jj_3R_Unary_265_9_68()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_Unary_271_9_69()) {
+                    if (jj_3R_Unary_267_9_69()) {
                         jj_scanpos = xsp;
-                        if (jj_3R_Unary_273_9_70()) {
+                        if (jj_3R_Unary_269_9_70()) {
                             return true;
                         }
                     }
@@ -3526,24 +3569,24 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Unary_264_9_67() {
+    private boolean jj_3R_Unary_260_9_67() {
         if (jj_scan_token(MINUS)) {
             return true;
         }
-        if (jj_3R_Unary_264_9_63()) {
+        if (jj_3R_Unary_260_9_63()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Integer_450_5_98() {
+    private boolean jj_3R_Integer_446_5_98() {
         if (jj_scan_token(INTEGER_LITERAL)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_254_9_73() {
+    private boolean jj_3R_Multiplication_250_9_73() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(50)) {
@@ -3552,13 +3595,13 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Unary_264_9_63()) {
+        if (jj_3R_Unary_260_9_63()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_252_9_72() {
+    private boolean jj_3R_Multiplication_248_9_72() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(48)) {
@@ -3567,20 +3610,20 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Unary_264_9_63()) {
+        if (jj_3R_Unary_260_9_63()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_250_9_64() {
+    private boolean jj_3R_Multiplication_246_9_64() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Multiplication_250_9_71()) {
+        if (jj_3R_Multiplication_246_9_71()) {
             jj_scanpos = xsp;
-            if (jj_3R_Multiplication_252_9_72()) {
+            if (jj_3R_Multiplication_248_9_72()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Multiplication_254_9_73()) {
+                if (jj_3R_Multiplication_250_9_73()) {
                     return true;
                 }
             }
@@ -3588,31 +3631,31 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Multiplication_250_9_71() {
+    private boolean jj_3R_Multiplication_246_9_71() {
         if (jj_scan_token(MULT)) {
             return true;
         }
-        if (jj_3R_Unary_264_9_63()) {
+        if (jj_3R_Unary_260_9_63()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_FloatingPoint_441_5_97() {
+    private boolean jj_3R_FloatingPoint_437_5_97() {
         if (jj_scan_token(FLOATING_POINT_LITERAL)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Multiplication_248_5_61() {
-        if (jj_3R_Unary_264_9_63()) {
+    private boolean jj_3R_Multiplication_244_5_61() {
+        if (jj_3R_Unary_260_9_63()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Multiplication_250_9_64()) {
+            if (jj_3R_Multiplication_246_9_64()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3620,72 +3663,72 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Boolean_433_7_105() {
+    private boolean jj_3R_Boolean_429_7_105() {
         if (jj_scan_token(FALSE)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Math_238_9_66() {
+    private boolean jj_3R_Math_234_9_66() {
         if (jj_scan_token(MINUS)) {
             return true;
         }
-        if (jj_3R_Multiplication_248_5_61()) {
+        if (jj_3R_Multiplication_244_5_61()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Boolean_431_5_104() {
+    private boolean jj_3R_Boolean_427_5_104() {
         if (jj_scan_token(TRUE)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Boolean_431_5_96() {
+    private boolean jj_3R_Boolean_427_5_96() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Boolean_431_5_104()) {
+        if (jj_3R_Boolean_427_5_104()) {
             jj_scanpos = xsp;
-            if (jj_3R_Boolean_433_7_105()) {
+            if (jj_3R_Boolean_429_7_105()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Math_236_9_62() {
+    private boolean jj_3R_Math_232_9_62() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Math_236_9_65()) {
+        if (jj_3R_Math_232_9_65()) {
             jj_scanpos = xsp;
-            if (jj_3R_Math_238_9_66()) {
+            if (jj_3R_Math_234_9_66()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Math_236_9_65() {
+    private boolean jj_3R_Math_232_9_65() {
         if (jj_scan_token(PLUS)) {
             return true;
         }
-        if (jj_3R_Multiplication_248_5_61()) {
+        if (jj_3R_Multiplication_244_5_61()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Math_234_5_55() {
-        if (jj_3R_Multiplication_248_5_61()) {
+    private boolean jj_3R_Math_230_5_55() {
+        if (jj_3R_Multiplication_244_5_61()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Math_236_9_62()) {
+            if (jj_3R_Math_232_9_62()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3693,45 +3736,45 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Literal_422_7_88() {
-        if (jj_3R_Null_468_5_100()) {
+    private boolean jj_3R_Literal_418_7_88() {
+        if (jj_3R_Null_464_5_100()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Literal_421_7_87() {
-        if (jj_3R_String_459_5_99()) {
+    private boolean jj_3R_Literal_417_7_87() {
+        if (jj_3R_String_455_5_99()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Literal_420_7_86() {
-        if (jj_3R_Integer_450_5_98()) {
+    private boolean jj_3R_Literal_416_7_86() {
+        if (jj_3R_Integer_446_5_98()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Literal_419_7_85() {
-        if (jj_3R_FloatingPoint_441_5_97()) {
+    private boolean jj_3R_Literal_415_7_85() {
+        if (jj_3R_FloatingPoint_437_5_97()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Concatenation_224_10_56() {
+    private boolean jj_3R_Concatenation_220_10_56() {
         if (jj_scan_token(CONCAT)) {
             return true;
         }
-        if (jj_3R_Math_234_5_55()) {
+        if (jj_3R_Math_230_5_55()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Function_400_24_106() {
+    private boolean jj_3R_Function_396_24_106() {
         if (jj_scan_token(COLON)) {
             return true;
         }
@@ -3741,25 +3784,25 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Literal_418_5_84() {
-        if (jj_3R_Boolean_431_5_96()) {
+    private boolean jj_3R_Literal_414_5_84() {
+        if (jj_3R_Boolean_427_5_96()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Literal_418_5_80() {
+    private boolean jj_3R_Literal_414_5_80() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Literal_418_5_84()) {
+        if (jj_3R_Literal_414_5_84()) {
             jj_scanpos = xsp;
-            if (jj_3R_Literal_419_7_85()) {
+            if (jj_3R_Literal_415_7_85()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Literal_420_7_86()) {
+                if (jj_3R_Literal_416_7_86()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_Literal_421_7_87()) {
+                    if (jj_3R_Literal_417_7_87()) {
                         jj_scanpos = xsp;
-                        if (jj_3R_Literal_422_7_88()) {
+                        if (jj_3R_Literal_418_7_88()) {
                             return true;
                         }
                     }
@@ -3769,14 +3812,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Concatenation_222_6_51() {
-        if (jj_3R_Math_234_5_55()) {
+    private boolean jj_3R_Concatenation_218_6_51() {
+        if (jj_3R_Math_230_5_55()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Concatenation_224_10_56()) {
+            if (jj_3R_Concatenation_220_10_56()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3784,14 +3827,14 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Function_409_7_107() {
-        if (jj_3R_MethodParameters_327_5_110()) {
+    private boolean jj_3R_Function_405_7_107() {
+        if (jj_3R_MethodParameters_323_5_110()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Compare_211_9_60() {
+    private boolean jj_3R_Compare_207_9_60() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(29)) {
@@ -3800,13 +3843,13 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Concatenation_222_6_51()) {
+        if (jj_3R_Concatenation_218_6_51()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Compare_209_9_59() {
+    private boolean jj_3R_Compare_205_9_59() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(31)) {
@@ -3815,13 +3858,13 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Concatenation_222_6_51()) {
+        if (jj_3R_Concatenation_218_6_51()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Compare_207_9_58() {
+    private boolean jj_3R_Compare_203_9_58() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(25)) {
@@ -3830,27 +3873,27 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Concatenation_222_6_51()) {
+        if (jj_3R_Concatenation_218_6_51()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Function_400_5_101() {
+    private boolean jj_3R_Function_396_5_101() {
         if (jj_scan_token(IDENTIFIER)) {
             return true;
         }
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Function_400_24_106()) {
+        if (jj_3R_Function_396_24_106()) {
             jj_scanpos = xsp;
         }
-        if (jj_3R_Function_409_7_107()) {
+        if (jj_3R_Function_405_7_107()) {
             return true;
         }
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Function_409_7_107()) {
+            if (jj_3R_Function_405_7_107()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3858,16 +3901,16 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Compare_205_9_52() {
+    private boolean jj_3R_Compare_201_9_52() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Compare_205_9_57()) {
+        if (jj_3R_Compare_201_9_57()) {
             jj_scanpos = xsp;
-            if (jj_3R_Compare_207_9_58()) {
+            if (jj_3R_Compare_203_9_58()) {
                 jj_scanpos = xsp;
-                if (jj_3R_Compare_209_9_59()) {
+                if (jj_3R_Compare_205_9_59()) {
                     jj_scanpos = xsp;
-                    if (jj_3R_Compare_211_9_60()) {
+                    if (jj_3R_Compare_207_9_60()) {
                         return true;
                     }
                 }
@@ -3876,7 +3919,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Compare_205_9_57() {
+    private boolean jj_3R_Compare_201_9_57() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(27)) {
@@ -3885,20 +3928,20 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Concatenation_222_6_51()) {
+        if (jj_3R_Concatenation_218_6_51()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Compare_203_5_48() {
-        if (jj_3R_Concatenation_222_6_51()) {
+    private boolean jj_3R_Compare_199_5_48() {
+        if (jj_3R_Concatenation_218_6_51()) {
             return true;
         }
         Token xsp;
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_Compare_205_9_52()) {
+            if (jj_3R_Compare_201_9_52()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3906,7 +3949,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_Equality_193_9_54() {
+    private boolean jj_3R_Equality_189_9_54() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(35)) {
@@ -3915,32 +3958,32 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Compare_203_5_48()) {
+        if (jj_3R_Compare_199_5_48()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Identifier_387_5_36() {
+    private boolean jj_3R_Identifier_383_5_36() {
         if (jj_scan_token(IDENTIFIER)) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_Equality_191_9_49() {
+    private boolean jj_3R_Equality_187_9_49() {
         Token xsp;
         xsp = jj_scanpos;
-        if (jj_3R_Equality_191_9_53()) {
+        if (jj_3R_Equality_187_9_53()) {
             jj_scanpos = xsp;
-            if (jj_3R_Equality_193_9_54()) {
+            if (jj_3R_Equality_189_9_54()) {
                 return true;
             }
         }
         return false;
     }
 
-    private boolean jj_3R_Equality_191_9_53() {
+    private boolean jj_3R_Equality_187_9_53() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(33)) {
@@ -3949,20 +3992,20 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Compare_203_5_48()) {
+        if (jj_3R_Compare_199_5_48()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_And_181_17_46() {
+    private boolean jj_3R_And_177_17_46() {
         Token xsp;
-        if (jj_3R_And_180_18_50()) {
+        if (jj_3R_And_176_18_50()) {
             return true;
         }
         while (true) {
             xsp = jj_scanpos;
-            if (jj_3R_And_180_18_50()) {
+            if (jj_3R_And_176_18_50()) {
                 jj_scanpos = xsp;
                 break;
             }
@@ -3970,7 +4013,7 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
         return false;
     }
 
-    private boolean jj_3R_And_180_18_50() {
+    private boolean jj_3R_And_176_18_50() {
         Token xsp;
         xsp = jj_scanpos;
         if (jj_scan_token(39)) {
@@ -3979,59 +4022,17 @@ public class ELParser/* @bgen(jjtree) */ implements 
ELParserTreeConstants, ELPar
                 return true;
             }
         }
-        if (jj_3R_Equality_189_5_45()) {
+        if (jj_3R_Equality_185_5_45()) {
             return true;
         }
         return false;
     }
 
-    private boolean jj_3R_ListData_360_26_113() {
+    private boolean jj_3R_ListData_356_26_113() {
         if (jj_scan_token(COMMA)) {
             return true;
         }
-        if (jj_3R_Expression_99_5_33()) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean jj_3R_Equality_189_5_45() {
-        if (jj_3R_Compare_203_5_48()) {
-            return true;
-        }
-        Token xsp;
-        while (true) {
-            xsp = jj_scanpos;
-            if (jj_3R_Equality_191_9_49()) {
-                jj_scanpos = xsp;
-                break;
-            }
-        }
-        return false;
-    }
-
-    private boolean jj_3R_MapEntry_378_5_111() {
-        if (jj_3R_Expression_99_5_33()) {
-            return true;
-        }
-        if (jj_scan_token(COLON)) {
-            return true;
-        }
-        if (jj_3R_Expression_99_5_33()) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean jj_3R_MapData_372_11_109() {
-        if (jj_3R_MapEntry_378_5_111()) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean jj_3R_LambdaExpression_124_68_27() {
-        if (jj_3R_Ternary_155_5_30()) {
+        if (jj_3R_Expression_95_5_33()) {
             return true;
         }
         return false;
diff --git a/java/org/apache/el/parser/ELParser.jjt 
b/java/org/apache/el/parser/ELParser.jjt
index 7464ff83c7..e2336e7bad 100644
--- a/java/org/apache/el/parser/ELParser.jjt
+++ b/java/org/apache/el/parser/ELParser.jjt
@@ -53,6 +53,7 @@ PARSER_END( ELParser )
  */
 AstCompositeExpression CompositeExpression() #CompositeExpression : {}
 {
+    { token_source.reset(); }
     (DeferredExpression() |
      DynamicExpression() |
      LiteralExpression())* <EOF> { return jjtThis; }
@@ -468,6 +469,15 @@ void Null() #Null : {}
 TOKEN_MGR_DECLS:
 {
 java.util.Deque<Integer> deque = new java.util.ArrayDeque<Integer>();
+
+    /*
+     * Field initialisers only run when the token manager is constructed, not 
when it is re-initialised via ReInit().
+     * Reset any state added above so that a token manager reused across 
parses (e.g. after a previous parse failed part
+     * way through) starts from a known state.
+     */
+    void reset() {
+        deque.clear();
+    }
 }
 <DEFAULT> TOKEN :
 {
diff --git a/java/org/apache/el/parser/ELParserTokenManager.java 
b/java/org/apache/el/parser/ELParserTokenManager.java
index aed970cd01..66b7f572fe 100644
--- a/java/org/apache/el/parser/ELParserTokenManager.java
+++ b/java/org/apache/el/parser/ELParserTokenManager.java
@@ -7,6 +7,15 @@ package org.apache.el.parser;
 public class ELParserTokenManager implements ELParserConstants {
     java.util.Deque<Integer> deque = new java.util.ArrayDeque<Integer>();
 
+    /*
+     * Field initialisers only run when the token manager is constructed, not 
when it is re-initialised via ReInit().
+     * Reset any state added above so that a token manager reused across 
parses (e.g. after a previous parse failed part
+     * way through) starts from a known state.
+     */
+    void reset() {
+        deque.clear();
+    }
+
     /** Debug output. */
     public java.io.PrintStream debugStream = System.out;
 
diff --git a/java/org/apache/el/parser/NodeVisitor.java 
b/java/org/apache/el/parser/NodeVisitor.java
index 83d43b42c6..4b3103909f 100644
--- a/java/org/apache/el/parser/NodeVisitor.java
+++ b/java/org/apache/el/parser/NodeVisitor.java
@@ -24,6 +24,7 @@ public interface NodeVisitor {
      * Visits the given node.
      *
      * @param node the node to visit
+     *
      * @throws Exception if an error occurs during visitation
      */
     void visit(Node node) throws Exception;
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 7b74d2b46f..a30d7270c8 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -317,6 +317,9 @@
         (markt)
       </add>
       <!-- Entries for backport and removal before 12.0.0-M1 below this line 
-->
+      <fix>
+        Ensure internal state is reset before re-using ELParser. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Cluster">


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to