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