
//----------------------------------------------------
// The following code was generated by CUP v0.10j [patch-6.035]
// Mon Nov 29 10:23:04 EST 1999
//----------------------------------------------------

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

/** CUP v0.10j [patch-6.035] generated parser.
  * @version Mon Nov 29 10:23:04 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\004\001\002\000\004\056\007\001" +
    "\002\000\004\002\006\001\002\000\004\002\000\001\002" +
    "\000\004\004\010\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\ufffe\005\ufffe\034\ufffe\043" +
    "\ufffe\051\ufffe\001\002\000\014\003\ufff7\005\ufff7\034\020" +
    "\043\022\051\016\001\002\000\004\004\010\001\002\000" +
    "\014\003\uffff\005\uffff\034\uffff\043\uffff\051\uffff\001\002" +
    "\000\006\003\064\005\063\001\002\000\004\056\056\001" +
    "\002\000\014\003\ufff8\005\ufff8\034\020\043\022\051\016" +
    "\001\002\000\004\056\uffe6\001\002\000\014\003\ufff5\005" +
    "\ufff5\034\ufff5\043\ufff5\051\ufff5\001\002\000\004\056\uffe7" +
    "\001\002\000\004\056\024\001\002\000\014\003\ufffa\006" +
    "\036\010\uffb2\012\ufffa\013\ufffa\001\002\000\010\003\031" +
    "\012\027\013\030\001\002\000\010\003\ufffb\012\ufffb\013" +
    "\ufffb\001\002\000\004\056\034\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\033\001\002" +
    "\000\014\003\ufffd\005\ufffd\034\ufffd\043\ufffd\051\ufffd\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\036\012\ufffa\013\ufffa\001\002\000\010" +
    "\003\ufffc\012\ufffc\013\ufffc\001\002\000\004\053\037\001" +
    "\002\000\004\007\040\001\002\000\010\003\ufff9\012\ufff9" +
    "\013\ufff9\001\002\000\004\010\042\001\002\000\010\011" +
    "\ufff0\034\020\043\022\001\002\000\004\056\052\001\002" +
    "\000\006\011\ufff1\012\047\001\002\000\004\011\046\001" +
    "\002\000\004\004\ufff3\001\002\000\006\034\020\043\022" +
    "\001\002\000\004\056\051\001\002\000\006\011\uffef\012" +
    "\uffef\001\002\000\006\011\uffee\012\uffee\001\002\000\004" +
    "\056\055\001\002\000\014\003\ufff6\005\ufff6\034\ufff6\043" +
    "\ufff6\051\ufff6\001\002\000\004\010\uffb2\001\002\000\004" +
    "\010\uffb2\001\002\000\004\010\060\001\002\000\010\011" +
    "\ufff0\034\020\043\022\001\002\000\004\011\062\001\002" +
    "\000\004\004\ufff2\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\004\005\066\001" +
    "\002\000\004\002\001\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\014\003\uffb1" +
    "\005\uffb1\034\uffb1\043\uffb1\051\uffb1\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\024\003\uffe4\005\uffe4\034" +
    "\020\035\uffe4\042\uffe4\043\022\046\uffe4\052\uffe4\056\uffe4" +
    "\001\002\000\004\056\233\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\020\003\064\005\063\035\102\042" +
    "\077\046\103\052\075\056\101\001\002\000\004\010\225" +
    "\001\002\000\020\003\uffe5\005\uffe5\035\uffe5\042\uffe5\046" +
    "\uffe5\052\uffe5\056\uffe5\001\002\000\004\010\212\001\002" +
    "\000\006\003\031\013\030\001\002\000\054\003\uffd2\006" +
    "\206\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\010\173\001\002\000\026\003\031\010" +
    "\110\013\030\015\120\035\102\041\122\050\124\053\113" +
    "\054\115\056\101\001\002\000\004\027\165\001\002\000" +
    "\014\003\uffed\005\uffed\034\uffed\043\uffed\051\uffed\001\002" +
    "\000\004\010\107\001\002\000\024\010\110\011\112\015" +
    "\120\035\102\041\122\050\124\053\113\054\115\056\101" +
    "\001\002\000\022\010\110\015\120\035\102\041\122\050" +
    "\124\053\113\054\115\056\101\001\002\000\006\011\161" +
    "\012\160\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\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\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\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\040\011\uffd6\012" +
    "\uffd6\014\136\015\140\016\130\017\126\020\131\021\141" +
    "\022\142\023\127\024\132\025\134\026\135\030\137\031" +
    "\133\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\022\010\110\015\120\035\102\041" +
    "\122\050\124\053\113\054\115\056\101\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" +
    "\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\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\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\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\110\015\120\035\102\041\122" +
    "\050\124\053\113\054\115\056\101\001\002\000\022\010" +
    "\110\015\120\035\102\041\122\050\124\053\113\054\115" +
    "\056\101\001\002\000\022\010\110\015\120\035\102\041" +
    "\122\050\124\053\113\054\115\056\101\001\002\000\022" +
    "\010\110\015\120\035\102\041\122\050\124\053\113\054" +
    "\115\056\101\001\002\000\022\010\110\015\120\035\102" +
    "\041\122\050\124\053\113\054\115\056\101\001\002\000" +
    "\022\010\110\015\120\035\102\041\122\050\124\053\113" +
    "\054\115\056\101\001\002\000\022\010\110\015\120\035" +
    "\102\041\122\050\124\053\113\054\115\056\101\001\002" +
    "\000\022\010\110\015\120\035\102\041\122\050\124\053" +
    "\113\054\115\056\101\001\002\000\022\010\110\015\120" +
    "\035\102\041\122\050\124\053\113\054\115\056\101\001" +
    "\002\000\022\010\110\015\120\035\102\041\122\050\124" +
    "\053\113\054\115\056\101\001\002\000\022\010\110\015" +
    "\120\035\102\041\122\050\124\053\113\054\115\056\101" +
    "\001\002\000\022\010\110\015\120\035\102\041\122\050" +
    "\124\053\113\054\115\056\101\001\002\000\022\010\110" +
    "\015\120\035\102\041\122\050\124\053\113\054\115\056" +
    "\101\001\002\000\046\003\uffc8\007\uffc8\011\uffc8\012\uffc8" +
    "\013\uffc8\014\136\015\140\016\130\017\126\020\131\021" +
    "\uffc8\022\uffc8\023\uffc8\024\uffc8\025\uffc8\026\uffc8\030\uffc8" +
    "\031\uffc8\001\002\000\046\003\uffc6\007\uffc6\011\uffc6\012" +
    "\uffc6\013\uffc6\014\136\015\140\016\130\017\126\020\131" +
    "\021\uffc6\022\uffc6\023\uffc6\024\uffc6\025\uffc6\026\uffc6\030" +
    "\uffc6\031\uffc6\001\002\000\046\003\uffcc\007\uffcc\011\uffcc" +
    "\012\uffcc\013\uffcc\014\uffcc\015\uffcc\016\130\017\uffcc\020" +
    "\uffcc\021\uffcc\022\uffcc\023\uffcc\024\uffcc\025\uffcc\026\uffcc" +
    "\030\uffcc\031\uffcc\001\002\000\046\003\uffc2\007\uffc2\011" +
    "\uffc2\012\uffc2\013\uffc2\014\136\015\140\016\130\017\126" +
    "\020\131\021\141\022\142\023\127\024\132\025\134\026" +
    "\135\030\uffc2\031\uffc2\001\002\000\046\003\uffcd\007\uffcd" +
    "\011\uffcd\012\uffcd\013\uffcd\014\uffcd\015\uffcd\016\130\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\uffc3\007" +
    "\uffc3\011\uffc3\012\uffc3\013\uffc3\014\136\015\140\016\130" +
    "\017\126\020\131\021\141\022\142\023\127\024\132\025" +
    "\uffc3\026\uffc3\030\uffc3\031\uffc3\001\002\000\046\003\uffc4" +
    "\007\uffc4\011\uffc4\012\uffc4\013\uffc4\014\136\015\140\016" +
    "\130\017\126\020\131\021\141\022\142\023\127\024\132" +
    "\025\uffc4\026\uffc4\030\uffc4\031\uffc4\001\002\000\046\003" +
    "\uffc1\007\uffc1\011\uffc1\012\uffc1\013\uffc1\014\136\015\140" +
    "\016\130\017\126\020\131\021\141\022\142\023\127\024" +
    "\132\025\134\026\135\030\137\031\uffc1\001\002\000\046" +
    "\003\uffc7\007\uffc7\011\uffc7\012\uffc7\013\uffc7\014\136\015" +
    "\140\016\130\017\126\020\131\021\uffc7\022\uffc7\023\uffc7" +
    "\024\uffc7\025\uffc7\026\uffc7\030\uffc7\031\uffc7\001\002\000" +
    "\046\003\uffca\007\uffca\011\uffca\012\uffca\013\uffca\014\136" +
    "\015\140\016\130\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\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\uffc5\007\uffc5\011\uffc5\012\uffc5\013\uffc5" +
    "\014\136\015\140\016\130\017\126\020\131\021\uffc5\022" +
    "\uffc5\023\uffc5\024\uffc5\025\uffc5\026\uffc5\030\uffc5\031\uffc5" +
    "\001\002\000\046\003\uffc9\007\uffc9\011\uffc9\012\uffc9\013" +
    "\uffc9\014\136\015\140\016\130\017\uffc9\020\uffc9\021\uffc9" +
    "\022\uffc9\023\uffc9\024\uffc9\025\uffc9\026\uffc9\030\uffc9\031" +
    "\uffc9\001\002\000\022\010\110\015\120\035\102\041\122" +
    "\050\124\053\113\054\115\056\101\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\136\015\140\016\130\017\126\020" +
    "\131\021\141\022\142\023\127\024\132\025\134\026\135" +
    "\030\137\031\133\001\002\000\036\011\164\014\136\015" +
    "\140\016\130\017\126\020\131\021\141\022\142\023\127" +
    "\024\132\025\134\026\135\030\137\031\133\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\110\015\120\035\102\041\122\050\124\053" +
    "\113\054\115\056\101\001\002\000\040\003\031\013\030" +
    "\014\136\015\140\016\130\017\126\020\131\021\141\022" +
    "\142\023\127\024\132\025\134\026\135\030\137\031\133" +
    "\001\002\000\020\003\uffe3\005\uffe3\035\uffe3\042\uffe3\046" +
    "\uffe3\052\uffe3\056\uffe3\001\002\000\020\003\uffdf\005\uffdf" +
    "\035\uffdf\042\uffdf\046\uffdf\052\uffdf\056\uffdf\001\002\000" +
    "\040\003\031\013\030\014\136\015\140\016\130\017\126" +
    "\020\131\021\141\022\142\023\127\024\132\025\134\026" +
    "\135\030\137\031\133\001\002\000\020\003\uffde\005\uffde" +
    "\035\uffde\042\uffde\046\uffde\052\uffde\056\uffde\001\002\000" +
    "\004\055\174\001\002\000\006\011\176\012\175\001\002" +
    "\000\024\010\110\015\120\035\102\041\122\050\124\053" +
    "\113\054\115\055\202\056\101\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" +
    "\204\012\203\001\002\000\040\011\uffbe\012\uffbe\014\136" +
    "\015\140\016\130\017\126\020\131\021\141\022\142\023" +
    "\127\024\132\025\134\026\135\030\137\031\133\001\002" +
    "\000\006\011\uffd4\012\uffd4\001\002\000\006\011\uffbd\012" +
    "\uffbd\001\002\000\024\010\110\015\120\035\102\041\122" +
    "\050\124\053\113\054\115\055\202\056\101\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\022\010\110\015" +
    "\120\035\102\041\122\050\124\053\113\054\115\056\101" +
    "\001\002\000\036\007\210\014\136\015\140\016\130\017" +
    "\126\020\131\021\141\022\142\023\127\024\132\025\134" +
    "\026\135\030\137\031\133\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\020" +
    "\003\uffe2\005\uffe2\035\uffe2\042\uffe2\046\uffe2\052\uffe2\056" +
    "\uffe2\001\002\000\022\010\110\015\120\035\102\041\122" +
    "\050\124\053\113\054\115\056\101\001\002\000\036\011" +
    "\214\014\136\015\140\016\130\017\126\020\131\021\141" +
    "\022\142\023\127\024\132\025\134\026\135\030\137\031" +
    "\133\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\064\005\063\035\102\042\077\046\103" +
    "\052\075\056\101\001\002\000\022\003\uffdc\005\uffdc\035" +
    "\uffdc\037\221\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\064\005\063\035\102\042\077" +
    "\046\103\052\075\056\101\001\002\000\020\003\uffdd\005" +
    "\uffdd\035\uffdd\042\uffdd\046\uffdd\052\uffdd\056\uffdd\001\002" +
    "\000\022\010\110\015\120\035\102\041\122\050\124\053" +
    "\113\054\115\056\101\001\002\000\036\011\227\014\136" +
    "\015\140\016\130\017\126\020\131\021\141\022\142\023" +
    "\127\024\132\025\134\026\135\030\137\031\133\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\064\005\063\035\102\042\077\046\103\052\075\056" +
    "\101\001\002\000\020\003\uffe0\005\uffe0\035\uffe0\042\uffe0" +
    "\046\uffe0\052\uffe0\056\uffe0\001\002\000\010\003\uffe8\012" +
    "\uffe8\013\uffe8\001\002\000\010\003\031\012\235\013\030" +
    "\001\002\000\004\056\237\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\014\003\ufff4\005\ufff4\034\ufff4\043\ufff4\051\ufff4" +
    "\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\004\001\001\000\002\001\001\000" +
    "\002\001\001\000\002\001\001\000\004\014\010\001\001" +
    "\000\002\001\001\000\004\017\011\001\001\000\016\006" +
    "\012\020\013\021\016\022\014\023\020\032\022\001\001" +
    "\000\006\005\066\014\067\001\001\000\002\001\001\000" +
    "\004\013\064\001\001\000\002\001\001\000\010\006\012" +
    "\023\053\032\052\001\001\000\002\001\001\000\002\001" +
    "\001\000\002\001\001\000\006\004\025\042\024\001\001" +
    "\000\004\015\040\001\001\000\004\012\031\001\001\000" +
    "\002\001\001\000\004\004\034\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\044\041\043\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\002" +
    "\001\001\000\002\001\001\000\002\001\001\000\004\015" +
    "\040\001\001\000\004\015\056\001\001\000\002\001\001" +
    "\000\010\032\042\040\060\041\043\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\016\237\001" +
    "\001\000\004\024\070\001\001\000\010\025\072\032\071" +
    "\036\073\001\001\000\004\035\233\001\001\000\002\001" +
    "\001\000\014\007\075\010\103\013\104\030\077\033\105" +
    "\001\001\000\002\001\001\000\002\001\001\000\002\001" +
    "\001\000\004\012\210\001\001\000\002\001\001\000\002" +
    "\001\001\000\020\010\122\012\167\026\170\027\120\030" +
    "\116\031\113\033\105\001\001\000\002\001\001\000\002" +
    "\001\001\000\002\001\001\000\020\010\122\026\115\027" +
    "\120\030\116\031\113\033\105\034\110\001\001\000\016" +
    "\010\122\026\162\027\120\030\116\031\113\033\105\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\122\026\124\027\120\030\116" +
    "\031\113\033\105\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\122\026\156\027\120\030\116\031\113\033" +
    "\105\001\001\000\016\010\122\026\155\027\120\030\116" +
    "\031\113\033\105\001\001\000\016\010\122\026\154\027" +
    "\120\030\116\031\113\033\105\001\001\000\016\010\122" +
    "\026\153\027\120\030\116\031\113\033\105\001\001\000" +
    "\016\010\122\026\152\027\120\030\116\031\113\033\105" +
    "\001\001\000\016\010\122\026\151\027\120\030\116\031" +
    "\113\033\105\001\001\000\016\010\122\026\150\027\120" +
    "\030\116\031\113\033\105\001\001\000\016\010\122\026" +
    "\147\027\120\030\116\031\113\033\105\001\001\000\016" +
    "\010\122\026\146\027\120\030\116\031\113\033\105\001" +
    "\001\000\016\010\122\026\145\027\120\030\116\031\113" +
    "\033\105\001\001\000\016\010\122\026\144\027\120\030" +
    "\116\031\113\033\105\001\001\000\016\010\122\026\143" +
    "\027\120\030\116\031\113\033\105\001\001\000\016\010" +
    "\122\026\142\027\120\030\116\031\113\033\105\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\122\026\161\027\120\030\116\031\113\033" +
    "\105\001\001\000\002\001\001\000\002\001\001\000\002" +
    "\001\001\000\002\001\001\000\016\010\122\026\165\027" +
    "\120\030\116\031\113\033\105\001\001\000\004\012\166" +
    "\001\001\000\002\001\001\000\002\001\001\000\004\012" +
    "\171\001\001\000\002\001\001\000\002\001\001\000\002" +
    "\001\001\000\022\010\122\011\200\026\177\027\120\030" +
    "\116\031\113\033\105\043\176\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\122\011\204\026\177\027\120" +
    "\030\116\031\113\033\105\001\001\000\002\001\001\000" +
    "\002\001\001\000\016\010\122\026\206\027\120\030\116" +
    "\031\113\033\105\001\001\000\002\001\001\000\002\001" +
    "\001\000\002\001\001\000\016\010\122\026\212\027\120" +
    "\030\116\031\113\033\105\001\001\000\002\001\001\000" +
    "\004\014\214\001\001\000\004\036\215\001\001\000\014" +
    "\007\075\010\103\013\216\030\077\033\105\001\001\000" +
    "\004\037\217\001\001\000\002\001\001\000\004\014\221" +
    "\001\001\000\004\036\222\001\001\000\014\007\075\010" +
    "\103\013\223\030\077\033\105\001\001\000\002\001\001" +
    "\000\016\010\122\026\225\027\120\030\116\031\113\033" +
    "\105\001\001\000\002\001\001\000\004\014\227\001\001" +
    "\000\004\036\230\001\001\000\014\007\075\010\103\013" +
    "\231\030\077\033\105\001\001\000\002\001\001\000\002" +
    "\001\001\000\004\012\235\001\001\000\002\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");

        }
    }
}

