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 b037fcfec5 Correct the Elvis (?:) operator and add null coalescing (??) operator b037fcfec5 is described below commit b037fcfec53dda465e280d221fd5b85e50078794 Author: Mark Thomas <ma...@apache.org> AuthorDate: Thu Apr 24 15:05:28 2025 +0100 Correct the Elvis (?:) operator and add null coalescing (??) operator --- java/org/apache/el/parser/AstElvis.java | 8 +- .../{AstElvis.java => AstNullCoalescing.java} | 8 +- java/org/apache/el/parser/ELParser.java | 706 +++++++++++---------- java/org/apache/el/parser/ELParser.jjt | 5 +- .../apache/el/parser/ELParserTreeConstants.java | 85 +-- test/org/apache/el/TestELEvaluation.java | 30 +- webapps/docs/changelog.xml | 4 +- 7 files changed, 474 insertions(+), 372 deletions(-) diff --git a/java/org/apache/el/parser/AstElvis.java b/java/org/apache/el/parser/AstElvis.java index ce34074616..4a5982b3f1 100644 --- a/java/org/apache/el/parser/AstElvis.java +++ b/java/org/apache/el/parser/AstElvis.java @@ -20,6 +20,7 @@ package org.apache.el.parser; import jakarta.el.ELException; +import org.apache.el.lang.ELSupport; import org.apache.el.lang.EvaluationContext; public class AstElvis extends SimpleNode { @@ -36,10 +37,11 @@ public class AstElvis extends SimpleNode { @Override public Object getValue(EvaluationContext ctx) throws ELException { Object obj0 = this.children[0].getValue(ctx); - if (obj0 == null) { - return this.children[1].getValue(ctx); - } else { + Boolean b = ELSupport.coerceToBoolean(ctx, obj0, true); + if (b.booleanValue()) { return obj0; + } else { + return this.children[1].getValue(ctx); } } } diff --git a/java/org/apache/el/parser/AstElvis.java b/java/org/apache/el/parser/AstNullCoalescing.java similarity index 86% copy from java/org/apache/el/parser/AstElvis.java copy to java/org/apache/el/parser/AstNullCoalescing.java index ce34074616..98a010e32a 100644 --- a/java/org/apache/el/parser/AstElvis.java +++ b/java/org/apache/el/parser/AstNullCoalescing.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* Generated By:JJTree: Do not edit this line. AstElvis.java Version 7.0 */ +/* Generated By:JJTree: Do not edit this line. AstNullCoalescing.java Version 7.0 */ /* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=false,TRACK_TOKENS=false,NODE_PREFIX=Ast,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ package org.apache.el.parser; @@ -22,8 +22,8 @@ import jakarta.el.ELException; import org.apache.el.lang.EvaluationContext; -public class AstElvis extends SimpleNode { - public AstElvis(int id) { +public class AstNullCoalescing extends SimpleNode { + public AstNullCoalescing(int id) { super(id); } @@ -43,4 +43,4 @@ public class AstElvis extends SimpleNode { } } } -/* JavaCC - OriginalChecksum=e0633cc57b29ec4931c19e4a07e0611e (do not edit this line) */ +/* JavaCC - OriginalChecksum=7f7cabdfdef87abc6e6a22ac32db0871 (do not edit this line) */ diff --git a/java/org/apache/el/parser/ELParser.java b/java/org/apache/el/parser/ELParser.java index 963e234aec..60e2729a36 100644 --- a/java/org/apache/el/parser/ELParser.java +++ b/java/org/apache/el/parser/ELParser.java @@ -594,10 +594,10 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar jj_la1[10] = jj_gen; break label_6; } - if (jj_2_5(3)) { + if (jj_2_5(2)) { jj_consume_token(QUESTIONMARK); - jj_consume_token(COLON); - AstElvis jjtn001 = new AstElvis(JJTELVIS); + jj_consume_token(QUESTIONMARK); + AstNullCoalescing jjtn001 = new AstNullCoalescing(JJTNULLCOALESCING); boolean jjtc001 = true; jjtree.openNodeScope(jjtn001); try { @@ -633,46 +633,85 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar jjtree.closeNodeScope(jjtn001, 2); } } + } else if (jj_2_6(2)) { + jj_consume_token(QUESTIONMARK); + jj_consume_token(COLON); + AstElvis jjtn002 = new AstElvis(JJTELVIS); + boolean jjtc002 = true; + jjtree.openNodeScope(jjtn002); + try { + Ternary(); + } catch (Throwable jjte002) { + if (jjtc002) { + jjtree.clearNodeScope(jjtn002); + jjtc002 = false; + } else { + jjtree.popNode(); + } + if (jjte002 instanceof RuntimeException) { + { + if (true) { + throw (RuntimeException) jjte002; + } + } + } + if (jjte002 instanceof ParseException) { + { + if (true) { + throw (ParseException) jjte002; + } + } + } + { + if (true) { + throw (Error) jjte002; + } + } + } finally { + if (jjtc002) { + jjtree.closeNodeScope(jjtn002, 2); + } + } } else { switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { case QUESTIONMARK: { jj_consume_token(QUESTIONMARK); Ternary(); jj_consume_token(COLON); - AstChoice jjtn002 = new AstChoice(JJTCHOICE); - boolean jjtc002 = true; - jjtree.openNodeScope(jjtn002); + AstChoice jjtn003 = new AstChoice(JJTCHOICE); + boolean jjtc003 = true; + jjtree.openNodeScope(jjtn003); try { Ternary(); - } catch (Throwable jjte002) { - if (jjtc002) { - jjtree.clearNodeScope(jjtn002); - jjtc002 = false; + } catch (Throwable jjte003) { + if (jjtc003) { + jjtree.clearNodeScope(jjtn003); + jjtc003 = false; } else { jjtree.popNode(); } - if (jjte002 instanceof RuntimeException) { + if (jjte003 instanceof RuntimeException) { { if (true) { - throw (RuntimeException) jjte002; + throw (RuntimeException) jjte003; } } } - if (jjte002 instanceof ParseException) { + if (jjte003 instanceof ParseException) { { if (true) { - throw (ParseException) jjte002; + throw (ParseException) jjte003; } } } { if (true) { - throw (Error) jjte002; + throw (Error) jjte003; } } } finally { - if (jjtc002) { - jjtree.closeNodeScope(jjtn002, 3); + if (jjtc003) { + jjtree.closeNodeScope(jjtn003, 3); } } break; @@ -1608,7 +1647,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar } default: jj_la1[37] = jj_gen; - if (jj_2_6(2)) { + if (jj_2_7(2)) { switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { case NOT0: { jj_consume_token(NOT0); @@ -2037,7 +2076,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar * NonLiteral For Grouped Operations, Identifiers, and Functions */ final public void NonLiteral() throws ParseException { - if (jj_2_7(5)) { + if (jj_2_8(5)) { LambdaExpressionOrInvocation(); } else { switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { @@ -2049,7 +2088,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar } default: jj_la1[45] = jj_gen; - if (jj_2_8(2147483647)) { + if (jj_2_9(2147483647)) { Function(); } else { switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { @@ -2059,7 +2098,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar } default: jj_la1[46] = jj_gen; - if (jj_2_9(5)) { + if (jj_2_10(5)) { SetData(); } else { switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) { @@ -2704,30 +2743,42 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar } } - private boolean jj_3R_LambdaExpressionOrInvocation_144_45_30() { - if (jj_3R_Ternary_155_5_22()) { + private boolean jj_2_10(int xla) { + jj_la = xla; + jj_lastpos = jj_scanpos = token; + try { + return (!jj_3_10()); + } catch (LookaheadSuccess ls) { + return true; + } finally { + jj_save(9, xla); + } + } + + private boolean jj_3R_LambdaExpressionOrInvocation_144_45_28() { + if (jj_3R_Ternary_155_5_30()) { return true; } return false; } - private boolean jj_3R_SetData_352_26_36() { + private boolean jj_3R_SetData_353_26_34() { if (jj_scan_token(COMMA)) { return true; } - if (jj_3R_Expression_99_5_35()) { + if (jj_3R_Expression_99_5_33()) { return true; } return false; } - private boolean jj_3R_MapData_370_5_101() { + private boolean jj_3R_MapData_371_5_103() { if (jj_scan_token(START_SET_OR_MAP)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_MapData_371_11_109()) { + if (jj_3R_MapData_372_11_109()) { jj_scanpos = xsp; } if (jj_scan_token(RBRACE)) { @@ -2736,26 +2787,26 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_And_179_5_34() { - if (jj_3R_Equality_188_5_40()) { + private boolean jj_3R_And_180_5_40() { + if (jj_3R_Equality_189_5_45()) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_And_180_17_47()) { + if (jj_3R_And_181_17_46()) { jj_scanpos = xsp; } return false; } - private boolean jj_3R_Or_171_12_43() { + private boolean jj_3R_Or_172_12_42() { Token xsp; - if (jj_3R_Or_170_13_48()) { + if (jj_3R_Or_171_13_47()) { return true; } while (true) { xsp = jj_scanpos; - if (jj_3R_Or_170_13_48()) { + if (jj_3R_Or_171_13_47()) { jj_scanpos = xsp; break; } @@ -2763,7 +2814,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Or_170_13_48() { + private boolean jj_3R_Or_171_13_47() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(41)) { @@ -2772,20 +2823,20 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_And_179_5_34()) { + if (jj_3R_And_180_5_40()) { return true; } return false; } - private boolean jj_3R_ListData_359_11_108() { - if (jj_3R_Expression_99_5_35()) { + private boolean jj_3R_ListData_360_11_108() { + if (jj_3R_Expression_99_5_33()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_ListData_359_26_113()) { + if (jj_3R_ListData_360_26_113()) { jj_scanpos = xsp; break; } @@ -2793,35 +2844,35 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_LambdaParameters_132_46_42() { + private boolean jj_3R_LambdaParameters_132_46_41() { if (jj_scan_token(COMMA)) { return true; } - if (jj_3R_Identifier_386_5_37()) { + if (jj_3R_Identifier_387_5_36()) { return true; } return false; } - private boolean jj_3R_Or_170_5_29() { - if (jj_3R_And_179_5_34()) { + private boolean jj_3R_Or_171_5_35() { + if (jj_3R_And_180_5_40()) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_Or_171_12_43()) { + if (jj_3R_Or_172_12_42()) { jj_scanpos = xsp; } return false; } - private boolean jj_3R_ListData_358_5_100() { + private boolean jj_3R_ListData_359_5_102() { if (jj_scan_token(LBRACK)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_ListData_359_11_108()) { + if (jj_3R_ListData_360_11_108()) { jj_scanpos = xsp; } if (jj_scan_token(RBRACK)) { @@ -2830,14 +2881,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_SetData_352_11_31() { - if (jj_3R_Expression_99_5_35()) { + private boolean jj_3R_SetData_353_11_29() { + if (jj_3R_Expression_99_5_33()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_SetData_352_26_36()) { + if (jj_3R_SetData_353_26_34()) { jj_scanpos = xsp; break; } @@ -2845,11 +2896,11 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Ternary_160_9_44() { + private boolean jj_3R_Ternary_161_9_43() { if (jj_scan_token(QUESTIONMARK)) { return true; } - if (jj_3R_Ternary_155_5_22()) { + if (jj_3R_Ternary_155_5_30()) { return true; } if (jj_scan_token(COLON)) { @@ -2858,101 +2909,102 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_MethodParameters_326_31_115() { - if (jj_scan_token(COMMA)) { + private boolean jj_3_6() { + if (jj_scan_token(QUESTIONMARK)) { + return true; + } + if (jj_scan_token(COLON)) { + return true; + } + if (jj_3R_Ternary_155_5_30()) { return true; } return false; } - private boolean jj_3R_SetData_351_5_25() { - if (jj_scan_token(START_SET_OR_MAP)) { + private boolean jj_3R_MethodParameters_327_31_115() { + if (jj_scan_token(COMMA)) { return true; } + return false; + } + + private boolean jj_3R_Ternary_157_9_38() { Token xsp; xsp = jj_scanpos; - if (jj_3R_SetData_352_11_31()) { + if (jj_3_5()) { jj_scanpos = xsp; - } - if (jj_scan_token(RBRACE)) { - return true; + if (jj_3_6()) { + jj_scanpos = xsp; + if (jj_3R_Ternary_161_9_43()) { + return true; + } + } } return false; } - private boolean jj_3R_null_337_18_24() { - if (jj_scan_token(IDENTIFIER)) { + private boolean jj_3_5() { + if (jj_scan_token(QUESTIONMARK)) { return true; } - if (jj_scan_token(COLON)) { + if (jj_scan_token(QUESTIONMARK)) { + return true; + } + if (jj_3R_Ternary_155_5_30()) { return true; } return false; } - private boolean jj_3R_LambdaParameters_132_31_38() { - if (jj_3R_Identifier_386_5_37()) { + private boolean jj_3R_SetData_352_5_24() { + if (jj_scan_token(START_SET_OR_MAP)) { return true; } Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_3R_LambdaParameters_132_46_42()) { - jj_scanpos = xsp; - break; - } + xsp = jj_scanpos; + if (jj_3R_SetData_353_11_29()) { + jj_scanpos = xsp; + } + if (jj_scan_token(RBRACE)) { + return true; } return false; } - private boolean jj_3_8() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_null_337_18_24()) { - jj_scanpos = xsp; - } + private boolean jj_3R_null_338_18_23() { if (jj_scan_token(IDENTIFIER)) { return true; } - if (jj_scan_token(LPAREN)) { + if (jj_scan_token(COLON)) { return true; } return false; } - private boolean jj_3R_Ternary_157_5_39() { + private boolean jj_3_9() { Token xsp; xsp = jj_scanpos; - if (jj_3_5()) { + if (jj_3R_null_338_18_23()) { jj_scanpos = xsp; - if (jj_3R_Ternary_160_9_44()) { - return true; - } } - return false; - } - - private boolean jj_3_5() { - if (jj_scan_token(QUESTIONMARK)) { - return true; - } - if (jj_scan_token(COLON)) { + if (jj_scan_token(IDENTIFIER)) { return true; } - if (jj_3R_Ternary_155_5_22()) { + if (jj_scan_token(LPAREN)) { return true; } return false; } - private boolean jj_3R_Ternary_155_5_22() { - if (jj_3R_Or_170_5_29()) { + private boolean jj_3R_LambdaParameters_132_31_37() { + if (jj_3R_Identifier_387_5_36()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Ternary_157_5_39()) { + if (jj_3R_LambdaParameters_132_46_41()) { jj_scanpos = xsp; break; } @@ -2960,76 +3012,76 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3_3() { - if (jj_3R_LambdaExpression_124_5_21()) { + private boolean jj_3R_Ternary_155_5_30() { + if (jj_3R_Or_171_5_35()) { return true; } + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_Ternary_157_9_38()) { + jj_scanpos = xsp; + break; + } + } return false; } - private boolean jj_3R_NonLiteral_341_7_91() { - if (jj_3R_MapData_370_5_101()) { + private boolean jj_3R_NonLiteral_342_7_93() { + if (jj_3R_MapData_371_5_103()) { return true; } return false; } - private boolean jj_3R_NonLiteral_340_7_90() { - if (jj_3R_ListData_358_5_100()) { + private boolean jj_3_3() { + if (jj_3R_LambdaExpression_124_5_21()) { return true; } return false; } - private boolean jj_3_4() { - if (jj_3R_LambdaExpression_124_5_21()) { + private boolean jj_3R_NonLiteral_341_7_92() { + if (jj_3R_ListData_359_5_102()) { return true; } return false; } - private boolean jj_3_9() { - if (jj_3R_SetData_351_5_25()) { + private boolean jj_3_10() { + if (jj_3R_SetData_352_5_24()) { return true; } return false; } - private boolean jj_3R_NonLiteral_338_7_89() { - if (jj_3R_Identifier_386_5_37()) { + private boolean jj_3R_NonLiteral_339_7_91() { + if (jj_3R_Identifier_387_5_36()) { return true; } return false; } - private boolean jj_3R_NonLiteral_337_7_88() { - if (jj_3R_Function_399_5_99()) { + private boolean jj_3_4() { + if (jj_3R_LambdaExpression_124_5_21()) { return true; } return false; } - private boolean jj_3R_NonLiteral_336_7_87() { - if (jj_scan_token(LPAREN)) { - return true; - } - if (jj_3R_Expression_99_5_35()) { - return true; - } - if (jj_scan_token(RPAREN)) { + private boolean jj_3R_NonLiteral_338_7_90() { + if (jj_3R_Function_400_5_101()) { return true; } return false; } - private boolean jj_3R_LambdaParameters_132_20_33() { + private boolean jj_3R_NonLiteral_337_7_89() { if (jj_scan_token(LPAREN)) { return true; } - Token xsp; - xsp = jj_scanpos; - if (jj_3R_LambdaParameters_132_31_38()) { - jj_scanpos = xsp; + if (jj_3R_Expression_99_5_33()) { + return true; } if (jj_scan_token(RPAREN)) { return true; @@ -3037,14 +3089,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_MethodParameters_326_16_114() { - if (jj_3R_Expression_99_5_35()) { + private boolean jj_3R_MethodParameters_327_16_114() { + if (jj_3R_Expression_99_5_33()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_MethodParameters_326_31_115()) { + if (jj_3R_MethodParameters_327_31_115()) { jj_scanpos = xsp; break; } @@ -3052,29 +3104,44 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_ValueSuffix_300_41_112() { - if (jj_3R_MethodParameters_326_5_110()) { + private boolean jj_3R_LambdaParameters_132_20_32() { + if (jj_scan_token(LPAREN)) { + return true; + } + Token xsp; + xsp = jj_scanpos; + if (jj_3R_LambdaParameters_132_31_37()) { + jj_scanpos = xsp; + } + if (jj_scan_token(RPAREN)) { return true; } return false; } - private boolean jj_3R_NonLiteral_335_5_80() { + private boolean jj_3R_ValueSuffix_301_41_112() { + if (jj_3R_MethodParameters_327_5_110()) { + return true; + } + return false; + } + + private boolean jj_3R_NonLiteral_336_5_81() { Token xsp; xsp = jj_scanpos; - if (jj_3_7()) { + if (jj_3_8()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_336_7_87()) { + if (jj_3R_NonLiteral_337_7_89()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_337_7_88()) { + if (jj_3R_NonLiteral_338_7_90()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_338_7_89()) { + if (jj_3R_NonLiteral_339_7_91()) { jj_scanpos = xsp; - if (jj_3_9()) { + if (jj_3_10()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_340_7_90()) { + if (jj_3R_NonLiteral_341_7_92()) { jj_scanpos = xsp; - if (jj_3R_NonLiteral_341_7_91()) { + if (jj_3R_NonLiteral_342_7_93()) { return true; } } @@ -3086,18 +3153,18 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3_7() { - if (jj_3R_LambdaExpressionOrInvocation_141_5_23()) { + private boolean jj_3_8() { + if (jj_3R_LambdaExpressionOrInvocation_141_5_22()) { return true; } return false; } - private boolean jj_3R_LambdaExpressionOrInvocation_141_5_23() { + private boolean jj_3R_LambdaExpressionOrInvocation_141_5_22() { if (jj_scan_token(LPAREN)) { return true; } - if (jj_3R_LambdaParameters_132_5_27()) { + if (jj_3R_LambdaParameters_132_5_26()) { return true; } if (jj_scan_token(ARROW)) { @@ -3107,7 +3174,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_30()) { + if (jj_3R_LambdaExpressionOrInvocation_144_45_28()) { return true; } } @@ -3117,13 +3184,13 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_MethodParameters_326_5_110() { + private boolean jj_3R_MethodParameters_327_5_110() { if (jj_scan_token(LPAREN)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_MethodParameters_326_16_114()) { + if (jj_3R_MethodParameters_327_16_114()) { jj_scanpos = xsp; } if (jj_scan_token(RPAREN)) { @@ -3132,57 +3199,57 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_LambdaParameters_132_5_32() { - if (jj_3R_Identifier_386_5_37()) { + private boolean jj_3R_LambdaParameters_132_5_31() { + if (jj_3R_Identifier_387_5_36()) { return true; } return false; } - private boolean jj_3R_LambdaParameters_132_5_27() { + private boolean jj_3R_LambdaParameters_132_5_26() { Token xsp; xsp = jj_scanpos; - if (jj_3R_LambdaParameters_132_5_32()) { + if (jj_3R_LambdaParameters_132_5_31()) { jj_scanpos = xsp; - if (jj_3R_LambdaParameters_132_20_33()) { + if (jj_3R_LambdaParameters_132_20_32()) { return true; } } return false; } - private boolean jj_3_1() { - if (jj_scan_token(ASSIGN)) { + private boolean jj_3R_BracketSuffix_319_5_95() { + if (jj_scan_token(LBRACK)) { return true; } - if (jj_3R_Assignment_115_5_20()) { + if (jj_3R_Expression_99_5_33()) { + return true; + } + if (jj_scan_token(RBRACK)) { return true; } return false; } - private boolean jj_3R_BracketSuffix_318_5_103() { - if (jj_scan_token(LBRACK)) { - return true; - } - if (jj_3R_Expression_99_5_35()) { + private boolean jj_3_1() { + if (jj_scan_token(ASSIGN)) { return true; } - if (jj_scan_token(RBRACK)) { + if (jj_3R_Assignment_115_5_20()) { return true; } return false; } - private boolean jj_3R_ValueSuffix_300_21_93() { - if (jj_3R_BracketSuffix_318_5_103()) { + private boolean jj_3R_ValueSuffix_301_21_83() { + if (jj_3R_BracketSuffix_319_5_95()) { return true; } return false; } private boolean jj_3R_LambdaExpression_124_5_21() { - if (jj_3R_LambdaParameters_132_5_27()) { + if (jj_3R_LambdaParameters_132_5_26()) { return true; } if (jj_scan_token(ARROW)) { @@ -3192,14 +3259,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar xsp = jj_scanpos; if (jj_3_3()) { jj_scanpos = xsp; - if (jj_3R_LambdaExpression_124_68_28()) { + if (jj_3R_LambdaExpression_124_68_27()) { return true; } } return false; } - private boolean jj_3R_Semicolon_107_20_46() { + private boolean jj_3R_Semicolon_107_20_44() { if (jj_scan_token(SEMICOLON)) { return true; } @@ -3209,7 +3276,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_DotSuffix_309_5_102() { + private boolean jj_3R_DotSuffix_310_5_94() { if (jj_scan_token(DOT)) { return true; } @@ -3219,8 +3286,8 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Assignment_116_5_26() { - if (jj_3R_Ternary_155_5_22()) { + private boolean jj_3R_Assignment_116_5_25() { + if (jj_3R_Ternary_155_5_30()) { return true; } Token xsp; @@ -3246,44 +3313,51 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar xsp = jj_scanpos; if (jj_3_2()) { jj_scanpos = xsp; - if (jj_3R_Assignment_116_5_26()) { + if (jj_3R_Assignment_116_5_25()) { return true; } } return false; } - private boolean jj_3R_ValueSuffix_300_7_92() { - if (jj_3R_DotSuffix_309_5_102()) { + private boolean jj_3R_ValueSuffix_301_7_82() { + if (jj_3R_DotSuffix_310_5_94()) { return true; } return false; } - private boolean jj_3R_ValueSuffix_300_5_81() { + private boolean jj_3R_ValueSuffix_301_5_79() { Token xsp; xsp = jj_scanpos; - if (jj_3R_ValueSuffix_300_7_92()) { + if (jj_3R_ValueSuffix_301_7_82()) { jj_scanpos = xsp; - if (jj_3R_ValueSuffix_300_21_93()) { + if (jj_3R_ValueSuffix_301_21_83()) { return true; } } xsp = jj_scanpos; - if (jj_3R_ValueSuffix_300_41_112()) { + if (jj_3R_ValueSuffix_301_41_112()) { jj_scanpos = xsp; } return false; } - private boolean jj_3R_Semicolon_107_5_41() { + private boolean jj_3R_Value_282_21_76() { + if (jj_3R_ValueSuffix_301_5_79()) { + return true; + } + return false; + } + + private boolean jj_3R_Semicolon_107_5_39() { if (jj_3R_Assignment_115_5_20()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Semicolon_107_20_46()) { + if (jj_3R_Semicolon_107_20_44()) { jj_scanpos = xsp; break; } @@ -3291,54 +3365,47 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Value_281_21_78() { - if (jj_3R_ValueSuffix_300_5_81()) { - return true; - } - return false; - } - - private boolean jj_3R_ValuePrefix_291_7_77() { - if (jj_3R_NonLiteral_335_5_80()) { - return true; - } - return false; - } - - private boolean jj_3R_ValuePrefix_290_5_76() { - if (jj_3R_Literal_417_5_79()) { + private boolean jj_3R_ValuePrefix_292_7_78() { + if (jj_3R_NonLiteral_336_5_81()) { return true; } return false; } - private boolean jj_3R_Expression_99_5_35() { - if (jj_3R_Semicolon_107_5_41()) { + private boolean jj_3R_ValuePrefix_291_5_77() { + if (jj_3R_Literal_418_5_80()) { return true; } return false; } - private boolean jj_3R_ValuePrefix_290_5_75() { + private boolean jj_3R_ValuePrefix_291_5_75() { Token xsp; xsp = jj_scanpos; - if (jj_3R_ValuePrefix_290_5_76()) { + if (jj_3R_ValuePrefix_291_5_77()) { jj_scanpos = xsp; - if (jj_3R_ValuePrefix_291_7_77()) { + if (jj_3R_ValuePrefix_292_7_78()) { return true; } } return false; } - private boolean jj_3R_Value_281_5_71() { - if (jj_3R_ValuePrefix_290_5_75()) { + private boolean jj_3R_Expression_99_5_33() { + if (jj_3R_Semicolon_107_5_39()) { + return true; + } + return false; + } + + private boolean jj_3R_Value_282_5_74() { + if (jj_3R_ValuePrefix_291_5_75()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Value_281_21_78()) { + if (jj_3R_Value_282_21_76()) { jj_scanpos = xsp; break; } @@ -3346,31 +3413,31 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Null_467_5_98() { + private boolean jj_3R_Null_468_5_100() { if (jj_scan_token(NULL)) { return true; } return false; } - private boolean jj_3R_Unary_272_9_67() { - if (jj_3R_Value_281_5_71()) { + private boolean jj_3R_Unary_273_9_70() { + if (jj_3R_Value_282_5_74()) { return true; } return false; } - private boolean jj_3R_Unary_270_9_66() { + private boolean jj_3R_Unary_271_9_69() { if (jj_scan_token(EMPTY)) { return true; } - if (jj_3R_Unary_263_9_62()) { + if (jj_3R_Unary_264_9_63()) { return true; } return false; } - private boolean jj_3R_Unary_268_9_65() { + private boolean jj_3R_Unary_269_9_68() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(37)) { @@ -3379,13 +3446,13 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Unary_263_9_62()) { + if (jj_3R_Unary_264_9_63()) { return true; } return false; } - private boolean jj_3_6() { + private boolean jj_3_7() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(37)) { @@ -3397,31 +3464,31 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar if (jj_scan_token(EMPTY)) { return true; } - if (jj_3R_Unary_263_9_62()) { + if (jj_3R_Unary_264_9_63()) { return true; } return false; } - private boolean jj_3R_String_458_5_97() { + private boolean jj_3R_String_459_5_99() { if (jj_scan_token(STRING_LITERAL)) { return true; } return false; } - private boolean jj_3R_Unary_263_9_62() { + private boolean jj_3R_Unary_264_9_63() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Unary_263_9_64()) { + if (jj_3R_Unary_264_9_67()) { jj_scanpos = xsp; - if (jj_3_6()) { + if (jj_3_7()) { jj_scanpos = xsp; - if (jj_3R_Unary_268_9_65()) { + if (jj_3R_Unary_269_9_68()) { jj_scanpos = xsp; - if (jj_3R_Unary_270_9_66()) { + if (jj_3R_Unary_271_9_69()) { jj_scanpos = xsp; - if (jj_3R_Unary_272_9_67()) { + if (jj_3R_Unary_273_9_70()) { return true; } } @@ -3431,24 +3498,24 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Unary_263_9_64() { + private boolean jj_3R_Unary_264_9_67() { if (jj_scan_token(MINUS)) { return true; } - if (jj_3R_Unary_263_9_62()) { + if (jj_3R_Unary_264_9_63()) { return true; } return false; } - private boolean jj_3R_Integer_449_5_96() { + private boolean jj_3R_Integer_450_5_98() { if (jj_scan_token(INTEGER_LITERAL)) { return true; } return false; } - private boolean jj_3R_Multiplication_253_9_74() { + private boolean jj_3R_Multiplication_254_9_73() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(51)) { @@ -3457,13 +3524,13 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Unary_263_9_62()) { + if (jj_3R_Unary_264_9_63()) { return true; } return false; } - private boolean jj_3R_Multiplication_251_9_73() { + private boolean jj_3R_Multiplication_252_9_72() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(49)) { @@ -3472,20 +3539,20 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Unary_263_9_62()) { + if (jj_3R_Unary_264_9_63()) { return true; } return false; } - private boolean jj_3R_Multiplication_249_9_68() { + private boolean jj_3R_Multiplication_250_9_64() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Multiplication_249_9_72()) { + if (jj_3R_Multiplication_250_9_71()) { jj_scanpos = xsp; - if (jj_3R_Multiplication_251_9_73()) { + if (jj_3R_Multiplication_252_9_72()) { jj_scanpos = xsp; - if (jj_3R_Multiplication_253_9_74()) { + if (jj_3R_Multiplication_254_9_73()) { return true; } } @@ -3493,31 +3560,31 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Multiplication_249_9_72() { + private boolean jj_3R_Multiplication_250_9_71() { if (jj_scan_token(MULT)) { return true; } - if (jj_3R_Unary_263_9_62()) { + if (jj_3R_Unary_264_9_63()) { return true; } return false; } - private boolean jj_3R_FloatingPoint_440_5_95() { + private boolean jj_3R_FloatingPoint_441_5_97() { if (jj_scan_token(FLOATING_POINT_LITERAL)) { return true; } return false; } - private boolean jj_3R_Multiplication_247_5_56() { - if (jj_3R_Unary_263_9_62()) { + private boolean jj_3R_Multiplication_248_5_61() { + if (jj_3R_Unary_264_9_63()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Multiplication_249_9_68()) { + if (jj_3R_Multiplication_250_9_64()) { jj_scanpos = xsp; break; } @@ -3525,72 +3592,72 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Boolean_432_7_105() { + private boolean jj_3R_Boolean_433_7_105() { if (jj_scan_token(FALSE)) { return true; } return false; } - private boolean jj_3R_Math_237_9_70() { + private boolean jj_3R_Math_238_9_66() { if (jj_scan_token(MINUS)) { return true; } - if (jj_3R_Multiplication_247_5_56()) { + if (jj_3R_Multiplication_248_5_61()) { return true; } return false; } - private boolean jj_3R_Boolean_430_5_104() { + private boolean jj_3R_Boolean_431_5_104() { if (jj_scan_token(TRUE)) { return true; } return false; } - private boolean jj_3R_Boolean_430_5_94() { + private boolean jj_3R_Boolean_431_5_96() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Boolean_430_5_104()) { + if (jj_3R_Boolean_431_5_104()) { jj_scanpos = xsp; - if (jj_3R_Boolean_432_7_105()) { + if (jj_3R_Boolean_433_7_105()) { return true; } } return false; } - private boolean jj_3R_Math_235_9_63() { + private boolean jj_3R_Math_236_9_62() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Math_235_9_69()) { + if (jj_3R_Math_236_9_65()) { jj_scanpos = xsp; - if (jj_3R_Math_237_9_70()) { + if (jj_3R_Math_238_9_66()) { return true; } } return false; } - private boolean jj_3R_Math_235_9_69() { + private boolean jj_3R_Math_236_9_65() { if (jj_scan_token(PLUS)) { return true; } - if (jj_3R_Multiplication_247_5_56()) { + if (jj_3R_Multiplication_248_5_61()) { return true; } return false; } - private boolean jj_3R_Math_233_5_52() { - if (jj_3R_Multiplication_247_5_56()) { + private boolean jj_3R_Math_234_5_55() { + if (jj_3R_Multiplication_248_5_61()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Math_235_9_63()) { + if (jj_3R_Math_236_9_62()) { jj_scanpos = xsp; break; } @@ -3598,45 +3665,45 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Literal_421_7_86() { - if (jj_3R_Null_467_5_98()) { + private boolean jj_3R_Literal_422_7_88() { + if (jj_3R_Null_468_5_100()) { return true; } return false; } - private boolean jj_3R_Literal_420_7_85() { - if (jj_3R_String_458_5_97()) { + private boolean jj_3R_Literal_421_7_87() { + if (jj_3R_String_459_5_99()) { return true; } return false; } - private boolean jj_3R_Literal_419_7_84() { - if (jj_3R_Integer_449_5_96()) { + private boolean jj_3R_Literal_420_7_86() { + if (jj_3R_Integer_450_5_98()) { return true; } return false; } - private boolean jj_3R_Literal_418_7_83() { - if (jj_3R_FloatingPoint_440_5_95()) { + private boolean jj_3R_Literal_419_7_85() { + if (jj_3R_FloatingPoint_441_5_97()) { return true; } return false; } - private boolean jj_3R_Concatenation_223_10_57() { + private boolean jj_3R_Concatenation_224_10_56() { if (jj_scan_token(CONCAT)) { return true; } - if (jj_3R_Math_233_5_52()) { + if (jj_3R_Math_234_5_55()) { return true; } return false; } - private boolean jj_3R_Function_399_24_106() { + private boolean jj_3R_Function_400_24_106() { if (jj_scan_token(COLON)) { return true; } @@ -3646,25 +3713,25 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Literal_417_5_82() { - if (jj_3R_Boolean_430_5_94()) { + private boolean jj_3R_Literal_418_5_84() { + if (jj_3R_Boolean_431_5_96()) { return true; } return false; } - private boolean jj_3R_Literal_417_5_79() { + private boolean jj_3R_Literal_418_5_80() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Literal_417_5_82()) { + if (jj_3R_Literal_418_5_84()) { jj_scanpos = xsp; - if (jj_3R_Literal_418_7_83()) { + if (jj_3R_Literal_419_7_85()) { jj_scanpos = xsp; - if (jj_3R_Literal_419_7_84()) { + if (jj_3R_Literal_420_7_86()) { jj_scanpos = xsp; - if (jj_3R_Literal_420_7_85()) { + if (jj_3R_Literal_421_7_87()) { jj_scanpos = xsp; - if (jj_3R_Literal_421_7_86()) { + if (jj_3R_Literal_422_7_88()) { return true; } } @@ -3674,14 +3741,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Concatenation_221_6_49() { - if (jj_3R_Math_233_5_52()) { + private boolean jj_3R_Concatenation_222_6_51() { + if (jj_3R_Math_234_5_55()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Concatenation_223_10_57()) { + if (jj_3R_Concatenation_224_10_56()) { jj_scanpos = xsp; break; } @@ -3689,14 +3756,14 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Function_408_7_107() { - if (jj_3R_MethodParameters_326_5_110()) { + private boolean jj_3R_Function_409_7_107() { + if (jj_3R_MethodParameters_327_5_110()) { return true; } return false; } - private boolean jj_3R_Compare_210_9_61() { + private boolean jj_3R_Compare_211_9_60() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(29)) { @@ -3705,13 +3772,13 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Concatenation_221_6_49()) { + if (jj_3R_Concatenation_222_6_51()) { return true; } return false; } - private boolean jj_3R_Compare_208_9_60() { + private boolean jj_3R_Compare_209_9_59() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(31)) { @@ -3720,13 +3787,13 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Concatenation_221_6_49()) { + if (jj_3R_Concatenation_222_6_51()) { return true; } return false; } - private boolean jj_3R_Compare_206_9_59() { + private boolean jj_3R_Compare_207_9_58() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(25)) { @@ -3735,27 +3802,27 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Concatenation_221_6_49()) { + if (jj_3R_Concatenation_222_6_51()) { return true; } return false; } - private boolean jj_3R_Function_399_5_99() { + private boolean jj_3R_Function_400_5_101() { if (jj_scan_token(IDENTIFIER)) { return true; } Token xsp; xsp = jj_scanpos; - if (jj_3R_Function_399_24_106()) { + if (jj_3R_Function_400_24_106()) { jj_scanpos = xsp; } - if (jj_3R_Function_408_7_107()) { + if (jj_3R_Function_409_7_107()) { return true; } while (true) { xsp = jj_scanpos; - if (jj_3R_Function_408_7_107()) { + if (jj_3R_Function_409_7_107()) { jj_scanpos = xsp; break; } @@ -3763,16 +3830,16 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Compare_204_9_53() { + private boolean jj_3R_Compare_205_9_52() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Compare_204_9_58()) { + if (jj_3R_Compare_205_9_57()) { jj_scanpos = xsp; - if (jj_3R_Compare_206_9_59()) { + if (jj_3R_Compare_207_9_58()) { jj_scanpos = xsp; - if (jj_3R_Compare_208_9_60()) { + if (jj_3R_Compare_209_9_59()) { jj_scanpos = xsp; - if (jj_3R_Compare_210_9_61()) { + if (jj_3R_Compare_211_9_60()) { return true; } } @@ -3781,7 +3848,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Compare_204_9_58() { + private boolean jj_3R_Compare_205_9_57() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(27)) { @@ -3790,20 +3857,20 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Concatenation_221_6_49()) { + if (jj_3R_Concatenation_222_6_51()) { return true; } return false; } - private boolean jj_3R_Compare_202_5_45() { - if (jj_3R_Concatenation_221_6_49()) { + private boolean jj_3R_Compare_203_5_48() { + if (jj_3R_Concatenation_222_6_51()) { return true; } Token xsp; while (true) { xsp = jj_scanpos; - if (jj_3R_Compare_204_9_53()) { + if (jj_3R_Compare_205_9_52()) { jj_scanpos = xsp; break; } @@ -3811,7 +3878,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_Equality_192_9_55() { + private boolean jj_3R_Equality_193_9_54() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(35)) { @@ -3820,32 +3887,32 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Compare_202_5_45()) { + if (jj_3R_Compare_203_5_48()) { return true; } return false; } - private boolean jj_3R_Identifier_386_5_37() { + private boolean jj_3R_Identifier_387_5_36() { if (jj_scan_token(IDENTIFIER)) { return true; } return false; } - private boolean jj_3R_Equality_190_9_50() { + private boolean jj_3R_Equality_191_9_49() { Token xsp; xsp = jj_scanpos; - if (jj_3R_Equality_190_9_54()) { + if (jj_3R_Equality_191_9_53()) { jj_scanpos = xsp; - if (jj_3R_Equality_192_9_55()) { + if (jj_3R_Equality_193_9_54()) { return true; } } return false; } - private boolean jj_3R_Equality_190_9_54() { + private boolean jj_3R_Equality_191_9_53() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(33)) { @@ -3854,20 +3921,20 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Compare_202_5_45()) { + if (jj_3R_Compare_203_5_48()) { return true; } return false; } - private boolean jj_3R_And_180_17_47() { + private boolean jj_3R_And_181_17_46() { Token xsp; - if (jj_3R_And_179_18_51()) { + if (jj_3R_And_180_18_50()) { return true; } while (true) { xsp = jj_scanpos; - if (jj_3R_And_179_18_51()) { + if (jj_3R_And_180_18_50()) { jj_scanpos = xsp; break; } @@ -3875,7 +3942,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_And_179_18_51() { + private boolean jj_3R_And_180_18_50() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(39)) { @@ -3884,30 +3951,30 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return true; } } - if (jj_3R_Equality_188_5_40()) { + if (jj_3R_Equality_189_5_45()) { return true; } return false; } - private boolean jj_3R_ListData_359_26_113() { + private boolean jj_3R_ListData_360_26_113() { if (jj_scan_token(COMMA)) { return true; } - if (jj_3R_Expression_99_5_35()) { + if (jj_3R_Expression_99_5_33()) { return true; } return false; } - private boolean jj_3R_Equality_188_5_40() { - if (jj_3R_Compare_202_5_45()) { + 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_190_9_50()) { + if (jj_3R_Equality_191_9_49()) { jj_scanpos = xsp; break; } @@ -3915,28 +3982,28 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar return false; } - private boolean jj_3R_LambdaExpression_124_68_28() { - if (jj_3R_Ternary_155_5_22()) { + private boolean jj_3R_MapEntry_378_5_111() { + if (jj_3R_Expression_99_5_33()) { return true; } - return false; - } - - private boolean jj_3R_MapEntry_377_5_111() { - if (jj_3R_Expression_99_5_35()) { + if (jj_scan_token(COLON)) { return true; } - if (jj_scan_token(COLON)) { + if (jj_3R_Expression_99_5_33()) { return true; } - if (jj_3R_Expression_99_5_35()) { + 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_MapData_371_11_109() { - if (jj_3R_MapEntry_377_5_111()) { + private boolean jj_3R_LambdaExpression_124_68_27() { + if (jj_3R_Ternary_155_5_30()) { return true; } return false; @@ -3977,7 +4044,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar 0x1008860, 0x0, 0x0, 0x0, 0x0, }; } - final private JJCalls[] jj_2_rtns = new JJCalls[9]; + final private JJCalls[] jj_2_rtns = new JJCalls[10]; private boolean jj_rescan = false; private int jj_gc = 0; @@ -4300,7 +4367,7 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar private void jj_rescan_token() { jj_rescan = true; - for (int i = 0; i < 9; i++) { + for (int i = 0; i < 10; i++) { try { JJCalls p = jj_2_rtns[i]; @@ -4336,6 +4403,9 @@ public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELPar case 8: jj_3_9(); break; + case 9: + jj_3_10(); + break; } } p = p.next; diff --git a/java/org/apache/el/parser/ELParser.jjt b/java/org/apache/el/parser/ELParser.jjt index 21d3ae42fe..222624e1fb 100644 --- a/java/org/apache/el/parser/ELParser.jjt +++ b/java/org/apache/el/parser/ELParser.jjt @@ -154,8 +154,9 @@ void Ternary() : {} { Or() ( - LOOKAHEAD(3) - (<QUESTIONMARK><COLON> Ternary() #Elvis(2)) + LOOKAHEAD(2) (<QUESTIONMARK><QUESTIONMARK> Ternary() #NullCoalescing(2)) + | + LOOKAHEAD(2) (<QUESTIONMARK><COLON> Ternary() #Elvis(2)) | (<QUESTIONMARK> Ternary() <COLON> Ternary() #Choice(3)) )* diff --git a/java/org/apache/el/parser/ELParserTreeConstants.java b/java/org/apache/el/parser/ELParserTreeConstants.java index 097d189eac..5d0ca504f4 100644 --- a/java/org/apache/el/parser/ELParserTreeConstants.java +++ b/java/org/apache/el/parser/ELParserTreeConstants.java @@ -11,49 +11,50 @@ public interface ELParserTreeConstants { int JJTASSIGN = 6; int JJTLAMBDAEXPRESSION = 7; int JJTLAMBDAPARAMETERS = 8; - int JJTELVIS = 9; - int JJTCHOICE = 10; - int JJTOR = 11; - int JJTAND = 12; - int JJTEQUAL = 13; - int JJTNOTEQUAL = 14; - int JJTLESSTHAN = 15; - int JJTGREATERTHAN = 16; - int JJTLESSTHANEQUAL = 17; - int JJTGREATERTHANEQUAL = 18; - int JJTCONCATENATION = 19; - int JJTPLUS = 20; - int JJTMINUS = 21; - int JJTMULT = 22; - int JJTDIV = 23; - int JJTMOD = 24; - int JJTNEGATIVE = 25; - int JJTNOTEMPTY = 26; - int JJTNOT = 27; - int JJTEMPTY = 28; - int JJTVALUE = 29; - int JJTDOTSUFFIX = 30; - int JJTBRACKETSUFFIX = 31; - int JJTMETHODPARAMETERS = 32; - int JJTSETDATA = 33; - int JJTLISTDATA = 34; - int JJTMAPDATA = 35; - int JJTMAPENTRY = 36; - int JJTIDENTIFIER = 37; - int JJTFUNCTION = 38; - int JJTTRUE = 39; - int JJTFALSE = 40; - int JJTFLOATINGPOINT = 41; - int JJTINTEGER = 42; - int JJTSTRING = 43; - int JJTNULL = 44; + int JJTNULLCOALESCING = 9; + int JJTELVIS = 10; + int JJTCHOICE = 11; + int JJTOR = 12; + int JJTAND = 13; + int JJTEQUAL = 14; + int JJTNOTEQUAL = 15; + int JJTLESSTHAN = 16; + int JJTGREATERTHAN = 17; + int JJTLESSTHANEQUAL = 18; + int JJTGREATERTHANEQUAL = 19; + int JJTCONCATENATION = 20; + int JJTPLUS = 21; + int JJTMINUS = 22; + int JJTMULT = 23; + int JJTDIV = 24; + int JJTMOD = 25; + int JJTNEGATIVE = 26; + int JJTNOTEMPTY = 27; + int JJTNOT = 28; + int JJTEMPTY = 29; + int JJTVALUE = 30; + int JJTDOTSUFFIX = 31; + int JJTBRACKETSUFFIX = 32; + int JJTMETHODPARAMETERS = 33; + int JJTSETDATA = 34; + int JJTLISTDATA = 35; + int JJTMAPDATA = 36; + int JJTMAPENTRY = 37; + int JJTIDENTIFIER = 38; + int JJTFUNCTION = 39; + int JJTTRUE = 40; + int JJTFALSE = 41; + int JJTFLOATINGPOINT = 42; + int JJTINTEGER = 43; + int JJTSTRING = 44; + int JJTNULL = 45; String[] jjtNodeName = { "CompositeExpression", "LiteralExpression", "DeferredExpression", "DynamicExpression", - "void", "Semicolon", "Assign", "LambdaExpression", "LambdaParameters", "Elvis", "Choice", "Or", "And", - "Equal", "NotEqual", "LessThan", "GreaterThan", "LessThanEqual", "GreaterThanEqual", "Concatenation", - "Plus", "Minus", "Mult", "Div", "Mod", "Negative", "NotEmpty", "Not", "Empty", "Value", "DotSuffix", - "BracketSuffix", "MethodParameters", "SetData", "ListData", "MapData", "MapEntry", "Identifier", "Function", - "True", "False", "FloatingPoint", "Integer", "String", "Null", }; + "void", "Semicolon", "Assign", "LambdaExpression", "LambdaParameters", "NullCoalescing", "Elvis", "Choice", + "Or", "And", "Equal", "NotEqual", "LessThan", "GreaterThan", "LessThanEqual", "GreaterThanEqual", + "Concatenation", "Plus", "Minus", "Mult", "Div", "Mod", "Negative", "NotEmpty", "Not", "Empty", "Value", + "DotSuffix", "BracketSuffix", "MethodParameters", "SetData", "ListData", "MapData", "MapEntry", + "Identifier", "Function", "True", "False", "FloatingPoint", "Integer", "String", "Null", }; } -/* JavaCC - OriginalChecksum=bf490de1f9b26486497de3154abf559e (do not edit this line) */ +/* JavaCC - OriginalChecksum=d80a2fa5420bfdbed47a91cdb3343069 (do not edit this line) */ diff --git a/test/org/apache/el/TestELEvaluation.java b/test/org/apache/el/TestELEvaluation.java index ada44c4b2c..2871004647 100644 --- a/test/org/apache/el/TestELEvaluation.java +++ b/test/org/apache/el/TestELEvaluation.java @@ -247,14 +247,42 @@ public class TestELEvaluation { @Test public void testElvis01() throws Exception { - Assert.assertEquals("OK", evaluateExpression("${'OK'?:'FAIL'}")); + Assert.assertEquals("true", evaluateExpression("${'true'?:'FAIL'}")); } @Test public void testElvis02() throws Exception { + // null coerces to false Assert.assertEquals("OK", evaluateExpression("${null?:'OK'}")); } + @Test + public void testElvis03() throws Exception { + Assert.assertEquals("OK", evaluateExpression("${'false'?:'OK'}")); + } + + @Test + public void testElvis04() throws Exception { + // Any string other "true" (ignoring case) coerces to false + evaluateExpression("${'error'?:'OK'}"); + } + + @Test(expected = ELException.class) + public void testElvis05() throws Exception { + // Non-string values do not coerce + evaluateExpression("${1234?:'OK'}"); + } + + @Test + public void testNullCoalescing01() throws Exception { + Assert.assertEquals("OK", evaluateExpression("${'OK'??'FAIL'}")); + } + + @Test + public void testNullCoalescing02() throws Exception { + Assert.assertEquals("OK", evaluateExpression("${null??'OK'}")); + } + // ************************************************************************ diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 5864a12afb..451a2f5191 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -199,8 +199,8 @@ <subsection name="Jasper"> <changelog> <add> - Add support for the new Elvis operator (<code>:?</code>) in Jakarta - Expression language. (markt) + Add support for the new Elvis (<code>:?</code>) and Null coalescing + (<code>??</code>) operators in Jakarta Expression language. (markt) </add> <add> Extend the existing <code>+</code> operator in Jakarta Expression --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org