[jboss-svn-commits] JBL Code SVN: r27284 - in labs/jbosstm/workspace/adinn/byteman/trunk: dd/grammar/cup and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jun 29 09:02:50 EDT 2009


Author: adinn
Date: 2009-06-29 09:02:50 -0400 (Mon, 29 Jun 2009)
New Revision: 27284

Modified:
   labs/jbosstm/workspace/adinn/byteman/trunk/bin/bytemancheck.sh
   labs/jbosstm/workspace/adinn/byteman/trunk/dd/grammar/cup/ECAGrammar.cup
   labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/Rule.java
   labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/ECAGrammarParser.java
   labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/ECATokenLexer.java
   labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/sym.java
   labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/test/TestScript.java
Log:
improved error detection/notification in parser and partly fixed broken functionality in script type checker

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/bin/bytemancheck.sh
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/bin/bytemancheck.sh	2009-06-29 12:09:04 UTC (rev 27283)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/bin/bytemancheck.sh	2009-06-29 13:02:50 UTC (rev 27284)
@@ -4,32 +4,37 @@
 # Copyright 2009, Red Hat Middleware LLC, and individual contributors
 # by the @authors tag. See the copyright.txt in the distribution for a
 # full listing of individual contributors.
-*
+#
 # This is free software; you can redistribute it and/or modify it
 # under the terms of the GNU Lesser General Public License as
 # published by the Free Software Foundation; either version 2.1 of
 # the License, or (at your option) any later version.
-*
+#
 # This software is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 # Lesser General Public License for more details.
-*
 # You should have received a copy of the GNU Lesser General Public
 # License along with this software; if not, write to the Free
 # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 # 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*
+#
 # @authors Andrew Dinn
 #
 # shell script which type checks a byteman rule set
 #
 # usage: bytemancheck -cp classpath script1 . . . scriptN
 #
-BASE=${0%*/bin/bytemancheck.sh}
-CP=${BASE}/lib/byteman.jar
-CP=${CP}:${BASE}}/ext/asm-all-3.0.jar
-if [ $1 == "-cp" ] ; then
+# use the root of the path to this file to locate the byteman jar
+BASE=${0%*bin/bytemancheck.sh}
+# the binary release puts byteman jar in lib while source puts it in
+# build/lib so add both paths to the classpath just in case
+CP=${BASE}lib/byteman.jar
+CP=${BASE}build/lib/byteman.jar
+# hmm. the asm code should be bundled in the byteman jar?
+CP=${CP}:${BASE}ext/asm-all-3.0.jar
+# incluide application classes upplied via -cp flag
+if [ "$1" == "-cp" ] ; then
   CP=${CP}:$2
   shift
   shift

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/dd/grammar/cup/ECAGrammar.cup
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/dd/grammar/cup/ECAGrammar.cup	2009-06-29 12:09:04 UTC (rev 27283)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/dd/grammar/cup/ECAGrammar.cup	2009-06-29 13:02:50 UTC (rev 27284)
@@ -34,47 +34,99 @@
     /*
     private ParseNode node(int tag)
     {
-    return ParseNode.node(tag, parser.file);
+    return ParseNode.node(tag, parser.getFile());
     }
     */
 
     private ParseNode node(int tag, int line, int column)
     {
-	return ParseNode.node(tag, parser.file, line, column);
+	return ParseNode.node(tag, parser.getFile(), line, column);
     }
 
     private ParseNode node(int tag, int line, int column, Object child0)
     {
-	return ParseNode.node(tag, parser.file, line, column, child0);
+	return ParseNode.node(tag, parser.getFile(), line, column, child0);
     }
 
     private ParseNode node(int tag, int line, int column, Object child0, Object child1)
     {
-	return ParseNode.node(tag, parser.file, line, column, child0, child1);
+	return ParseNode.node(tag, parser.getFile(), line, column, child0, child1);
     }
 
     private ParseNode node(int tag, int line, int column, Object child0, Object child1, Object child2)
     {
-	return ParseNode.node(tag, parser.file, line, column, child0, child1, child2);
+	return ParseNode.node(tag, parser.getFile(), line, column, child0, child1, child2);
     }
 
     /*
     private ParseNode node(int tag, int line, int column, Object child0, Object child1, Object child2, Object child3)
     {
-	return ParseNode.node(tag, parser.file, line, column, child0, child1, child2, child3);
+	return ParseNode.node(tag, parser.getFile(), line, column, child0, child1, child2, child3);
     }
     */
+    public void error(String message, int line, int col)
+    {
+        parser.error(message, line, col);
+    }
+
+    public void error(String message)
+    {
+        parser.error(message);
+    }
+
 :}
 
 parser code {:
 
-  public String file = "";
+  private String file = "";
+  private int errorCount = 0;
 
   public void setFile(String file)
   {
     this.file = file;
   }
 
+  public void error(String message, int line, int col)
+  {
+        errorCount++;
+        System.out.println(file + " @ " + line + "." + col + " : " + message);
+  }
+
+  /** Report a non fatal error (or warning).  This method takes a message
+   *  string and an additional object (to be used by specializations
+   *  implemented in subclasses).  Here in the base class a very simple
+   *  implementation is provided which simply prints the message to
+   *  System.err.
+   *
+   * @param message an error message.
+   * @param info    an extra object reserved for use by specialized subclasses.
+   */
+  public void report_error(String message, Object info)
+  {
+      if (info instanceof Symbol) {
+          Symbol sym = (Symbol)info;
+          System.err.println(message + " at line " + sym.left +  " character " + sym.right);
+      } else {
+          System.err.println(message);
+      }
+  }
+
+  public void error(String message)
+  {
+        errorCount++;
+        System.out.println(file + " : " + message);
+  }
+
+  public String getFile()
+  {
+    return file;
+  }
+
+  public int getErrorCount()
+  {
+    return errorCount;
+  }
+
   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
 
   /** Do debug output for a reduce.
@@ -199,6 +251,7 @@
 non terminal ParseNode actions;
 non terminal ParseNode action_expr_list;
 non terminal ParseNode action_expr;
+non terminal ParseNode throw_return_expr;
 
 non terminal ParseNode expr_list;
 
@@ -222,6 +275,17 @@
 non terminal ParseNode simple_name;
 non terminal ParseNode path;
 
+/* error patterns */
+
+non terminal ParseNode eca_error;
+non terminal ParseNode eca_error_in_event;
+non terminal ParseNode eca_error_in_condition;
+non terminal ParseNode eca_error_in_action;
+//non terminal ParseNode bindings_error_missing_sepr;
+non terminal ParseNode action_expr_list_error_invalid_action;
+//non terminal ParseNode expr_list_error_missing_sepr;
+non terminal ParseNode expr_list_error_invalid_expr;
+
 /* precedences from weakest to tightest binding */
 
 precedence left SEMI;
@@ -247,8 +311,34 @@
 eca	::=	BIND event:e
 		IF condition:c
 		DO actions:a {: RESULT = node(ParseNode.BIND, eleft, eright, e, c, a); :}
+	|   eca_error
 	;
 
+eca_error
+    ::= eca_error_in_event
+    |   eca_error_in_condition
+    |   eca_error_in_action
+    ;
+
+eca_error_in_event
+    ::= BIND:b error {: error("invalid event", bleft, bright); :}
+        IF condition:c
+        DO actions:a {: RESULT = node(ParseNode.BIND, bleft, bright, null, c, a); :}
+    ;
+
+eca_error_in_condition
+    ::= BIND event:e
+        IF:i error {: error("invalid condition", ileft, iright); :}
+        DO actions:a {: RESULT = node(ParseNode.BIND, eleft, eright, e, null, a); :}
+    ;
+
+eca_error_in_action
+    ::= BIND event:e
+        IF condition:c
+        DO:d error {: error("invalid action", dleft, dright);
+                      RESULT = node(ParseNode.BIND, eleft, eright, e, c, null); :}
+    ;
+
 // event specifications -- for now events are just a list of bindings
 
 event	::=	NOTHING:n {: RESULT = node(ParseNode.NOTHING, nleft, nright); :}
@@ -260,9 +350,15 @@
 bindings
 	::=	binding:b COMMA bindings:bs {: RESULT = node(ParseNode.COMMA, bleft, bright, b, bs); :}
 	|	binding:b SEMI bindings:bs {: RESULT = node(ParseNode.COMMA, bleft, bright, b, bs); :}
+//	|   bindings_error_missing_sepr:b {: RESULT = b; :}
 	|	binding:b {: RESULT = b; :}
 	;
 
+//bindings_error_missing_sepr
+//    ::= binding:b bindings:bs {: error("missing separator", bleft, bright);
+//	                             RESULT = node(ParseNode.COMMA, bleft, bright, b, bs); :}
+//    ;
+
 binding	::=	bind_sym:s ASSIGN expr:e {: RESULT = node(ParseNode.ASSIGN, sleft, sright, s, e); :}
 	;
 
@@ -296,12 +392,24 @@
 		{: RESULT = node(ParseNode.SEMI, eleft, eright, e, ael); :}
 	|	expr:e COMMA action_expr_list:ael
 		{: RESULT = node(ParseNode.SEMI, eleft, eright, e, ael); :}
+    |   action_expr_list_error_invalid_action:ael {: RESULT = ael; :}
+    |   action_expr_list_error_missing_semi:ael {: RESULT = ael; :}
 	|	action_expr:ae {: RESULT = ae; :}
 	;
 
+action_expr_list_error_invalid_action
+    ::= error action_expr_list:ael
+        {: error("invalid action", aelleft, aelright);
+           RESULT = ael; :}
+    ;
+
 action_expr
 	::=	expr:e {: RESULT = e; :}
-	|	RETURN:r
+	| throw_return_expr
+	;
+
+throw_return_expr
+    ::=	RETURN:r
 		{: RESULT = node(ParseNode.RETURN, rleft, rright, null); :}
 	|	RETURN:r expr:e
 		{: RESULT = node(ParseNode.RETURN, rleft, rright, e); :}
@@ -315,10 +423,25 @@
 	::=	expr:e {: RESULT = e; :}
 	|	expr:e COMMA expr_list:el
 		{: RESULT = node(ParseNode.COMMA, eleft, eright, e, el); :}
+//	|	expr_list_error_missing_sepr:el {: RESULT = el; :}
+	|	expr_list_error_invalid_expr:el {: RESULT = el; :}
 	;
 
-expr	::=	ternary_oper_expr:e {: RESULT = e; :}
-     	|	binary_oper_expr:e {: RESULT = e; :}
+//expr_list_error_missing_sepr
+//    ::= expr:e expr_list:el
+//		{: error("missing separator");
+//		   RESULT = node(ParseNode.COMMA, eleft, eright, e, el); :}
+//    ;
+
+expr_list_error_invalid_expr
+    ::= error COMMA:c expr_list:el
+		{: error("invalid expression", cleft, cright);
+		   RESULT = node(ParseNode.COMMA, cleft, cright, null, el); :}
+    ;
+
+expr
+    ::= ternary_oper_expr:e {: RESULT = e; :}
+    |	binary_oper_expr:e {: RESULT = e; :}
 	|	unary_oper_expr:e {: RESULT = e; :}
 	|	array_expr:e {: RESULT = e; :}
 	|	field_expr:e {: RESULT = e; :}
@@ -360,7 +483,8 @@
 	::=	NOT:o expr:e {: RESULT = node(ParseNode.UNOP, eleft, eright, node(ParseNode.NOT, oleft, oright), e); :}
 	/* bitwise operators */
 	|	TWIDDLE:o expr:e {: RESULT = node(ParseNode.UNOP, eleft, eright, node(ParseNode.TWIDDLE, oleft, oright), e); :}
-	|	MINUS:o expr:e {: RESULT = node(ParseNode.UNOP, eleft, eright, node(ParseNode.UMINUS, oleft, oright), e); :} %prec UMINUS
+	/* arithmetic operators */
+    |   MINUS:o expr:e {: RESULT = node(ParseNode.UNOP, eleft, eright, node(ParseNode.UMINUS, oleft, oright), e); :} %prec UMINUS
 	;
 
 array_expr

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/Rule.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/Rule.java	2009-06-29 12:09:04 UTC (rev 27283)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/Rule.java	2009-06-29 13:02:50 UTC (rev 27284)
@@ -175,7 +175,12 @@
                 ECAGrammarParser parser = new ECAGrammarParser(lexer);
                 parser.setFile(file);
                 Symbol parse = (debugParse ? parser.debug_parse() : parser.parse());
+                if (parser.getErrorCount() != 0) {
+                    throw new ParseException("org.jboss.byteman.rule.Rule : error parsing rule\n" + ruleSpec);
+                }
                 ruleTree = (ParseNode) parse.value;
+            } catch (ParseException pe) {
+                throw pe;
             } catch (Exception e) {
                 throw new ParseException("org.jboss.byteman.rule.Rule : error parsing rule\n" + ruleSpec, e);
             }

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/ECAGrammarParser.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/ECAGrammarParser.java	2009-06-29 12:09:04 UTC (rev 27283)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/ECAGrammarParser.java	2009-06-29 13:02:50 UTC (rev 27284)
@@ -1,7 +1,7 @@
 
 //----------------------------------------------------
 // The following code was generated by CUP v0.10k
-// Wed Jun 03 17:40:48 BST 2009
+// Mon Jun 29 11:49:38 BST 2009
 //----------------------------------------------------
 
 package org.jboss.byteman.rule.grammar;
@@ -10,7 +10,7 @@
 import org.jboss.byteman.rule.grammar.ParseNode;
 
 /** CUP v0.10k generated parser.
-  * @version Wed Jun 03 17:40:48 BST 2009
+  * @version Mon Jun 29 11:49:38 BST 2009
   */
 public class ECAGrammarParser extends java_cup.runtime.lr_parser {
 
@@ -23,33 +23,37 @@
   /** Production table. */
   protected static final short _production_table[][] = 
     unpackFromStrings(new String[] {
-    "\000\125\000\002\003\003\000\002\002\004\000\002\004" +
-    "\010\000\002\005\003\000\002\005\003\000\002\006\005" +
-    "\000\002\006\005\000\002\006\003\000\002\007\005\000" +
-    "\002\010\005\000\002\010\003\000\002\011\003\000\002" +
-    "\012\003\000\002\012\003\000\002\013\005\000\002\013" +
-    "\005\000\002\013\003\000\002\014\003\000\002\014\003" +
-    "\000\002\014\004\000\002\014\006\000\002\014\007\000" +
-    "\002\015\003\000\002\015\005\000\002\016\003\000\002" +
-    "\016\003\000\002\016\003\000\002\016\003\000\002\016" +
-    "\003\000\002\016\003\000\002\016\003\000\002\016\003" +
-    "\000\002\017\007\000\002\020\005\000\002\020\005\000" +
-    "\002\020\005\000\002\020\005\000\002\020\005\000\002" +
-    "\020\005\000\002\020\005\000\002\020\005\000\002\020" +
-    "\005\000\002\020\005\000\002\020\005\000\002\020\005" +
-    "\000\002\020\005\000\002\020\005\000\002\020\005\000" +
-    "\002\020\005\000\002\021\004\000\002\021\004\000\002" +
-    "\021\004\000\002\022\004\000\002\022\004\000\002\022" +
-    "\004\000\002\030\003\000\002\030\004\000\002\031\005" +
-    "\000\002\023\005\000\002\023\003\000\002\024\005\000" +
-    "\002\024\005\000\002\024\005\000\002\025\005\000\002" +
-    "\025\006\000\002\025\007\000\002\025\010\000\002\025" +
-    "\003\000\002\026\007\000\002\026\010\000\002\026\007" +
-    "\000\002\026\010\000\002\026\007\000\002\026\010\000" +
-    "\002\027\003\000\002\027\003\000\002\027\003\000\002" +
-    "\027\003\000\002\027\003\000\002\027\005\000\002\032" +
-    "\003\000\002\032\005\000\002\033\003\000\002\034\003" +
-    "\000\002\034\005" });
+    "\000\143\000\002\003\003\000\002\002\004\000\002\004" +
+    "\010\000\002\004\003\000\002\036\003\000\002\036\003" +
+    "\000\002\036\003\000\002\044\002\000\002\037\011\000" +
+    "\002\045\002\000\002\040\011\000\002\041\010\000\002" +
+    "\005\003\000\002\005\003\000\002\006\005\000\002\006" +
+    "\005\000\002\006\003\000\002\007\005\000\002\010\005" +
+    "\000\002\010\003\000\002\011\003\000\002\012\003\000" +
+    "\002\012\003\000\002\013\005\000\002\013\005\000\002" +
+    "\013\003\000\002\013\003\000\002\042\004\000\002\014" +
+    "\003\000\002\014\003\000\002\015\003\000\002\015\004" +
+    "\000\002\015\006\000\002\015\007\000\002\016\003\000" +
+    "\002\016\005\000\002\016\003\000\002\043\005\000\002" +
+    "\017\003\000\002\017\003\000\002\017\003\000\002\017" +
+    "\003\000\002\017\003\000\002\017\003\000\002\017\003" +
+    "\000\002\017\003\000\002\020\007\000\002\021\005\000" +
+    "\002\021\005\000\002\021\005\000\002\021\005\000\002" +
+    "\021\005\000\002\021\005\000\002\021\005\000\002\021" +
+    "\005\000\002\021\005\000\002\021\005\000\002\021\005" +
+    "\000\002\021\005\000\002\021\005\000\002\021\005\000" +
+    "\002\021\005\000\002\021\005\000\002\022\004\000\002" +
+    "\022\004\000\002\022\004\000\002\023\004\000\002\023" +
+    "\004\000\002\023\004\000\002\031\003\000\002\031\004" +
+    "\000\002\032\005\000\002\024\005\000\002\024\003\000" +
+    "\002\025\005\000\002\025\005\000\002\025\005\000\002" +
+    "\026\005\000\002\026\006\000\002\026\007\000\002\026" +
+    "\010\000\002\026\003\000\002\027\007\000\002\027\010" +
+    "\000\002\027\007\000\002\027\010\000\002\027\007\000" +
+    "\002\027\010\000\002\030\003\000\002\030\003\000\002" +
+    "\030\003\000\002\030\003\000\002\030\003\000\002\030" +
+    "\005\000\002\033\003\000\002\033\005\000\002\034\003" +
+    "\000\002\035\003\000\002\035\005" });
 
   /** Access to production table. */
   public short[][] production_table() {return _production_table;}
@@ -57,377 +61,400 @@
   /** Parse-action table. */
   protected static final short[][] _action_table = 
     unpackFromStrings(new String[] {
-    "\000\223\000\004\004\005\001\002\000\004\002\001\001" +
-    "\002\000\006\007\010\054\011\001\002\000\004\002\007" +
-    "\001\002\000\004\002\000\001\002\000\004\005\ufffe\001" +
-    "\002\000\074\002\uffaf\005\uffaf\006\uffaf\012\uffaf\013\uffaf" +
-    "\014\uffaf\015\uffaf\016\uffaf\017\uffaf\020\uffaf\021\uffaf\022" +
-    "\uffaf\023\uffaf\024\uffaf\025\uffaf\026\uffaf\027\uffaf\030\uffaf" +
-    "\031\uffaf\032\uffaf\033\uffaf\034\uffaf\035\uffaf\036\uffaf\037" +
-    "\uffaf\040\uffaf\041\uffaf\042\uffaf\043\uffaf\001\002\000\004" +
-    "\005\201\001\002\000\004\021\032\001\002\000\006\021" +
-    "\ufff7\023\023\001\002\000\010\005\ufffa\016\020\017\017" +
-    "\001\002\000\004\005\ufffd\001\002\000\004\054\011\001" +
-    "\002\000\004\054\011\001\002\000\004\005\ufffb\001\002" +
-    "\000\004\005\ufffc\001\002\000\004\054\025\001\002\000" +
-    "\004\021\ufff8\001\002\000\072\002\uffaf\005\uffaf\006\uffaf" +
-    "\012\uffaf\013\uffaf\015\uffaf\016\uffaf\017\uffaf\020\uffae\021" +
-    "\uffaf\022\uffaf\023\uffaf\024\uffaf\025\uffaf\026\uffaf\027\uffaf" +
-    "\030\uffaf\031\uffaf\032\uffaf\033\uffaf\034\uffaf\035\uffaf\036" +
-    "\uffaf\037\uffaf\040\uffaf\041\uffaf\042\uffaf\043\uffaf\001\002" +
-    "\000\004\020\030\001\002\000\006\012\uffb1\021\uffb1\001" +
-    "\002\000\004\054\031\001\002\000\010\012\uffb0\020\uffad" +
-    "\021\uffb0\001\002\000\026\012\042\042\051\044\036\045" +
-    "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
-    "\001\002\000\052\005\ufff9\016\ufff9\017\ufff9\022\113\024" +
-    "\077\025\073\026\074\027\101\030\110\031\075\032\106" +
-    "\033\100\034\105\035\111\036\104\037\112\040\103\041" +
-    "\076\042\107\043\072\001\002\000\066\002\uffe5\005\uffe5" +
-    "\006\uffe5\013\uffe5\014\060\015\uffe5\016\uffe5\017\uffe5\022" +
-    "\uffe5\023\uffe5\024\uffe5\025\uffe5\026\uffe5\027\uffe5\030\uffe5" +
-    "\031\uffe5\032\uffe5\033\uffe5\034\uffe5\035\uffe5\036\uffe5\037" +
-    "\uffe5\040\uffe5\041\uffe5\042\uffe5\043\uffe5\001\002\000\070" +
-    "\002\uffb3\005\uffb3\006\uffb3\013\uffb3\014\uffb3\015\uffb3\016" +
-    "\uffb3\017\uffb3\020\uffb3\022\uffb3\023\uffb3\024\uffb3\025\uffb3" +
-    "\026\uffb3\027\uffb3\030\uffb3\031\uffb3\032\uffb3\033\uffb3\034" +
-    "\uffb3\035\uffb3\036\uffb3\037\uffb3\040\uffb3\041\uffb3\042\uffb3" +
-    "\043\uffb3\001\002\000\026\012\042\042\051\044\036\045" +
-    "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
-    "\001\002\000\070\002\uffb5\005\uffb5\006\uffb5\013\uffb5\014" +
-    "\uffb5\015\uffb5\016\uffb5\017\uffb5\020\uffb5\022\uffb5\023\uffb5" +
-    "\024\uffb5\025\uffb5\026\uffb5\027\uffb5\030\uffb5\031\uffb5\032" +
-    "\uffb5\033\uffb5\034\uffb5\035\uffb5\036\uffb5\037\uffb5\040\uffb5" +
-    "\041\uffb5\042\uffb5\043\uffb5\001\002\000\066\002\uffe2\005" +
-    "\uffe2\006\uffe2\012\173\013\uffe2\015\uffe2\016\uffe2\017\uffe2" +
-    "\022\uffe2\023\uffe2\024\uffe2\025\uffe2\026\uffe2\027\uffe2\030" +
-    "\uffe2\031\uffe2\032\uffe2\033\uffe2\034\uffe2\035\uffe2\036\uffe2" +
-    "\037\uffe2\040\uffe2\041\uffe2\042\uffe2\043\uffe2\001\002\000" +
-    "\026\012\042\042\051\044\036\045\041\047\035\050\057" +
-    "\051\053\052\037\053\044\054\025\001\002\000\026\012" +
-    "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
-    "\052\037\053\044\054\025\001\002\000\070\002\uffe3\005" +
-    "\uffe3\006\uffe3\013\uffe3\014\060\015\uffe3\016\uffe3\017\uffe3" +
-    "\020\162\022\uffe3\023\uffe3\024\uffe3\025\uffe3\026\uffe3\027" +
-    "\uffe3\030\uffe3\031\uffe3\032\uffe3\033\uffe3\034\uffe3\035\uffe3" +
-    "\036\uffe3\037\uffe3\040\uffe3\041\uffe3\042\uffe3\043\uffe3\001" +
-    "\002\000\070\002\uffb4\005\uffb4\006\uffb4\013\uffb4\014\uffb4" +
-    "\015\uffb4\016\uffb4\017\uffb4\020\uffb4\022\uffb4\023\uffb4\024" +
-    "\uffb4\025\uffb4\026\uffb4\027\uffb4\030\uffb4\031\uffb4\032\uffb4" +
-    "\033\uffb4\034\uffb4\035\uffb4\036\uffb4\037\uffb4\040\uffb4\041" +
-    "\uffb4\042\uffb4\043\uffb4\001\002\000\064\002\uffe8\005\uffe8" +
-    "\006\uffe8\013\uffe8\015\uffe8\016\uffe8\017\uffe8\022\uffe8\023" +
-    "\uffe8\024\uffe8\025\uffe8\026\uffe8\027\uffe8\030\uffe8\031\uffe8" +
-    "\032\uffe8\033\uffe8\034\uffe8\035\uffe8\036\uffe8\037\uffe8\040" +
-    "\uffe8\041\uffe8\042\uffe8\043\uffe8\001\002\000\070\002\uffc6" +
-    "\005\uffc6\006\uffc6\013\uffc6\014\uffc6\015\uffc6\016\uffc6\017" +
-    "\uffc6\020\153\022\uffc6\023\uffc6\024\uffc6\025\uffc6\026\uffc6" +
-    "\027\uffc6\030\uffc6\031\uffc6\032\uffc6\033\uffc6\034\uffc6\035" +
-    "\uffc6\036\uffc6\037\uffc6\040\uffc6\041\uffc6\042\uffc6\043\uffc6" +
-    "\001\002\000\004\020\144\001\002\000\064\002\uffe9\005" +
-    "\uffe9\006\uffe9\013\uffe9\015\uffe9\016\uffe9\017\uffe9\022\uffe9" +
-    "\023\uffe9\024\uffe9\025\uffe9\026\uffe9\027\uffe9\030\uffe9\031" +
-    "\uffe9\032\uffe9\033\uffe9\034\uffe9\035\uffe9\036\uffe9\037\uffe9" +
-    "\040\uffe9\041\uffe9\042\uffe9\043\uffe9\001\002\000\026\012" +
-    "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
-    "\052\037\053\044\054\025\001\002\000\070\002\uffbe\005" +
-    "\uffbe\006\uffbe\013\uffbe\014\uffbe\015\uffbe\016\uffbe\017\uffbe" +
-    "\020\uffbe\022\uffbe\023\uffbe\024\uffbe\025\uffbe\026\uffbe\027" +
-    "\uffbe\030\uffbe\031\uffbe\032\uffbe\033\uffbe\034\uffbe\035\uffbe" +
-    "\036\uffbe\037\uffbe\040\uffbe\041\uffbe\042\uffbe\043\uffbe\001" +
-    "\002\000\070\002\uffb7\005\uffb7\006\uffb7\013\uffb7\014\uffb7" +
-    "\015\uffb7\016\uffb7\017\uffb7\020\uffb7\022\uffb7\023\uffb7\024" +
-    "\uffb7\025\uffb7\026\uffb7\027\uffb7\030\uffb7\031\uffb7\032\uffb7" +
-    "\033\uffb7\034\uffb7\035\uffb7\036\uffb7\037\uffb7\040\uffb7\041" +
-    "\uffb7\042\uffb7\043\uffb7\001\002\000\064\002\uffe6\005\uffe6" +
-    "\006\uffe6\013\uffe6\015\uffe6\016\uffe6\017\uffe6\022\uffe6\023" +
-    "\uffe6\024\uffe6\025\uffe6\026\uffe6\027\uffe6\030\uffe6\031\uffe6" +
-    "\032\uffe6\033\uffe6\034\uffe6\035\uffe6\036\uffe6\037\uffe6\040" +
-    "\uffe6\041\uffe6\042\uffe6\043\uffe6\001\002\000\064\002\uffe7" +
-    "\005\uffe7\006\uffe7\013\uffe7\015\uffe7\016\uffe7\017\uffe7\022" +
-    "\uffe7\023\uffe7\024\uffe7\025\uffe7\026\uffe7\027\uffe7\030\uffe7" +
-    "\031\uffe7\032\uffe7\033\uffe7\034\uffe7\035\uffe7\036\uffe7\037" +
-    "\uffe7\040\uffe7\041\uffe7\042\uffe7\043\uffe7\001\002\000\070" +
-    "\002\uffe4\005\uffe4\006\uffe4\013\uffe4\014\060\015\uffe4\016" +
-    "\uffe4\017\uffe4\020\063\022\uffe4\023\uffe4\024\uffe4\025\uffe4" +
-    "\026\uffe4\027\uffe4\030\uffe4\031\uffe4\032\uffe4\033\uffe4\034" +
-    "\uffe4\035\uffe4\036\uffe4\037\uffe4\040\uffe4\041\uffe4\042\uffe4" +
-    "\043\uffe4\001\002\000\070\002\uffb6\005\uffb6\006\uffb6\013" +
-    "\uffb6\014\uffb6\015\uffb6\016\uffb6\017\uffb6\020\uffb6\022\uffb6" +
-    "\023\uffb6\024\uffb6\025\uffb6\026\uffb6\027\uffb6\030\uffb6\031" +
-    "\uffb6\032\uffb6\033\uffb6\034\uffb6\035\uffb6\036\uffb6\037\uffb6" +
-    "\040\uffb6\041\uffb6\042\uffb6\043\uffb6\001\002\000\026\012" +
-    "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
-    "\052\037\053\044\054\025\001\002\000\064\002\uffcb\005" +
-    "\uffcb\006\uffcb\013\uffcb\015\uffcb\016\uffcb\017\uffcb\022\uffcb" +
-    "\023\uffcb\024\uffcb\025\uffcb\026\uffcb\027\uffcb\030\uffcb\031" +
-    "\uffcb\032\uffcb\033\uffcb\034\uffcb\035\uffcb\036\uffcb\037\uffcb" +
-    "\040\uffcb\041\uffcb\042\uffcb\043\uffcb\001\002\000\066\002" +
-    "\uffca\005\uffca\006\uffca\013\uffca\014\060\015\uffca\016\uffca" +
-    "\017\uffca\022\uffca\023\uffca\024\uffca\025\uffca\026\uffca\027" +
-    "\uffca\030\uffca\031\uffca\032\uffca\033\uffca\034\uffca\035\uffca" +
-    "\036\uffca\037\uffca\040\uffca\041\uffca\042\uffca\043\uffca\001" +
-    "\002\000\004\054\011\001\002\000\072\002\uffc4\005\uffc4" +
-    "\006\uffc4\012\065\013\uffc4\014\uffc4\015\uffc4\016\uffc4\017" +
-    "\uffc4\020\uffc4\022\uffc4\023\uffc4\024\uffc4\025\uffc4\026\uffc4" +
-    "\027\uffc4\030\uffc4\031\uffc4\032\uffc4\033\uffc4\034\uffc4\035" +
-    "\uffc4\036\uffc4\037\uffc4\040\uffc4\041\uffc4\042\uffc4\043\uffc4" +
-    "\001\002\000\030\012\042\013\067\042\051\044\036\045" +
-    "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
-    "\001\002\000\050\013\uffeb\017\102\022\113\024\077\025" +
-    "\073\026\074\027\101\030\110\031\075\032\106\033\100" +
-    "\034\105\035\111\036\104\037\112\040\103\041\076\042" +
-    "\107\043\072\001\002\000\070\002\uffbb\005\uffbb\006\uffbb" +
-    "\013\uffbb\014\uffbb\015\uffbb\016\uffbb\017\uffbb\020\uffbb\022" +
-    "\uffbb\023\uffbb\024\uffbb\025\uffbb\026\uffbb\027\uffbb\030\uffbb" +
-    "\031\uffbb\032\uffbb\033\uffbb\034\uffbb\035\uffbb\036\uffbb\037" +
-    "\uffbb\040\uffbb\041\uffbb\042\uffbb\043\uffbb\001\002\000\004" +
-    "\013\071\001\002\000\070\002\uffba\005\uffba\006\uffba\013" +
-    "\uffba\014\uffba\015\uffba\016\uffba\017\uffba\020\uffba\022\uffba" +
-    "\023\uffba\024\uffba\025\uffba\026\uffba\027\uffba\030\uffba\031" +
-    "\uffba\032\uffba\033\uffba\034\uffba\035\uffba\036\uffba\037\uffba" +
-    "\040\uffba\041\uffba\042\uffba\043\uffba\001\002\000\026\012" +
-    "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
-    "\052\037\053\044\054\025\001\002\000\026\012\042\042" +
-    "\051\044\036\045\041\047\035\050\057\051\053\052\037" +
-    "\053\044\054\025\001\002\000\026\012\042\042\051\044" +
-    "\036\045\041\047\035\050\057\051\053\052\037\053\044" +
-    "\054\025\001\002\000\026\012\042\042\051\044\036\045" +
-    "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
-    "\001\002\000\026\012\042\042\051\044\036\045\041\047" +
-    "\035\050\057\051\053\052\037\053\044\054\025\001\002" +
-    "\000\026\012\042\042\051\044\036\045\041\047\035\050" +
-    "\057\051\053\052\037\053\044\054\025\001\002\000\026" +
-    "\012\042\042\051\044\036\045\041\047\035\050\057\051" +
-    "\053\052\037\053\044\054\025\001\002\000\026\012\042" +
-    "\042\051\044\036\045\041\047\035\050\057\051\053\052" +
-    "\037\053\044\054\025\001\002\000\026\012\042\042\051" +
-    "\044\036\045\041\047\035\050\057\051\053\052\037\053" +
-    "\044\054\025\001\002\000\026\012\042\042\051\044\036" +
-    "\045\041\047\035\050\057\051\053\052\037\053\044\054" +
-    "\025\001\002\000\026\012\042\042\051\044\036\045\041" +
-    "\047\035\050\057\051\053\052\037\053\044\054\025\001" +
-    "\002\000\026\012\042\042\051\044\036\045\041\047\035" +
-    "\050\057\051\053\052\037\053\044\054\025\001\002\000" +
-    "\026\012\042\042\051\044\036\045\041\047\035\050\057" +
-    "\051\053\052\037\053\044\054\025\001\002\000\026\012" +
-    "\042\042\051\044\036\045\041\047\035\050\057\051\053" +
-    "\052\037\053\044\054\025\001\002\000\026\012\042\042" +
-    "\051\044\036\045\041\047\035\050\057\051\053\052\037" +
-    "\053\044\054\025\001\002\000\026\012\042\042\051\044" +
-    "\036\045\041\047\035\050\057\051\053\052\037\053\044" +
-    "\054\025\001\002\000\026\012\042\042\051\044\036\045" +
-    "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
-    "\001\002\000\026\012\042\042\051\044\036\045\041\047" +
-    "\035\050\057\051\053\052\037\053\044\054\025\001\002" +
-    "\000\046\022\113\023\115\024\077\025\073\026\074\027" +
-    "\101\030\110\031\075\032\106\033\100\034\105\035\111" +
-    "\036\104\037\112\040\103\041\076\042\107\043\072\001" +
-    "\002\000\026\012\042\042\051\044\036\045\041\047\035" +
-    "\050\057\051\053\052\037\053\044\054\025\001\002\000" +
-    "\064\002\uffe1\005\uffe1\006\uffe1\013\uffe1\015\uffe1\016\uffe1" +
-    "\017\uffe1\022\113\023\uffe1\024\077\025\073\026\074\027" +
-    "\101\030\110\031\075\032\106\033\100\034\105\035\111" +
-    "\036\104\037\112\040\103\041\076\042\107\043\072\001" +
-    "\002\000\064\002\uffd3\005\uffd3\006\uffd3\013\uffd3\015\uffd3" +
-    "\016\uffd3\017\uffd3\022\uffd3\023\uffd3\024\uffd3\025\uffd3\026" +
-    "\uffd3\027\uffd3\030\uffd3\031\uffd3\032\uffd3\033\uffd3\034\105" +
-    "\035\111\036\104\037\uffd3\040\uffd3\041\uffd3\042\uffd3\043" +
-    "\uffd3\001\002\000\064\002\uffd7\005\uffd7\006\uffd7\013\uffd7" +
-    "\015\uffd7\016\uffd7\017\uffd7\022\uffd7\023\uffd7\024\uffd7\025" +
-    "\uffd7\026\uffd7\027\uffd7\030\uffd7\031\uffd7\032\uffd7\033\uffd7" +
-    "\034\uffd7\035\uffd7\036\uffd7\037\uffd7\040\uffd7\041\uffd7\042" +
-    "\uffd7\043\uffd7\001\002\000\060\002\uffdc\005\uffdc\006\uffdc" +
-    "\013\uffdc\015\uffdc\016\uffdc\017\uffdc\022\uffdc\023\uffdc\024" +
-    "\uffdc\025\uffdc\026\074\027\101\032\106\033\100\034\105" +
-    "\035\111\036\104\037\112\040\103\041\076\042\107\043" +
-    "\072\001\002\000\064\002\uffd4\005\uffd4\006\uffd4\013\uffd4" +
+    "\000\252\000\004\004\010\001\002\000\004\002\ufffe\001" +
+    "\002\000\004\002\ufffd\001\002\000\004\002\ufffb\001\002" +
+    "\000\004\002\001\001\002\000\010\003\015\007\014\054" +
+    "\016\001\002\000\004\002\ufffc\001\002\000\004\002\013" +
+    "\001\002\000\004\002\000\001\002\000\004\005\ufff5\001" +
+    "\002\000\004\005\ufffa\001\002\000\074\002\uffa1\005\uffa1" +
+    "\006\uffa1\012\uffa1\013\uffa1\014\uffa1\015\uffa1\016\uffa1\017" +
+    "\uffa1\020\uffa1\021\uffa1\022\uffa1\023\uffa1\024\uffa1\025\uffa1" +
+    "\026\uffa1\027\uffa1\030\uffa1\031\uffa1\032\uffa1\033\uffa1\034" +
+    "\uffa1\035\uffa1\036\uffa1\037\uffa1\040\uffa1\041\uffa1\042\uffa1" +
+    "\043\uffa1\001\002\000\004\005\212\001\002\000\004\021" +
+    "\037\001\002\000\006\021\uffee\023\030\001\002\000\010" +
+    "\005\ufff1\016\025\017\024\001\002\000\004\005\ufff4\001" +
+    "\002\000\004\054\016\001\002\000\004\054\016\001\002" +
+    "\000\004\005\ufff2\001\002\000\004\005\ufff3\001\002\000" +
+    "\004\054\032\001\002\000\004\021\uffef\001\002\000\072" +
+    "\002\uffa1\005\uffa1\006\uffa1\012\uffa1\013\uffa1\015\uffa1\016" +
+    "\uffa1\017\uffa1\020\uffa0\021\uffa1\022\uffa1\023\uffa1\024\uffa1" +
+    "\025\uffa1\026\uffa1\027\uffa1\030\uffa1\031\uffa1\032\uffa1\033" +
+    "\uffa1\034\uffa1\035\uffa1\036\uffa1\037\uffa1\040\uffa1\041\uffa1" +
+    "\042\uffa1\043\uffa1\001\002\000\004\020\035\001\002\000" +
+    "\006\012\uffa3\021\uffa3\001\002\000\004\054\036\001\002" +
+    "\000\010\012\uffa2\020\uff9f\021\uffa2\001\002\000\026\012" +
+    "\047\042\056\044\043\045\046\047\042\050\064\051\060" +
+    "\052\044\053\051\054\032\001\002\000\052\005\ufff0\016" +
+    "\ufff0\017\ufff0\022\124\024\110\025\104\026\106\027\112" +
+    "\030\121\031\105\032\117\033\111\034\116\035\122\036" +
+    "\115\037\123\040\114\041\107\042\120\043\103\001\002" +
+    "\000\066\002\uffd7\005\uffd7\006\uffd7\013\uffd7\014\065\015" +
+    "\uffd7\016\uffd7\017\uffd7\022\uffd7\023\uffd7\024\uffd7\025\uffd7" +
+    "\026\uffd7\027\uffd7\030\uffd7\031\uffd7\032\uffd7\033\uffd7\034" +
+    "\uffd7\035\uffd7\036\uffd7\037\uffd7\040\uffd7\041\uffd7\042\uffd7" +
+    "\043\uffd7\001\002\000\070\002\uffa5\005\uffa5\006\uffa5\013" +
+    "\uffa5\014\uffa5\015\uffa5\016\uffa5\017\uffa5\020\uffa5\022\uffa5" +
+    "\023\uffa5\024\uffa5\025\uffa5\026\uffa5\027\uffa5\030\uffa5\031" +
+    "\uffa5\032\uffa5\033\uffa5\034\uffa5\035\uffa5\036\uffa5\037\uffa5" +
+    "\040\uffa5\041\uffa5\042\uffa5\043\uffa5\001\002\000\026\012" +
+    "\047\042\056\044\043\045\046\047\042\050\064\051\060" +
+    "\052\044\053\051\054\032\001\002\000\070\002\uffa7\005" +
+    "\uffa7\006\uffa7\013\uffa7\014\uffa7\015\uffa7\016\uffa7\017\uffa7" +
+    "\020\uffa7\022\uffa7\023\uffa7\024\uffa7\025\uffa7\026\uffa7\027" +
+    "\uffa7\030\uffa7\031\uffa7\032\uffa7\033\uffa7\034\uffa7\035\uffa7" +
+    "\036\uffa7\037\uffa7\040\uffa7\041\uffa7\042\uffa7\043\uffa7\001" +
+    "\002\000\066\002\uffd4\005\uffd4\006\uffd4\012\204\013\uffd4" +
     "\015\uffd4\016\uffd4\017\uffd4\022\uffd4\023\uffd4\024\uffd4\025" +
     "\uffd4\026\uffd4\027\uffd4\030\uffd4\031\uffd4\032\uffd4\033\uffd4" +
-    "\034\105\035\111\036\104\037\112\040\103\041\uffd4\042" +
-    "\uffd4\043\072\001\002\000\064\002\uffda\005\uffda\006\uffda" +
-    "\013\uffda\015\uffda\016\uffda\017\uffda\022\uffda\023\uffda\024" +
-    "\uffda\025\uffda\026\uffda\027\uffda\030\uffda\031\uffda\032\uffda" +
-    "\033\uffda\034\105\035\111\036\104\037\112\040\103\041" +
-    "\076\042\107\043\072\001\002\000\064\002\uffd8\005\uffd8" +
-    "\006\uffd8\013\uffd8\015\uffd8\016\uffd8\017\uffd8\022\uffd8\023" +
-    "\uffd8\024\uffd8\025\uffd8\026\uffd8\027\uffd8\030\uffd8\031\uffd8" +
-    "\032\uffd8\033\uffd8\034\uffd8\035\uffd8\036\uffd8\037\uffd8\040" +
-    "\uffd8\041\uffd8\042\uffd8\043\uffd8\001\002\000\064\002\uffd6" +
-    "\005\uffd6\006\uffd6\013\uffd6\015\uffd6\016\uffd6\017\uffd6\022" +
-    "\uffd6\023\uffd6\024\uffd6\025\uffd6\026\uffd6\027\uffd6\030\uffd6" +
-    "\031\uffd6\032\uffd6\033\uffd6\034\uffd6\035\uffd6\036\uffd6\037" +
-    "\uffd6\040\uffd6\041\uffd6\042\uffd6\043\uffd6\001\002\000\064" +
-    "\002\uffd2\005\uffd2\006\uffd2\013\uffd2\015\uffd2\016\uffd2\017" +
-    "\uffd2\022\uffd2\023\uffd2\024\uffd2\025\uffd2\026\uffd2\027\uffd2" +
-    "\030\uffd2\031\uffd2\032\uffd2\033\uffd2\034\105\035\111\036" +
-    "\104\037\uffd2\040\uffd2\041\uffd2\042\uffd2\043\uffd2\001\002" +
-    "\000\004\013\uffea\001\002\000\064\002\uffdd\005\uffdd\006" +
-    "\uffdd\013\uffdd\015\uffdd\016\uffdd\017\uffdd\022\uffdd\023\uffdd" +
-    "\024\uffdd\025\uffdd\026\uffdd\027\uffdd\030\uffdd\031\uffdd\032" +
-    "\uffdd\033\uffdd\034\105\035\111\036\104\037\112\040\103" +
-    "\041\076\042\107\043\072\001\002\000\064\002\uffd9\005" +
-    "\uffd9\006\uffd9\013\uffd9\015\uffd9\016\uffd9\017\uffd9\022\uffd9" +
-    "\023\uffd9\024\uffd9\025\uffd9\026\uffd9\027\uffd9\030\uffd9\031" +
-    "\uffd9\032\uffd9\033\uffd9\034\105\035\111\036\104\037\112" +
-    "\040\103\041\076\042\107\043\072\001\002\000\064\002" +
-    "\uffe0\005\uffe0\006\uffe0\013\uffe0\015\uffe0\016\uffe0\017\uffe0" +
-    "\022\uffe0\023\uffe0\024\uffe0\025\uffe0\026\074\027\101\030" +
-    "\110\031\075\032\106\033\100\034\105\035\111\036\104" +
-    "\037\112\040\103\041\076\042\107\043\072\001\002\000" +
-    "\064\002\uffd5\005\uffd5\006\uffd5\013\uffd5\015\uffd5\016\uffd5" +
-    "\017\uffd5\022\uffd5\023\uffd5\024\uffd5\025\uffd5\026\uffd5\027" +
-    "\uffd5\030\uffd5\031\uffd5\032\uffd5\033\uffd5\034\105\035\111" +
-    "\036\104\037\112\040\103\041\uffd5\042\uffd5\043\072\001" +
-    "\002\000\060\002\uffdb\005\uffdb\006\uffdb\013\uffdb\015\uffdb" +
+    "\034\uffd4\035\uffd4\036\uffd4\037\uffd4\040\uffd4\041\uffd4\042" +
+    "\uffd4\043\uffd4\001\002\000\026\012\047\042\056\044\043" +
+    "\045\046\047\042\050\064\051\060\052\044\053\051\054" +
+    "\032\001\002\000\026\012\047\042\056\044\043\045\046" +
+    "\047\042\050\064\051\060\052\044\053\051\054\032\001" +
+    "\002\000\070\002\uffd5\005\uffd5\006\uffd5\013\uffd5\014\065" +
+    "\015\uffd5\016\uffd5\017\uffd5\020\173\022\uffd5\023\uffd5\024" +
+    "\uffd5\025\uffd5\026\uffd5\027\uffd5\030\uffd5\031\uffd5\032\uffd5" +
+    "\033\uffd5\034\uffd5\035\uffd5\036\uffd5\037\uffd5\040\uffd5\041" +
+    "\uffd5\042\uffd5\043\uffd5\001\002\000\070\002\uffa6\005\uffa6" +
+    "\006\uffa6\013\uffa6\014\uffa6\015\uffa6\016\uffa6\017\uffa6\020" +
+    "\uffa6\022\uffa6\023\uffa6\024\uffa6\025\uffa6\026\uffa6\027\uffa6" +
+    "\030\uffa6\031\uffa6\032\uffa6\033\uffa6\034\uffa6\035\uffa6\036" +
+    "\uffa6\037\uffa6\040\uffa6\041\uffa6\042\uffa6\043\uffa6\001\002" +
+    "\000\064\002\uffda\005\uffda\006\uffda\013\uffda\015\uffda\016" +
+    "\uffda\017\uffda\022\uffda\023\uffda\024\uffda\025\uffda\026\uffda" +
+    "\027\uffda\030\uffda\031\uffda\032\uffda\033\uffda\034\uffda\035" +
+    "\uffda\036\uffda\037\uffda\040\uffda\041\uffda\042\uffda\043\uffda" +
+    "\001\002\000\070\002\uffb8\005\uffb8\006\uffb8\013\uffb8\014" +
+    "\uffb8\015\uffb8\016\uffb8\017\uffb8\020\164\022\uffb8\023\uffb8" +
+    "\024\uffb8\025\uffb8\026\uffb8\027\uffb8\030\uffb8\031\uffb8\032" +
+    "\uffb8\033\uffb8\034\uffb8\035\uffb8\036\uffb8\037\uffb8\040\uffb8" +
+    "\041\uffb8\042\uffb8\043\uffb8\001\002\000\004\020\155\001" +
+    "\002\000\064\002\uffdb\005\uffdb\006\uffdb\013\uffdb\015\uffdb" +
     "\016\uffdb\017\uffdb\022\uffdb\023\uffdb\024\uffdb\025\uffdb\026" +
-    "\074\027\101\032\106\033\100\034\105\035\111\036\104" +
-    "\037\112\040\103\041\076\042\107\043\072\001\002\000" +
-    "\064\002\uffde\005\uffde\006\uffde\013\uffde\015\uffde\016\uffde" +
-    "\017\uffde\022\uffde\023\uffde\024\uffde\025\uffde\026\uffde\027" +
-    "\uffde\030\uffde\031\uffde\032\uffde\033\uffde\034\105\035\111" +
-    "\036\104\037\112\040\103\041\076\042\107\043\072\001" +
-    "\002\000\064\002\uffdf\005\uffdf\006\uffdf\013\uffdf\015\uffdf" +
-    "\016\uffdf\017\uffdf\022\uffdf\023\uffdf\024\uffdf\025\uffdf\026" +
-    "\074\027\101\030\110\031\075\032\106\033\100\034\105" +
-    "\035\111\036\104\037\112\040\103\041\076\042\107\043" +
-    "\072\001\002\000\064\002\uffd1\005\uffd1\006\uffd1\013\uffd1" +
-    "\015\uffd1\016\uffd1\017\uffd1\022\uffd1\023\uffd1\024\uffd1\025" +
-    "\uffd1\026\uffd1\027\uffd1\030\uffd1\031\uffd1\032\uffd1\033\uffd1" +
-    "\034\105\035\111\036\104\037\uffd1\040\uffd1\041\uffd1\042" +
-    "\uffd1\043\uffd1\001\002\000\064\002\uffc9\005\uffc9\006\uffc9" +
+    "\uffdb\027\uffdb\030\uffdb\031\uffdb\032\uffdb\033\uffdb\034\uffdb" +
+    "\035\uffdb\036\uffdb\037\uffdb\040\uffdb\041\uffdb\042\uffdb\043" +
+    "\uffdb\001\002\000\026\012\047\042\056\044\043\045\046" +
+    "\047\042\050\064\051\060\052\044\053\051\054\032\001" +
+    "\002\000\070\002\uffb0\005\uffb0\006\uffb0\013\uffb0\014\uffb0" +
+    "\015\uffb0\016\uffb0\017\uffb0\020\uffb0\022\uffb0\023\uffb0\024" +
+    "\uffb0\025\uffb0\026\uffb0\027\uffb0\030\uffb0\031\uffb0\032\uffb0" +
+    "\033\uffb0\034\uffb0\035\uffb0\036\uffb0\037\uffb0\040\uffb0\041" +
+    "\uffb0\042\uffb0\043\uffb0\001\002\000\070\002\uffa9\005\uffa9" +
+    "\006\uffa9\013\uffa9\014\uffa9\015\uffa9\016\uffa9\017\uffa9\020" +
+    "\uffa9\022\uffa9\023\uffa9\024\uffa9\025\uffa9\026\uffa9\027\uffa9" +
+    "\030\uffa9\031\uffa9\032\uffa9\033\uffa9\034\uffa9\035\uffa9\036" +
+    "\uffa9\037\uffa9\040\uffa9\041\uffa9\042\uffa9\043\uffa9\001\002" +
+    "\000\064\002\uffd8\005\uffd8\006\uffd8\013\uffd8\015\uffd8\016" +
+    "\uffd8\017\uffd8\022\uffd8\023\uffd8\024\uffd8\025\uffd8\026\uffd8" +
+    "\027\uffd8\030\uffd8\031\uffd8\032\uffd8\033\uffd8\034\uffd8\035" +
+    "\uffd8\036\uffd8\037\uffd8\040\uffd8\041\uffd8\042\uffd8\043\uffd8" +
+    "\001\002\000\064\002\uffd9\005\uffd9\006\uffd9\013\uffd9\015" +
+    "\uffd9\016\uffd9\017\uffd9\022\uffd9\023\uffd9\024\uffd9\025\uffd9" +
+    "\026\uffd9\027\uffd9\030\uffd9\031\uffd9\032\uffd9\033\uffd9\034" +
+    "\uffd9\035\uffd9\036\uffd9\037\uffd9\040\uffd9\041\uffd9\042\uffd9" +
+    "\043\uffd9\001\002\000\070\002\uffd6\005\uffd6\006\uffd6\013" +
+    "\uffd6\014\065\015\uffd6\016\uffd6\017\uffd6\020\070\022\uffd6" +
+    "\023\uffd6\024\uffd6\025\uffd6\026\uffd6\027\uffd6\030\uffd6\031" +
+    "\uffd6\032\uffd6\033\uffd6\034\uffd6\035\uffd6\036\uffd6\037\uffd6" +
+    "\040\uffd6\041\uffd6\042\uffd6\043\uffd6\001\002\000\070\002" +
+    "\uffa8\005\uffa8\006\uffa8\013\uffa8\014\uffa8\015\uffa8\016\uffa8" +
+    "\017\uffa8\020\uffa8\022\uffa8\023\uffa8\024\uffa8\025\uffa8\026" +
+    "\uffa8\027\uffa8\030\uffa8\031\uffa8\032\uffa8\033\uffa8\034\uffa8" +
+    "\035\uffa8\036\uffa8\037\uffa8\040\uffa8\041\uffa8\042\uffa8\043" +
+    "\uffa8\001\002\000\026\012\047\042\056\044\043\045\046" +
+    "\047\042\050\064\051\060\052\044\053\051\054\032\001" +
+    "\002\000\064\002\uffbd\005\uffbd\006\uffbd\013\uffbd\015\uffbd" +
+    "\016\uffbd\017\uffbd\022\uffbd\023\uffbd\024\uffbd\025\uffbd\026" +
+    "\uffbd\027\uffbd\030\uffbd\031\uffbd\032\uffbd\033\uffbd\034\uffbd" +
+    "\035\uffbd\036\uffbd\037\uffbd\040\uffbd\041\uffbd\042\uffbd\043" +
+    "\uffbd\001\002\000\066\002\uffbc\005\uffbc\006\uffbc\013\uffbc" +
+    "\014\065\015\uffbc\016\uffbc\017\uffbc\022\uffbc\023\uffbc\024" +
+    "\uffbc\025\uffbc\026\uffbc\027\uffbc\030\uffbc\031\uffbc\032\uffbc" +
+    "\033\uffbc\034\uffbc\035\uffbc\036\uffbc\037\uffbc\040\uffbc\041" +
+    "\uffbc\042\uffbc\043\uffbc\001\002\000\004\054\016\001\002" +
+    "\000\072\002\uffb6\005\uffb6\006\uffb6\012\072\013\uffb6\014" +
+    "\uffb6\015\uffb6\016\uffb6\017\uffb6\020\uffb6\022\uffb6\023\uffb6" +
+    "\024\uffb6\025\uffb6\026\uffb6\027\uffb6\030\uffb6\031\uffb6\032" +
+    "\uffb6\033\uffb6\034\uffb6\035\uffb6\036\uffb6\037\uffb6\040\uffb6" +
+    "\041\uffb6\042\uffb6\043\uffb6\001\002\000\032\003\077\012" +
+    "\047\013\074\042\056\044\043\045\046\047\042\050\064" +
+    "\051\060\052\044\053\051\054\032\001\002\000\050\013" +
+    "\uffdf\017\113\022\124\024\110\025\104\026\106\027\112" +
+    "\030\121\031\105\032\117\033\111\034\116\035\122\036" +
+    "\115\037\123\040\114\041\107\042\120\043\103\001\002" +
+    "\000\070\002\uffad\005\uffad\006\uffad\013\uffad\014\uffad\015" +
+    "\uffad\016\uffad\017\uffad\020\uffad\022\uffad\023\uffad\024\uffad" +
+    "\025\uffad\026\uffad\027\uffad\030\uffad\031\uffad\032\uffad\033" +
+    "\uffad\034\uffad\035\uffad\036\uffad\037\uffad\040\uffad\041\uffad" +
+    "\042\uffad\043\uffad\001\002\000\004\013\uffdd\001\002\000" +
+    "\004\013\102\001\002\000\004\017\100\001\002\000\030" +
+    "\003\077\012\047\042\056\044\043\045\046\047\042\050" +
+    "\064\051\060\052\044\053\051\054\032\001\002\000\004" +
+    "\013\uffdc\001\002\000\070\002\uffac\005\uffac\006\uffac\013" +
+    "\uffac\014\uffac\015\uffac\016\uffac\017\uffac\020\uffac\022\uffac" +
+    "\023\uffac\024\uffac\025\uffac\026\uffac\027\uffac\030\uffac\031" +
+    "\uffac\032\uffac\033\uffac\034\uffac\035\uffac\036\uffac\037\uffac" +
+    "\040\uffac\041\uffac\042\uffac\043\uffac\001\002\000\026\012" +
+    "\047\042\056\044\043\045\046\047\042\050\064\051\060" +
+    "\052\044\053\051\054\032\001\002\000\026\012\047\042" +
+    "\056\044\043\045\046\047\042\050\064\051\060\052\044" +
+    "\053\051\054\032\001\002\000\026\012\047\042\056\044" +
+    "\043\045\046\047\042\050\064\051\060\052\044\053\051" +
+    "\054\032\001\002\000\026\012\047\042\056\044\043\045" +
+    "\046\047\042\050\064\051\060\052\044\053\051\054\032" +
+    "\001\002\000\026\012\047\042\056\044\043\045\046\047" +
+    "\042\050\064\051\060\052\044\053\051\054\032\001\002" +
+    "\000\026\012\047\042\056\044\043\045\046\047\042\050" +
+    "\064\051\060\052\044\053\051\054\032\001\002\000\026" +
+    "\012\047\042\056\044\043\045\046\047\042\050\064\051" +
+    "\060\052\044\053\051\054\032\001\002\000\026\012\047" +
+    "\042\056\044\043\045\046\047\042\050\064\051\060\052" +
+    "\044\053\051\054\032\001\002\000\030\003\077\012\047" +
+    "\042\056\044\043\045\046\047\042\050\064\051\060\052" +
+    "\044\053\051\054\032\001\002\000\026\012\047\042\056" +
+    "\044\043\045\046\047\042\050\064\051\060\052\044\053" +
+    "\051\054\032\001\002\000\026\012\047\042\056\044\043" +
+    "\045\046\047\042\050\064\051\060\052\044\053\051\054" +
+    "\032\001\002\000\026\012\047\042\056\044\043\045\046" +
+    "\047\042\050\064\051\060\052\044\053\051\054\032\001" +
+    "\002\000\026\012\047\042\056\044\043\045\046\047\042" +
+    "\050\064\051\060\052\044\053\051\054\032\001\002\000" +
+    "\026\012\047\042\056\044\043\045\046\047\042\050\064" +
+    "\051\060\052\044\053\051\054\032\001\002\000\026\012" +
+    "\047\042\056\044\043\045\046\047\042\050\064\051\060" +
+    "\052\044\053\051\054\032\001\002\000\026\012\047\042" +
+    "\056\044\043\045\046\047\042\050\064\051\060\052\044" +
+    "\053\051\054\032\001\002\000\026\012\047\042\056\044" +
+    "\043\045\046\047\042\050\064\051\060\052\044\053\051" +
+    "\054\032\001\002\000\026\012\047\042\056\044\043\045" +
+    "\046\047\042\050\064\051\060\052\044\053\051\054\032" +
+    "\001\002\000\046\022\124\023\126\024\110\025\104\026" +
+    "\106\027\112\030\121\031\105\032\117\033\111\034\116" +
+    "\035\122\036\115\037\123\040\114\041\107\042\120\043" +
+    "\103\001\002\000\026\012\047\042\056\044\043\045\046" +
+    "\047\042\050\064\051\060\052\044\053\051\054\032\001" +
+    "\002\000\064\002\uffd3\005\uffd3\006\uffd3\013\uffd3\015\uffd3" +
+    "\016\uffd3\017\uffd3\022\124\023\uffd3\024\110\025\104\026" +
+    "\106\027\112\030\121\031\105\032\117\033\111\034\116" +
+    "\035\122\036\115\037\123\040\114\041\107\042\120\043" +
+    "\103\001\002\000\064\002\uffc5\005\uffc5\006\uffc5\013\uffc5" +
+    "\015\uffc5\016\uffc5\017\uffc5\022\uffc5\023\uffc5\024\uffc5\025" +
+    "\uffc5\026\uffc5\027\uffc5\030\uffc5\031\uffc5\032\uffc5\033\uffc5" +
+    "\034\116\035\122\036\115\037\uffc5\040\uffc5\041\uffc5\042" +
+    "\uffc5\043\uffc5\001\002\000\064\002\uffc9\005\uffc9\006\uffc9" +
     "\013\uffc9\015\uffc9\016\uffc9\017\uffc9\022\uffc9\023\uffc9\024" +
     "\uffc9\025\uffc9\026\uffc9\027\uffc9\030\uffc9\031\uffc9\032\uffc9" +
     "\033\uffc9\034\uffc9\035\uffc9\036\uffc9\037\uffc9\040\uffc9\041" +
-    "\uffc9\042\uffc9\043\uffc9\001\002\000\046\015\142\022\113" +
-    "\024\077\025\073\026\074\027\101\030\110\031\075\032" +
-    "\106\033\100\034\105\035\111\036\104\037\112\040\103" +
-    "\041\076\042\107\043\072\001\002\000\066\002\uffc8\005" +
-    "\uffc8\006\uffc8\013\uffc8\014\uffc8\015\uffc8\016\uffc8\017\uffc8" +
-    "\022\uffc8\023\uffc8\024\uffc8\025\uffc8\026\uffc8\027\uffc8\030" +
-    "\uffc8\031\uffc8\032\uffc8\033\uffc8\034\uffc8\035\uffc8\036\uffc8" +
-    "\037\uffc8\040\uffc8\041\uffc8\042\uffc8\043\uffc8\001\002\000" +
-    "\064\002\uffce\005\uffce\006\uffce\013\uffce\015\uffce\016\uffce" +
-    "\017\uffce\022\uffce\023\uffce\024\uffce\025\uffce\026\uffce\027" +
-    "\uffce\030\uffce\031\uffce\032\uffce\033\uffce\034\uffce\035\uffce" +
-    "\036\uffce\037\uffce\040\uffce\041\uffce\042\uffce\043\uffce\001" +
-    "\002\000\004\054\145\001\002\000\072\002\uffaf\005\uffaf" +
-    "\006\uffaf\012\uffaf\013\uffaf\014\uffaf\015\uffaf\016\uffaf\017" +
-    "\uffaf\020\uffad\022\uffaf\023\uffaf\024\uffaf\025\uffaf\026\uffaf" +
-    "\027\uffaf\030\uffaf\031\uffaf\032\uffaf\033\uffaf\034\uffaf\035" +
-    "\uffaf\036\uffaf\037\uffaf\040\uffaf\041\uffaf\042\uffaf\043\uffaf" +
-    "\001\002\000\070\002\uffc7\005\uffc7\006\uffc7\012\147\013" +
-    "\uffc7\014\uffc7\015\uffc7\016\uffc7\017\uffc7\022\uffc7\023\uffc7" +
-    "\024\uffc7\025\uffc7\026\uffc7\027\uffc7\030\uffc7\031\uffc7\032" +
-    "\uffc7\033\uffc7\034\uffc7\035\uffc7\036\uffc7\037\uffc7\040\uffc7" +
-    "\041\uffc7\042\uffc7\043\uffc7\001\002\000\030\012\042\013" +
-    "\150\042\051\044\036\045\041\047\035\050\057\051\053" +
-    "\052\037\053\044\054\025\001\002\000\070\002\uffc0\005" +
-    "\uffc0\006\uffc0\013\uffc0\014\uffc0\015\uffc0\016\uffc0\017\uffc0" +
-    "\020\uffc0\022\uffc0\023\uffc0\024\uffc0\025\uffc0\026\uffc0\027" +
-    "\uffc0\030\uffc0\031\uffc0\032\uffc0\033\uffc0\034\uffc0\035\uffc0" +
-    "\036\uffc0\037\uffc0\040\uffc0\041\uffc0\042\uffc0\043\uffc0\001" +
-    "\002\000\004\013\152\001\002\000\070\002\uffbf\005\uffbf" +
-    "\006\uffbf\013\uffbf\014\uffbf\015\uffbf\016\uffbf\017\uffbf\020" +
-    "\uffbf\022\uffbf\023\uffbf\024\uffbf\025\uffbf\026\uffbf\027\uffbf" +
-    "\030\uffbf\031\uffbf\032\uffbf\033\uffbf\034\uffbf\035\uffbf\036" +
-    "\uffbf\037\uffbf\040\uffbf\041\uffbf\042\uffbf\043\uffbf\001\002" +
-    "\000\004\054\011\001\002\000\072\002\uffc3\005\uffc3\006" +
-    "\uffc3\012\155\013\uffc3\014\uffc3\015\uffc3\016\uffc3\017\uffc3" +
-    "\020\uffc3\022\uffc3\023\uffc3\024\uffc3\025\uffc3\026\uffc3\027" +
-    "\uffc3\030\uffc3\031\uffc3\032\uffc3\033\uffc3\034\uffc3\035\uffc3" +
-    "\036\uffc3\037\uffc3\040\uffc3\041\uffc3\042\uffc3\043\uffc3\001" +
-    "\002\000\030\012\042\013\156\042\051\044\036\045\041" +
-    "\047\035\050\057\051\053\052\037\053\044\054\025\001" +
-    "\002\000\070\002\uffb9\005\uffb9\006\uffb9\013\uffb9\014\uffb9" +
-    "\015\uffb9\016\uffb9\017\uffb9\020\uffb9\022\uffb9\023\uffb9\024" +
-    "\uffb9\025\uffb9\026\uffb9\027\uffb9\030\uffb9\031\uffb9\032\uffb9" +
-    "\033\uffb9\034\uffb9\035\uffb9\036\uffb9\037\uffb9\040\uffb9\041" +
-    "\uffb9\042\uffb9\043\uffb9\001\002\000\004\013\160\001\002" +
-    "\000\070\002\uffb8\005\uffb8\006\uffb8\013\uffb8\014\uffb8\015" +
-    "\uffb8\016\uffb8\017\uffb8\020\uffb8\022\uffb8\023\uffb8\024\uffb8" +
-    "\025\uffb8\026\uffb8\027\uffb8\030\uffb8\031\uffb8\032\uffb8\033" +
-    "\uffb8\034\uffb8\035\uffb8\036\uffb8\037\uffb8\040\uffb8\041\uffb8" +
-    "\042\uffb8\043\uffb8\001\002\000\064\002\uffcd\005\uffcd\006" +
-    "\uffcd\013\uffcd\015\uffcd\016\uffcd\017\uffcd\022\uffcd\023\uffcd" +
-    "\024\uffcd\025\uffcd\026\uffcd\027\uffcd\030\uffcd\031\uffcd\032" +
-    "\uffcd\033\uffcd\034\uffcd\035\uffcd\036\uffcd\037\uffcd\040\uffcd" +
-    "\041\uffcd\042\uffcd\043\uffcd\001\002\000\004\054\011\001" +
-    "\002\000\072\002\uffc5\005\uffc5\006\uffc5\012\164\013\uffc5" +
-    "\014\uffc5\015\uffc5\016\uffc5\017\uffc5\020\uffc5\022\uffc5\023" +
-    "\uffc5\024\uffc5\025\uffc5\026\uffc5\027\uffc5\030\uffc5\031\uffc5" +
-    "\032\uffc5\033\uffc5\034\uffc5\035\uffc5\036\uffc5\037\uffc5\040" +
-    "\uffc5\041\uffc5\042\uffc5\043\uffc5\001\002\000\030\012\042" +
-    "\013\165\042\051\044\036\045\041\047\035\050\057\051" +
-    "\053\052\037\053\044\054\025\001\002\000\070\002\uffbd" +
-    "\005\uffbd\006\uffbd\013\uffbd\014\uffbd\015\uffbd\016\uffbd\017" +
-    "\uffbd\020\uffbd\022\uffbd\023\uffbd\024\uffbd\025\uffbd\026\uffbd" +
-    "\027\uffbd\030\uffbd\031\uffbd\032\uffbd\033\uffbd\034\uffbd\035" +
-    "\uffbd\036\uffbd\037\uffbd\040\uffbd\041\uffbd\042\uffbd\043\uffbd" +
-    "\001\002\000\004\013\167\001\002\000\070\002\uffbc\005" +
-    "\uffbc\006\uffbc\013\uffbc\014\uffbc\015\uffbc\016\uffbc\017\uffbc" +
-    "\020\uffbc\022\uffbc\023\uffbc\024\uffbc\025\uffbc\026\uffbc\027" +
-    "\uffbc\030\uffbc\031\uffbc\032\uffbc\033\uffbc\034\uffbc\035\uffbc" +
-    "\036\uffbc\037\uffbc\040\uffbc\041\uffbc\042\uffbc\043\uffbc\001" +
-    "\002\000\046\013\171\022\113\024\077\025\073\026\074" +
-    "\027\101\030\110\031\075\032\106\033\100\034\105\035" +
-    "\111\036\104\037\112\040\103\041\076\042\107\043\072" +
-    "\001\002\000\070\002\uffb2\005\uffb2\006\uffb2\013\uffb2\014" +
-    "\uffb2\015\uffb2\016\uffb2\017\uffb2\020\uffb2\022\uffb2\023\uffb2" +
-    "\024\uffb2\025\uffb2\026\uffb2\027\uffb2\030\uffb2\031\uffb2\032" +
-    "\uffb2\033\uffb2\034\uffb2\035\uffb2\036\uffb2\037\uffb2\040\uffb2" +
-    "\041\uffb2\042\uffb2\043\uffb2\001\002\000\064\002\uffcf\005" +
+    "\uffc9\042\uffc9\043\uffc9\001\002\000\060\002\uffce\005\uffce" +
+    "\006\uffce\013\uffce\015\uffce\016\uffce\017\uffce\022\uffce\023" +
+    "\uffce\024\uffce\025\uffce\026\106\027\112\032\117\033\111" +
+    "\034\116\035\122\036\115\037\123\040\114\041\107\042" +
+    "\120\043\103\001\002\000\064\002\uffc6\005\uffc6\006\uffc6" +
+    "\013\uffc6\015\uffc6\016\uffc6\017\uffc6\022\uffc6\023\uffc6\024" +
+    "\uffc6\025\uffc6\026\uffc6\027\uffc6\030\uffc6\031\uffc6\032\uffc6" +
+    "\033\uffc6\034\116\035\122\036\115\037\123\040\114\041" +
+    "\uffc6\042\uffc6\043\103\001\002\000\064\002\uffcc\005\uffcc" +
+    "\006\uffcc\013\uffcc\015\uffcc\016\uffcc\017\uffcc\022\uffcc\023" +
+    "\uffcc\024\uffcc\025\uffcc\026\uffcc\027\uffcc\030\uffcc\031\uffcc" +
+    "\032\uffcc\033\uffcc\034\116\035\122\036\115\037\123\040" +
+    "\114\041\107\042\120\043\103\001\002\000\064\002\uffca" +
+    "\005\uffca\006\uffca\013\uffca\015\uffca\016\uffca\017\uffca\022" +
+    "\uffca\023\uffca\024\uffca\025\uffca\026\uffca\027\uffca\030\uffca" +
+    "\031\uffca\032\uffca\033\uffca\034\uffca\035\uffca\036\uffca\037" +
+    "\uffca\040\uffca\041\uffca\042\uffca\043\uffca\001\002\000\064" +
+    "\002\uffc8\005\uffc8\006\uffc8\013\uffc8\015\uffc8\016\uffc8\017" +
+    "\uffc8\022\uffc8\023\uffc8\024\uffc8\025\uffc8\026\uffc8\027\uffc8" +
+    "\030\uffc8\031\uffc8\032\uffc8\033\uffc8\034\uffc8\035\uffc8\036" +
+    "\uffc8\037\uffc8\040\uffc8\041\uffc8\042\uffc8\043\uffc8\001\002" +
+    "\000\064\002\uffc4\005\uffc4\006\uffc4\013\uffc4\015\uffc4\016" +
+    "\uffc4\017\uffc4\022\uffc4\023\uffc4\024\uffc4\025\uffc4\026\uffc4" +
+    "\027\uffc4\030\uffc4\031\uffc4\032\uffc4\033\uffc4\034\116\035" +
+    "\122\036\115\037\uffc4\040\uffc4\041\uffc4\042\uffc4\043\uffc4" +
+    "\001\002\000\004\013\uffde\001\002\000\064\002\uffcf\005" +
     "\uffcf\006\uffcf\013\uffcf\015\uffcf\016\uffcf\017\uffcf\022\uffcf" +
     "\023\uffcf\024\uffcf\025\uffcf\026\uffcf\027\uffcf\030\uffcf\031" +
-    "\uffcf\032\uffcf\033\uffcf\034\uffcf\035\uffcf\036\uffcf\037\uffcf" +
-    "\040\uffcf\041\uffcf\042\uffcf\043\uffcf\001\002\000\030\012" +
-    "\042\013\174\042\051\044\036\045\041\047\035\050\057" +
-    "\051\053\052\037\053\044\054\025\001\002\000\070\002" +
-    "\uffc2\005\uffc2\006\uffc2\013\uffc2\014\uffc2\015\uffc2\016\uffc2" +
-    "\017\uffc2\020\uffc2\022\uffc2\023\uffc2\024\uffc2\025\uffc2\026" +
-    "\uffc2\027\uffc2\030\uffc2\031\uffc2\032\uffc2\033\uffc2\034\uffc2" +
-    "\035\uffc2\036\uffc2\037\uffc2\040\uffc2\041\uffc2\042\uffc2\043" +
-    "\uffc2\001\002\000\004\013\176\001\002\000\070\002\uffc1" +
-    "\005\uffc1\006\uffc1\013\uffc1\014\uffc1\015\uffc1\016\uffc1\017" +
-    "\uffc1\020\uffc1\022\uffc1\023\uffc1\024\uffc1\025\uffc1\026\uffc1" +
-    "\027\uffc1\030\uffc1\031\uffc1\032\uffc1\033\uffc1\034\uffc1\035" +
-    "\uffc1\036\uffc1\037\uffc1\040\uffc1\041\uffc1\042\uffc1\043\uffc1" +
-    "\001\002\000\064\002\uffd0\005\uffd0\006\uffd0\013\uffd0\015" +
-    "\uffd0\016\uffd0\017\uffd0\022\uffd0\023\uffd0\024\uffd0\025\uffd0" +
-    "\026\074\027\101\030\110\031\075\032\106\033\100\034" +
-    "\105\035\111\036\104\037\112\040\103\041\076\042\107" +
-    "\043\072\001\002\000\064\002\uffcc\005\uffcc\006\uffcc\013" +
-    "\uffcc\015\uffcc\016\uffcc\017\uffcc\022\uffcc\023\uffcc\024\uffcc" +
-    "\025\uffcc\026\uffcc\027\uffcc\030\uffcc\031\uffcc\032\uffcc\033" +
-    "\uffcc\034\uffcc\035\uffcc\036\uffcc\037\uffcc\040\uffcc\041\uffcc" +
-    "\042\uffcc\043\uffcc\001\002\000\026\012\042\042\051\044" +
-    "\036\045\041\047\035\050\057\051\053\052\037\053\044" +
-    "\054\025\001\002\000\046\006\ufff6\022\113\024\077\025" +
-    "\073\026\074\027\101\030\110\031\075\032\106\033\100" +
-    "\034\105\035\111\036\104\037\112\040\103\041\076\042" +
-    "\107\043\072\001\002\000\004\006\204\001\002\000\034" +
-    "\007\211\010\207\011\213\012\042\042\051\044\036\045" +
-    "\041\047\035\050\057\051\053\052\037\053\044\054\025" +
-    "\001\002\000\004\002\ufff1\001\002\000\052\002\ufff0\016" +
-    "\222\017\223\022\113\024\077\025\073\026\074\027\101" +
-    "\030\110\031\075\032\106\033\100\034\105\035\111\036" +
-    "\104\037\112\040\103\041\076\042\107\043\072\001\002" +
-    "\000\030\002\uffef\012\042\042\051\044\036\045\041\047" +
-    "\035\050\057\051\053\052\037\053\044\054\025\001\002" +
-    "\000\004\002\uffff\001\002\000\004\002\ufff5\001\002\000" +
-    "\004\002\ufff4\001\002\000\004\054\025\001\002\000\004" +
-    "\012\215\001\002\000\030\012\042\013\216\042\051\044" +
-    "\036\045\041\047\035\050\057\051\053\052\037\053\044" +
-    "\054\025\001\002\000\004\002\uffed\001\002\000\004\013" +
-    "\220\001\002\000\004\002\uffec\001\002\000\046\002\uffee" +
-    "\022\113\024\077\025\073\026\074\027\101\030\110\031" +
-    "\075\032\106\033\100\034\105\035\111\036\104\037\112" +
-    "\040\103\041\076\042\107\043\072\001\002\000\032\010" +
-    "\207\011\213\012\042\042\051\044\036\045\041\047\035" +
-    "\050\057\051\053\052\037\053\044\054\025\001\002\000" +
-    "\032\010\207\011\213\012\042\042\051\044\036\045\041" +
-    "\047\035\050\057\051\053\052\037\053\044\054\025\001" +
-    "\002\000\004\002\ufff2\001\002\000\004\002\ufff3\001\002" +
-    "" });
+    "\uffcf\032\uffcf\033\uffcf\034\116\035\122\036\115\037\123" +
+    "\040\114\041\107\042\120\043\103\001\002\000\064\002" +
+    "\uffcb\005\uffcb\006\uffcb\013\uffcb\015\uffcb\016\uffcb\017\uffcb" +
+    "\022\uffcb\023\uffcb\024\uffcb\025\uffcb\026\uffcb\027\uffcb\030" +
+    "\uffcb\031\uffcb\032\uffcb\033\uffcb\034\116\035\122\036\115" +
+    "\037\123\040\114\041\107\042\120\043\103\001\002\000" +
+    "\064\002\uffd2\005\uffd2\006\uffd2\013\uffd2\015\uffd2\016\uffd2" +
+    "\017\uffd2\022\uffd2\023\uffd2\024\uffd2\025\uffd2\026\106\027" +
+    "\112\030\121\031\105\032\117\033\111\034\116\035\122" +
+    "\036\115\037\123\040\114\041\107\042\120\043\103\001" +
+    "\002\000\064\002\uffc7\005\uffc7\006\uffc7\013\uffc7\015\uffc7" +
+    "\016\uffc7\017\uffc7\022\uffc7\023\uffc7\024\uffc7\025\uffc7\026" +
+    "\uffc7\027\uffc7\030\uffc7\031\uffc7\032\uffc7\033\uffc7\034\116" +
+    "\035\122\036\115\037\123\040\114\041\uffc7\042\uffc7\043" +
+    "\103\001\002\000\064\002\uffd0\005\uffd0\006\uffd0\013\uffd0" +
+    "\015\uffd0\016\uffd0\017\uffd0\022\uffd0\023\uffd0\024\uffd0\025" +
+    "\uffd0\026\uffd0\027\uffd0\030\uffd0\031\uffd0\032\uffd0\033\uffd0" +
+    "\034\116\035\122\036\115\037\123\040\114\041\107\042" +
+    "\120\043\103\001\002\000\060\002\uffcd\005\uffcd\006\uffcd" +
+    "\013\uffcd\015\uffcd\016\uffcd\017\uffcd\022\uffcd\023\uffcd\024" +
+    "\uffcd\025\uffcd\026\106\027\112\032\117\033\111\034\116" +
+    "\035\122\036\115\037\123\040\114\041\107\042\120\043" +
+    "\103\001\002\000\064\002\uffd1\005\uffd1\006\uffd1\013\uffd1" +
+    "\015\uffd1\016\uffd1\017\uffd1\022\uffd1\023\uffd1\024\uffd1\025" +
+    "\uffd1\026\106\027\112\030\121\031\105\032\117\033\111" +
+    "\034\116\035\122\036\115\037\123\040\114\041\107\042" +
+    "\120\043\103\001\002\000\064\002\uffc3\005\uffc3\006\uffc3" +
+    "\013\uffc3\015\uffc3\016\uffc3\017\uffc3\022\uffc3\023\uffc3\024" +
+    "\uffc3\025\uffc3\026\uffc3\027\uffc3\030\uffc3\031\uffc3\032\uffc3" +
+    "\033\uffc3\034\116\035\122\036\115\037\uffc3\040\uffc3\041" +
+    "\uffc3\042\uffc3\043\uffc3\001\002\000\064\002\uffbb\005\uffbb" +
+    "\006\uffbb\013\uffbb\015\uffbb\016\uffbb\017\uffbb\022\uffbb\023" +
+    "\uffbb\024\uffbb\025\uffbb\026\uffbb\027\uffbb\030\uffbb\031\uffbb" +
+    "\032\uffbb\033\uffbb\034\uffbb\035\uffbb\036\uffbb\037\uffbb\040" +
+    "\uffbb\041\uffbb\042\uffbb\043\uffbb\001\002\000\046\015\153" +
+    "\022\124\024\110\025\104\026\106\027\112\030\121\031" +
+    "\105\032\117\033\111\034\116\035\122\036\115\037\123" +
+    "\040\114\041\107\042\120\043\103\001\002\000\066\002" +
+    "\uffba\005\uffba\006\uffba\013\uffba\014\uffba\015\uffba\016\uffba" +
+    "\017\uffba\022\uffba\023\uffba\024\uffba\025\uffba\026\uffba\027" +
+    "\uffba\030\uffba\031\uffba\032\uffba\033\uffba\034\uffba\035\uffba" +
+    "\036\uffba\037\uffba\040\uffba\041\uffba\042\uffba\043\uffba\001" +
+    "\002\000\064\002\uffc0\005\uffc0\006\uffc0\013\uffc0\015\uffc0" +
+    "\016\uffc0\017\uffc0\022\uffc0\023\uffc0\024\uffc0\025\uffc0\026" +
+    "\uffc0\027\uffc0\030\uffc0\031\uffc0\032\uffc0\033\uffc0\034\uffc0" +
+    "\035\uffc0\036\uffc0\037\uffc0\040\uffc0\041\uffc0\042\uffc0\043" +
+    "\uffc0\001\002\000\004\054\156\001\002\000\072\002\uffa1" +
+    "\005\uffa1\006\uffa1\012\uffa1\013\uffa1\014\uffa1\015\uffa1\016" +
+    "\uffa1\017\uffa1\020\uff9f\022\uffa1\023\uffa1\024\uffa1\025\uffa1" +
+    "\026\uffa1\027\uffa1\030\uffa1\031\uffa1\032\uffa1\033\uffa1\034" +
+    "\uffa1\035\uffa1\036\uffa1\037\uffa1\040\uffa1\041\uffa1\042\uffa1" +
+    "\043\uffa1\001\002\000\070\002\uffb9\005\uffb9\006\uffb9\012" +
+    "\160\013\uffb9\014\uffb9\015\uffb9\016\uffb9\017\uffb9\022\uffb9" +
+    "\023\uffb9\024\uffb9\025\uffb9\026\uffb9\027\uffb9\030\uffb9\031" +
+    "\uffb9\032\uffb9\033\uffb9\034\uffb9\035\uffb9\036\uffb9\037\uffb9" +
+    "\040\uffb9\041\uffb9\042\uffb9\043\uffb9\001\002\000\032\003" +
+    "\077\012\047\013\161\042\056\044\043\045\046\047\042" +
+    "\050\064\051\060\052\044\053\051\054\032\001\002\000" +
+    "\070\002\uffb2\005\uffb2\006\uffb2\013\uffb2\014\uffb2\015\uffb2" +
+    "\016\uffb2\017\uffb2\020\uffb2\022\uffb2\023\uffb2\024\uffb2\025" +
+    "\uffb2\026\uffb2\027\uffb2\030\uffb2\031\uffb2\032\uffb2\033\uffb2" +
+    "\034\uffb2\035\uffb2\036\uffb2\037\uffb2\040\uffb2\041\uffb2\042" +
+    "\uffb2\043\uffb2\001\002\000\004\013\163\001\002\000\070" +
+    "\002\uffb1\005\uffb1\006\uffb1\013\uffb1\014\uffb1\015\uffb1\016" +
+    "\uffb1\017\uffb1\020\uffb1\022\uffb1\023\uffb1\024\uffb1\025\uffb1" +
+    "\026\uffb1\027\uffb1\030\uffb1\031\uffb1\032\uffb1\033\uffb1\034" +
+    "\uffb1\035\uffb1\036\uffb1\037\uffb1\040\uffb1\041\uffb1\042\uffb1" +
+    "\043\uffb1\001\002\000\004\054\016\001\002\000\072\002" +
+    "\uffb5\005\uffb5\006\uffb5\012\166\013\uffb5\014\uffb5\015\uffb5" +
+    "\016\uffb5\017\uffb5\020\uffb5\022\uffb5\023\uffb5\024\uffb5\025" +
+    "\uffb5\026\uffb5\027\uffb5\030\uffb5\031\uffb5\032\uffb5\033\uffb5" +
+    "\034\uffb5\035\uffb5\036\uffb5\037\uffb5\040\uffb5\041\uffb5\042" +
+    "\uffb5\043\uffb5\001\002\000\032\003\077\012\047\013\167" +
+    "\042\056\044\043\045\046\047\042\050\064\051\060\052" +
+    "\044\053\051\054\032\001\002\000\070\002\uffab\005\uffab" +
+    "\006\uffab\013\uffab\014\uffab\015\uffab\016\uffab\017\uffab\020" +
+    "\uffab\022\uffab\023\uffab\024\uffab\025\uffab\026\uffab\027\uffab" +
+    "\030\uffab\031\uffab\032\uffab\033\uffab\034\uffab\035\uffab\036" +
+    "\uffab\037\uffab\040\uffab\041\uffab\042\uffab\043\uffab\001\002" +
+    "\000\004\013\171\001\002\000\070\002\uffaa\005\uffaa\006" +
+    "\uffaa\013\uffaa\014\uffaa\015\uffaa\016\uffaa\017\uffaa\020\uffaa" +
+    "\022\uffaa\023\uffaa\024\uffaa\025\uffaa\026\uffaa\027\uffaa\030" +
+    "\uffaa\031\uffaa\032\uffaa\033\uffaa\034\uffaa\035\uffaa\036\uffaa" +
+    "\037\uffaa\040\uffaa\041\uffaa\042\uffaa\043\uffaa\001\002\000" +
+    "\064\002\uffbf\005\uffbf\006\uffbf\013\uffbf\015\uffbf\016\uffbf" +
+    "\017\uffbf\022\uffbf\023\uffbf\024\uffbf\025\uffbf\026\uffbf\027" +
+    "\uffbf\030\uffbf\031\uffbf\032\uffbf\033\uffbf\034\uffbf\035\uffbf" +
+    "\036\uffbf\037\uffbf\040\uffbf\041\uffbf\042\uffbf\043\uffbf\001" +
+    "\002\000\004\054\016\001\002\000\072\002\uffb7\005\uffb7" +
+    "\006\uffb7\012\175\013\uffb7\014\uffb7\015\uffb7\016\uffb7\017" +
+    "\uffb7\020\uffb7\022\uffb7\023\uffb7\024\uffb7\025\uffb7\026\uffb7" +
+    "\027\uffb7\030\uffb7\031\uffb7\032\uffb7\033\uffb7\034\uffb7\035" +
+    "\uffb7\036\uffb7\037\uffb7\040\uffb7\041\uffb7\042\uffb7\043\uffb7" +
+    "\001\002\000\032\003\077\012\047\013\176\042\056\044" +
+    "\043\045\046\047\042\050\064\051\060\052\044\053\051" +
+    "\054\032\001\002\000\070\002\uffaf\005\uffaf\006\uffaf\013" +
+    "\uffaf\014\uffaf\015\uffaf\016\uffaf\017\uffaf\020\uffaf\022\uffaf" +
+    "\023\uffaf\024\uffaf\025\uffaf\026\uffaf\027\uffaf\030\uffaf\031" +
+    "\uffaf\032\uffaf\033\uffaf\034\uffaf\035\uffaf\036\uffaf\037\uffaf" +
+    "\040\uffaf\041\uffaf\042\uffaf\043\uffaf\001\002\000\004\013" +
+    "\200\001\002\000\070\002\uffae\005\uffae\006\uffae\013\uffae" +
+    "\014\uffae\015\uffae\016\uffae\017\uffae\020\uffae\022\uffae\023" +
+    "\uffae\024\uffae\025\uffae\026\uffae\027\uffae\030\uffae\031\uffae" +
+    "\032\uffae\033\uffae\034\uffae\035\uffae\036\uffae\037\uffae\040" +
+    "\uffae\041\uffae\042\uffae\043\uffae\001\002\000\046\013\202" +
+    "\022\124\024\110\025\104\026\106\027\112\030\121\031" +
+    "\105\032\117\033\111\034\116\035\122\036\115\037\123" +
+    "\040\114\041\107\042\120\043\103\001\002\000\070\002" +
+    "\uffa4\005\uffa4\006\uffa4\013\uffa4\014\uffa4\015\uffa4\016\uffa4" +
+    "\017\uffa4\020\uffa4\022\uffa4\023\uffa4\024\uffa4\025\uffa4\026" +
+    "\uffa4\027\uffa4\030\uffa4\031\uffa4\032\uffa4\033\uffa4\034\uffa4" +
+    "\035\uffa4\036\uffa4\037\uffa4\040\uffa4\041\uffa4\042\uffa4\043" +
+    "\uffa4\001\002\000\064\002\uffc1\005\uffc1\006\uffc1\013\uffc1" +
+    "\015\uffc1\016\uffc1\017\uffc1\022\uffc1\023\uffc1\024\uffc1\025" +
+    "\uffc1\026\uffc1\027\uffc1\030\uffc1\031\uffc1\032\uffc1\033\uffc1" +
+    "\034\uffc1\035\uffc1\036\uffc1\037\uffc1\040\uffc1\041\uffc1\042" +
+    "\uffc1\043\uffc1\001\002\000\032\003\077\012\047\013\205" +
+    "\042\056\044\043\045\046\047\042\050\064\051\060\052" +
+    "\044\053\051\054\032\001\002\000\070\002\uffb4\005\uffb4" +
+    "\006\uffb4\013\uffb4\014\uffb4\015\uffb4\016\uffb4\017\uffb4\020" +
+    "\uffb4\022\uffb4\023\uffb4\024\uffb4\025\uffb4\026\uffb4\027\uffb4" +
+    "\030\uffb4\031\uffb4\032\uffb4\033\uffb4\034\uffb4\035\uffb4\036" +
+    "\uffb4\037\uffb4\040\uffb4\041\uffb4\042\uffb4\043\uffb4\001\002" +
+    "\000\004\013\207\001\002\000\070\002\uffb3\005\uffb3\006" +
+    "\uffb3\013\uffb3\014\uffb3\015\uffb3\016\uffb3\017\uffb3\020\uffb3" +
+    "\022\uffb3\023\uffb3\024\uffb3\025\uffb3\026\uffb3\027\uffb3\030" +
+    "\uffb3\031\uffb3\032\uffb3\033\uffb3\034\uffb3\035\uffb3\036\uffb3" +
+    "\037\uffb3\040\uffb3\041\uffb3\042\uffb3\043\uffb3\001\002\000" +
+    "\064\002\uffc2\005\uffc2\006\uffc2\013\uffc2\015\uffc2\016\uffc2" +
+    "\017\uffc2\022\uffc2\023\uffc2\024\uffc2\025\uffc2\026\106\027" +
+    "\112\030\121\031\105\032\117\033\111\034\116\035\122" +
+    "\036\115\037\123\040\114\041\107\042\120\043\103\001" +
+    "\002\000\064\002\uffbe\005\uffbe\006\uffbe\013\uffbe\015\uffbe" +
+    "\016\uffbe\017\uffbe\022\uffbe\023\uffbe\024\uffbe\025\uffbe\026" +
+    "\uffbe\027\uffbe\030\uffbe\031\uffbe\032\uffbe\033\uffbe\034\uffbe" +
+    "\035\uffbe\036\uffbe\037\uffbe\040\uffbe\041\uffbe\042\uffbe\043" +
+    "\uffbe\001\002\000\030\003\214\012\047\042\056\044\043" +
+    "\045\046\047\042\050\064\051\060\052\044\053\051\054" +
+    "\032\001\002\000\046\006\uffed\022\124\024\110\025\104" +
+    "\026\106\027\112\030\121\031\105\032\117\033\111\034" +
+    "\116\035\122\036\115\037\123\040\114\041\107\042\120" +
+    "\043\103\001\002\000\004\006\ufff8\001\002\000\004\006" +
+    "\216\001\002\000\036\003\226\007\223\010\221\011\227" +
+    "\012\047\042\056\044\043\045\046\047\042\050\064\051" +
+    "\060\052\044\053\051\054\032\001\002\000\004\002\uffe7" +
+    "\001\002\000\052\002\uffe5\016\241\017\242\022\124\024" +
+    "\110\025\104\026\106\027\112\030\121\031\105\032\117" +
+    "\033\111\034\116\035\122\036\115\037\123\040\114\041" +
+    "\107\042\120\043\103\001\002\000\030\002\uffe3\012\047" +
+    "\042\056\044\043\045\046\047\042\050\064\051\060\052" +
+    "\044\053\051\054\032\001\002\000\004\002\uffff\001\002" +
+    "\000\004\002\uffec\001\002\000\004\002\uffeb\001\002\000" +
+    "\004\002\uffe8\001\002\000\036\002\ufff6\003\237\010\221" +
+    "\011\227\012\047\042\056\044\043\045\046\047\042\050" +
+    "\064\051\060\052\044\053\051\054\032\001\002\000\004" +
+    "\054\032\001\002\000\004\002\uffe4\001\002\000\004\012" +
+    "\232\001\002\000\032\003\077\012\047\013\233\042\056" +
+    "\044\043\045\046\047\042\050\064\051\060\052\044\053" +
+    "\051\054\032\001\002\000\004\002\uffe1\001\002\000\004" +
+    "\013\235\001\002\000\004\002\uffe0\001\002\000\004\002" +
+    "\uffe6\001\002\000\034\003\237\010\221\011\227\012\047" +
+    "\042\056\044\043\045\046\047\042\050\064\051\060\052" +
+    "\044\053\051\054\032\001\002\000\046\002\uffe2\022\124" +
+    "\024\110\025\104\026\106\027\112\030\121\031\105\032" +
+    "\117\033\111\034\116\035\122\036\115\037\123\040\114" +
+    "\041\107\042\120\043\103\001\002\000\034\003\237\010" +
+    "\221\011\227\012\047\042\056\044\043\045\046\047\042" +
+    "\050\064\051\060\052\044\053\051\054\032\001\002\000" +
+    "\034\003\237\010\221\011\227\012\047\042\056\044\043" +
+    "\045\046\047\042\050\064\051\060\052\044\053\051\054" +
+    "\032\001\002\000\004\002\uffe9\001\002\000\004\002\uffea" +
+    "\001\002\000\004\006\246\001\002\000\036\003\237\007" +
+    "\223\010\221\011\227\012\047\042\056\044\043\045\046" +
+    "\047\042\050\064\051\060\052\044\053\051\054\032\001" +
+    "\002\000\004\002\ufff7\001\002\000\004\005\251\001\002" +
+    "\000\026\012\047\042\056\044\043\045\046\047\042\050" +
+    "\064\051\060\052\044\053\051\054\032\001\002\000\004" +
+    "\006\253\001\002\000\036\003\237\007\223\010\221\011" +
+    "\227\012\047\042\056\044\043\045\046\047\042\050\064" +
+    "\051\060\052\044\053\051\054\032\001\002\000\004\002" +
+    "\ufff9\001\002" });
 
   /** Access to parse-action table. */
   public short[][] action_table() {return _action_table;}
@@ -435,126 +462,150 @@
   /** <code>reduce_goto</code> table. */
   protected static final short[][] _reduce_table = 
     unpackFromStrings(new String[] {
-    "\000\223\000\006\003\005\004\003\001\001\000\002\001" +
-    "\001\000\014\005\011\006\015\007\014\010\012\033\013" +
-    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
+    "\000\252\000\016\003\011\004\006\036\003\037\004\040" +
+    "\010\041\005\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\014\005\016\006" +
+    "\022\007\021\010\017\034\020\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\004\044\247\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\002\001\001\000\012\006\026\007\021\010\017\034\020" +
+    "\001\001\000\012\006\025\007\021\010\017\034\020\001" +
+    "\001\000\002\001\001\000\002\001\001\000\010\033\030" +
+    "\034\033\035\032\001\001\000\002\001\001\000\002\001" +
     "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\032\017\037\020\054\021\051\022" +
+    "\061\023\060\024\040\025\052\026\062\027\056\030\047" +
+    "\034\044\035\053\001\001\000\002\001\001\000\006\031" +
+    "\210\032\066\001\001\000\002\001\001\000\032\017\207" +
+    "\020\054\021\051\022\061\023\060\024\040\025\052\026" +
+    "\062\027\056\030\047\034\044\035\053\001\001\000\002" +
+    "\001\001\000\002\001\001\000\032\017\202\020\054\021" +
+    "\051\022\061\023\060\024\040\025\052\026\062\027\056" +
+    "\030\047\034\044\035\053\001\001\000\032\017\200\020" +
+    "\054\021\051\022\061\023\060\024\040\025\052\026\062" +
+    "\027\056\030\047\034\044\035\053\001\001\000\006\031" +
+    "\171\032\066\001\001\000\002\001\001\000\002\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
-    "\012\006\021\007\014\010\012\033\013\001\001\000\012" +
-    "\006\020\007\014\010\012\033\013\001\001\000\002\001" +
-    "\001\000\002\001\001\000\010\032\023\033\026\034\025" +
+    "\032\017\153\020\054\021\051\022\061\023\060\024\040" +
+    "\025\052\026\062\027\056\030\047\034\044\035\053\001" +
+    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\006\031\065\032\066\001\001\000" +
+    "\002\001\001\000\032\017\151\020\054\021\051\022\061" +
+    "\023\060\024\040\025\052\026\062\027\056\030\047\034" +
+    "\044\035\053\001\001\000\002\001\001\000\006\031\150" +
+    "\032\066\001\001\000\004\034\070\001\001\000\002\001" +
+    "\001\000\036\016\075\017\072\020\054\021\051\022\061" +
+    "\023\060\024\040\025\052\026\062\027\056\030\047\034" +
+    "\044\035\053\043\074\001\001\000\002\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
-    "\000\032\016\032\017\047\020\044\021\054\022\053\023" +
-    "\033\024\045\025\055\026\051\027\042\033\037\034\046" +
-    "\001\001\000\002\001\001\000\006\030\177\031\061\001" +
-    "\001\000\002\001\001\000\032\016\176\017\047\020\044" +
-    "\021\054\022\053\023\033\024\045\025\055\026\051\027" +
-    "\042\033\037\034\046\001\001\000\002\001\001\000\002" +
-    "\001\001\000\032\016\171\017\047\020\044\021\054\022" +
-    "\053\023\033\024\045\025\055\026\051\027\042\033\037" +
-    "\034\046\001\001\000\032\016\167\017\047\020\044\021" +
-    "\054\022\053\023\033\024\045\025\055\026\051\027\042" +
-    "\033\037\034\046\001\001\000\006\030\160\031\061\001" +
-    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
-    "\000\002\001\001\000\002\001\001\000\032\016\142\017" +
-    "\047\020\044\021\054\022\053\023\033\024\045\025\055" +
-    "\026\051\027\042\033\037\034\046\001\001\000\002\001" +
-    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
-    "\000\006\030\060\031\061\001\001\000\002\001\001\000" +
-    "\032\016\140\017\047\020\044\021\054\022\053\023\033" +
-    "\024\045\025\055\026\051\027\042\033\037\034\046\001" +
-    "\001\000\002\001\001\000\006\030\137\031\061\001\001" +
-    "\000\004\033\063\001\001\000\002\001\001\000\034\015" +
-    "\067\016\065\017\047\020\044\021\054\022\053\023\033" +
-    "\024\045\025\055\026\051\027\042\033\037\034\046\001" +
-    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
-    "\000\002\001\001\000\032\016\136\017\047\020\044\021" +
-    "\054\022\053\023\033\024\045\025\055\026\051\027\042" +
-    "\033\037\034\046\001\001\000\032\016\135\017\047\020" +
-    "\044\021\054\022\053\023\033\024\045\025\055\026\051" +
-    "\027\042\033\037\034\046\001\001\000\032\016\134\017" +
-    "\047\020\044\021\054\022\053\023\033\024\045\025\055" +
-    "\026\051\027\042\033\037\034\046\001\001\000\032\016" +
-    "\133\017\047\020\044\021\054\022\053\023\033\024\045" +
-    "\025\055\026\051\027\042\033\037\034\046\001\001\000" +
-    "\032\016\132\017\047\020\044\021\054\022\053\023\033" +
-    "\024\045\025\055\026\051\027\042\033\037\034\046\001" +
-    "\001\000\032\016\131\017\047\020\044\021\054\022\053" +
-    "\023\033\024\045\025\055\026\051\027\042\033\037\034" +
-    "\046\001\001\000\032\016\130\017\047\020\044\021\054" +
-    "\022\053\023\033\024\045\025\055\026\051\027\042\033" +
-    "\037\034\046\001\001\000\032\016\127\017\047\020\044" +
-    "\021\054\022\053\023\033\024\045\025\055\026\051\027" +
-    "\042\033\037\034\046\001\001\000\034\015\126\016\065" +
-    "\017\047\020\044\021\054\022\053\023\033\024\045\025" +
-    "\055\026\051\027\042\033\037\034\046\001\001\000\032" +
-    "\016\125\017\047\020\044\021\054\022\053\023\033\024" +
-    "\045\025\055\026\051\027\042\033\037\034\046\001\001" +
-    "\000\032\016\124\017\047\020\044\021\054\022\053\023" +
-    "\033\024\045\025\055\026\051\027\042\033\037\034\046" +
-    "\001\001\000\032\016\123\017\047\020\044\021\054\022" +
-    "\053\023\033\024\045\025\055\026\051\027\042\033\037" +
-    "\034\046\001\001\000\032\016\122\017\047\020\044\021" +
-    "\054\022\053\023\033\024\045\025\055\026\051\027\042" +
-    "\033\037\034\046\001\001\000\032\016\121\017\047\020" +
-    "\044\021\054\022\053\023\033\024\045\025\055\026\051" +
-    "\027\042\033\037\034\046\001\001\000\032\016\120\017" +
-    "\047\020\044\021\054\022\053\023\033\024\045\025\055" +
-    "\026\051\027\042\033\037\034\046\001\001\000\032\016" +
-    "\117\017\047\020\044\021\054\022\053\023\033\024\045" +
-    "\025\055\026\051\027\042\033\037\034\046\001\001\000" +
-    "\032\016\116\017\047\020\044\021\054\022\053\023\033" +
-    "\024\045\025\055\026\051\027\042\033\037\034\046\001" +
-    "\001\000\032\016\113\017\047\020\044\021\054\022\053" +
-    "\023\033\024\045\025\055\026\051\027\042\033\037\034" +
-    "\046\001\001\000\002\001\001\000\032\016\115\017\047" +
-    "\020\044\021\054\022\053\023\033\024\045\025\055\026" +
-    "\051\027\042\033\037\034\046\001\001\000\002\001\001" +
+    "\001\000\036\016\100\017\072\020\054\021\051\022\061" +
+    "\023\060\024\040\025\052\026\062\027\056\030\047\034" +
+    "\044\035\053\043\074\001\001\000\002\001\001\000\002" +
+    "\001\001\000\032\017\147\020\054\021\051\022\061\023" +
+    "\060\024\040\025\052\026\062\027\056\030\047\034\044" +
+    "\035\053\001\001\000\032\017\146\020\054\021\051\022" +
+    "\061\023\060\024\040\025\052\026\062\027\056\030\047" +
+    "\034\044\035\053\001\001\000\032\017\145\020\054\021" +
+    "\051\022\061\023\060\024\040\025\052\026\062\027\056" +
+    "\030\047\034\044\035\053\001\001\000\032\017\144\020" +
+    "\054\021\051\022\061\023\060\024\040\025\052\026\062" +
+    "\027\056\030\047\034\044\035\053\001\001\000\032\017" +
+    "\143\020\054\021\051\022\061\023\060\024\040\025\052" +
+    "\026\062\027\056\030\047\034\044\035\053\001\001\000" +
+    "\032\017\142\020\054\021\051\022\061\023\060\024\040" +
+    "\025\052\026\062\027\056\030\047\034\044\035\053\001" +
+    "\001\000\032\017\141\020\054\021\051\022\061\023\060" +
+    "\024\040\025\052\026\062\027\056\030\047\034\044\035" +
+    "\053\001\001\000\032\017\140\020\054\021\051\022\061" +
+    "\023\060\024\040\025\052\026\062\027\056\030\047\034" +
+    "\044\035\053\001\001\000\036\016\137\017\072\020\054" +
+    "\021\051\022\061\023\060\024\040\025\052\026\062\027" +
+    "\056\030\047\034\044\035\053\043\074\001\001\000\032" +
+    "\017\136\020\054\021\051\022\061\023\060\024\040\025" +
+    "\052\026\062\027\056\030\047\034\044\035\053\001\001" +
+    "\000\032\017\135\020\054\021\051\022\061\023\060\024" +
+    "\040\025\052\026\062\027\056\030\047\034\044\035\053" +
+    "\001\001\000\032\017\134\020\054\021\051\022\061\023" +
+    "\060\024\040\025\052\026\062\027\056\030\047\034\044" +
+    "\035\053\001\001\000\032\017\133\020\054\021\051\022" +
+    "\061\023\060\024\040\025\052\026\062\027\056\030\047" +
+    "\034\044\035\053\001\001\000\032\017\132\020\054\021" +
+    "\051\022\061\023\060\024\040\025\052\026\062\027\056" +
+    "\030\047\034\044\035\053\001\001\000\032\017\131\020" +
+    "\054\021\051\022\061\023\060\024\040\025\052\026\062" +
+    "\027\056\030\047\034\044\035\053\001\001\000\032\017" +
+    "\130\020\054\021\051\022\061\023\060\024\040\025\052" +
+    "\026\062\027\056\030\047\034\044\035\053\001\001\000" +
+    "\032\017\127\020\054\021\051\022\061\023\060\024\040" +
+    "\025\052\026\062\027\056\030\047\034\044\035\053\001" +
+    "\001\000\032\017\124\020\054\021\051\022\061\023\060" +
+    "\024\040\025\052\026\062\027\056\030\047\034\044\035" +
+    "\053\001\001\000\002\001\001\000\032\017\126\020\054" +
+    "\021\051\022\061\023\060\024\040\025\052\026\062\027" +
+    "\056\030\047\034\044\035\053\001\001\000\002\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
     "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
     "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
     "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
     "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
-    "\001\001\000\002\001\001\000\004\033\145\001\001\000" +
-    "\002\001\001\000\002\001\001\000\034\015\150\016\065" +
-    "\017\047\020\044\021\054\022\053\023\033\024\045\025" +
-    "\055\026\051\027\042\033\037\034\046\001\001\000\002" +
-    "\001\001\000\002\001\001\000\002\001\001\000\004\033" +
-    "\153\001\001\000\002\001\001\000\034\015\156\016\065" +
-    "\017\047\020\044\021\054\022\053\023\033\024\045\025" +
-    "\055\026\051\027\042\033\037\034\046\001\001\000\002" +
+    "\001\001\000\002\001\001\000\004\034\156\001\001\000" +
+    "\002\001\001\000\002\001\001\000\036\016\161\017\072" +
+    "\020\054\021\051\022\061\023\060\024\040\025\052\026" +
+    "\062\027\056\030\047\034\044\035\053\043\074\001\001" +
+    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
+    "\004\034\164\001\001\000\002\001\001\000\036\016\167" +
+    "\017\072\020\054\021\051\022\061\023\060\024\040\025" +
+    "\052\026\062\027\056\030\047\034\044\035\053\043\074" +
     "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\004\033\162\001\001\000\002\001\001\000\034" +
-    "\015\165\016\065\017\047\020\044\021\054\022\053\023" +
-    "\033\024\045\025\055\026\051\027\042\033\037\034\046" +
-    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
-    "\000\034\015\174\016\065\017\047\020\044\021\054\022" +
-    "\053\023\033\024\045\025\055\026\051\027\042\033\037" +
-    "\034\046\001\001\000\002\001\001\000\002\001\001\000" +
-    "\002\001\001\000\002\001\001\000\002\001\001\000\034" +
-    "\011\202\016\201\017\047\020\044\021\054\022\053\023" +
-    "\033\024\045\025\055\026\051\027\042\033\037\034\046" +
-    "\001\001\000\002\001\001\000\002\001\001\000\040\012" +
-    "\207\013\211\014\204\016\205\017\047\020\044\021\054" +
-    "\022\053\023\033\024\045\025\055\026\051\027\042\033" +
-    "\037\034\046\001\001\000\002\001\001\000\002\001\001" +
-    "\000\032\016\220\017\047\020\044\021\054\022\053\023" +
-    "\033\024\045\025\055\026\051\027\042\033\037\034\046" +
-    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
-    "\001\000\010\032\213\033\026\034\025\001\001\000\002" +
-    "\001\001\000\034\015\216\016\065\017\047\020\044\021" +
-    "\054\022\053\023\033\024\045\025\055\026\051\027\042" +
-    "\033\037\034\046\001\001\000\002\001\001\000\002\001" +
-    "\001\000\002\001\001\000\002\001\001\000\036\013\224" +
-    "\014\204\016\205\017\047\020\044\021\054\022\053\023" +
-    "\033\024\045\025\055\026\051\027\042\033\037\034\046" +
-    "\001\001\000\036\013\223\014\204\016\205\017\047\020" +
-    "\044\021\054\022\053\023\033\024\045\025\055\026\051" +
-    "\027\042\033\037\034\046\001\001\000\002\001\001\000" +
-    "\002\001\001" });
+    "\001\000\002\001\001\000\004\034\173\001\001\000\002" +
+    "\001\001\000\036\016\176\017\072\020\054\021\051\022" +
+    "\061\023\060\024\040\025\052\026\062\027\056\030\047" +
+    "\034\044\035\053\043\074\001\001\000\002\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\036\016\205\017\072\020" +
+    "\054\021\051\022\061\023\060\024\040\025\052\026\062" +
+    "\027\056\030\047\034\044\035\053\043\074\001\001\000" +
+    "\002\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\034\011\214\017\212\020" +
+    "\054\021\051\022\061\023\060\024\040\025\052\026\062" +
+    "\027\056\030\047\034\044\035\053\001\001\000\002\001" +
+    "\001\000\004\045\244\001\001\000\002\001\001\000\044" +
+    "\012\221\013\223\014\216\015\227\017\217\020\054\021" +
+    "\051\022\061\023\060\024\040\025\052\026\062\027\056" +
+    "\030\047\034\044\035\053\042\224\001\001\000\002\001" +
+    "\001\000\002\001\001\000\032\017\237\020\054\021\051" +
+    "\022\061\023\060\024\040\025\052\026\062\027\056\030" +
+    "\047\034\044\035\053\001\001\000\002\001\001\000\002" +
+    "\001\001\000\002\001\001\000\002\001\001\000\042\013" +
+    "\235\014\216\015\227\017\217\020\054\021\051\022\061" +
+    "\023\060\024\040\025\052\026\062\027\056\030\047\034" +
+    "\044\035\053\042\224\001\001\000\010\033\230\034\033" +
+    "\035\032\001\001\000\002\001\001\000\002\001\001\000" +
+    "\036\016\233\017\072\020\054\021\051\022\061\023\060" +
+    "\024\040\025\052\026\062\027\056\030\047\034\044\035" +
+    "\053\043\074\001\001\000\002\001\001\000\002\001\001" +
+    "\000\002\001\001\000\002\001\001\000\042\013\235\014" +
+    "\216\015\227\017\217\020\054\021\051\022\061\023\060" +
+    "\024\040\025\052\026\062\027\056\030\047\034\044\035" +
+    "\053\042\224\001\001\000\002\001\001\000\042\013\243" +
+    "\014\216\015\227\017\217\020\054\021\051\022\061\023" +
+    "\060\024\040\025\052\026\062\027\056\030\047\034\044" +
+    "\035\053\042\224\001\001\000\042\013\242\014\216\015" +
+    "\227\017\217\020\054\021\051\022\061\023\060\024\040" +
+    "\025\052\026\062\027\056\030\047\034\044\035\053\042" +
+    "\224\001\001\000\002\001\001\000\002\001\001\000\002" +
+    "\001\001\000\044\012\246\013\223\014\216\015\227\017" +
+    "\217\020\054\021\051\022\061\023\060\024\040\025\052" +
+    "\026\062\027\056\030\047\034\044\035\053\042\224\001" +
+    "\001\000\002\001\001\000\002\001\001\000\034\011\251" +
+    "\017\212\020\054\021\051\022\061\023\060\024\040\025" +
+    "\052\026\062\027\056\030\047\034\044\035\053\001\001" +
+    "\000\002\001\001\000\044\012\253\013\223\014\216\015" +
+    "\227\017\217\020\054\021\051\022\061\023\060\024\040" +
+    "\025\052\026\062\027\056\030\047\034\044\035\053\042" +
+    "\224\001\001\000\002\001\001" });
 
   /** Access to <code>reduce_goto</code> table. */
   public short[][] reduce_table() {return _reduce_table;}
@@ -603,13 +654,55 @@
 
 
 
-  public String file = "";
+  private String file = "";
+  private int errorCount = 0;
 
   public void setFile(String file)
   {
     this.file = file;
   }
 
+  public void error(String message, int line, int col)
+  {
+        errorCount++;
+        System.out.println(file + " @ " + line + "." + col + " : " + message);
+  }
+
+  /** Report a non fatal error (or warning).  This method takes a message
+   *  string and an additional object (to be used by specializations
+   *  implemented in subclasses).  Here in the base class a very simple
+   *  implementation is provided which simply prints the message to
+   *  System.err.
+   *
+   * @param message an error message.
+   * @param info    an extra object reserved for use by specialized subclasses.
+   */
+  public void report_error(String message, Object info)
+  {
+      if (info instanceof Symbol) {
+          Symbol sym = (Symbol)info;
+          System.err.println(message + " at line " + sym.left +  " character " + sym.right);
+      } else {
+          System.err.println(message);
+      }
+  }
+
+  public void error(String message)
+  {
+        errorCount++;
+        System.out.println(file + " : " + message);
+  }
+
+  public String getFile()
+  {
+    return file;
+  }
+
+  public int getErrorCount()
+  {
+    return errorCount;
+  }
+
   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
 
   /** Do debug output for a reduce.
@@ -645,37 +738,47 @@
     /*
     private ParseNode node(int tag)
     {
-    return ParseNode.node(tag, parser.file);
+    return ParseNode.node(tag, parser.getFile());
     }
     */
 
     private ParseNode node(int tag, int line, int column)
     {
-	return ParseNode.node(tag, parser.file, line, column);
+	return ParseNode.node(tag, parser.getFile(), line, column);
     }
 
     private ParseNode node(int tag, int line, int column, Object child0)
     {
-	return ParseNode.node(tag, parser.file, line, column, child0);
+	return ParseNode.node(tag, parser.getFile(), line, column, child0);
     }
 
     private ParseNode node(int tag, int line, int column, Object child0, Object child1)
     {
-	return ParseNode.node(tag, parser.file, line, column, child0, child1);
+	return ParseNode.node(tag, parser.getFile(), line, column, child0, child1);
     }
 
     private ParseNode node(int tag, int line, int column, Object child0, Object child1, Object child2)
     {
-	return ParseNode.node(tag, parser.file, line, column, child0, child1, child2);
+	return ParseNode.node(tag, parser.getFile(), line, column, child0, child1, child2);
     }
 
     /*
     private ParseNode node(int tag, int line, int column, Object child0, Object child1, Object child2, Object child3)
     {
-	return ParseNode.node(tag, parser.file, line, column, child0, child1, child2, child3);
+	return ParseNode.node(tag, parser.getFile(), line, column, child0, child1, child2, child3);
     }
     */
+    public void error(String message, int line, int col)
+    {
+        parser.error(message, line, col);
+    }
 
+    public void error(String message)
+    {
+        parser.error(message);
+    }
+
+
   private final ECAGrammarParser parser;
 
   /** Constructor */
@@ -698,7 +801,7 @@
       switch (CUP$ECAGrammarParser$act_num)
         {
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 84: // path ::= path DOT IDENTIFIER 
+          case 98: // path ::= path DOT IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -708,36 +811,36 @@
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		String i = (String)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.PATH, ileft, iright, i, p); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(26/*path*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(27/*path*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 83: // path ::= IDENTIFIER 
+          case 97: // path ::= IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		String i = (String)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.PATH, ileft, iright, i, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(26/*path*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(27/*path*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 82: // simple_name ::= IDENTIFIER 
+          case 96: // simple_name ::= IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		String i = (String)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.IDENTIFIER, ileft, iright, i, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(25/*simple_name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(26/*simple_name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 81: // name ::= path DOT IDENTIFIER 
+          case 95: // name ::= path DOT IDENTIFIER 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -747,96 +850,96 @@
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		String i = (String)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.IDENTIFIER, ileft, iright, i, p); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(24/*name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(25/*name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 80: // name ::= simple_name 
+          case 94: // name ::= simple_name 
             {
               ParseNode RESULT = null;
 		int nleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int nright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode n = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = n; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(24/*name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(25/*name*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 79: // simple_expr ::= LPAREN expr RPAREN 
+          case 93: // simple_expr ::= LPAREN expr RPAREN 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(22/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 78: // simple_expr ::= DOLLAR 
+          case 92: // simple_expr ::= DOLLAR 
             {
               ParseNode RESULT = null;
 		int sleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int sright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		Object s = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.DOLLAR, sleft, sright, s); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(22/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 77: // simple_expr ::= STRING_LITERAL 
+          case 91: // simple_expr ::= STRING_LITERAL 
             {
               ParseNode RESULT = null;
 		int sleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int sright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		String s = (String)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.STRING_LITERAL, sleft, sright, s); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(22/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 76: // simple_expr ::= BOOLEAN_LITERAL 
+          case 90: // simple_expr ::= BOOLEAN_LITERAL 
             {
               ParseNode RESULT = null;
 		int bleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int bright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		Boolean b = (Boolean)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT =  node(ParseNode.BOOLEAN_LITERAL, bleft, bright, b); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(22/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 75: // simple_expr ::= FLOAT_LITERAL 
+          case 89: // simple_expr ::= FLOAT_LITERAL 
             {
               ParseNode RESULT = null;
 		int fleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int fright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		Float f = (Float)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT =  node(ParseNode.FLOAT_LITERAL, fleft, fright, f); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(22/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 74: // simple_expr ::= INTEGER_LITERAL 
+          case 88: // simple_expr ::= INTEGER_LITERAL 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		Integer i = (Integer)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT =  node(ParseNode.INTEGER_LITERAL, ileft, iright, i); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(22/*simple_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 73: // expr_meth_expr ::= expr_field_expr DOT simple_name LPAREN expr_list RPAREN 
+          case 87: // expr_meth_expr ::= expr_field_expr DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int efeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -849,12 +952,12 @@
 		int argsright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode args = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, efe, args); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 72: // expr_meth_expr ::= expr_field_expr DOT simple_name LPAREN RPAREN 
+          case 86: // expr_meth_expr ::= expr_field_expr DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int efeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -864,12 +967,12 @@
 		int mright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
 		ParseNode m = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, efe, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 71: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN expr_list RPAREN 
+          case 85: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int emeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -882,12 +985,12 @@
 		int argsright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode args = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, eme, args); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 70: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN RPAREN 
+          case 84: // expr_meth_expr ::= meth_expr DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int emeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -897,12 +1000,12 @@
 		int mright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
 		ParseNode m = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, eme, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 69: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN expr_list RPAREN 
+          case 83: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -915,12 +1018,12 @@
 		int argsright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode args = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, se, args); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 68: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN RPAREN 
+          case 82: // expr_meth_expr ::= simple_expr DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -930,24 +1033,24 @@
 		int mright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
 		ParseNode m = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, se, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(21/*expr_meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 67: // meth_expr ::= expr_meth_expr 
+          case 81: // meth_expr ::= expr_meth_expr 
             {
               ParseNode RESULT = null;
 		int emeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int emeright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode eme = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = eme; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(19/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 66: // meth_expr ::= path DOT simple_name LPAREN expr_list RPAREN 
+          case 80: // meth_expr ::= path DOT simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
@@ -960,12 +1063,12 @@
 		int argsright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode args = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, p, args); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(19/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 65: // meth_expr ::= path DOT simple_name LPAREN RPAREN 
+          case 79: // meth_expr ::= path DOT simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -975,12 +1078,12 @@
 		int mright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
 		ParseNode m = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, p, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(19/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 64: // meth_expr ::= simple_name LPAREN expr_list RPAREN 
+          case 78: // meth_expr ::= simple_name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int mleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left;
@@ -990,24 +1093,24 @@
 		int argsright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode args = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, null, args); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(19/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 63: // meth_expr ::= simple_name LPAREN RPAREN 
+          case 77: // meth_expr ::= simple_name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int mleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
 		int mright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
 		ParseNode m = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
 		 RESULT = node(ParseNode.METH, mleft, mright, m, null, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(19/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(20/*meth_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 62: // expr_field_expr ::= expr_field_expr DOT simple_name 
+          case 76: // expr_field_expr ::= expr_field_expr DOT simple_name 
             {
               ParseNode RESULT = null;
 		int efeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1017,12 +1120,12 @@
 		int fright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode f = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.FIELD, fleft, fright, f, efe); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(18/*expr_field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(19/*expr_field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 61: // expr_field_expr ::= meth_expr DOT simple_name 
+          case 75: // expr_field_expr ::= meth_expr DOT simple_name 
             {
               ParseNode RESULT = null;
 		int meleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1032,12 +1135,12 @@
 		int fright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode f = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.FIELD, fleft, fright, f, me); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(18/*expr_field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(19/*expr_field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 60: // expr_field_expr ::= simple_expr DOT simple_name 
+          case 74: // expr_field_expr ::= simple_expr DOT simple_name 
             {
               ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1047,24 +1150,24 @@
 		int fright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode f = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.FIELD, fleft, fright, f, se); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(18/*expr_field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(19/*expr_field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 59: // field_expr ::= expr_field_expr 
+          case 73: // field_expr ::= expr_field_expr 
             {
               ParseNode RESULT = null;
 		int efeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int eferight = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode efe = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = efe; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(17/*field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(18/*field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 58: // field_expr ::= path DOT simple_name 
+          case 72: // field_expr ::= path DOT simple_name 
             {
               ParseNode RESULT = null;
 		int pleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1074,24 +1177,24 @@
 		int fright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode f = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.FIELD, fleft, fright, f, p); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(17/*field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(18/*field_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 57: // array_idx ::= LSQUARE expr RSQUARE 
+          case 71: // array_idx ::= LSQUARE expr RSQUARE 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(23/*array_idx*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(24/*array_idx*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 56: // array_idx_list ::= array_idx array_idx_list 
+          case 70: // array_idx_list ::= array_idx array_idx_list 
             {
               ParseNode RESULT = null;
 		int aileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1101,24 +1204,24 @@
 		int ailright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode ail = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT =  node(ParseNode.SEMI, aileft, airight, ai, ail); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(22/*array_idx_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(23/*array_idx_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 55: // array_idx_list ::= array_idx 
+          case 69: // array_idx_list ::= array_idx 
             {
               ParseNode RESULT = null;
 		int aileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int airight = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode ai = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = ai; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(22/*array_idx_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(23/*array_idx_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 54: // array_expr ::= meth_expr array_idx_list 
+          case 68: // array_expr ::= meth_expr array_idx_list 
             {
               ParseNode RESULT = null;
 		int meleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1128,12 +1231,12 @@
 		int ailright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode ail = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.ARRAY, meleft, meright, me, ail); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(16/*array_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(17/*array_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 53: // array_expr ::= field_expr array_idx_list 
+          case 67: // array_expr ::= field_expr array_idx_list 
             {
               ParseNode RESULT = null;
 		int feleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1143,12 +1246,12 @@
 		int ailright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode ail = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.ARRAY, feleft, feright, fe, ail); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(16/*array_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(17/*array_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 52: // array_expr ::= simple_expr array_idx_list 
+          case 66: // array_expr ::= simple_expr array_idx_list 
             {
               ParseNode RESULT = null;
 		int seleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1158,12 +1261,12 @@
 		int ailright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode ail = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.ARRAY, seleft, seright, se, ail); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(16/*array_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(17/*array_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 51: // unary_oper_expr ::= MINUS expr 
+          case 65: // unary_oper_expr ::= MINUS expr 
             {
               ParseNode RESULT = null;
 		int oleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1173,12 +1276,12 @@
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.UNOP, eleft, eright, node(ParseNode.UMINUS, oleft, oright), e); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*unary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(16/*unary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 50: // unary_oper_expr ::= TWIDDLE expr 
+          case 64: // unary_oper_expr ::= TWIDDLE expr 
             {
               ParseNode RESULT = null;
 		int oleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1188,12 +1291,12 @@
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.UNOP, eleft, eright, node(ParseNode.TWIDDLE, oleft, oright), e); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*unary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(16/*unary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 49: // unary_oper_expr ::= NOT expr 
+          case 63: // unary_oper_expr ::= NOT expr 
             {
               ParseNode RESULT = null;
 		int oleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1203,12 +1306,12 @@
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.UNOP, eleft, eright, node(ParseNode.NOT, oleft, oright), e); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*unary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(16/*unary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 48: // binary_oper_expr ::= expr MOD expr 
+          case 62: // binary_oper_expr ::= expr MOD expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1221,12 +1324,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.MOD, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 47: // binary_oper_expr ::= expr DIV expr 
+          case 61: // binary_oper_expr ::= expr DIV expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1239,12 +1342,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.DIV, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 46: // binary_oper_expr ::= expr MUL expr 
+          case 60: // binary_oper_expr ::= expr MUL expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1257,12 +1360,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.MUL, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 45: // binary_oper_expr ::= expr MINUS expr 
+          case 59: // binary_oper_expr ::= expr MINUS expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1275,12 +1378,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.MINUS, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 44: // binary_oper_expr ::= expr PLUS expr 
+          case 58: // binary_oper_expr ::= expr PLUS expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1293,12 +1396,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.PLUS, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 43: // binary_oper_expr ::= expr BXOR expr 
+          case 57: // binary_oper_expr ::= expr BXOR expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1311,12 +1414,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.BXOR, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 42: // binary_oper_expr ::= expr BAND expr 
+          case 56: // binary_oper_expr ::= expr BAND expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1329,12 +1432,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.BAND, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 41: // binary_oper_expr ::= expr BOR expr 
+          case 55: // binary_oper_expr ::= expr BOR expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1347,12 +1450,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.BOR, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 40: // binary_oper_expr ::= expr GT expr 
+          case 54: // binary_oper_expr ::= expr GT expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1365,12 +1468,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.GT, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 39: // binary_oper_expr ::= expr GE expr 
+          case 53: // binary_oper_expr ::= expr GE expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1383,12 +1486,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.GE, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 38: // binary_oper_expr ::= expr NE expr 
+          case 52: // binary_oper_expr ::= expr NE expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1401,12 +1504,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.NE, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 37: // binary_oper_expr ::= expr EQ expr 
+          case 51: // binary_oper_expr ::= expr EQ expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1419,12 +1522,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.EQ, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 36: // binary_oper_expr ::= expr LE expr 
+          case 50: // binary_oper_expr ::= expr LE expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1437,12 +1540,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.LE, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 35: // binary_oper_expr ::= expr LT expr 
+          case 49: // binary_oper_expr ::= expr LT expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1455,12 +1558,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.LT, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 34: // binary_oper_expr ::= expr AND expr 
+          case 48: // binary_oper_expr ::= expr AND expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1473,12 +1576,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.AND, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 33: // binary_oper_expr ::= expr OR expr 
+          case 47: // binary_oper_expr ::= expr OR expr 
             {
               ParseNode RESULT = null;
 		int e1left = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1491,12 +1594,12 @@
 		int e2right = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e2 = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.BINOP, e1left, e1right, node(ParseNode.OR, oleft, oright), e1, e2); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(15/*binary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 32: // ternary_oper_expr ::= expr TERN_IF expr COLON expr 
+          case 46: // ternary_oper_expr ::= expr TERN_IF expr COLON expr 
             {
               ParseNode RESULT = null;
 		int condleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
@@ -1509,110 +1612,138 @@
 		int iffalseright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode iffalse = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.TERNOP, condleft, condright, cond, iftrue, iffalse); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*ternary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(14/*ternary_oper_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 31: // expr ::= simple_name 
+          case 45: // expr ::= simple_name 
             {
               ParseNode RESULT = null;
 		int nleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int nright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode n = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = n; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 30: // expr ::= simple_expr 
+          case 44: // expr ::= simple_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 29: // expr ::= meth_expr 
+          case 43: // expr ::= meth_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 28: // expr ::= field_expr 
+          case 42: // expr ::= field_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 27: // expr ::= array_expr 
+          case 41: // expr ::= array_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 26: // expr ::= unary_oper_expr 
+          case 40: // expr ::= unary_oper_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 25: // expr ::= binary_oper_expr 
+          case 39: // expr ::= binary_oper_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 24: // expr ::= ternary_oper_expr 
+          case 38: // expr ::= ternary_oper_expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(13/*expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 23: // expr_list ::= expr COMMA expr_list 
+          case 37: // expr_list_error_invalid_expr ::= error COMMA expr_list 
             {
               ParseNode RESULT = null;
+		int cleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
+		int cright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
+		Object c = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
+		int elleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int elright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode el = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 error("invalid expression", cleft, cright);
+		   RESULT = node(ParseNode.COMMA, cleft, cright, null, el); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(33/*expr_list_error_invalid_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 36: // expr_list ::= expr_list_error_invalid_expr 
+            {
+              ParseNode RESULT = null;
+		int elleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int elright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode el = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 RESULT = el; 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 35: // expr_list ::= expr COMMA expr_list 
+            {
+              ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
@@ -1620,24 +1751,24 @@
 		int elright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode el = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.COMMA, eleft, eright, e, el); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(11/*expr_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 22: // expr_list ::= expr 
+          case 34: // expr_list ::= expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = e; 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(11/*expr_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(12/*expr_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 21: // action_expr ::= THROW name LPAREN expr_list RPAREN 
+          case 33: // throw_return_expr ::= THROW name LPAREN expr_list RPAREN 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left;
@@ -1647,24 +1778,24 @@
 		int argsright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
 		ParseNode args = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
 		 RESULT = node(ParseNode.THROW, ileft, iright, i, args); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(10/*action_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(11/*throw_return_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 20: // action_expr ::= THROW name LPAREN RPAREN 
+          case 32: // throw_return_expr ::= THROW name LPAREN RPAREN 
             {
               ParseNode RESULT = null;
 		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
 		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
 		ParseNode i = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
 		 RESULT = node(ParseNode.THROW, ileft, iright, i, null); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(10/*action_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(11/*throw_return_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-3)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 19: // action_expr ::= RETURN expr 
+          case 31: // throw_return_expr ::= RETURN expr 
             {
               ParseNode RESULT = null;
 		int rleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
@@ -1674,24 +1805,33 @@
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.RETURN, rleft, rright, e); 
-              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(10/*action_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(11/*throw_return_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 18: // action_expr ::= RETURN 
+          case 30: // throw_return_expr ::= RETURN 
             {
               ParseNode RESULT = null;
 		int rleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int rright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		Object r = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
 		 RESULT = node(ParseNode.RETURN, rleft, rright, null); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(11/*throw_return_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 29: // action_expr ::= throw_return_expr 
+            {
+              ParseNode RESULT = null;
+
               CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(10/*action_expr*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
             }
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 17: // action_expr ::= expr 
+          case 28: // action_expr ::= expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1703,9 +1843,22 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 16: // action_expr_list ::= action_expr 
+          case 27: // action_expr_list_error_invalid_action ::= error action_expr_list 
             {
               ParseNode RESULT = null;
+		int aelleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int aelright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode ael = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 error("invalid action", aelleft, aelright);
+           RESULT = ael; 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(32/*action_expr_list_error_invalid_action*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 26: // action_expr_list ::= action_expr 
+            {
+              ParseNode RESULT = null;
 		int aeleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
 		int aeright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
 		ParseNode ae = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
@@ -1715,9 +1868,21 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 15: // action_expr_list ::= expr COMMA action_expr_list 
+          case 25: // action_expr_list ::= action_expr_list_error_invalid_action 
             {
               ParseNode RESULT = null;
+		int aelleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int aelright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode ael = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 RESULT = ael; 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(9/*action_expr_list*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 24: // action_expr_list ::= expr COMMA action_expr_list 
+            {
+              ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
 		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
 		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
@@ -1730,7 +1895,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 14: // action_expr_list ::= expr SEMI action_expr_list 
+          case 23: // action_expr_list ::= expr SEMI action_expr_list 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1745,7 +1910,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 13: // actions ::= action_expr_list 
+          case 22: // actions ::= action_expr_list 
             {
               ParseNode RESULT = null;
 		int aelleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1757,7 +1922,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 12: // actions ::= NOTHING 
+          case 21: // actions ::= NOTHING 
             {
               ParseNode RESULT = null;
 		int nleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1769,7 +1934,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 11: // condition ::= expr 
+          case 20: // condition ::= expr 
             {
               ParseNode RESULT = null;
 		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1781,7 +1946,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 10: // bind_sym ::= simple_name 
+          case 19: // bind_sym ::= simple_name 
             {
               ParseNode RESULT = null;
 		int varleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1793,7 +1958,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 9: // bind_sym ::= simple_name COLON name 
+          case 18: // bind_sym ::= simple_name COLON name 
             {
               ParseNode RESULT = null;
 		int varleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1808,7 +1973,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 8: // binding ::= bind_sym ASSIGN expr 
+          case 17: // binding ::= bind_sym ASSIGN expr 
             {
               ParseNode RESULT = null;
 		int sleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1823,7 +1988,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 7: // bindings ::= binding 
+          case 16: // bindings ::= binding 
             {
               ParseNode RESULT = null;
 		int bleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1835,7 +2000,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 6: // bindings ::= binding SEMI bindings 
+          case 15: // bindings ::= binding SEMI bindings 
             {
               ParseNode RESULT = null;
 		int bleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1850,7 +2015,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 5: // bindings ::= binding COMMA bindings 
+          case 14: // bindings ::= binding COMMA bindings 
             {
               ParseNode RESULT = null;
 		int bleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
@@ -1865,7 +2030,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 4: // event ::= bindings 
+          case 13: // event ::= bindings 
             {
               ParseNode RESULT = null;
 		int bleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1877,7 +2042,7 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
-          case 3: // event ::= NOTHING 
+          case 12: // event ::= NOTHING 
             {
               ParseNode RESULT = null;
 		int nleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
@@ -1889,6 +2054,130 @@
           return CUP$ECAGrammarParser$result;
 
           /*. . . . . . . . . . . . . . . . . . . .*/
+          case 11: // eca_error_in_action ::= BIND event IF condition DO error 
+            {
+              ParseNode RESULT = null;
+		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).right;
+		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).value;
+		int cleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
+		int cright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
+		ParseNode c = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
+		int dleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
+		int dright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
+		Object d = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
+		 error("invalid action", dleft, dright);
+                      RESULT = node(ParseNode.BIND, eleft, eright, e, c, null); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(31/*eca_error_in_action*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 10: // eca_error_in_condition ::= BIND event IF error NT$1 DO actions 
+            {
+              ParseNode RESULT = null;
+              // propagate RESULT from NT$1
+              if ( ((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value != null )
+                RESULT = (ParseNode) ((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
+		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).right;
+		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-5)).value;
+		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).left;
+		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).right;
+		Object i = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).value;
+		int aleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int aright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode a = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 RESULT = node(ParseNode.BIND, eleft, eright, e, null, a); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(30/*eca_error_in_condition*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-6)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 9: // NT$1 ::= 
+            {
+              Object RESULT = null;
+		int eleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
+		int eright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
+		ParseNode e = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
+		int ileft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
+		int iright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
+		Object i = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
+ error("invalid condition", ileft, iright); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(35/*NT$1*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 8: // eca_error_in_event ::= BIND error NT$0 IF condition DO actions 
+            {
+              ParseNode RESULT = null;
+              // propagate RESULT from NT$0
+              if ( ((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).value != null )
+                RESULT = (ParseNode) ((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-4)).value;
+		int bleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-6)).left;
+		int bright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-6)).right;
+		Object b = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-6)).value;
+		int cleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).left;
+		int cright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).right;
+		ParseNode c = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-2)).value;
+		int aleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left;
+		int aright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right;
+		ParseNode a = (ParseNode)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).value;
+		 RESULT = node(ParseNode.BIND, bleft, bright, null, c, a); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(29/*eca_error_in_event*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-6)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 7: // NT$0 ::= 
+            {
+              Object RESULT = null;
+		int bleft = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).left;
+		int bright = ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).right;
+		Object b = (Object)((java_cup.runtime.Symbol) CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-1)).value;
+ error("invalid event", bleft, bright); 
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(34/*NT$0*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 6: // eca_error ::= eca_error_in_action 
+            {
+              ParseNode RESULT = null;
+
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(28/*eca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 5: // eca_error ::= eca_error_in_condition 
+            {
+              ParseNode RESULT = null;
+
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(28/*eca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 4: // eca_error ::= eca_error_in_event 
+            {
+              ParseNode RESULT = null;
+
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(28/*eca_error*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
+          case 3: // eca ::= eca_error 
+            {
+              ParseNode RESULT = null;
+
+              CUP$ECAGrammarParser$result = new java_cup.runtime.Symbol(2/*eca*/, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).left, ((java_cup.runtime.Symbol)CUP$ECAGrammarParser$stack.elementAt(CUP$ECAGrammarParser$top-0)).right, RESULT);
+            }
+          return CUP$ECAGrammarParser$result;
+
+          /*. . . . . . . . . . . . . . . . . . . .*/
           case 2: // eca ::= BIND event IF condition DO actions 
             {
               ParseNode RESULT = null;

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/ECATokenLexer.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/ECATokenLexer.java	2009-06-29 12:09:04 UTC (rev 27283)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/ECATokenLexer.java	2009-06-29 13:02:50 UTC (rev 27284)
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.2 on 03/06/09 17:40 */
+/* The following code was generated by JFlex 1.4.2 on 6/29/09 11:49 AM */
 
 /*
 * JBoss, Home of Professional Open Source
@@ -33,7 +33,7 @@
 /**
  * This class is a scanner generated by 
  * <a href="http://www.jflex.de/">JFlex</a> 1.4.2
- * on 03/06/09 17:40 from the specification file
+ * on 6/29/09 11:49 AM from the specification file
  * <tt>dd/grammar/flex/ECAToken.flex</tt>
  */
 public class ECATokenLexer implements java_cup.runtime.Scanner {

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/sym.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/sym.java	2009-06-29 12:09:04 UTC (rev 27283)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/rule/grammar/sym.java	2009-06-29 13:02:50 UTC (rev 27284)
@@ -1,7 +1,7 @@
 
 //----------------------------------------------------
 // The following code was generated by CUP v0.10k
-// Wed Jun 03 17:40:48 BST 2009
+// Mon Jun 29 11:49:38 BST 2009
 //----------------------------------------------------
 
 package org.jboss.byteman.rule.grammar;
@@ -54,32 +54,41 @@
   public static final int INTEGER_LITERAL = 39;
 
   /* non terminals */
+  static final int NT$1 = 35;
+  static final int NT$0 = 34;
+  static final int condition = 7;
+  static final int meth_expr = 20;
+  static final int array_expr = 17;
+  static final int eca_rule = 1;
+  static final int $START = 0;
+  static final int eca_error_in_action = 31;
+  static final int expr_field_expr = 19;
+  static final int binding = 5;
+  static final int name = 25;
+  static final int bind_sym = 6;
+  static final int ternary_oper_expr = 14;
   static final int action_expr = 10;
-  static final int array_idx_list = 22;
-  static final int expr = 12;
-  static final int field_expr = 17;
-  static final int simple_name = 25;
-  static final int $START = 0;
-  static final int simple_expr = 21;
+  static final int array_idx = 24;
+  static final int simple_expr = 22;
+  static final int action_expr_list_error_invalid_action = 32;
+  static final int action_expr_list = 9;
+  static final int field_expr = 18;
+  static final int binary_oper_expr = 15;
+  static final int eca_error = 28;
+  static final int eca_error_in_event = 29;
+  static final int unary_oper_expr = 16;
   static final int actions = 8;
-  static final int bind_sym = 6;
+  static final int expr_meth_expr = 21;
+  static final int eca_error_in_condition = 30;
+  static final int path = 27;
+  static final int expr = 13;
+  static final int array_idx_list = 23;
+  static final int bindings = 4;
+  static final int throw_return_expr = 11;
+  static final int expr_list_error_invalid_expr = 33;
+  static final int simple_name = 26;
+  static final int expr_list = 12;
   static final int eca = 2;
-  static final int action_expr_list = 9;
-  static final int binary_oper_expr = 14;
-  static final int expr_field_expr = 18;
-  static final int path = 26;
-  static final int ternary_oper_expr = 13;
-  static final int binding = 5;
-  static final int expr_meth_expr = 20;
-  static final int expr_list = 11;
   static final int event = 3;
-  static final int condition = 7;
-  static final int eca_rule = 1;
-  static final int array_expr = 16;
-  static final int unary_oper_expr = 15;
-  static final int meth_expr = 19;
-  static final int array_idx = 23;
-  static final int bindings = 4;
-  static final int name = 24;
 }
 

Modified: labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/test/TestScript.java
===================================================================
--- labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/test/TestScript.java	2009-06-29 12:09:04 UTC (rev 27283)
+++ labs/jbosstm/workspace/adinn/byteman/trunk/src/org/jboss/byteman/test/TestScript.java	2009-06-29 13:02:50 UTC (rev 27284)
@@ -24,16 +24,24 @@
 package org.jboss.byteman.test;
 
 import org.jboss.byteman.rule.type.TypeHelper;
+import org.jboss.byteman.rule.type.Type;
+import org.jboss.byteman.rule.type.TypeGroup;
 import org.jboss.byteman.rule.Rule;
+import org.jboss.byteman.rule.binding.Bindings;
+import org.jboss.byteman.rule.binding.Binding;
 import org.jboss.byteman.rule.exception.ParseException;
 import org.jboss.byteman.rule.exception.TypeException;
 import org.jboss.byteman.rule.exception.CompileException;
 import org.jboss.byteman.agent.LocationType;
 import org.jboss.byteman.agent.Location;
+import org.jboss.byteman.agent.adapter.RuleCheckAdapter;
 import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassWriter;
 
 import java.util.List;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.io.File;
 import java.io.IOException;
 import java.io.FileInputStream;
@@ -245,8 +253,18 @@
                                         access = Opcodes.ACC_STATIC;
                                     }
                                     rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc, exceptionNames);
-                                    rule.typeCheck();
-                                    System.err.println("TestScript: type checked rule " + ruleName);
+                                    // the param and local var types are normally set by the check adapter but we
+                                    // cannot run that without accessing the byte[] version of the class so we have
+                                    // to install the param types by hand and we cannot check local var types
+                                    int paramErrorCount = installParamTypes(rule, targetClassName, access, candidateName, candidateDesc);
+                                    if (paramErrorCount == 0) {
+                                        rule.typeCheck();
+                                        System.err.println("TestScript: type checked rule " + ruleName);
+                                    } else {
+                                        errorCount += paramErrorCount;
+                                        typeErrorCount += paramErrorCount;
+                                        System.err.println("TestScript: failed to type check rule " + ruleName);
+                                    }
                                 }
                             }
                         }
@@ -274,8 +292,18 @@
                                         access = Opcodes.ACC_STATIC;
                                     }
                                     rule.setTypeInfo(targetClassName, access, candidateName, candidateDesc, exceptionNames);
-                                    rule.typeCheck();
-                                    System.err.println("TestScript: type checked rule " + ruleName);
+                                    // the param and local var types are normally set by the check adapter but we
+                                    // cannot run that without accessing the byte[] version of the class so we have
+                                    // to install the param types by hand and we cannot check local var types
+                                    int paramErrorCount = installParamTypes(rule, targetClassName, access, candidateName, candidateDesc);
+                                    if (paramErrorCount == 0) {
+                                        rule.typeCheck();
+                                        System.err.println("TestScript: type checked rule " + ruleName);
+                                    } else {
+                                        errorCount += paramErrorCount;
+                                        typeErrorCount += paramErrorCount;
+                                        System.err.println("TestScript: failed to type check rule " + ruleName);
+                                    }
                                 }
                             }
                         }
@@ -348,6 +376,42 @@
         return desc;
     }
 
+    public int installParamTypes(Rule rule, String targetClassName, int access, String candidateName, String candidateDesc)
+    {
+        List<String> paramTypes = Type.parseMethodDescriptor(candidateDesc, false);
+        int paramCount = paramTypes.size();
+        int errorCount = 0;
+
+        TypeGroup typegroup = rule.getTypeGroup();
+
+        Bindings bindings = rule.getBindings();
+        Iterator<Binding> iterator = bindings.iterator();
+
+        while (iterator.hasNext()) {
+            Binding binding = iterator.next();
+
+            if (binding.getType() == Type.UNDEFINED) {
+                if (binding.isRecipient()) {
+                    binding.setDescriptor(targetClassName);
+                } else if (binding.isParam()) {
+                    int idx = binding.getIndex();
+                    // n.b. param indices are 1-based so use > here not >=
+                    if (idx > paramCount) {
+                        errorCount++;
+                        System.err.println("TestScript: invalid method parameter reference $" + idx  + " in rule " + rule.getName());
+                    } else {
+                        binding.setDescriptor(paramTypes.get(idx - 1));
+                    }
+                } else if (binding.isLocalVar()) {
+                    errorCount++;
+                    System.err.println("TestScript: cannot typecheck local variable " + binding.getName()  + " in rule " + rule.getName());
+                }
+            }
+        }
+
+        return errorCount;
+    }
+
     /**
      * suffix found on end of .class files (doh :-)
      */




More information about the jboss-svn-commits mailing list