[e-cvs] cvs commit: e/src/jsrc/org/erights/e/elang/syntax EBuilder.java EParser.java e.y

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Thu, 23 Aug 2001 04:57:07 -0400


markm       01/08/23 04:57:07

  Modified:    src/jsrc/org/erights/e/elang/syntax EBuilder.java
                        EParser.java e.y
  Log:
  new when-catch-finally.  Thanks Alan Karp.

Revision  Changes    Path
1.72      +34 -34    e/src/jsrc/org/erights/e/elang/syntax/EBuilder.java

Index: EBuilder.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/EBuilder.java,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -r1.71 -r1.72
--- EBuilder.java	2001/04/15 19:49:25	1.71
+++ EBuilder.java	2001/08/23 08:57:06	1.72
@@ -1439,20 +1439,22 @@
      * <pre>
      * when (eExpr) -> auds(patt1) {
      *     body1
-     * } catch patt2 {
-     *     body2
-     * }
+     * } catch ... {
+     *     ...
+     * } ... # possibly more catches & a finally clause
      * </pre>
      * expands to
      * <pre>
      * Ref whenResolved(eExpr, def auds(resolution) :void {
-     *     if (Ref isBroken(resolution)) {
-     *         def patt2 := Ref optProblem(resolution)
-     *         body2
-     *     } else {
+     *     try {
+     *         if (Ref isBroken(resolution)) {
+     *             throw(Ref optProblem(resolution))
+     *         }
      *         def patt1 := resolution
      *         body1
-     *     }
+     *     } catch ... {
+     *         ...
+     *     } ... # possibly more catches & a finally clause
      * })
      * </pre>
      */
@@ -1460,31 +1462,29 @@
                            Object[] auds,
                            Pattern patt1,
                            EExpr body1,
-                           Pattern patt2,
-                           EExpr body2)
+                           Object catchers,
+                           Object optFinally)
     {
         String resolution = newTemp("resolution");
         EExpr resExpr = noun(resolution);
         Pattern resPatt = finalPattern(resolution);
         
+        EExpr cond = ifx(call(REF, "isBroken", list(resExpr)),
+                         call(THROW,
+                              "run",
+                              list(call(REF, "optProblem", list(resExpr)))));
         if (! (patt1 instanceof IgnorePattern)) {
             body1 = sequence(define(patt1, resExpr),
                              body1);
         }
-        body2 = sequence(define(patt2,
-                                call(REF,
-                                     "optProblem",
-                                     list(resExpr))),
-                         body2);
-        EExpr sndBody = ifx(call(REF, "isBroken", list(resExpr)),
-                            body2,
-                            body1);
+        body1 = sequence(cond, body1);
+        body1 = tryx(body1, catchers, optFinally);
         return call(REF,
                     "whenResolved",
                     list(eExpr,
                          methObject(auds,
                                     methHead("run", list(resPatt), VOID),
-                                    sndBody)));
+                                    body1)));
     }
 
     /**
@@ -1505,14 +1505,15 @@
      *     body2
      * }
      * </pre>
-     * which then expands according to the base case.
+     * which then expands according to the base case explained in
+     * {@link #whenBase} 
      */
     private EExpr whenList(EExpr[] eExprs,
                            Object[] auds,
                            Pattern[] patts,
                            EExpr body1,
-                           Pattern patt2,
-                           EExpr body2)
+                           Object catchers,
+                           Object optFinally)
     {
         int len = eExprs.length;
         if (len <= 0) {
@@ -1539,14 +1540,18 @@
                         auds,
                         patt1,
                         body1,
-                        patt2,
-                        body2);
+                        catchers,
+                        optFinally);
     }
+
 
-    
+    /**
+     * 
+     */
     /*package*/ EExpr when(Object headList,
                            Object bodyExpr,
-                           Object mCatcher)
+                           Object catchers,
+                           Object optFinally)
     {
         EExpr[] eExprs = null;
         Object[] auds = null;
@@ -1562,17 +1567,12 @@
             reserved("alternate when syntax");
         }
         
-        EExpr body1 = (EExpr)bodyExpr;
-        Matcher catcher = (Matcher)mCatcher;
-        Pattern patt2 = catcher.pattern();
-        EExpr body2 = catcher.body();
-
         return whenList(eExprs,
                         auds,
                         patts,
-                        body1,
-                        patt2,
-                        body2);
+                        (EExpr)bodyExpr,
+                        catchers,
+                        optFinally);
     }
 
 



1.80      +262 -261  e/src/jsrc/org/erights/e/elang/syntax/EParser.java

Index: EParser.java
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/EParser.java,v
retrieving revision 1.79
retrieving revision 1.80
diff -u -r1.79 -r1.80
--- EParser.java	2001/08/13 20:38:10	1.79
+++ EParser.java	2001/08/23 08:57:06	1.80
@@ -346,9 +346,9 @@
    43,   43,   89,   89,   38,   13,   13,   17,   17,   17,
    17,   17,   17,   17,   17,   17,   17,   17,   17,   44,
    44,   50,   47,   47,   47,   91,   92,   94,   94,   95,
-   95,   93,   93,   51,   51,   54,   52,   52,   57,   57,
-   96,   96,   96,   96,   98,   98,   98,   98,   97,   97,
-   97,  100,  100,  101,  101,  102,  102,   99,   99,   90,
+   95,   93,   93,   51,   51,   54,   96,   52,   52,   57,
+   57,   97,   97,   97,   97,   99,   99,   99,   99,   98,
+   98,   98,  101,  101,  102,  102,  103,  103,  100,  100,
    90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
    90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
    90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
@@ -357,7 +357,7 @@
    90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
    90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
    90,   90,   90,   90,   90,   90,   90,   90,   90,   90,
-   90,   90,   90,   90,
+   90,   90,   90,   90,   90,
 };
 final static short yylen[] = {                            2,
     1,    1,    2,    1,    1,    3,    3,    1,    3,    1,
@@ -371,7 +371,7 @@
     6,    2,    3,    6,    4,    4,    5,    6,    7,    2,
     4,    1,    4,    5,    6,    1,    1,    1,    1,    1,
     1,    1,    3,    2,    1,    3,    3,    1,    3,    3,
-    5,    3,    4,    2,    3,    3,    4,    4,    1,    1,
+    5,    3,    4,    2,    3,    3,    4,    5,    1,    1,
     4,    2,    2,    4,    2,    3,    2,    3,    2,    1,
     3,    3,    5,    5,    4,    4,    0,    1,    1,    0,
     5,    4,    0,    1,    3,    1,    2,    2,    3,    3,
@@ -387,9 +387,9 @@
     1,    3,    3,    2,    1,    1,    1,    1,    1,    1,
     1,    1,    1,    1,    1,    1,    1,    1,    1,    5,
     7,    6,    7,    1,    1,    0,    0,    1,    3,    1,
-    3,    1,    3,    1,    2,    3,    0,    2,    7,    3,
-    1,    2,    2,    4,    2,    4,    2,    4,    2,    5,
-    4,    2,    3,    1,    4,    2,    2,    0,    3,    1,
+    3,    1,    3,    1,    1,    2,    3,    0,    2,    7,
+    3,    1,    2,    2,    4,    2,    4,    2,    4,    2,
+    5,    4,    2,    3,    1,    4,    2,    2,    0,    3,
     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -398,19 +398,19 @@
     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
     1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-    1,    1,    1,    1,
+    1,    1,    1,    1,    1,
 };
 final static short yydefred[] = {                         0,
   234,    0,    0,    0,    2,    0,  246,    0,    0,    0,
-  300,  301,  302,  303,  304,  305,  306,  307,  308,  309,
-  310,  311,  312,  313,  314,  315,  316,  317,  318,  319,
-  320,  321,  322,  323,  324,  325,  326,  327,  328,  329,
-  330,  331,  332,  333,  334,  335,  336,  337,  338,  339,
-  340,  341,  342,  343,  344,  345,  346,  347,  348,  349,
-  350,  351,  352,  353,  354,  355,  356,  357,  358,  359,
-  360,  361,  362,  363,  364,  365,  366,  367,  368,  369,
-  370,  371,  372,  373,  374,  375,  376,  377,  378,  379,
-  380,  381,  382,  383,  384,    0,    0,    0,    0,    0,
+  301,  302,  303,  304,  305,  306,  307,  308,  309,  310,
+  311,  312,  313,  314,  315,  316,  317,  318,  319,  320,
+  321,  322,  323,  324,  325,  326,  327,  328,  329,  330,
+  331,  332,  333,  334,  335,  336,  337,  338,  339,  340,
+  341,  342,  343,  344,  345,  346,  347,  348,  349,  350,
+  351,  352,  353,  354,  355,  356,  357,  358,  359,  360,
+  361,  362,  363,  364,  365,  366,  367,  368,  369,  370,
+  371,  372,  373,  374,  375,  376,  377,  378,  379,  380,
+  381,  382,  383,  384,  385,    0,    0,    0,    0,    0,
     0,  188,    3,    0,  189,    0,  174,    0,  167,  172,
   247,   96,   97,   98,   99,  100,  102,    0,    0,    0,
     0,    4,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -438,60 +438,60 @@
     0,    0,  180,  178,  181,    0,  177,    0,  103,    0,
     0,    0,  266,    0,  264,  265,  202,  198,    0,    0,
     0,  115,    0,  109,    0,    0,    0,  239,    0,    0,
-  266,  116,    0,  274,    0,    0,    0,  110,  126,    0,
-  266,    0,    0,   76,   75,   73,   74,  130,  244,    0,
-  106,  107,    0,    0,    0,    0,    0,    0,  155,    0,
-    0,    0,  221,  128,    0,    0,    0,    0,    0,  112,
-    0,    9,    0,   16,    0,    0,    0,    0,    0,    0,
+  266,  116,    0,  275,  274,    0,    0,  236,  110,  126,
+    0,  266,    0,    0,   76,   75,   73,   74,  130,  244,
+    0,  106,  107,    0,    0,    0,    0,    0,    0,  155,
+    0,    0,    0,  221,  128,    0,    0,    0,    0,    0,
+  112,    0,    9,    0,   16,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  148,    0,  147,    0,  131,  166,    0,    0,  163,
-    0,    0,    0,    0,    0,    7,    0,  190,  191,  185,
-    0,    0,    0,    0,  179,  165,    0,  135,    0,  224,
-    0,    0,  136,    0,    0,    0,    0,    0,    0,    0,
-    0,   86,    0,    0,    0,    0,  117,  275,    0,    0,
-    0,  229,  118,    0,    0,    0,    0,    0,  289,  280,
-  243,    0,  242,  240,  121,    0,    0,  124,    0,    0,
-    0,    0,    0,    0,  113,    0,    0,   21,   23,    0,
-   18,   22,   19,   25,   29,   31,   32,   40,   39,   36,
-   37,   38,   33,   34,   35,   43,   44,   45,   42,   46,
-    0,    0,   54,    0,   51,    0,   59,    0,   56,   57,
-   67,   66,   63,   65,   61,   62,   64,   71,   70,   69,
-    0,    0,   79,    0,    0,    0,   93,  149,  192,  194,
-  162,    0,  156,    0,    0,  159,   11,  152,  150,  152,
-  183,  182,    0,    0,  223,  236,  199,  200,    0,  209,
-    0,  111,  134,  133,    0,    0,   87,  236,    0,  278,
-    0,    0,  228,    0,    0,    0,  292,    0,  294,    0,
-    0,    0,    0,  267,  260,  219,    0,  226,    0,    0,
-   24,  203,    0,    0,    0,    0,   94,    0,  169,  171,
-    0,    0,    0,    0,  268,    0,  222,    0,   88,    0,
-  272,    0,  276,    0,    0,  230,  297,  296,    0,  293,
-  291,    0,    0,    0,  281,  267,    0,    0,  299,    0,
-  220,    0,   81,    0,   84,   95,  151,  184,  142,    0,
-    0,    0,    0,    0,    0,  267,    0,   89,    0,    0,
-    0,  231,    0,  282,  285,  287,    0,  283,    0,  290,
-  261,    0,   80,  141,    0,    0,    0,    0,    0,    0,
-  269,    0,    0,  210,  273,  262,    0,  295,  279,    0,
-    0,    0,  204,    0,  215,    0,    0,    0,  218,  211,
-  213,  271,  263,    0,  284,  286,  288,  214,    0,  212,
-    0,  227,  216,    0,  217,
+    0,    0,  148,    0,  147,    0,  131,  166,    0,    0,
+  163,    0,    0,    0,    0,    0,    7,    0,  190,  191,
+  185,    0,    0,    0,    0,  179,  165,    0,  135,    0,
+  224,    0,    0,  136,    0,    0,    0,    0,    0,    0,
+    0,    0,   86,    0,    0,    0,    0,  117,  276,    0,
+    0,    0,  229,    0,    0,    0,    0,    0,    0,    0,
+  290,  281,  243,    0,  242,  240,  121,    0,    0,  124,
+    0,    0,    0,    0,    0,    0,  113,    0,    0,   21,
+   23,    0,   18,   22,   19,   25,   29,   31,   32,   40,
+   39,   36,   37,   38,   33,   34,   35,   43,   44,   45,
+   42,   46,    0,    0,   54,    0,   51,    0,   59,    0,
+   56,   57,   67,   66,   63,   65,   61,   62,   64,   71,
+   70,   69,    0,    0,   79,    0,    0,    0,   93,  149,
+  192,  194,  162,    0,  156,    0,    0,  159,   11,  152,
+  150,  152,  183,  182,    0,    0,  223,  236,  199,  200,
+    0,  209,    0,  111,  134,  133,    0,    0,   87,  236,
+    0,  279,    0,    0,  228,    0,  118,    0,    0,  293,
+    0,  295,    0,    0,    0,    0,  267,  260,  219,    0,
+  226,    0,    0,   24,  203,    0,    0,    0,    0,   94,
+    0,  169,  171,    0,    0,    0,    0,  268,    0,  222,
+    0,   88,    0,  272,    0,  277,    0,    0,  230,  298,
+  297,    0,  294,  292,    0,    0,    0,  282,  267,    0,
+    0,  300,    0,  220,    0,   81,    0,   84,   95,  151,
+  184,  142,    0,    0,    0,    0,    0,    0,  267,    0,
+   89,    0,    0,    0,  231,    0,  283,  286,  288,    0,
+  284,    0,  291,  261,    0,   80,  141,    0,    0,    0,
+    0,    0,    0,  269,    0,    0,  210,  273,  262,    0,
+  296,  280,    0,    0,    0,  204,    0,  215,    0,    0,
+    0,  218,  211,  213,  271,  263,    0,  285,  287,  289,
+  214,    0,  212,    0,  227,  216,    0,  217,
 };
 final static short yydgoto[] = {                          3,
-  188,    5,  399,  198,  146,  368,  335,  147,    6,  148,
-  149,  150,  151,  532,  561,  152,  283,  105,  154,  155,
-  156,  540,  157,  158,  159,  555,  160,  559,  161,  563,
-  162,  570,  163,  164,  165,  166,  241,  382,  167,  168,
+  188,    5,  400,  198,  146,  368,  335,  147,    6,  148,
+  149,  150,  151,  534,  563,  152,  283,  105,  154,  155,
+  156,  542,  157,  158,  159,  557,  160,  561,  161,  565,
+  162,  572,  163,  164,  165,  166,  241,  383,  167,  168,
   318,  169,  242,  170,  218,  264,  354,  256,  213,  372,
-  373,  497,  230,  498,  171,  172,  234,  202,  478,  479,
-  319,  343,  472,  183,  243,  184,  185,  186,  187,  107,
+  373,  498,  230,  374,  171,  172,  234,  202,  479,  480,
+  319,  343,  473,  183,  243,  184,  185,  186,  187,  107,
   108,  109,  110,  195,  196,  344,  345,  214,  215,  244,
-  601,  684,  708,  729,  355,  356,  501,  502,  245,  111,
-  250,  517,  652,  646,  686,  666,  383,  667,  509,  505,
-  618,  619,
+  603,  687,  711,  732,  355,  356,  502,  503,  245,  111,
+  250,  519,  655,  649,  689,  499,  669,  384,  670,  511,
+  507,  621,  622,
 };
-final static short yysindex[] = {                      -307,
-    0,10032,    0,11908,    0, -327,    0,16723,   48,16723,
+final static short yysindex[] = {                      -320,
+    0,10200,    0,12076,    0, -308,    0,16891,   54,16891,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -500,75 +500,75 @@
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0, -313, -313, 6675, -313,  -28,
-   54,    0,    0,   99,    0, -160,    0,  120,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,12378,10150,10150,
-13432,    0,10032, 6794,   48, 8301,   48,   65,   65,13312,
-   48,    0,   48,13432, -313, -313, -313, -313, -316, -313,
-   10,    0,  -51,15154, 9104, -313,    0,    0,   53,    0,
-    0,  362, -204, -185,    0,  -16,   49,   34,  119,    2,
-    0, -182, 8635,    0,  188,    0,    0, -115,    0,    0,
-    0,    0,    0,  174, -313, -165,  201,12968,16723, -313,
-    0, -140,  233,   -8,  240,   -2,    0,11908,  296,   82,
-  135, -313,   46,    0,    0,  -22, -313,13432,  122,    0,
-    0,   65,  -71,    0,    0,16723,16723,  254,  271,    0,
-    0,  359,   65,   29,    0,   65, -140,  131,    0,   65,
- -313, -313,    0,  375,  278,    0,    0, -313,  389,   65,
-   65,  278,15272,    0,16723,12968,12968,12968,16723,   37,
-  354,   31,    0,  409,    0,  416,    0,    0,  202, -313,
-    0,  204, 9566,  118,    0,   65,16723,16723,  348,  353,
-    0,   91,   99,14356,    0, 8759,11908, -313, -313,    0,
-    0,    0,    0,    0, -313,    0,    0,    0,    0,    0,
-    0,    0, -313, -313, -313, -313, -313, -313, -313, -313,
- -313, -313, -313, -313, -313, -313, -313, -313, -313, -313,
- -313, -313, -313, -313, -313, -313, -313, -313, -313, -313,
- -313, -313,16723,   90, -313,  455,    0,    0,  -11, -313,
-  451,10032, -313,    0,    0,13894,    0, -313,  453, -313,
-    0,  373, -313,    0, -313,    0,    0,  376,  378,12378,
-  381,  383,    0,    0,    0,   46,    0,12378,    0,  242,
-   65,10032,    0,  242,    0,    0,    0,    0,  257,  258,
- 9566,    0, -313,    0,11908,  243,15390,    0,  479, -313,
-    0,    0,  -60,    0,  164, -313,  249,    0,    0, -313,
-    0,  163,  146,    0,    0,    0,    0,    0,    0, -313,
-    0,    0, -316, -313,    0,  410,11908,  411,    0,  503,
- 9566, -313,    0,    0,  174,  201,  288,  289, -313,    0,
-   65,    0, 9104,    0,12378,11908,11908,12031,11908,12378,
-12378,12378,12501,10032,10032,12501,12501,12501,12378,12378,
-12378,12378,12378,12378,12378,12501,12378,12501,12501,12501,
-12501,12501,12501,12501,12501,15508,  458,  508, -313,  514,
-  515,    0,  455,    0,12378,    0,    0,12378,   99,    0,
-10032, -313,10032, -313, 6794,    0, 8759,    0,    0,    0,
- -313,16723,10032,16030,    0,    0,10150,    0,  287,    0,
-   65, -313,    0,  432,  433,  519,16723,   65,  -94, -313,
-  531,    0,  535, -313,10032,   65,    0,    0,  161,  167,
-  279,    0,    0,16319,  538, -313, -313, -313,    0,    0,
-    0,   37,    0,    0,    0, -313,  459,    0,  527,  545,
-12378,  462,  464,11908,    0,   99, -185,    0,    0,  -26,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  -76,  -76,    0,  119,    0,  119,    0,    2,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
- -313,  553,    0, -313,  554, -313,    0,    0,    0,    0,
-    0,10494,    0,10494, -140,    0,    0,    0,    0,    0,
-    0,    0,  -71,10150,    0,    0,    0,    0,  527,    0,
-  552,    0,    0,    0,  559, -313,    0,    0,   65,    0,
- -313, -313,    0, -313,  543,  543,    0,    3,    0,  543,
-  -48,  561,16723,    0,    0,    0,  527,    0,    0,    0,
-    0,    0,  305,  563, -313,  565,    0,  566,    0,    0,
-  483,  485,  242,   65,    0,  -46,    0, -313,    0,  570,
-    0,  332,    0,13432,10032,    0,    0,    0, -313,    0,
-    0, -313,15626,15626,    0,    0, -313,  543,    0,  491,
-    0, -313,    0,  577,    0,    0,    0,    0,    0,  242,
-   48,15744,15744, -313, -195,    0,16723,    0, -313,  495,
-  581,    0,16319,    0,    0,    0,  498,    0, -209,    0,
-    0,  309,    0,    0,  -80, 9566,  -10,   65,  175,   65,
-    0, -313,  499,    0,    0,    0,10032,    0,    0, -313,
-15626,15626,    0,   48,    0,  584,11908, 9566,    0,    0,
-    0,    0,    0,  346,    0,    0,    0,    0,  527,    0,
-  585,    0,    0,  527,    0,
+    0,    0,    0,    0,    0, -272, -272, 6843, -272,   31,
+   49,    0,    0,  118,    0,  -93,    0,  136,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,12546,10318,10318,
+13600,    0,10200, 6962,   54, 8469,   54,   92,   92,13480,
+   54,    0,   54,13600, -272, -272, -272, -272, -279, -272,
+    8,    0,  -84,15322, 9272, -272,    0,    0,  132,    0,
+    0,  358, -164, -147,    0,  -35,   47,  116,  120,  -19,
+    0, -151, 8803,    0,  208,    0,    0,  -36,    0,    0,
+    0,    0,    0,  192, -272, -131,  201,13136,16891, -272,
+    0, -129,  225,  -23,  233,   -4,    0,12076,  287,   73,
+   76, -272,   85,    0,    0,   97, -272,13600,   20,    0,
+    0,   92,  -45,    0,    0,16891,16891,  216,  223,    0,
+    0,  313,   92,  -57,    0,   92, -129,   86,    0,   92,
+ -272, -272,    0,  329,  282,    0,    0, -272,  367,   92,
+   92,  282,15440,    0,16891,13136,13136,13136,16891,    2,
+  320,    7,    0,  372,    0,  380,    0,    0,  165, -272,
+    0,  166, 9734,   94,    0,   92,16891,16891,  318,  321,
+    0,   51,  118,14524,    0, 8927,12076, -272, -272,    0,
+    0,    0,    0,    0, -272,    0,    0,    0,    0,    0,
+    0,    0, -272, -272, -272, -272, -272, -272, -272, -272,
+ -272, -272, -272, -272, -272, -272, -272, -272, -272, -272,
+ -272, -272, -272, -272, -272, -272, -272, -272, -272, -272,
+ -272, -272,16891,   89, -272,  410,    0,    0,  122, -272,
+  408,10200, -272,    0,    0,14062,    0, -272,  409, -272,
+    0,  333, -272,    0, -272,    0,    0,  328,  336,12546,
+  349,  353,    0,    0,    0,   85,    0,12546,    0,  207,
+   92,10200,    0,  207,    0,    0,    0,    0,  224,  226,
+ 9734,    0, -272,    0,12076,  206,15558,    0,  453, -272,
+    0,    0, -176,    0,    0,  195, -272,    0,    0,    0,
+ -272,    0,   95,  117,    0,    0,    0,    0,    0,    0,
+ -272,    0,    0, -279, -272,    0,  387,12076,  389,    0,
+  476, 9734, -272,    0,    0,  192,  201,  269,  276, -272,
+    0,   92,    0, 9272,    0,12546,12076,12076,12199,12076,
+12546,12546,12546,12669,10200,10200,12669,12669,12669,12546,
+12546,12546,12546,12546,12546,12546,12669,12546,12669,12669,
+12669,12669,12669,12669,12669,12669,15676,  442,  497, -272,
+  499,  503,    0,  410,    0,12546,    0,    0,12546,  118,
+    0,10200, -272,10200, -272, 6962,    0, 8927,    0,    0,
+    0, -272,16891,10200,16198,    0,    0,10318,    0,  277,
+    0,   92, -272,    0,  421,  423,  508,16891,   92,  -75,
+ -272,  510,    0,  512, -272,10200,   92,    0,    0,  140,
+  146,  205,    0,  286,  281,16487,  520, -272, -272, -272,
+    0,    0,    0,    2,    0,    0,    0, -272,  437,    0,
+  505,  528,12546,  445,  446,12076,    0,  118, -147,    0,
+    0,  -21,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0, -117, -117,    0,  120,    0,  120,    0,  -19,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0, -272,  532,    0, -272,  533, -272,    0,    0,
+    0,    0,    0,10662,    0,10662, -129,    0,    0,    0,
+    0,    0,    0,    0,  -45,10318,    0,    0,    0,    0,
+  505,    0,  531,    0,    0,    0,  536, -272,    0,    0,
+   92,    0, -272, -272,    0, -272,    0,  521,  521,    0,
+    3,    0,  521, -106,  537,16891,    0,    0,    0,  505,
+    0,    0,    0,    0,    0,  217,  540, -272,  542,    0,
+  543,    0,    0,  460,  462,  207,   92,    0,  -26,    0,
+ -272,    0,  550,    0,  310,    0,13600,10200,    0,    0,
+    0, -272,    0,    0, -272,15794,15794,    0,    0, -272,
+  521,    0,  468,    0, -272,    0,  553,    0,    0,    0,
+    0,    0,  207,   54,15912,15912, -272, -107,    0,16891,
+    0, -272,  470,  561,    0,16487,    0,    0,    0,  477,
+    0, -169,    0,    0,  227,    0,    0,  -98, 9734,  -25,
+   92,  100,   92,    0, -272,  479,    0,    0,    0,10200,
+    0,    0, -272,15794,15794,    0,   54,    0,  564,12076,
+ 9734,    0,    0,    0,    0,    0,  279,    0,    0,    0,
+    0,  505,    0,  568,    0,    0,  505,    0,
 };
-final static short yyrindex[] = {                      6207,
-    0,  154,    0,   19,    0, 5377,    0,    0,    0,    0,
+final static short yyrindex[] = {                      6365,
+    0,  133,    0,   74,    0, 5602,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -577,87 +577,87 @@
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,12845,16841,  -39,11438,    0,
-    0,    0,    0, 5196,    0,    0,    0, 5914,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  154,  -95,  247,
-    0,    0,  154,  154,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,16841,12845,12845,12845,10621,11438,
-    0,    0,    0,    0,  154,  627,    0,    0,   27,    0,
-  915,  539,    0, 5947,    0, 4574, 4991, 4781, 4330, 4159,
-    0, 4120, 3742,    0, 2051,    0,    0,    0,    0,    0,
-    0,    0,    0, 5486,11438,    0, 5522,  154,    0,14238,
-    0,  -19,    0,   35,    0,  537,    0,  154,    0,    0,
-    0,11561,    0,    0,    0,    0,11561,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,14696,    0,    0,  347,    0,    0,    0,
-15862,10968,    0, 2466,    0,    0,    0,11438,    0,    0,
-    0,    0,    0,    0,    0,  154,  154,  154,    0,   70,
-    0,    0,    0,   38,    0,    0,    0,    0,    0,11091,
-    0,    0,  -29,  510,    0,    0,    0,    0,    0,    0,
- 7256,    0,  793,    0,    0,   50,  150,11561,11438,    0,
-    0,    0,    0,    0,11438,    0,    0,    0,    0,    0,
-    0,    0,11438,11438,11561,11561,11561,11561, 9222, 9222,
-11561,11561,11561,11561,11561,11561,11561,11561,11561,11561,
-11561,11561,11561,11561,11561,11561,11561,11561,11561,11561,
-15862,10621,    0, 2619,10968,    0,    0,    0,    0,11561,
-    0,  154,11561,    0,    0,    0,    0, 9222, 5776, 9222,
-    0, 5812, 6331,    0,   -3,    0,    0,    0,    0,  154,
-16959,16487,    0,    0,    0,    0,    0,  154,    0,  363,
-    0,  154,    0,  363,    0,    0,    0,    0,    0,    0,
-  -29,    0,16841,    0,  154, 1483,    0,    0,    0,10968,
-    0,    0, 1898,    0,    0,11438,    0,    0,    0,16201,
-    0, -109,    0,    0,    0,    0,    0,    0,    0,11438,
-    0,    0,11438,11438, 1330,    0,  -63,    0,    0,    0,
-  -29,11561,    0,    0, 7596, 7718,    0,    0,11438,    0,
-    0,    0,  154,    0,  154,  154,  154,  154,  154,  154,
-  154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
-  154,  154,  154,  154,  154,  154,  154,  154,  154,  154,
-  154,  154,  154,  154,  154,    0,    0, 3034,10968,    0,
-    0,    0,    0,    0,  154,    0,    0,  154,  -23,    0,
-  154, 9688,  154, 9688,  154,    0,   -7,    0,    0,    0,
-11438,    0,  154,    0,    0,    0,  247,    0,    0,    0,
-    0,  -66,    0,    0,    0,    0,    0,    0,    0,10968,
- 3187,    0,    0,  -68,  154,    0,    0,    0,    0,    0,
-    0,    0,    0,  594,    0,  -56,16201,16841,    0,    0,
-    0,    0,    0,    0,    0,  511,    0,    0,  510,    0,
-  154,    0,    0,  154,    0, 7134, 5982,    0,    0,11438,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
- 4817, 4952,    0, 4366,    0, 4745,    0, 4195,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-10968, 3602,    0,10968,    0,10968,    0,    0,    0,    0,
-    0,  154,    0,  154,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  -95,    0,    0,    0,    0,  510,    0,
-14814,    0,    0,    0,    0,10968,    0,    0,    0,    0,
-13776, 9222,    0,11438,  -24,  -24,    0,  596,    0, -109,
-  513,    0,    0,    0,    0,    0,  510,    0, 8058, 8180,
-    0,    0,    0,    0,10968,    0,    0,    0,    0,    0,
-    0,    0,  363,    0,    0,  -93,    0,16841,    0,    0,
-    0,  516,    0,    0,  154,    0,    0,    0,16605,    0,
-    0,  511,    0,    0,    0,    0,  511, -109,    0,    0,
-    0,11438,    0,    0,    0,    0,    0,    0,    0,  363,
-    0,    0,    0,  -66,  517,    0,    0,    0,  -85,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,  518,    0,
-    0,    0,    0,    0,    0,  -29,  510,    0,  510,    0,
-    0,  511,    0,    0,    0,    0,  154,    0,    0,  511,
-    0,    0,    0,    0,    0,    0,  154,  -29,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,  510,    0,
-    0,    0,    0,  510,    0,
+    0,    0,    0,    0,    0,13013,17009,  -43,11606,    0,
+    0,    0,    0,  580,    0,    0,    0, 6065,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  133,  -86,  -81,
+    0,    0,  133,  133,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,17009,13013,13013,13013,10789,11606,
+    0,    0,    0,    0,  133,  610,    0,    0,   26,    0,
+ 1114, 5318,    0, 6150,    0, 4926,  845, 5133, 4682, 4511,
+    0, 4472, 4094,    0, 2403,    0,    0,    0,    0,    0,
+    0,    0,    0, 5340,11606,    0, 5714,  133,    0,14406,
+    0,  -17,    0,   11,    0,  518,    0,  133,    0,    0,
+    0,11729,    0,    0,    0,    0,11729,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,14864,    0,    0,  331,    0,    0,    0,
+16030,11136,    0, 2818,    0,    0,    0,11606,    0,    0,
+    0,    0,    0,    0,    0,  133,  133,  133,    0,   17,
+    0,    0,    0,   34,    0,    0,    0,    0,    0,11259,
+    0,    0,  -11,  490,    0,    0,    0,    0,    0,    0,
+ 7424,    0,  733,    0,    0,  128,  555,11729,11606,    0,
+    0,    0,    0,    0,11606,    0,    0,    0,    0,    0,
+    0,    0,11606,11606,11729,11729,11729,11729, 9390, 9390,
+11729,11729,11729,11729,11729,11729,11729,11729,11729,11729,
+11729,11729,11729,11729,11729,11729,11729,11729,11729,11729,
+16030,10789,    0, 2971,11136,    0,    0,    0,    0,11729,
+    0,  133,11729,    0,    0,    0,    0, 9390, 5982, 9390,
+    0, 6015, 6499,    0,   -3,    0,    0,    0,    0,  133,
+17127,16655,    0,    0,    0,    0,    0,  133,    0,  352,
+    0,  133,    0,  352,    0,    0,    0,    0,    0,    0,
+  -11,    0,17009,    0,  133, 1835,    0,    0,    0,11136,
+    0,    0, 2250,    0,    0,    0,11606,    0,    0,    0,
+16369,    0,  -67,    0,    0,    0,    0,    0,    0,    0,
+11606,    0,    0,11606,11606, 1267,    0,  -39,    0,    0,
+    0,  -11,11729,    0,    0, 7764, 7886,    0,    0,11606,
+    0,    0,    0,  133,    0,  133,  133,  133,  133,  133,
+  133,  133,  133,  133,  133,  133,  133,  133,  133,  133,
+  133,  133,  133,  133,  133,  133,  133,  133,  133,  133,
+  133,  133,  133,  133,  133,  133,    0,    0, 3386,11136,
+    0,    0,    0,    0,    0,  133,    0,    0,  133,   -8,
+    0,  133, 9856,  133, 9856,  133,    0,  -22,    0,    0,
+    0,11606,    0,  133,    0,    0,    0,  -81,    0,    0,
+    0,    0,  -80,    0,    0,    0,    0,    0,    0,    0,
+11136, 3539,    0,    0,  -56,  133,    0,    0,    0,    0,
+    0,    0,    0,    0, 1682,  576,    0,  -96,16369,17009,
+    0,    0,    0,    0,    0,    0,    0,  501,    0,    0,
+  490,    0,  133,    0,    0,  133,    0, 7302, 6200,    0,
+    0,11606,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0, 5169, 5304,    0, 4718,    0, 5097,    0, 4547,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,11136, 3954,    0,11136,    0,11136,    0,    0,
+    0,    0,    0,  133,    0,  133,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,  -86,    0,    0,    0,    0,
+  490,    0,14982,    0,    0,    0,    0,11136,    0,    0,
+    0,    0,13944, 9390,    0,11606,    0,  -10,  -10,    0,
+  587,    0,  -67,  504,    0,    0,    0,    0,    0,  490,
+    0, 8226, 8348,    0,    0,    0,    0,11136,    0,    0,
+    0,    0,    0,    0,    0,  352,    0,    0,  -42,    0,
+17009,    0,    0,    0,  506,    0,    0,  133,    0,    0,
+    0,16773,    0,    0,  501,    0,    0,    0,    0,  501,
+  -67,    0,    0,    0,11606,    0,    0,    0,    0,    0,
+    0,    0,  352,    0,    0,    0,  -80,  507,    0,    0,
+    0,  -20,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  509,    0,    0,    0,    0,    0,    0,  -11,  490,
+    0,  490,    0,    0,  501,    0,    0,    0,    0,  133,
+    0,    0,  501,    0,    0,    0,    0,    0,    0,  133,
+  -11,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  490,    0,    0,    0,    0,  490,    0,
 };
 final static short yygindex[] = {                         0,
-    1,    0,  404,   14,    0,   -5,  250,  374, -136, -137,
-    0, -263,  221,    0,  114,    0,    0,   51,  224,  228,
- -248, -149, -167,  -14,  -62,    0,   13,  205,  126,   -1,
-  206,    0,    0,  -77,    0,    0,   23, -118, -232,   21,
-    0,   -4,    0,  361,    0, -121, -233,  386,    0,  420,
-    0,    0,    0,  276,  165,    0,    0, -114, -321,    0,
-    0, -258, -340, -229, -146,  -61,    0,    0, -113,  329,
- -257,    0,    0,    0,    0,  311,    0,    0,    0, -214,
-    0,    0,  -18, -251, -559,  -15,    0,   45,  268,    0,
- -264, -561,   20,    0,    0,    0, -579,    0, -555,  162,
-    0,  -21,
+    1,    0,  275,   12,    0,   68,  232,  370, -138, -153,
+    0, -201,  221,    0,  179,    0,    0,   50,  222,  212,
+ -267, -286,   57,  -18,  -50,    0,  -14,  197,   58,   78,
+  194,    0,    0, -122,    0,    0,  -48, -120, -225,   90,
+    0,   -7,    0,  311,    0, -121, -260,  377,    0,  412,
+  264,  144,    0,  267,  160,    0,    0, -110, -290,    0,
+    0, -270, -310, -236, -174,  -69,    0,    0, -112,  327,
+ -529,    0,    0,    0,    0,  308,    0,    0,    0, -217,
+    0,    0,  -31, -249, -593,  -32,    0,   41,  265,    0,
+ -223, -578,    9,    0,    0,    0,    0, -579,    0, -539,
+  151,    0,  -29,
 };
-final static int YYTABLESIZE=17338;
+final static int YYTABLESIZE=17506;
 
 //These two tables are not statically initialized, but rather
 //initialized on first use, so that a failure to initialize them
@@ -679,7 +679,7 @@
         yytable = (short[])obInp.readObject();
         yycheck = (short[])obInp.readObject();
         long hash = EYaccFixer.checkhash(yytable, yycheck);
-        if (hash != -6617099290233459027L) {
+        if (hash != 2899208771068227488L) {
             throw new RuntimeException(rName + " bad checkhash: " +
                                        hash);
         }
@@ -848,7 +848,7 @@
 "prim : CLASS classHead body",
 "prim : SWITCH parenExpr caseList",
 "prim : TRY body catchList finallyClause",
-"prim : WHEN whenHead body catchClause",
+"prim : WHEN whenHead body catches finallyClause",
 "prim : ifExpr",
 "prim : macro",
 "prim : '$' '{' LiteralInteger '}'",
@@ -1005,7 +1005,8 @@
 "matchList : emptyList",
 "matchList : matchList matcher br",
 "catchList : emptyList",
-"catchList : catchList catchClause",
+"catchList : catches",
+"catches : catchList catchClause",
 "catchClause : CATCH pattern body",
 "finallyClause :",
 "finallyClause : FINALLY body",
@@ -1117,7 +1118,7 @@
 "reserved : WSTRING",
 };
 
-//#line 1075 "e.y"
+//#line 1083 "e.y"
 
 /**
  *
@@ -1549,7 +1550,7 @@
  */
 static public final IntTable TheTokenTable = tokenTable(TheTokens);
 
-//#line 4942 "EParser.java"
+//#line 4977 "EParser.java"
 //###############################################################
 // method: yylexdebug : check lexer state
 //###############################################################
@@ -2061,7 +2062,7 @@
 break;
 case 118:
 //#line 468 "e.y"
-{ yyval = when(val_peek(2),val_peek(1),val_peek(0)); }
+{ yyval = when(val_peek(3),val_peek(2),val_peek(1),val_peek(0)); }
 break;
 case 121:
 //#line 474 "e.y"
@@ -2592,95 +2593,95 @@
 //#line 964 "e.y"
 { yyval = with(val_peek(2), val_peek(1)); }
 break;
-case 275:
-//#line 973 "e.y"
+case 276:
+//#line 981 "e.y"
 { yyval = with(val_peek(1), val_peek(0)); }
 break;
-case 276:
-//#line 977 "e.y"
+case 277:
+//#line 985 "e.y"
 { yyval = matcher(val_peek(1), val_peek(0)); }
 break;
-case 277:
-//#line 984 "e.y"
+case 278:
+//#line 992 "e.y"
 { yyval = null; }
 break;
-case 278:
-//#line 985 "e.y"
+case 279:
+//#line 993 "e.y"
 { yyval = val_peek(0); }
 break;
-case 279:
-//#line 996 "e.y"
+case 280:
+//#line 1004 "e.y"
 { yyval = oType(val_peek(6), val_peek(2)); }
 break;
-case 280:
-//#line 997 "e.y"
+case 281:
+//#line 1005 "e.y"
 { yyval = oType(val_peek(2), list(val_peek(1))); }
 break;
-case 284:
-//#line 1004 "e.y"
-{ yyval = with(val_peek(3),val_peek(1)); }
-break;
 case 285:
-//#line 1008 "e.y"
-{ yyval = list(val_peek(0)); }
+//#line 1012 "e.y"
+{ yyval = with(val_peek(3),val_peek(1)); }
 break;
 case 286:
-//#line 1009 "e.y"
-{ yyval = with(val_peek(3),val_peek(0)); }
+//#line 1016 "e.y"
+{ yyval = list(val_peek(0)); }
 break;
 case 287:
-//#line 1011 "e.y"
-{ reserved("on event"); }
+//#line 1017 "e.y"
+{ yyval = with(val_peek(3),val_peek(0)); }
 break;
 case 288:
-//#line 1012 "e.y"
+//#line 1019 "e.y"
 { reserved("on event"); }
 break;
 case 289:
-//#line 1019 "e.y"
-{ yyval = mType(val_peek(1),list(),val_peek(0)); }
+//#line 1020 "e.y"
+{ reserved("on event"); }
 break;
 case 290:
-//#line 1020 "e.y"
-{ yyval = mType(val_peek(4),val_peek(2),val_peek(0)); }
+//#line 1027 "e.y"
+{ yyval = mType(val_peek(1),list(),val_peek(0)); }
 break;
 case 291:
-//#line 1021 "e.y"
-{ yyval = mType("run",val_peek(2),val_peek(0)); }
+//#line 1028 "e.y"
+{ yyval = mType(val_peek(4),val_peek(2),val_peek(0)); }
 break;
 case 292:
-//#line 1025 "e.y"
-{ yyval = val_peek(0); }
+//#line 1029 "e.y"
+{ yyval = mType("run",val_peek(2),val_peek(0)); }
 break;
 case 293:
-//#line 1026 "e.y"
-{ yyval = val_peek(1); }
+//#line 1033 "e.y"
+{ yyval = val_peek(0); }
 break;
 case 294:
-//#line 1030 "e.y"
-{ yyval = list(val_peek(0)); }
+//#line 1034 "e.y"
+{ yyval = val_peek(1); }
 break;
 case 295:
-//#line 1031 "e.y"
-{ yyval = with(val_peek(3),val_peek(0)); }
+//#line 1038 "e.y"
+{ yyval = list(val_peek(0)); }
 break;
 case 296:
-//#line 1038 "e.y"
-{ yyval = pType(val_peek(1),val_peek(0)); }
+//#line 1039 "e.y"
+{ yyval = with(val_peek(3),val_peek(0)); }
 break;
 case 297:
-//#line 1039 "e.y"
-{ yyval = pType(null,val_peek(0)); }
+//#line 1046 "e.y"
+{ yyval = pType(val_peek(1),val_peek(0)); }
 break;
 case 298:
-//#line 1043 "e.y"
-{ yyval = null; }
+//#line 1047 "e.y"
+{ yyval = pType(null,val_peek(0)); }
 break;
 case 299:
-//#line 1044 "e.y"
+//#line 1051 "e.y"
+{ yyval = null; }
+break;
+case 300:
+//#line 1052 "e.y"
 { yyval = val_peek(0); }
 break;
-//#line 6070 "EParser.java"
+//#line 6105 "EParser.java"
 //########## END OF USER-SUPPLIED ACTIONS ##########
     }//switch
     //#### Now let's reduce... ####



1.75      +10 -2     e/src/jsrc/org/erights/e/elang/syntax/e.y

Index: e.y
===================================================================
RCS file: /cvs/e/src/jsrc/org/erights/e/elang/syntax/e.y,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- e.y	2001/08/13 20:38:11	1.74
+++ e.y	2001/08/23 08:57:07	1.75
@@ -465,7 +465,7 @@
 
  |      TRY body catchList finallyClause        { $$ = tryx($2,$3,$4); }
 
- |      WHEN whenHead body catchClause          { $$ = when($2,$3,$4); }
+ |      WHEN whenHead body catches finallyClause { $$ = when($2,$3,$4,$5); }
 
  |      ifExpr
 
@@ -970,7 +970,15 @@
  */
 catchList:
         emptyList
- |      catchList catchClause                   { $$ = with($1, $2); }
+ |      catches
+ ;
+
+/**
+ * Middle path of a 'when' expression -- an least one catch clause is
+ * required 
+ */
+catches:
+        catchList catchClause                   { $$ = with($1, $2); }
  ;
 
 catchClause: