Author: markt Date: Thu Jul 18 11:40:26 2013 New Revision: 1504437 URL: http://svn.apache.org/r1504437 Log: Modify the grammar for function to permit multiple sets of parameters for lambda expressions. Implementing that handling is still a TODO.
Modified: tomcat/trunk/java/org/apache/el/Messages.properties tomcat/trunk/java/org/apache/el/lang/ExpressionBuilder.java tomcat/trunk/java/org/apache/el/parser/AstFunction.java tomcat/trunk/java/org/apache/el/parser/ELParser.java tomcat/trunk/java/org/apache/el/parser/ELParser.jjt Modified: tomcat/trunk/java/org/apache/el/Messages.properties URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/Messages.properties?rev=1504437&r1=1504436&r2=1504437&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/Messages.properties (original) +++ tomcat/trunk/java/org/apache/el/Messages.properties Thu Jul 18 11:40:26 2013 @@ -51,6 +51,7 @@ error.fnMapper.paramcount=Function ''{0} error.context.null=ELContext was null # Parser +error.funciton.tooManyMethodParameterSets=There are multiple sets of parameters specified for function [{0}] error.identifier.notjava=The identifier [{0}] is not a valid Java identifier as required by section 1.19 of the EL specification (Identifier ::= Java language identifier). This check can be disabled by setting the system property org.apache.el.parser.SKIP_IDENTIFIER_CHECK to true. error.lambda.tooManyMethodParameterSets=There are more sets of method parameters specified than there are nested lambda expressions Modified: tomcat/trunk/java/org/apache/el/lang/ExpressionBuilder.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/lang/ExpressionBuilder.java?rev=1504437&r1=1504436&r2=1504437&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/lang/ExpressionBuilder.java (original) +++ tomcat/trunk/java/org/apache/el/lang/ExpressionBuilder.java Thu Jul 18 11:40:26 2013 @@ -212,7 +212,8 @@ public final class ExpressionBuilder imp } int pcnt = m.getParameterTypes().length; - if (node.jjtGetNumChildren() != pcnt) { + // AstFunction->MethodParameters->Parameters() + if (node.jjtGetChild(0).jjtGetNumChildren() != pcnt) { throw new ELException(MessageFactory.get( "error.fnMapper.paramcount", funcNode.getOutputName(), "" + pcnt, "" + node.jjtGetNumChildren())); Modified: tomcat/trunk/java/org/apache/el/parser/AstFunction.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/AstFunction.java?rev=1504437&r1=1504436&r2=1504437&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/parser/AstFunction.java (original) +++ tomcat/trunk/java/org/apache/el/parser/AstFunction.java Thu Jul 18 11:40:26 2013 @@ -97,10 +97,11 @@ public final class AstFunction extends S if (obj instanceof LambdaExpression) { LambdaExpression le = (LambdaExpression) obj; // Build arguments - int numArgs = this.jjtGetNumChildren(); + // TODO handle multiple sets of arguments + int numArgs = this.jjtGetChild(0).jjtGetNumChildren(); Object[] args = new Object[numArgs]; for (int i = 0; i < numArgs; i++) { - args[i] = children[i].getValue(ctx); + args[i] = jjtGetChild(0).jjtGetChild(i).getValue(ctx); } return le.invoke(ctx, args); } @@ -111,15 +112,24 @@ public final class AstFunction extends S this.getOutputName())); } + // Not a lambda expression so must be a function. Check there is just a + // single set of method parameters + if (this.jjtGetNumChildren() != 1) { + throw new ELException(MessageFactory.get( + "error.funciton.tooManyMethodParameterSets", + getOutputName())); + } + + Node parameters = jjtGetChild(0); Class<?>[] paramTypes = m.getParameterTypes(); Object[] params = null; Object result = null; - int numParams = this.jjtGetNumChildren(); + int numParams = parameters.jjtGetNumChildren(); if (numParams > 0) { params = new Object[numParams]; try { for (int i = 0; i < numParams; i++) { - params[i] = this.children[i].getValue(ctx); + params[i] = parameters.jjtGetChild(i).getValue(ctx); params[i] = coerceToType(params[i], paramTypes[i]); } } catch (ELException ele) { Modified: tomcat/trunk/java/org/apache/el/parser/ELParser.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/ELParser.java?rev=1504437&r1=1504436&r2=1504437&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/parser/ELParser.java (original) +++ tomcat/trunk/java/org/apache/el/parser/ELParser.java Thu Jul 18 11:40:26 2013 @@ -1845,42 +1845,18 @@ public class ELParser/*@bgen(jjtree)*/im } else { jjtn000.setLocalName(t1.image); } - jj_consume_token(LPAREN); - switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case START_SET_OR_MAP: - case INTEGER_LITERAL: - case FLOATING_POINT_LITERAL: - case STRING_LITERAL: - case TRUE: - case FALSE: - case NULL: - case LPAREN: - case LBRACK: - case NOT0: - case NOT1: - case EMPTY: - case MINUS: - case IDENTIFIER: - Expression(); - label_19: - while (true) { - switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { - case COMMA: - ; - break; - default: - jj_la1[48] = jj_gen; - break label_19; - } - jj_consume_token(COMMA); - Expression(); + label_19: + while (true) { + MethodParameters(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case LPAREN: + ; + break; + default: + jj_la1[48] = jj_gen; + break label_19; } - break; - default: - jj_la1[49] = jj_gen; - ; } - jj_consume_token(RPAREN); } catch (Throwable jjte000) { if (jjtc000) { jjtree.clearNodeScope(jjtn000); @@ -1925,7 +1901,7 @@ public class ELParser/*@bgen(jjtree)*/im Null(); break; default: - jj_la1[50] = jj_gen; + jj_la1[49] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -1962,7 +1938,7 @@ public class ELParser/*@bgen(jjtree)*/im } break; default: - jj_la1[51] = jj_gen; + jj_la1[50] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2132,13 +2108,13 @@ public class ELParser/*@bgen(jjtree)*/im return false; } - private boolean jj_3R_103() { + private boolean jj_3R_105() { if (jj_3R_35()) return true; return false; } - private boolean jj_3R_102() { - if (jj_3R_103()) return true; + private boolean jj_3R_103() { + if (jj_3R_105()) return true; return false; } @@ -2176,12 +2152,12 @@ public class ELParser/*@bgen(jjtree)*/im if (jj_scan_token(START_SET_OR_MAP)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3R_102()) jj_scanpos = xsp; + if (jj_3R_103()) jj_scanpos = xsp; if (jj_scan_token(RBRACE)) return true; return false; } - private boolean jj_3R_101() { + private boolean jj_3R_102() { if (jj_3R_35()) return true; return false; } @@ -2207,7 +2183,7 @@ public class ELParser/*@bgen(jjtree)*/im if (jj_scan_token(LBRACK)) return true; Token xsp; xsp = jj_scanpos; - if (jj_3R_101()) jj_scanpos = xsp; + if (jj_3R_102()) jj_scanpos = xsp; if (jj_scan_token(RBRACK)) return true; return false; } @@ -2374,6 +2350,11 @@ public class ELParser/*@bgen(jjtree)*/im return false; } + private boolean jj_3R_104() { + if (jj_scan_token(LPAREN)) return true; + return false; + } + private boolean jj_3R_21() { if (jj_3R_27()) return true; if (jj_scan_token(ARROW)) return true; @@ -2717,6 +2698,11 @@ public class ELParser/*@bgen(jjtree)*/im return false; } + private boolean jj_3R_101() { + if (jj_3R_104()) return true; + return false; + } + private boolean jj_3R_55() { Token xsp; xsp = jj_scanpos; @@ -2784,7 +2770,11 @@ public class ELParser/*@bgen(jjtree)*/im xsp = jj_scanpos; if (jj_3_9()) jj_scanpos = xsp; if (jj_scan_token(IDENTIFIER)) return true; - if (jj_scan_token(LPAREN)) return true; + if (jj_3R_101()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_101()) { jj_scanpos = xsp; break; } + } return false; } @@ -2849,7 +2839,7 @@ public class ELParser/*@bgen(jjtree)*/im private Token jj_scanpos, jj_lastpos; private int jj_la; private int jj_gen; - final private int[] jj_la1 = new int[52]; + final private int[] jj_la1 = new int[51]; static private int[] jj_la1_0; static private int[] jj_la1_1; static { @@ -2857,10 +2847,10 @@ public class ELParser/*@bgen(jjtree)*/im jj_la1_init_1(); } private static void jj_la1_init_0() { - jj_la1_0 = new int[] {0xe,0xe,0x800000,0x15ed00,0x15ed00,0x1000000,0x0,0x40000,0x15ed00,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfe000000,0x18000000,0x6000000,0x80000000,0x60000000,0xfe000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x15ed00,0x120000,0x15ed00,0x120000,0x40000,0x1000000,0x15ed00,0x40000,0x0,0x100100,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1ec00,0xc000,}; + jj_la1_0 = new int[] {0xe,0xe,0x800000,0x15ed00,0x15ed00,0x1000000,0x0,0x40000,0x15ed00,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfe000000,0x18000000,0x6000000,0x80000000,0x60000000,0xfe000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x15ed00,0x120000,0x15ed00,0x120000,0x40000,0x1000000,0x15ed00,0x40000,0x0,0x100100,0x1000000,0x15ed00,0x1000000,0x15ed00,0x1000000,0x15ed00,0x40000,0x1ec00,0xc000,}; } private static void jj_la1_init_1() { - jj_la1_1 = new int[] {0x0,0x0,0x0,0x1008860,0x1008860,0x0,0x1000000,0x1000000,0x1008860,0x0,0x600,0x600,0x180,0x180,0x1e,0x6,0x18,0x1e,0x1,0x0,0x0,0x1,0x0,0x1,0x200000,0xc000,0xc000,0x1e2000,0x60000,0x180000,0x1e2000,0x60,0x1008860,0x0,0x1000000,0x0,0x0,0x0,0x1008860,0x0,0x1000000,0x0,0x0,0x1008860,0x0,0x1008860,0x0,0x1008860,0x0,0x1008860,0x0,0x0,}; + jj_la1_1 = new int[] {0x0,0x0,0x0,0x1008860,0x1008860,0x0,0x1000000,0x1000000,0x1008860,0x0,0x600,0x600,0x180,0x180,0x1e,0x6,0x18,0x1e,0x1,0x0,0x0,0x1,0x0,0x1,0x200000,0xc000,0xc000,0x1e2000,0x60000,0x180000,0x1e2000,0x60,0x1008860,0x0,0x1000000,0x0,0x0,0x0,0x1008860,0x0,0x1000000,0x0,0x0,0x1008860,0x0,0x1008860,0x0,0x1008860,0x0,0x0,0x0,}; } final private JJCalls[] jj_2_rtns = new JJCalls[9]; private boolean jj_rescan = false; @@ -2877,7 +2867,7 @@ public class ELParser/*@bgen(jjtree)*/im token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 52; i++) jj_la1[i] = -1; + for (int i = 0; i < 51; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -2893,7 +2883,7 @@ public class ELParser/*@bgen(jjtree)*/im jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 52; i++) jj_la1[i] = -1; + for (int i = 0; i < 51; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -2904,7 +2894,7 @@ public class ELParser/*@bgen(jjtree)*/im token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 52; i++) jj_la1[i] = -1; + for (int i = 0; i < 51; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -2916,7 +2906,7 @@ public class ELParser/*@bgen(jjtree)*/im jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 52; i++) jj_la1[i] = -1; + for (int i = 0; i < 51; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -2926,7 +2916,7 @@ public class ELParser/*@bgen(jjtree)*/im token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 52; i++) jj_la1[i] = -1; + for (int i = 0; i < 51; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -2937,7 +2927,7 @@ public class ELParser/*@bgen(jjtree)*/im jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 52; i++) jj_la1[i] = -1; + for (int i = 0; i < 51; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } @@ -3054,7 +3044,7 @@ public class ELParser/*@bgen(jjtree)*/im la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 52; i++) { + for (int i = 0; i < 51; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1<<j)) != 0) { Modified: tomcat/trunk/java/org/apache/el/parser/ELParser.jjt URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/parser/ELParser.jjt?rev=1504437&r1=1504436&r2=1504437&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/parser/ELParser.jjt (original) +++ tomcat/trunk/java/org/apache/el/parser/ELParser.jjt Thu Jul 18 11:40:26 2013 @@ -396,7 +396,7 @@ void Function() #Function : jjtThis.setLocalName(t1.image); } } - <LPAREN> (Expression() (<COMMA> Expression())*)? <RPAREN> + ( MethodParameters() )+ } /* --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org