
//----------------------------------------------------
// The following code was generated by CUP v0.10j [patch-6.035]
// Fri Dec 10 10:26:11 EST 1999
//----------------------------------------------------

import IR2.*;
import java.util.*;

/** CUP v0.10j [patch-6.035] generated parser.
  * @version Fri Dec 10 10:26:11 EST 1999
  */
public class Parser extends java_cup.runtime.lr_parser {

  /** Default constructor. */
  public Parser() {super();}

  /** Constructor which sets the default scanner. */
  public Parser(java_cup.runtime.Scanner s) {super(s);}

  /** Production table. */
  protected static final short _production_table[][] = 
    unpackFromStrings(new String[] {
    "\000\121\000\002\003\010\000\002\002\004\000\002\017" +
    "\004\000\002\017\002\000\002\020\005\000\002\042\005" +
    "\000\002\042\003\000\002\004\003\000\002\004\006\000" +
    "\002\022\003\000\002\022\002\000\002\021\004\000\002" +
    "\021\003\000\002\023\005\000\002\006\010\000\002\006" +
    "\010\000\002\040\003\000\002\040\002\000\002\041\006" +
    "\000\002\041\004\000\002\005\006\000\002\024\004\000" +
    "\002\024\002\000\002\025\005\000\002\035\005\000\002" +
    "\035\003\000\002\032\003\000\002\032\003\000\002\036" +
    "\004\000\002\036\002\000\002\007\006\000\002\007\004" +
    "\000\002\007\012\000\002\007\011\000\002\007\004\000" +
    "\002\007\005\000\002\037\006\000\002\037\002\000\002" +
    "\030\006\000\002\030\005\000\002\030\010\000\002\030" +
    "\006\000\002\034\005\000\002\034\003\000\002\043\005" +
    "\000\002\043\003\000\002\033\003\000\002\010\003\000" +
    "\002\010\006\000\002\026\003\000\002\026\003\000\002" +
    "\026\003\000\002\026\005\000\002\026\005\000\002\026" +
    "\005\000\002\026\005\000\002\026\005\000\002\026\005" +
    "\000\002\026\005\000\002\026\005\000\002\026\005\000" +
    "\002\026\005\000\002\026\005\000\002\026\005\000\002" +
    "\026\005\000\002\026\005\000\002\026\004\000\002\011" +
    "\003\000\002\011\003\000\002\027\003\000\002\027\003" +
    "\000\002\027\003\000\002\031\003\000\002\031\003\000" +
    "\002\012\003\000\002\012\004\000\002\014\003\000\002" +
    "\013\003\000\002\013\004\000\002\015\002\000\002\016" +
    "\002" });

  /** Access to production table. */
  public short[][] production_table() {return _production_table;}

  /** Parse-action table. */
  protected static final short[][] _action_table = 
    unpackFromStrings(new String[] {
    "\000\236\000\004\036\005\001\002\000\004\002\240\001" +
    "\002\000\004\056\006\001\002\000\004\004\010\001\002" +
    "\000\014\003\ufffe\005\ufffe\034\ufffe\043\ufffe\051\ufffe\001" +
    "\002\000\026\003\uffb5\005\uffb5\034\uffb5\035\uffb5\042\uffb5" +
    "\043\uffb5\046\uffb5\051\uffb5\052\uffb5\056\uffb5\001\002\000" +
    "\014\003\ufff7\005\ufff7\034\013\043\012\051\014\001\002" +
    "\000\004\056\uffe7\001\002\000\004\056\uffe6\001\002\000" +
    "\004\056\233\001\002\000\014\003\ufff8\005\ufff8\034\013" +
    "\043\012\051\014\001\002\000\006\003\073\005\100\001" +
    "\002\000\004\004\010\001\002\000\004\056\023\001\002" +
    "\000\014\003\ufff5\005\ufff5\034\ufff5\043\ufff5\051\ufff5\001" +
    "\002\000\014\003\uffff\005\uffff\034\uffff\043\uffff\051\uffff" +
    "\001\002\000\014\003\ufffa\006\035\010\uffb2\012\ufffa\013" +
    "\ufffa\001\002\000\010\003\031\012\026\013\030\001\002" +
    "\000\010\003\ufffb\012\ufffb\013\ufffb\001\002\000\004\056" +
    "\033\001\002\000\014\003\ufffd\005\ufffd\034\ufffd\043\ufffd" +
    "\051\ufffd\001\002\000\026\003\uffb7\005\uffb7\034\uffb7\035" +
    "\uffb7\042\uffb7\043\uffb7\046\uffb7\051\uffb7\052\uffb7\056\uffb7" +
    "\001\002\000\004\013\032\001\002\000\026\003\uffb6\005" +
    "\uffb6\034\uffb6\035\uffb6\042\uffb6\043\uffb6\046\uffb6\051\uffb6" +
    "\052\uffb6\056\uffb6\001\002\000\012\003\ufffa\006\035\012" +
    "\ufffa\013\ufffa\001\002\000\010\003\ufffc\012\ufffc\013\ufffc" +
    "\001\002\000\004\053\036\001\002\000\004\007\037\001" +
    "\002\000\010\003\ufff9\012\ufff9\013\ufff9\001\002\000\004" +
    "\010\041\001\002\000\010\011\ufff0\034\013\043\012\001" +
    "\002\000\006\011\ufff1\012\047\001\002\000\004\056\046" +
    "\001\002\000\004\011\045\001\002\000\004\004\ufff3\001" +
    "\002\000\006\011\uffee\012\uffee\001\002\000\006\034\013" +
    "\043\012\001\002\000\004\056\051\001\002\000\006\011" +
    "\uffef\012\uffef\001\002\000\024\003\uffeb\005\uffeb\034\uffeb" +
    "\035\uffeb\042\uffeb\043\uffeb\046\uffeb\052\uffeb\056\uffeb\001" +
    "\002\000\014\003\uffb1\005\uffb1\034\uffb1\043\uffb1\051\uffb1" +
    "\001\002\000\014\003\ufff4\005\ufff4\034\ufff4\043\ufff4\051" +
    "\ufff4\001\002\000\024\003\uffe4\005\uffe4\034\013\035\uffe4" +
    "\042\uffe4\043\012\046\uffe4\052\uffe4\056\uffe4\001\002\000" +
    "\020\003\073\005\100\035\075\042\071\046\077\052\066" +
    "\056\072\001\002\000\004\056\061\001\002\000\024\003" +
    "\uffec\005\uffec\034\uffec\035\uffec\042\uffec\043\uffec\046\uffec" +
    "\052\uffec\056\uffec\001\002\000\010\003\uffe8\012\uffe8\013" +
    "\uffe8\001\002\000\010\003\031\012\063\013\030\001\002" +
    "\000\004\056\065\001\002\000\024\003\uffea\005\uffea\034" +
    "\uffea\035\uffea\042\uffea\043\uffea\046\uffea\052\uffea\056\uffea" +
    "\001\002\000\010\003\uffe9\012\uffe9\013\uffe9\001\002\000" +
    "\004\010\221\001\002\000\006\003\031\013\030\001\002" +
    "\000\004\010\211\001\002\000\004\010\176\001\002\000" +
    "\054\003\uffd2\006\173\007\uffd2\010\uffd3\011\uffd2\012\uffd2" +
    "\013\uffd2\014\uffd2\015\uffd2\016\uffd2\017\uffd2\020\uffd2\021" +
    "\uffd2\022\uffd2\023\uffd2\024\uffd2\025\uffd2\026\uffd2\027\uffd2" +
    "\030\uffd2\031\uffd2\001\002\000\004\005\172\001\002\000" +
    "\020\003\uffe5\005\uffe5\035\uffe5\042\uffe5\046\uffe5\052\uffe5" +
    "\056\uffe5\001\002\000\004\010\157\001\002\000\004\027" +
    "\154\001\002\000\026\003\031\010\115\013\030\015\102" +
    "\035\075\041\107\050\104\053\105\054\114\056\072\001" +
    "\002\000\032\002\uffb4\003\uffb4\005\uffb4\034\uffb4\035\uffb4" +
    "\037\uffb4\042\uffb4\043\uffb4\046\uffb4\051\uffb4\052\uffb4\056" +
    "\uffb4\001\002\000\014\003\uffed\005\uffed\034\uffed\043\uffed" +
    "\051\uffed\001\002\000\022\010\115\015\102\035\075\041" +
    "\107\050\104\053\105\054\114\056\072\001\002\000\046" +
    "\003\uffcf\007\uffcf\011\uffcf\012\uffcf\013\uffcf\014\uffcf\015" +
    "\uffcf\016\uffcf\017\uffcf\020\uffcf\021\uffcf\022\uffcf\023\uffcf" +
    "\024\uffcf\025\uffcf\026\uffcf\030\uffcf\031\uffcf\001\002\000" +
    "\046\003\uffb9\007\uffb9\011\uffb9\012\uffb9\013\uffb9\014\uffb9" +
    "\015\uffb9\016\uffb9\017\uffb9\020\uffb9\021\uffb9\022\uffb9\023" +
    "\uffb9\024\uffb9\025\uffb9\026\uffb9\030\uffb9\031\uffb9\001\002" +
    "\000\046\003\uffbc\007\uffbc\011\uffbc\012\uffbc\013\uffbc\014" +
    "\uffbc\015\uffbc\016\uffbc\017\uffbc\020\uffbc\021\uffbc\022\uffbc" +
    "\023\uffbc\024\uffbc\025\uffbc\026\uffbc\030\uffbc\031\uffbc\001" +
    "\002\000\020\003\uffdf\005\uffdf\035\uffdf\042\uffdf\046\uffdf" +
    "\052\uffdf\056\uffdf\001\002\000\046\003\uffb8\007\uffb8\011" +
    "\uffb8\012\uffb8\013\uffb8\014\uffb8\015\uffb8\016\uffb8\017\uffb8" +
    "\020\uffb8\021\uffb8\022\uffb8\023\uffb8\024\uffb8\025\uffb8\026" +
    "\uffb8\030\uffb8\031\uffb8\001\002\000\046\003\uffba\007\uffba" +
    "\011\uffba\012\uffba\013\uffba\014\uffba\015\uffba\016\uffba\017" +
    "\uffba\020\uffba\021\uffba\022\uffba\023\uffba\024\uffba\025\uffba" +
    "\026\uffba\030\uffba\031\uffba\001\002\000\046\003\uffd0\007" +
    "\uffd0\011\uffd0\012\uffd0\013\uffd0\014\uffd0\015\uffd0\016\uffd0" +
    "\017\uffd0\020\uffd0\021\uffd0\022\uffd0\023\uffd0\024\uffd0\025" +
    "\uffd0\026\uffd0\030\uffd0\031\uffd0\001\002\000\046\003\uffce" +
    "\007\uffce\011\uffce\012\uffce\013\uffce\014\uffce\015\uffce\016" +
    "\uffce\017\uffce\020\uffce\021\uffce\022\uffce\023\uffce\024\uffce" +
    "\025\uffce\026\uffce\030\uffce\031\uffce\001\002\000\040\003" +
    "\031\013\030\014\124\015\117\016\131\017\122\020\121" +
    "\021\126\022\123\023\133\024\127\025\125\026\132\030" +
    "\120\031\134\001\002\000\046\003\uffbb\007\uffbb\011\uffbb" +
    "\012\uffbb\013\uffbb\014\uffbb\015\uffbb\016\uffbb\017\uffbb\020" +
    "\uffbb\021\uffbb\022\uffbb\023\uffbb\024\uffbb\025\uffbb\026\uffbb" +
    "\030\uffbb\031\uffbb\001\002\000\022\010\115\015\102\035" +
    "\075\041\107\050\104\053\105\054\114\056\072\001\002" +
    "\000\036\011\130\014\124\015\117\016\131\017\122\020" +
    "\121\021\126\022\123\023\133\024\127\025\125\026\132" +
    "\030\120\031\134\001\002\000\022\010\115\015\102\035" +
    "\075\041\107\050\104\053\105\054\114\056\072\001\002" +
    "\000\022\010\115\015\102\035\075\041\107\050\104\053" +
    "\105\054\114\056\072\001\002\000\022\010\115\015\102" +
    "\035\075\041\107\050\104\053\105\054\114\056\072\001" +
    "\002\000\022\010\115\015\102\035\075\041\107\050\104" +
    "\053\105\054\114\056\072\001\002\000\022\010\115\015" +
    "\102\035\075\041\107\050\104\053\105\054\114\056\072" +
    "\001\002\000\022\010\115\015\102\035\075\041\107\050" +
    "\104\053\105\054\114\056\072\001\002\000\022\010\115" +
    "\015\102\035\075\041\107\050\104\053\105\054\114\056" +
    "\072\001\002\000\022\010\115\015\102\035\075\041\107" +
    "\050\104\053\105\054\114\056\072\001\002\000\022\010" +
    "\115\015\102\035\075\041\107\050\104\053\105\054\114" +
    "\056\072\001\002\000\046\003\uffc0\007\uffc0\011\uffc0\012" +
    "\uffc0\013\uffc0\014\uffc0\015\uffc0\016\uffc0\017\uffc0\020\uffc0" +
    "\021\uffc0\022\uffc0\023\uffc0\024\uffc0\025\uffc0\026\uffc0\030" +
    "\uffc0\031\uffc0\001\002\000\022\010\115\015\102\035\075" +
    "\041\107\050\104\053\105\054\114\056\072\001\002\000" +
    "\022\010\115\015\102\035\075\041\107\050\104\053\105" +
    "\054\114\056\072\001\002\000\022\010\115\015\102\035" +
    "\075\041\107\050\104\053\105\054\114\056\072\001\002" +
    "\000\022\010\115\015\102\035\075\041\107\050\104\053" +
    "\105\054\114\056\072\001\002\000\046\003\uffc1\007\uffc1" +
    "\011\uffc1\012\uffc1\013\uffc1\014\124\015\117\016\131\017" +
    "\122\020\121\021\126\022\123\023\133\024\127\025\125" +
    "\026\132\030\120\031\uffc1\001\002\000\046\003\uffc5\007" +
    "\uffc5\011\uffc5\012\uffc5\013\uffc5\014\124\015\117\016\131" +
    "\017\122\020\121\021\uffc5\022\uffc5\023\uffc5\024\uffc5\025" +
    "\uffc5\026\uffc5\030\uffc5\031\uffc5\001\002\000\046\003\uffc3" +
    "\007\uffc3\011\uffc3\012\uffc3\013\uffc3\014\124\015\117\016" +
    "\131\017\122\020\121\021\126\022\123\023\133\024\127" +
    "\025\uffc3\026\uffc3\030\uffc3\031\uffc3\001\002\000\046\003" +
    "\uffcb\007\uffcb\011\uffcb\012\uffcb\013\uffcb\014\uffcb\015\uffcb" +
    "\016\uffcb\017\uffcb\020\uffcb\021\uffcb\022\uffcb\023\uffcb\024" +
    "\uffcb\025\uffcb\026\uffcb\030\uffcb\031\uffcb\001\002\000\046" +
    "\003\uffc7\007\uffc7\011\uffc7\012\uffc7\013\uffc7\014\124\015" +
    "\117\016\131\017\122\020\121\021\uffc7\022\uffc7\023\uffc7" +
    "\024\uffc7\025\uffc7\026\uffc7\030\uffc7\031\uffc7\001\002\000" +
    "\046\003\uffc6\007\uffc6\011\uffc6\012\uffc6\013\uffc6\014\124" +
    "\015\117\016\131\017\122\020\121\021\uffc6\022\uffc6\023" +
    "\uffc6\024\uffc6\025\uffc6\026\uffc6\030\uffc6\031\uffc6\001\002" +
    "\000\046\003\uffc4\007\uffc4\011\uffc4\012\uffc4\013\uffc4\014" +
    "\124\015\117\016\131\017\122\020\121\021\126\022\123" +
    "\023\133\024\127\025\uffc4\026\uffc4\030\uffc4\031\uffc4\001" +
    "\002\000\046\003\uffcd\007\uffcd\011\uffcd\012\uffcd\013\uffcd" +
    "\014\uffcd\015\uffcd\016\131\017\uffcd\020\uffcd\021\uffcd\022" +
    "\uffcd\023\uffcd\024\uffcd\025\uffcd\026\uffcd\030\uffcd\031\uffcd" +
    "\001\002\000\046\003\uffc8\007\uffc8\011\uffc8\012\uffc8\013" +
    "\uffc8\014\124\015\117\016\131\017\122\020\121\021\uffc8" +
    "\022\uffc8\023\uffc8\024\uffc8\025\uffc8\026\uffc8\030\uffc8\031" +
    "\uffc8\001\002\000\046\003\uffc9\007\uffc9\011\uffc9\012\uffc9" +
    "\013\uffc9\014\124\015\117\016\131\017\uffc9\020\uffc9\021" +
    "\uffc9\022\uffc9\023\uffc9\024\uffc9\025\uffc9\026\uffc9\030\uffc9" +
    "\031\uffc9\001\002\000\046\003\uffca\007\uffca\011\uffca\012" +
    "\uffca\013\uffca\014\124\015\117\016\131\017\uffca\020\uffca" +
    "\021\uffca\022\uffca\023\uffca\024\uffca\025\uffca\026\uffca\030" +
    "\uffca\031\uffca\001\002\000\046\003\uffc2\007\uffc2\011\uffc2" +
    "\012\uffc2\013\uffc2\014\124\015\117\016\131\017\122\020" +
    "\121\021\126\022\123\023\133\024\127\025\125\026\132" +
    "\030\uffc2\031\uffc2\001\002\000\046\003\uffcc\007\uffcc\011" +
    "\uffcc\012\uffcc\013\uffcc\014\uffcc\015\uffcc\016\131\017\uffcc" +
    "\020\uffcc\021\uffcc\022\uffcc\023\uffcc\024\uffcc\025\uffcc\026" +
    "\uffcc\030\uffcc\031\uffcc\001\002\000\020\003\uffde\005\uffde" +
    "\035\uffde\042\uffde\046\uffde\052\uffde\056\uffde\001\002\000" +
    "\046\003\uffbf\007\uffbf\011\uffbf\012\uffbf\013\uffbf\014\uffbf" +
    "\015\uffbf\016\uffbf\017\uffbf\020\uffbf\021\uffbf\022\uffbf\023" +
    "\uffbf\024\uffbf\025\uffbf\026\uffbf\030\uffbf\031\uffbf\001\002" +
    "\000\022\010\115\015\102\035\075\041\107\050\104\053" +
    "\105\054\114\056\072\001\002\000\040\003\031\013\030" +
    "\014\124\015\117\016\131\017\122\020\121\021\126\022" +
    "\123\023\133\024\127\025\125\026\132\030\120\031\134" +
    "\001\002\000\020\003\uffe3\005\uffe3\035\uffe3\042\uffe3\046" +
    "\uffe3\052\uffe3\056\uffe3\001\002\000\004\055\160\001\002" +
    "\000\006\011\162\012\161\001\002\000\024\010\115\015" +
    "\102\035\075\041\107\050\104\053\105\054\114\055\163" +
    "\056\072\001\002\000\046\003\uffd8\007\uffd8\011\uffd8\012" +
    "\uffd8\013\uffd8\014\uffd8\015\uffd8\016\uffd8\017\uffd8\020\uffd8" +
    "\021\uffd8\022\uffd8\023\uffd8\024\uffd8\025\uffd8\026\uffd8\030" +
    "\uffd8\031\uffd8\001\002\000\006\011\uffbd\012\uffbd\001\002" +
    "\000\006\011\uffd4\012\uffd4\001\002\000\006\011\170\012" +
    "\167\001\002\000\040\011\uffbe\012\uffbe\014\124\015\117" +
    "\016\131\017\122\020\121\021\126\022\123\023\133\024" +
    "\127\025\125\026\132\030\120\031\134\001\002\000\024" +
    "\010\115\015\102\035\075\041\107\050\104\053\105\054" +
    "\114\055\163\056\072\001\002\000\046\003\uffd9\007\uffd9" +
    "\011\uffd9\012\uffd9\013\uffd9\014\uffd9\015\uffd9\016\uffd9\017" +
    "\uffd9\020\uffd9\021\uffd9\022\uffd9\023\uffd9\024\uffd9\025\uffd9" +
    "\026\uffd9\030\uffd9\031\uffd9\001\002\000\006\011\uffd5\012" +
    "\uffd5\001\002\000\032\002\uffb3\003\uffb3\005\uffb3\034\uffb3" +
    "\035\uffb3\037\uffb3\042\uffb3\043\uffb3\046\uffb3\051\uffb3\052" +
    "\uffb3\056\uffb3\001\002\000\022\010\115\015\102\035\075" +
    "\041\107\050\104\053\105\054\114\056\072\001\002\000" +
    "\036\007\175\014\124\015\117\016\131\017\122\020\121" +
    "\021\126\022\123\023\133\024\127\025\125\026\132\030" +
    "\120\031\134\001\002\000\050\003\uffd1\007\uffd1\011\uffd1" +
    "\012\uffd1\013\uffd1\014\uffd1\015\uffd1\016\uffd1\017\uffd1\020" +
    "\uffd1\021\uffd1\022\uffd1\023\uffd1\024\uffd1\025\uffd1\026\uffd1" +
    "\027\uffd1\030\uffd1\031\uffd1\001\002\000\022\010\115\015" +
    "\102\035\075\041\107\050\104\053\105\054\114\056\072" +
    "\001\002\000\036\011\200\014\124\015\117\016\131\017" +
    "\122\020\121\021\126\022\123\023\133\024\127\025\125" +
    "\026\132\030\120\031\134\001\002\000\004\004\010\001" +
    "\002\000\020\003\uffe4\005\uffe4\035\uffe4\042\uffe4\046\uffe4" +
    "\052\uffe4\056\uffe4\001\002\000\020\003\073\005\100\035" +
    "\075\042\071\046\077\052\066\056\072\001\002\000\022" +
    "\003\uffdc\005\uffdc\035\uffdc\037\205\042\uffdc\046\uffdc\052" +
    "\uffdc\056\uffdc\001\002\000\020\003\uffe1\005\uffe1\035\uffe1" +
    "\042\uffe1\046\uffe1\052\uffe1\056\uffe1\001\002\000\004\004" +
    "\010\001\002\000\020\003\uffe4\005\uffe4\035\uffe4\042\uffe4" +
    "\046\uffe4\052\uffe4\056\uffe4\001\002\000\020\003\073\005" +
    "\100\035\075\042\071\046\077\052\066\056\072\001\002" +
    "\000\020\003\uffdd\005\uffdd\035\uffdd\042\uffdd\046\uffdd\052" +
    "\uffdd\056\uffdd\001\002\000\024\010\115\011\213\015\102" +
    "\035\075\041\107\050\104\053\105\054\114\056\072\001" +
    "\002\000\006\011\216\012\215\001\002\000\046\003\uffda" +
    "\007\uffda\011\uffda\012\uffda\013\uffda\014\uffda\015\uffda\016" +
    "\uffda\017\uffda\020\uffda\021\uffda\022\uffda\023\uffda\024\uffda" +
    "\025\uffda\026\uffda\030\uffda\031\uffda\001\002\000\040\011" +
    "\uffd6\012\uffd6\014\124\015\117\016\131\017\122\020\121" +
    "\021\126\022\123\023\133\024\127\025\125\026\132\030" +
    "\120\031\134\001\002\000\022\010\115\015\102\035\075" +
    "\041\107\050\104\053\105\054\114\056\072\001\002\000" +
    "\046\003\uffdb\007\uffdb\011\uffdb\012\uffdb\013\uffdb\014\uffdb" +
    "\015\uffdb\016\uffdb\017\uffdb\020\uffdb\021\uffdb\022\uffdb\023" +
    "\uffdb\024\uffdb\025\uffdb\026\uffdb\030\uffdb\031\uffdb\001\002" +
    "\000\040\011\uffd7\012\uffd7\014\124\015\117\016\131\017" +
    "\122\020\121\021\126\022\123\023\133\024\127\025\125" +
    "\026\132\030\120\031\134\001\002\000\020\003\uffe2\005" +
    "\uffe2\035\uffe2\042\uffe2\046\uffe2\052\uffe2\056\uffe2\001\002" +
    "\000\022\010\115\015\102\035\075\041\107\050\104\053" +
    "\105\054\114\056\072\001\002\000\036\011\223\014\124" +
    "\015\117\016\131\017\122\020\121\021\126\022\123\023" +
    "\133\024\127\025\125\026\132\030\120\031\134\001\002" +
    "\000\004\004\010\001\002\000\020\003\uffe4\005\uffe4\035" +
    "\uffe4\042\uffe4\046\uffe4\052\uffe4\056\uffe4\001\002\000\020" +
    "\003\073\005\100\035\075\042\071\046\077\052\066\056" +
    "\072\001\002\000\020\003\uffe0\005\uffe0\035\uffe0\042\uffe0" +
    "\046\uffe0\052\uffe0\056\uffe0\001\002\000\004\002\001\001" +
    "\002\000\014\003\ufff6\005\ufff6\034\ufff6\043\ufff6\051\ufff6" +
    "\001\002\000\004\056\232\001\002\000\004\010\uffb2\001" +
    "\002\000\004\010\uffb2\001\002\000\004\010\235\001\002" +
    "\000\010\011\ufff0\034\013\043\012\001\002\000\004\011" +
    "\237\001\002\000\004\004\ufff2\001\002\000\004\002\000" +
    "\001\002" });

  /** Access to parse-action table. */
  public short[][] action_table() {return _action_table;}

  /** <code>reduce_goto</code> table. */
  protected static final short[][] _reduce_table = 
    unpackFromStrings(new String[] {
    "\000\236\000\004\003\003\001\001\000\002\001\001\000" +
    "\002\001\001\000\004\014\006\001\001\000\004\017\010" +
    "\001\001\000\002\001\001\000\016\006\016\020\021\021" +
    "\014\022\015\023\020\032\017\001\001\000\002\001\001" +
    "\000\002\001\001\000\002\001\001\000\010\006\016\023" +
    "\227\032\230\001\001\000\004\013\226\001\001\000\006" +
    "\005\052\014\051\001\001\000\006\004\024\042\023\001" +
    "\001\000\002\001\001\000\002\001\001\000\004\015\037" +
    "\001\001\000\004\012\026\001\001\000\002\001\001\000" +
    "\004\004\033\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\010\032\042\040\043\041" +
    "\041\001\001\000\002\001\001\000\002\001\001\000\002" +
    "\001\001\000\002\001\001\000\002\001\001\000\004\032" +
    "\047\001\001\000\002\001\001\000\002\001\001\000\004" +
    "\024\054\001\001\000\004\016\053\001\001\000\002\001" +
    "\001\000\010\025\057\032\056\036\055\001\001\000\014" +
    "\007\073\010\075\013\100\030\066\033\067\001\001\000" +
    "\004\035\061\001\001\000\002\001\001\000\002\001\001" +
    "\000\004\012\063\001\001\000\002\001\001\000\002\001" +
    "\001\000\002\001\001\000\002\001\001\000\004\012\217" +
    "\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\020\010\110\012\105\026\112\027" +
    "\111\030\102\031\107\033\067\001\001\000\002\001\001" +
    "\000\002\001\001\000\016\010\110\026\152\027\111\030" +
    "\102\031\107\033\067\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\012\151\001\001\000\002\001\001\000\016\010" +
    "\110\026\115\027\111\030\102\031\107\033\067\001\001" +
    "\000\002\001\001\000\016\010\110\026\150\027\111\030" +
    "\102\031\107\033\067\001\001\000\016\010\110\026\147" +
    "\027\111\030\102\031\107\033\067\001\001\000\016\010" +
    "\110\026\146\027\111\030\102\031\107\033\067\001\001" +
    "\000\016\010\110\026\145\027\111\030\102\031\107\033" +
    "\067\001\001\000\016\010\110\026\144\027\111\030\102" +
    "\031\107\033\067\001\001\000\016\010\110\026\143\027" +
    "\111\030\102\031\107\033\067\001\001\000\016\010\110" +
    "\026\142\027\111\030\102\031\107\033\067\001\001\000" +
    "\016\010\110\026\141\027\111\030\102\031\107\033\067" +
    "\001\001\000\016\010\110\026\140\027\111\030\102\031" +
    "\107\033\067\001\001\000\002\001\001\000\016\010\110" +
    "\026\137\027\111\030\102\031\107\033\067\001\001\000" +
    "\016\010\110\026\136\027\111\030\102\031\107\033\067" +
    "\001\001\000\016\010\110\026\135\027\111\030\102\031" +
    "\107\033\067\001\001\000\016\010\110\026\134\027\111" +
    "\030\102\031\107\033\067\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\016\010\110\026\154\027\111\030\102" +
    "\031\107\033\067\001\001\000\004\012\155\001\001\000" +
    "\002\001\001\000\002\001\001\000\002\001\001\000\022" +
    "\010\110\011\163\026\165\027\111\030\102\031\107\033" +
    "\067\043\164\001\001\000\002\001\001\000\002\001\001" +
    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
    "\020\010\110\011\170\026\165\027\111\030\102\031\107" +
    "\033\067\001\001\000\002\001\001\000\002\001\001\000" +
    "\002\001\001\000\016\010\110\026\173\027\111\030\102" +
    "\031\107\033\067\001\001\000\002\001\001\000\002\001" +
    "\001\000\016\010\110\026\176\027\111\030\102\031\107" +
    "\033\067\001\001\000\002\001\001\000\004\014\200\001" +
    "\001\000\004\036\201\001\001\000\014\007\073\010\075" +
    "\013\202\030\066\033\067\001\001\000\004\037\203\001" +
    "\001\000\002\001\001\000\004\014\205\001\001\000\004" +
    "\036\206\001\001\000\014\007\073\010\075\013\207\030" +
    "\066\033\067\001\001\000\002\001\001\000\020\010\110" +
    "\026\213\027\111\030\102\031\107\033\067\034\211\001" +
    "\001\000\002\001\001\000\002\001\001\000\002\001\001" +
    "\000\016\010\110\026\216\027\111\030\102\031\107\033" +
    "\067\001\001\000\002\001\001\000\002\001\001\000\002" +
    "\001\001\000\016\010\110\026\221\027\111\030\102\031" +
    "\107\033\067\001\001\000\002\001\001\000\004\014\223" +
    "\001\001\000\004\036\224\001\001\000\014\007\073\010" +
    "\075\013\225\030\066\033\067\001\001\000\002\001\001" +
    "\000\002\001\001\000\002\001\001\000\002\001\001\000" +
    "\004\015\037\001\001\000\004\015\233\001\001\000\002" +
    "\001\001\000\010\032\042\040\235\041\041\001\001\000" +
    "\002\001\001\000\002\001\001\000\002\001\001" });

  /** Access to <code>reduce_goto</code> table. */
  public short[][] reduce_table() {return _reduce_table;}

  /** Instance of action encapsulation class. */
  protected CUP$Parser$actions action_obj;

  /** Action encapsulation object initializer. */
  protected void init_actions()
    {
      action_obj = new CUP$Parser$actions(this);
    }

  /** Invoke a user supplied parse action. */
  public java_cup.runtime.Symbol do_action(
    int                        act_num,
    java_cup.runtime.lr_parser parser,
    java.util.Stack            stack,
    int                        top)
    throws java.lang.Exception
  {
    /* call code in generated class */
    return action_obj.CUP$Parser$do_action(act_num, parser, stack, top);
  }

  /** Indicates start state. */
  public int start_state() {return 0;}
  /** Indicates start production. */
  public int start_production() {return 1;}

  /** <code>EOF</code> Symbol index. */
  public int EOF_sym() {return 0;}

  /** <code>error</code> Symbol index. */
  public int error_sym() {return 1;}


  /** Scan to get the next Symbol. */
  public java_cup.runtime.Symbol scan()
    throws java.lang.Exception
    {
 return lexer.nextToken(); 
    }

 
  Yylex lexer;
  ParseErrorStream error_stream;
  boolean debug;
  
  public Parser(java.io.InputStream s, ParseErrorStream es, boolean d) {
    this();
    if (s == null)
      throw new Error("Error: Bad input stream initializer.");
    
    lexer = new Yylex(s, es);
    error_stream = es;
    debug = d;
  }

  public Parser(java.io.InputStream s, ParseErrorStream es) {
    this(s, es, false);
  }

  public java_cup.runtime.Symbol parse() throws Exception {
    try {
      if (debug)
        return super.debug_parse();
      else
        return super.parse();
    } catch (SemanticException err) {
      error_stream.error(-1, "Uncaught exception: " + err.getMessage());
      return null;
    }
  }
  
  public void set_debug(boolean debug) {
    this.debug = debug;
  }
  
  public void syntax_error(java_cup.runtime.Symbol current) {
    error_stream.error(current.left,
                       "Syntax error at " + Token.symbol_to_string(current));
  }
  
  public void report_error(String message, Object current) {
    error_stream.error(((java_cup.runtime.Symbol)current).left,
                       "Syntax error at "
                       + Token.symbol_to_string((java_cup.runtime.Symbol)
                                                current)
                       + ": " + message);
  }

}

/** Cup generated class to encapsulate user supplied action code.*/
class CUP$Parser$actions {


  SymbolTable cur_scope = new Program(), last_scope;
  
  public void print_production(String prodstring) {
    if (parser.debug)
      System.out.println(prodstring);
  }
  
  public void add(SymbolTable table, Descriptor d) {
    Descriptor prev = (Descriptor) table.put_unique(d.get_name(), d);
    if (prev != null)
      parser.error_stream.error(d.get_line(),
                                d.get_name()
                                + " already defined (line "
                                + prev.get_line() + ")");
  }
  
  public void add(Descriptor d) {
    add(cur_scope, d);
  }

  private final Parser parser;

  /** Constructor */
  CUP$Parser$actions(Parser parser) {
    this.parser = parser;
  }

  /** Method with the actual generated action code. */
  public final java_cup.runtime.Symbol CUP$Parser$do_action(
    int                        CUP$Parser$act_num,
    java_cup.runtime.lr_parser CUP$Parser$parser,
    java.util.Stack            CUP$Parser$stack,
    int                        CUP$Parser$top)
    throws java.lang.Exception
    {
      /* Symbol object for return from actions */
      java_cup.runtime.Symbol CUP$Parser$result;

      /* select the action based on the action number */
      switch (CUP$Parser$act_num)
        {
          /*. . . . . . . . . . . . . . . . . . . .*/
          case 80: // end_scope ::= 
            {
              Object RESULT = null;
String PRODSTRING = "end_scope ::= ";
		
	  if (cur_scope != null) {
		last_scope = cur_scope;
		cur_scope = cur_scope.get_parent();
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(12/*end_scope*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 79: // begin_scope ::= 
            {
              Object RESULT = null;
String PRODSTRING = "begin_scope ::= ";
		 cur_scope = new SymbolTable(cur_scope); 
              CUP$Parser$result = new java_cup.runtime.Symbol(11/*begin_scope*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 78: // r_brace ::= error RBRACE 
            {
              Object RESULT = null;
String PRODSTRING = "r_brace ::= error RBRACE ";

              CUP$Parser$result = new java_cup.runtime.Symbol(9/*r_brace*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 77: // r_brace ::= RBRACE 
            {
              Object RESULT = null;
String PRODSTRING = "r_brace ::= RBRACE ";

              CUP$Parser$result = new java_cup.runtime.Symbol(9/*r_brace*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 76: // l_brace ::= LBRACE 
            {
              Object RESULT = null;
String PRODSTRING = "l_brace ::= LBRACE ";

              CUP$Parser$result = new java_cup.runtime.Symbol(10/*l_brace*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 75: // semi ::= error SEMICOLON 
            {
              Object RESULT = null;
String PRODSTRING = "semi ::= error SEMICOLON ";

              CUP$Parser$result = new java_cup.runtime.Symbol(8/*semi*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 74: // semi ::= SEMICOLON 
            {
              Object RESULT = null;
String PRODSTRING = "semi ::= SEMICOLON ";

              CUP$Parser$result = new java_cup.runtime.Symbol(8/*semi*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 73: // bool_literal ::= FALSE 
            {
              BooleanImmedExpr RESULT = null;
String PRODSTRING = "bool_literal ::= FALSE ";
		 RESULT = new BooleanImmedExpr(false); 
              CUP$Parser$result = new java_cup.runtime.Symbol(23/*bool_literal*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 72: // bool_literal ::= TRUE 
            {
              BooleanImmedExpr RESULT = null;
String PRODSTRING = "bool_literal ::= TRUE ";
		 RESULT = new BooleanImmedExpr(true); 
              CUP$Parser$result = new java_cup.runtime.Symbol(23/*bool_literal*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 71: // literal ::= bool_literal 
            {
              RValue RESULT = null;
String PRODSTRING = "literal ::= bool_literal ";
		int bleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int bright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		BooleanImmedExpr b = (BooleanImmedExpr)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = b; 
              CUP$Parser$result = new java_cup.runtime.Symbol(21/*literal*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 70: // literal ::= CHAR_LITERAL 
            {
              RValue RESULT = null;
String PRODSTRING = "literal ::= CHAR_LITERAL ";
		int cleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int cright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		Character c = (Character)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = new CharImmedExpr(c.charValue()); 
              CUP$Parser$result = new java_cup.runtime.Symbol(21/*literal*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 69: // literal ::= INT_LITERAL 
            {
              RValue RESULT = null;
String PRODSTRING = "literal ::= INT_LITERAL ";
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		Long i = (Long)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = new IntImmedExpr(i.longValue()); 
              CUP$Parser$result = new java_cup.runtime.Symbol(21/*literal*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 68: // callout_arg ::= STRING_LITERAL 
            {
              Object RESULT = null;
String PRODSTRING = "callout_arg ::= STRING_LITERAL ";
		int sleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int sright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		String s = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = new StringImmedExpr(s); 
              CUP$Parser$result = new java_cup.runtime.Symbol(7/*callout_arg*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 67: // callout_arg ::= expr 
            {
              Object RESULT = null;
String PRODSTRING = "callout_arg ::= expr ";
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = e; 
              CUP$Parser$result = new java_cup.runtime.Symbol(7/*callout_arg*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 66: // expr ::= MINUS expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= MINUS expr ";
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new NegOpExpr(e);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 65: // expr ::= LPAREN expr RPAREN 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= LPAREN expr RPAREN ";
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		 RESULT = e; 
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 64: // expr ::= expr OR expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr OR expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new OrCondOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 63: // expr ::= expr AND expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr AND expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new AndCondOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 62: // expr ::= expr NE expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr NE expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new NeEqOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 61: // expr ::= expr EQ expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr EQ expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new EqEqOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 60: // expr ::= expr LT expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr LT expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new LtRelOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 59: // expr ::= expr LE expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr LE expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new LeRelOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 58: // expr ::= expr GT expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr GT expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new GtRelOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 57: // expr ::= expr GE expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr GE expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new GeRelOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 56: // expr ::= expr LSHIFT expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr LSHIFT expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new ShlArithOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 55: // expr ::= expr RSHIFT expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr RSHIFT expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new ShrArithOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 54: // expr ::= expr TIMES expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr TIMES expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new MulArithOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 53: // expr ::= expr MINUS expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr MINUS expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new SubArithOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 52: // expr ::= expr PLUS expr 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= expr PLUS expr ";
		int e1left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int e1right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		RValue e1 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int oleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int oright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Object o = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int e2left = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int e2right = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e2 = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new AddArithOpExpr(e1, e2);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(oleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 51: // expr ::= literal 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= literal ";
		int lleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int lright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue l = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = l; 
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 50: // expr ::= method_call 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= method_call ";
		int mcleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int mcright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue mc = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = mc; 
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 49: // expr ::= location 
            {
              RValue RESULT = null;
String PRODSTRING = "expr ::= location ";
		int lleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int lright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		LValue l = (LValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = l; 
              CUP$Parser$result = new java_cup.runtime.Symbol(20/*expr*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 48: // location ::= ID LBRACKET expr RBRACKET 
            {
              LValue RESULT = null;
String PRODSTRING = "location ::= ID LBRACKET expr RBRACKET ";
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).right;
		String i = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value;
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		 
	  /* Attempt to lookup identifier in current and enclosing scopes */
	  Descriptor d = (Descriptor)cur_scope.get(i);

	  /* Rule 2 and 9 */
	  if (d == null) {
		parser.error_stream.error(ileft, "Undefined variable " + i);
		RESULT = null;
	  } else {
		if (!(d instanceof ArrayVarDescriptor)) {
		  /* Rule 10a */
		  parser.error_stream.error(ileft,
									"Wrong type: " + i + " is not an array.");
		  RESULT = null;
		} else if (e != null && e.get_type() != Typed.INT) {
		  /* Rule 10b */
		  parser.error_stream.error(eleft,
									"Array subscript must be of type int");
		  RESULT = null;
		} else {
		  RESULT = new ArrayExpr((ArrayVarDescriptor)d, e);
		}
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(6/*location*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 47: // location ::= ID 
            {
              LValue RESULT = null;
String PRODSTRING = "location ::= ID ";
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		String i = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 
	  /* Attempt to lookup identifier in current and enclosing scopes */
	  Descriptor d = (Descriptor)cur_scope.get(i);

	  /* Rule 2 and 9 */
	  if (d == null) {
		parser.error_stream.error(ileft, "Undefined variable " + i);
		RESULT = null;
	  } else {
		if (!(d instanceof ScalarVarDescriptor)) {
		  parser.error_stream.error(ileft, "Identifier "
									+ i + " does not refer to a scalar");
		  RESULT = null;
		} else {
		  RESULT = new ScalarVarExpr((ScalarVarDescriptor)d);
		}
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(6/*location*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 46: // method_name ::= ID 
            {
              String RESULT = null;
String PRODSTRING = "method_name ::= ID ";
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		String i = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = i; 
              CUP$Parser$result = new java_cup.runtime.Symbol(25/*method_name*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 45: // callout_arg_list ::= callout_arg 
            {
              Vector RESULT = null;
String PRODSTRING = "callout_arg_list ::= callout_arg ";
		int caleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int caright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		Object ca = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  RESULT = new Vector();
	  RESULT.addElement(ca);
    
              CUP$Parser$result = new java_cup.runtime.Symbol(33/*callout_arg_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 44: // callout_arg_list ::= callout_arg_list COMMA callout_arg 
            {
              Vector RESULT = null;
String PRODSTRING = "callout_arg_list ::= callout_arg_list COMMA callout_arg ";
		int calleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int calright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		Vector cal = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int caleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int caright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		Object ca = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  RESULT = cal;
	  RESULT.addElement(ca);
    
              CUP$Parser$result = new java_cup.runtime.Symbol(33/*callout_arg_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 43: // expr_list ::= expr 
            {
              Vector RESULT = null;
String PRODSTRING = "expr_list ::= expr ";
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  RESULT = new Vector();
	  RESULT.addElement(e); 
    
              CUP$Parser$result = new java_cup.runtime.Symbol(26/*expr_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 42: // expr_list ::= expr_list COMMA expr 
            {
              Vector RESULT = null;
String PRODSTRING = "expr_list ::= expr_list COMMA expr ";
		int elleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int elright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		Vector el = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  RESULT = el;
	  RESULT.addElement(e);
    
              CUP$Parser$result = new java_cup.runtime.Symbol(26/*expr_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 41: // method_call ::= CALLOUT LPAREN STRING_LITERAL RPAREN 
            {
              RValue RESULT = null;
String PRODSTRING = "method_call ::= CALLOUT LPAREN STRING_LITERAL RPAREN ";
		int cleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left;
		int cright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).right;
		Object c = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value;
		int sleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int sright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		String s = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		  
	  RValue [] args = new RValue[0];
	  RESULT = new CalloutExpr(s, args);
    
              CUP$Parser$result = new java_cup.runtime.Symbol(22/*method_call*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 40: // method_call ::= CALLOUT LPAREN STRING_LITERAL COMMA callout_arg_list RPAREN 
            {
              RValue RESULT = null;
String PRODSTRING = "method_call ::= CALLOUT LPAREN STRING_LITERAL COMMA callout_arg_list RPAREN ";
		int cleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left;
		int cright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).right;
		Object c = (Object)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-5)).value;
		int sleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left;
		int sright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).right;
		String s = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value;
		int calleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int calright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector cal = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		  
	  RValue [] args = new RValue[cal.size()];
	  cal.copyInto(args);

	  try {
		/* Rule 5 handled by CalloutExpr constructor */
		RESULT = new CalloutExpr(s, args);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(cleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(22/*method_call*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 39: // method_call ::= method_name LPAREN RPAREN 
            {
              RValue RESULT = null;
String PRODSTRING = "method_call ::= method_name LPAREN RPAREN ";
		int nleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int nright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		String n = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		 
	  /* Attempt to lookup identifier in current and enclosing scopes */
	  Descriptor d = (Descriptor)cur_scope.get(n);

	  /* Rule 2 */
	  if (d == null) {
		parser.error_stream.error(nleft, "No such method " + n);
		RESULT = null;
	  } else if (!(d instanceof MethodDescriptor)) {
		parser.error_stream.error(nleft, "Cannot call "+n+": not a method.");
		RESULT = null;
	  } else {
		/* Prep arg array. Apply Rule 5. */
		RValue [] args = new RValue[0];

		try {
		  /* Rule 5 handled by CallExpr constructor */
		  RESULT = new CallExpr((MethodDescriptor)d, args);
		} catch (SemanticTypeException err) {
		  parser.error_stream.error(nleft, err.getMessage());
		  RESULT = null;
		}
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(22/*method_call*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 38: // method_call ::= method_name LPAREN expr_list RPAREN 
            {
              RValue RESULT = null;
String PRODSTRING = "method_call ::= method_name LPAREN expr_list RPAREN ";
		int nleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left;
		int nright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).right;
		String n = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value;
		int elleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int elright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector el = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		 
	  /* Attempt to lookup identifier in current and enclosing scopes */
	  Descriptor d = (Descriptor)cur_scope.get(n);

	  /* Rule 2 */
	  if (d == null) {
		parser.error_stream.error(nleft, "No such method " + n);
		RESULT = null;
	  } else if (!(d instanceof MethodDescriptor)) {
		parser.error_stream.error(nleft, "Cannot call "+n+": not a method.");
		RESULT = null;
	  } else {
		/* Prep arg array. Apply Rule 5. */
		RValue [] args = new RValue[el.size()];
		el.copyInto(args);
		try {
		  /* Rule 5 handled by CallExpr constructor */
		  RESULT = new CallExpr((MethodDescriptor)d, args);
		} catch (SemanticTypeException err) {
		  parser.error_stream.error(nleft, err.getMessage());
		  RESULT = null;
		}
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(22/*method_call*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 37: // else_clause ::= 
            {
              Vector RESULT = null;
String PRODSTRING = "else_clause ::= ";
		 RESULT = null; 
              CUP$Parser$result = new java_cup.runtime.Symbol(29/*else_clause*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 36: // else_clause ::= ELSE l_brace statement_list r_brace 
            {
              Vector RESULT = null;
String PRODSTRING = "else_clause ::= ELSE l_brace statement_list r_brace ";
		int slleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int slright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector sl = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		 RESULT = sl; 
              CUP$Parser$result = new java_cup.runtime.Symbol(29/*else_clause*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 35: // statement ::= RETURN expr semi 
            {
              HighInstruction RESULT = null;
String PRODSTRING = "statement ::= RETURN expr semi ";
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		 RESULT = new ReturnInstruction(e); 
              CUP$Parser$result = new java_cup.runtime.Symbol(5/*statement*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 34: // statement ::= RETURN semi 
            {
              HighInstruction RESULT = null;
String PRODSTRING = "statement ::= RETURN semi ";
		 RESULT = new ReturnInstruction(); 
              CUP$Parser$result = new java_cup.runtime.Symbol(5/*statement*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 33: // statement ::= WHILE LPAREN expr RPAREN l_brace statement_list r_brace 
            {
              HighInstruction RESULT = null;
String PRODSTRING = "statement ::= WHILE LPAREN expr RPAREN l_brace statement_list r_brace ";
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value;
		int slleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int slright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector sl = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		
	  try {
		RESULT = new WhileInstruction(e, new Block(cur_scope, sl));
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(eleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(5/*statement*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-6)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 32: // statement ::= IF LPAREN expr RPAREN l_brace statement_list r_brace else_clause 
            {
              HighInstruction RESULT = null;
String PRODSTRING = "statement ::= IF LPAREN expr RPAREN l_brace statement_list r_brace else_clause ";
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-5)).value;
		int slleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int slright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		Vector sl = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int ecleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int ecright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		Vector ec = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
	  try {
		RESULT = new IfInstruction(e, new Block(cur_scope, sl),
								   (ec == null)
								   ? null
								   : new Block(cur_scope, ec));
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(eleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(5/*statement*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-7)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 31: // statement ::= method_call semi 
            {
              HighInstruction RESULT = null;
String PRODSTRING = "statement ::= method_call semi ";
		int mcleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int mcright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		RValue mc = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		 RESULT = new SimpleInstruction(mc); 
              CUP$Parser$result = new java_cup.runtime.Symbol(5/*statement*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 30: // statement ::= location ASSIGN expr semi 
            {
              HighInstruction RESULT = null;
String PRODSTRING = "statement ::= location ASSIGN expr semi ";
		int lleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left;
		int lright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).right;
		LValue l = (LValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value;
		int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		RValue e = (RValue)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		 
	  try {
		RESULT = new SimpleInstruction(l, e);
	  } catch (SemanticTypeException err) {
		parser.error_stream.error(lleft, err.getMessage());
		RESULT = null;
	  }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(5/*statement*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 29: // statement_list ::= 
            {
              Vector RESULT = null;
String PRODSTRING = "statement_list ::= ";
		 RESULT = new Vector(); 
              CUP$Parser$result = new java_cup.runtime.Symbol(28/*statement_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 28: // statement_list ::= statement_list statement 
            {
              Vector RESULT = null;
String PRODSTRING = "statement_list ::= statement_list statement ";
		int slleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int slright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector sl = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int sleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int sright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		HighInstruction s = (HighInstruction)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = sl; RESULT.addElement(s); 
              CUP$Parser$result = new java_cup.runtime.Symbol(28/*statement_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 27: // type ::= BOOLEAN 
            {
              Integer RESULT = null;
String PRODSTRING = "type ::= BOOLEAN ";
		 RESULT = new Integer(Typed.BOOLEAN); 
              CUP$Parser$result = new java_cup.runtime.Symbol(24/*type*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 26: // type ::= INT 
            {
              Integer RESULT = null;
String PRODSTRING = "type ::= INT ";
		 RESULT = new Integer(Typed.INT); 
              CUP$Parser$result = new java_cup.runtime.Symbol(24/*type*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 25: // var_decl_id_list ::= ID 
            {
              Vector RESULT = null;
String PRODSTRING = "var_decl_id_list ::= ID ";
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		String i = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
      RESULT = new Vector();
      RESULT.addElement(i);
      RESULT.addElement(new Integer(ileft));
    
              CUP$Parser$result = new java_cup.runtime.Symbol(27/*var_decl_id_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 24: // var_decl_id_list ::= var_decl_id_list COMMA ID 
            {
              Vector RESULT = null;
String PRODSTRING = "var_decl_id_list ::= var_decl_id_list COMMA ID ";
		int vleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int vright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		Vector v = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		String i = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
      RESULT = v;
      v.addElement(i);
      v.addElement(new Integer(ileft));
    
              CUP$Parser$result = new java_cup.runtime.Symbol(27/*var_decl_id_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 23: // var_decl ::= type var_decl_id_list semi 
            {
              Object RESULT = null;
String PRODSTRING = "var_decl ::= type var_decl_id_list semi ";
		int tleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int tright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		Integer t = (Integer)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int vleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int vright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector v = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		 
      for (Enumeration e = v.elements() ; e.hasMoreElements();) {
        String name = (String)e.nextElement();
        int line = ((Integer)e.nextElement()).intValue();
        add(new LocalScalarVarDescriptor(name, t.intValue(), line));
      }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(19/*var_decl*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 22: // var_decl_list ::= 
            {
              Object RESULT = null;
String PRODSTRING = "var_decl_list ::= ";

              CUP$Parser$result = new java_cup.runtime.Symbol(18/*var_decl_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 21: // var_decl_list ::= var_decl_list var_decl 
            {
              Object RESULT = null;
String PRODSTRING = "var_decl_list ::= var_decl_list var_decl ";

              CUP$Parser$result = new java_cup.runtime.Symbol(18/*var_decl_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 20: // block ::= l_brace var_decl_list statement_list r_brace 
            {
              Block RESULT = null;
String PRODSTRING = "block ::= l_brace var_decl_list statement_list r_brace ";
		int ivectleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int ivectright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector ivect = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		 RESULT = new Block(cur_scope, ivect); 
              CUP$Parser$result = new java_cup.runtime.Symbol(3/*block*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 19: // method_param_list ::= type ID 
            {
              Vector RESULT = null;
String PRODSTRING = "method_param_list ::= type ID ";
		int tleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int tright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Integer t = (Integer)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		String i = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
      RESULT = new Vector();
      Descriptor d = new ParamScalarVarDescriptor(i, t.intValue(), ileft);
      add(d);
      RESULT.addElement(d);
    
              CUP$Parser$result = new java_cup.runtime.Symbol(31/*method_param_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 18: // method_param_list ::= method_param_list COMMA type ID 
            {
              Vector RESULT = null;
String PRODSTRING = "method_param_list ::= method_param_list COMMA type ID ";
		int mplleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left;
		int mplright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).right;
		Vector mpl = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value;
		int tleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int tright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Integer t = (Integer)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		String i = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
      RESULT = mpl;
      Descriptor d = new ParamScalarVarDescriptor(i, t.intValue(), ileft);
      add(d);
      RESULT.addElement(d);
    
              CUP$Parser$result = new java_cup.runtime.Symbol(31/*method_param_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 17: // method_param_spec ::= 
            {
              Vector RESULT = null;
String PRODSTRING = "method_param_spec ::= ";
		 RESULT = new Vector(); 
              CUP$Parser$result = new java_cup.runtime.Symbol(30/*method_param_spec*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 16: // method_param_spec ::= method_param_list 
            {
              Vector RESULT = null;
String PRODSTRING = "method_param_spec ::= method_param_list ";
		int mlleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int mlright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		Vector ml = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = ml; 
              CUP$Parser$result = new java_cup.runtime.Symbol(30/*method_param_spec*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 15: // method_signature ::= VOID ID begin_scope LPAREN method_param_spec RPAREN 
            {
              MethodDescriptor RESULT = null;
String PRODSTRING = "method_signature ::= VOID ID begin_scope LPAREN method_param_spec RPAREN ";
		int nameleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).left;
		int nameright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).right;
		String name = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value;
		int mpsleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int mpsright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector mps = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		
      ParamScalarVarDescriptor [] paramlist
		 = new ParamScalarVarDescriptor[mps.size()];
      mps.copyInto(paramlist);
      MethodDescriptor d
        = new MethodDescriptor(name, Typed.VOID, paramlist, nameleft);
      // Quick hack to get the root scope.  Shrug, we can improve it if
      // we feel like it.
      add(cur_scope.get_parent(), d);
      RESULT = d;
    
              CUP$Parser$result = new java_cup.runtime.Symbol(4/*method_signature*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 14: // method_signature ::= type ID begin_scope LPAREN method_param_spec RPAREN 
            {
              MethodDescriptor RESULT = null;
String PRODSTRING = "method_signature ::= type ID begin_scope LPAREN method_param_spec RPAREN ";
		int tleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left;
		int tright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).right;
		Integer t = (Integer)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-5)).value;
		int nameleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).left;
		int nameright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).right;
		String name = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value;
		int mpsleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int mpsright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector mps = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		
      ParamScalarVarDescriptor [] paramlist
		 = new ParamScalarVarDescriptor[mps.size()];
      mps.copyInto(paramlist);
      MethodDescriptor d
        = new MethodDescriptor(name, t.intValue(), paramlist, nameleft);
      // Quick hack to get the root scope.  Shrug, we can improve it if
      // we feel like it.
      add(cur_scope.get_parent(), d);
      RESULT = d;
    
              CUP$Parser$result = new java_cup.runtime.Symbol(4/*method_signature*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 13: // method_decl ::= method_signature block end_scope 
            {
              Object RESULT = null;
String PRODSTRING = "method_decl ::= method_signature block end_scope ";
		int msleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int msright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		MethodDescriptor ms = (MethodDescriptor)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int bleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int bright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Block b = (Block)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		
      try {
        ms.set_code_block(b);
      } catch (SemanticTypeException err) {
        parser.error_stream.error(ms.get_line(), err.getMessage());
      }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(17/*method_decl*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 12: // method_decl_list ::= method_decl 
            {
              Object RESULT = null;
String PRODSTRING = "method_decl_list ::= method_decl ";

              CUP$Parser$result = new java_cup.runtime.Symbol(15/*method_decl_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 11: // method_decl_list ::= method_decl_list method_decl 
            {
              Object RESULT = null;
String PRODSTRING = "method_decl_list ::= method_decl_list method_decl ";

              CUP$Parser$result = new java_cup.runtime.Symbol(15/*method_decl_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 10: // method_decl_list_or_not ::= 
            {
              Object RESULT = null;
String PRODSTRING = "method_decl_list_or_not ::= ";

              CUP$Parser$result = new java_cup.runtime.Symbol(16/*method_decl_list_or_not*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 9: // method_decl_list_or_not ::= method_decl_list 
            {
              Object RESULT = null;
String PRODSTRING = "method_decl_list_or_not ::= method_decl_list ";

              CUP$Parser$result = new java_cup.runtime.Symbol(16/*method_decl_list_or_not*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 8: // field_decl_id ::= ID LBRACKET INT_LITERAL RBRACKET 
            {
              Descriptor RESULT = null;
String PRODSTRING = "field_decl_id ::= ID LBRACKET INT_LITERAL RBRACKET ";
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).right;
		String i = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-3)).value;
		int sizeleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int sizeright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Long size = (Long)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		
      long len = size.longValue();
      try {
        RESULT = new ArrayVarDescriptor(i, len, 0, ileft);
      } catch (SemanticException e) {
        parser.error_stream.error(sizeleft, e.getMessage());
        RESULT = null;
      }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(2/*field_decl_id*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-3)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 7: // field_decl_id ::= ID 
            {
              Descriptor RESULT = null;
String PRODSTRING = "field_decl_id ::= ID ";
		int ileft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int iright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		String i = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		 RESULT = new GlobalScalarVarDescriptor(i, 0, ileft); 
              CUP$Parser$result = new java_cup.runtime.Symbol(2/*field_decl_id*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 6: // field_decl_id_list ::= field_decl_id 
            {
              Vector RESULT = null;
String PRODSTRING = "field_decl_id_list ::= field_decl_id ";
		int fleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int fright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		Descriptor f = (Descriptor)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
      RESULT = new Vector();
      RESULT.addElement(f);
    
              CUP$Parser$result = new java_cup.runtime.Symbol(32/*field_decl_id_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 5: // field_decl_id_list ::= field_decl_id_list COMMA field_decl_id 
            {
              Vector RESULT = null;
String PRODSTRING = "field_decl_id_list ::= field_decl_id_list COMMA field_decl_id ";
		int flleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int flright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		Vector fl = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int fleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;
		int fright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;
		Descriptor f = (Descriptor)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0)).value;
		
      RESULT = fl;
      fl.addElement(f);
    
              CUP$Parser$result = new java_cup.runtime.Symbol(32/*field_decl_id_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 4: // field_decl ::= type field_decl_id_list semi 
            {
              Object RESULT = null;
String PRODSTRING = "field_decl ::= type field_decl_id_list semi ";
		int tleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left;
		int tright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).right;
		Integer t = (Integer)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-2)).value;
		int vleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int vright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Vector v = (Vector)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		  
      Descriptor d;
      int int_type = t.intValue();
      for (Enumeration e = v.elements(); e.hasMoreElements(); ) {
        d = (Descriptor)e.nextElement();
        d.set_type(int_type);
        add(d);
      }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(14/*field_decl*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-2)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 3: // field_decl_list ::= 
            {
              Object RESULT = null;
String PRODSTRING = "field_decl_list ::= ";

              CUP$Parser$result = new java_cup.runtime.Symbol(13/*field_decl_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 2: // field_decl_list ::= field_decl_list field_decl 
            {
              Object RESULT = null;
String PRODSTRING = "field_decl_list ::= field_decl_list field_decl ";

              CUP$Parser$result = new java_cup.runtime.Symbol(13/*field_decl_list*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 1: // $START ::= program EOF 
            {
              Object RESULT = null;
String PRODSTRING = "$START ::= program EOF ";
		int start_valleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left;
		int start_valright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).right;
		Program start_val = (Program)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-1)).value;
		RESULT = start_val;
              CUP$Parser$result = new java_cup.runtime.Symbol(0/*$START*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-1)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          /* ACCEPT */
          CUP$Parser$parser.done_parsing();
          return CUP$Parser$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 0: // program ::= CLASS ID l_brace field_decl_list method_decl_list_or_not r_brace 
            {
              Program RESULT = null;
String PRODSTRING = "program ::= CLASS ID l_brace field_decl_list method_decl_list_or_not r_brace ";
		int nameleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).left;
		int nameright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-4)).right;
		String name = (String)((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-4)).value;
		
      if (!name.equalsIgnoreCase("Program"))
        parser.error_stream.error(nameleft,
                         "Decaf programs should only implement class Program");

      // Missing right brackets might leave extra stuff on stack.
      while (cur_scope != null) { 
        last_scope = cur_scope; cur_scope = cur_scope.get_parent(); 
      }

      RESULT = (Program)last_scope;

      // Make sure main is around and has correct signature
      Descriptor d = (Descriptor)RESULT.get("main");
      if (d == null)
        parser.error_stream.error("Missing declaration for method main()");
      else if (!(d instanceof MethodDescriptor)) 
        parser.error_stream.error("Identifier main must refer to a method");
      else {
        if (((MethodDescriptor)d).get_parameters().length != 0) 
          parser.error_stream.error("Argument list for main() must be empty");
      }
    
              CUP$Parser$result = new java_cup.runtime.Symbol(1/*program*/, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-5)).left, ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right, RESULT);
            }
          return CUP$Parser$result;

          /* . . . . . .*/
          default:
            throw new Exception(
               "Invalid action number found in internal parse table");

        }
    }
}

