You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/07/18 13:40:27 UTC
svn commit: r1504437 - in /tomcat/trunk/java/org/apache/el:
Messages.properties lang/ExpressionBuilder.java parser/AstFunction.java
parser/ELParser.java parser/ELParser.jjt
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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org