
//----------------------------------------------------
// The following code was generated by Java(tm) CUP v0.9d
// Thu Aug 10 03:51:39 MSD 2006
//----------------------------------------------------

package java_cup;

import java.util.Hashtable;

public class parser extends java_cup.runtime.lr_parser {

  /** constructor */
  public parser() {super();}

  /** production table */
  protected static final short _production_table[][] = {
        {0, 2},     {32, 0},     {1, 10},     {1, 4},     {33, 0}, 
        {2, 4},     {2, 1},     {3, 2},     {3, 1},     {34, 0}, 
        {11, 4},     {4, 2},     {5, 4},     {5, 1},     {6, 4}, 
        {6, 1},     {13, 4},     {13, 1},     {14, 4},     {14, 1}, 
        {16, 4},     {16, 1},     {7, 2},     {7, 1},     {35, 0}, 
        {15, 5},     {36, 0},     {15, 6},     {37, 0},     {15, 4}, 
        {38, 0},     {15, 5},     {18, 3},     {18, 1},     {19, 3}, 
        {19, 1},     {39, 0},     {8, 5},     {8, 1},     {9, 2}, 
        {9, 1},     {40, 0},     {20, 5},     {41, 0},     {20, 3}, 
        {25, 3},     {25, 1},     {26, 1},     {21, 2},     {21, 1}, 
        {22, 2},     {22, 1},     {31, 2},     {31, 1},     {10, 3}, 
        {10, 1},     {12, 3},     {12, 1},     {17, 1},     {23, 1}, 
        {24, 1},     {28, 1},     {29, 1},     {30, 1},     {27, 0}
      };

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

  /** parse action table */
  protected static final short[][] _action_table = {
    /*0*/{1,3,2,-2,3,-2,5,-2,6,-2,7,-2,8,-2,9,-2,10,-2,20,-2,-1,0},
    /*1*/{0,120,-1,0},
    /*2*/{7,34,8,36,-1,0},
    /*3*/{2,7,3,-65,5,-65,6,-65,7,-65,8,-65,9,-65,10,-65,20,-65,-1,0},
    /*4*/{3,-65,5,-65,6,-65,7,-65,8,-65,9,-65,10,-65,20,-65,-1,0},
    /*5*/{3,-7,5,-7,6,-7,7,-7,8,-7,9,-7,10,-7,20,-7,-1,0},
    /*6*/{21,8,-1,0},
    /*7*/{13,-56,16,-56,21,-56,-1,0},
    /*8*/{13,-5,16,11,-1,0},
    /*9*/{13,13,-1,0},
    /*10*/{21,12,-1,0},
    /*11*/{13,-55,16,-55,21,-55,-1,0},
    /*12*/{3,-6,5,-6,6,-6,7,-6,8,-6,9,-6,10,-6,20,-6,-1,0},
    /*13*/{3,17,5,18,6,-65,7,-65,8,-65,9,-65,10,-65,20,-65,-1,0},
    /*14*/{3,-9,5,-9,6,-9,7,-9,8,-9,9,-9,10,-9,20,-9,-1,0},
    /*15*/{3,-8,5,-8,6,-8,7,-8,8,-8,9,-8,10,-8,20,-8,-1,0},
    /*16*/{21,8,-1,0},
    /*17*/{4,108,-1,0},
    /*18*/{6,103,7,-65,8,-65,9,-65,10,-65,20,-65,-1,0},
    /*19*/{6,-14,7,-14,8,-14,9,-14,10,-14,20,-14,-1,0},
    /*20*/{7,-65,8,-65,9,-65,10,-65,20,22,-1,0},
    /*21*/{11,99,-1,0},
    /*22*/{7,-22,8,-22,9,-22,10,-22,-1,0},
    /*23*/{7,-65,8,-65,9,25,10,-65,-1,0},
    /*24*/{11,96,-1,0},
    /*25*/{7,-65,8,-65,10,29,-1,0},
    /*26*/{7,-18,8,-18,10,-18,-1,0},
    /*27*/{7,34,8,36,-1,0},
    /*28*/{11,31,-1,0},
    /*29*/{7,-20,8,-20,-1,0},
    /*30*/{22,32,-1,0},
    /*31*/{13,33,-1,0},
    /*32*/{7,-19,8,-19,-1,0},
    /*33*/{1,85,21,8,-1,0},
    /*34*/{1,-24,7,-24,8,-24,12,-24,21,-24,-1,0},
    /*35*/{7,72,-1,0},
    /*36*/{1,-65,7,34,8,36,12,41,21,-65,-1,0},
    /*37*/{1,47,21,43,-1,0},
    /*38*/{1,-39,21,-39,-1,0},
    /*39*/{1,-23,7,-23,8,-23,12,-23,21,-23,-1,0},
    /*40*/{11,42,-1,0},
    /*41*/{21,43,-1,0},
    /*42*/{13,-62,18,-62,-1,0},
    /*43*/{13,-37,-1,0},
    /*44*/{13,46,-1,0},
    /*45*/{1,-38,21,-38,-1,0},
    /*46*/{13,-44,-1,0},
    /*47*/{18,-42,-1,0},
    /*48*/{0,-3,1,47,21,43,-1,0},
    /*49*/{0,-41,1,-41,21,-41,-1,0},
    /*50*/{0,-40,1,-40,21,-40,-1,0},
    /*51*/{18,53,-1,0},
    /*52*/{13,-65,19,-65,21,-65,22,-65,-1,0},
    /*53*/{13,68,19,67,-1,0},
    /*54*/{13,-50,19,-50,21,-50,22,-50,-1,0},
    /*55*/{13,-48,19,-48,21,59,22,58,-1,0},
    /*56*/{13,-47,19,-47,-1,0},
    /*57*/{13,-52,19,-52,21,-52,22,-52,-1,0},
    /*58*/{13,-63,17,-63,19,-63,21,-63,22,-63,-1,0},
    /*59*/{13,-65,17,62,19,-65,21,-65,22,-65,-1,0},
    /*60*/{13,-49,19,-49,21,-49,22,-49,-1,0},
    /*61*/{21,65,-1,0},
    /*62*/{13,-54,19,-54,21,-54,22,-54,-1,0},
    /*63*/{13,-51,19,-51,21,-51,22,-51,-1,0},
    /*64*/{13,-64,21,-64,22,-64,-1,0},
    /*65*/{13,-53,21,-53,22,-53,-1,0},
    /*66*/{13,-65,19,-65,21,-65,22,-65,-1,0},
    /*67*/{0,-43,1,-43,21,-43,-1,0},
    /*68*/{13,-46,19,-46,-1,0},
    /*69*/{13,71,-1,0},
    /*70*/{0,-45,1,-45,21,-45,-1,0},
    /*71*/{1,73,21,8,-1,0},
    /*72*/{13,-31,-1,0},
    /*73*/{16,11,21,-59,-1,0},
    /*74*/{21,76,-1,0},
    /*75*/{13,-61,14,-61,-1,0},
    /*76*/{13,-27,14,79,-1,0},
    /*77*/{13,-36,14,-36,-1,0},
    /*78*/{21,76,-1,0},
    /*79*/{13,81,-1,0},
    /*80*/{1,-28,7,-28,8,-28,12,-28,21,-28,-1,0},
    /*81*/{13,-35,14,-35,-1,0},
    /*82*/{13,84,-1,0},
    /*83*/{1,-32,7,-32,8,-32,12,-32,21,-32,-1,0},
    /*84*/{13,-29,-1,0},
    /*85*/{21,87,-1,0},
    /*86*/{13,-60,14,-60,-1,0},
    /*87*/{13,-34,14,-34,-1,0},
    /*88*/{13,-25,14,91,-1,0},
    /*89*/{13,93,-1,0},
    /*90*/{21,87,-1,0},
    /*91*/{13,-33,14,-33,-1,0},
    /*92*/{1,-26,7,-26,8,-26,12,-26,21,-26,-1,0},
    /*93*/{13,95,-1,0},
    /*94*/{1,-30,7,-30,8,-30,12,-30,21,-30,-1,0},
    /*95*/{22,97,-1,0},
    /*96*/{13,98,-1,0},
    /*97*/{7,-17,8,-17,10,-17,-1,0},
    /*98*/{21,8,-1,0},
    /*99*/{13,101,16,11,-1,0},
    /*100*/{7,-21,8,-21,9,-21,10,-21,-1,0},
    /*101*/{7,-16,8,-16,9,-16,10,-16,20,-16,-1,0},
    /*102*/{4,105,-1,0},
    /*103*/{7,-12,8,-12,9,-12,10,-12,20,-12,-1,0},
    /*104*/{22,106,-1,0},
    /*105*/{13,107,-1,0},
    /*106*/{7,-15,8,-15,9,-15,10,-15,20,-15,-1,0},
    /*107*/{22,109,-1,0},
    /*108*/{13,110,-1,0},
    /*109*/{6,-13,7,-13,8,-13,9,-13,10,-13,20,-13,-1,0},
    /*110*/{13,-58,16,115,-1,0},
    /*111*/{13,-10,-1,0},
    /*112*/{13,114,-1,0},
    /*113*/{3,-11,5,-11,6,-11,7,-11,8,-11,9,-11,10,-11,20,-11,-1,0},
    /*114*/{15,116,21,12,-1,0},
    /*115*/{13,-57,-1,0},
    /*116*/{1,-65,7,34,8,36,12,41,21,-65,-1,0},
    /*117*/{1,47,21,43,-1,0},
    /*118*/{0,-4,1,47,21,43,-1,0},
    /*119*/{0,-1,-1,0},
  };

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

  /** reduce_goto table */
  protected static final short[][] _reduce_table = {
    /*0*/{1,1,32,3,-1,-1},
    /*1*/{-1,-1},
    /*2*/{7,116,15,34,-1,-1},
    /*3*/{2,4,27,5,-1,-1},
    /*4*/{3,13,27,14,-1,-1},
    /*5*/{-1,-1},
    /*6*/{10,8,-1,-1},
    /*7*/{-1,-1},
    /*8*/{33,9,-1,-1},
    /*9*/{-1,-1},
    /*10*/{-1,-1},
    /*11*/{-1,-1},
    /*12*/{-1,-1},
    /*13*/{4,20,5,18,11,15,27,19,-1,-1},
    /*14*/{-1,-1},
    /*15*/{-1,-1},
    /*16*/{10,110,12,111,-1,-1},
    /*17*/{-1,-1},
    /*18*/{6,103,27,101,-1,-1},
    /*19*/{-1,-1},
    /*20*/{16,23,27,22,-1,-1},
    /*21*/{-1,-1},
    /*22*/{-1,-1},
    /*23*/{13,25,27,26,-1,-1},
    /*24*/{-1,-1},
    /*25*/{14,27,27,29,-1,-1},
    /*26*/{-1,-1},
    /*27*/{7,36,15,34,-1,-1},
    /*28*/{-1,-1},
    /*29*/{-1,-1},
    /*30*/{-1,-1},
    /*31*/{-1,-1},
    /*32*/{-1,-1},
    /*33*/{10,73,17,85,-1,-1},
    /*34*/{-1,-1},
    /*35*/{-1,-1},
    /*36*/{8,37,15,39,27,38,-1,-1},
    /*37*/{9,48,20,49,28,47,-1,-1},
    /*38*/{-1,-1},
    /*39*/{-1,-1},
    /*40*/{-1,-1},
    /*41*/{28,43,-1,-1},
    /*42*/{-1,-1},
    /*43*/{39,44,-1,-1},
    /*44*/{-1,-1},
    /*45*/{-1,-1},
    /*46*/{41,69,-1,-1},
    /*47*/{40,51,-1,-1},
    /*48*/{20,50,28,47,-1,-1},
    /*49*/{-1,-1},
    /*50*/{-1,-1},
    /*51*/{-1,-1},
    /*52*/{21,55,25,53,26,56,27,54,-1,-1},
    /*53*/{-1,-1},
    /*54*/{-1,-1},
    /*55*/{22,60,29,59,-1,-1},
    /*56*/{-1,-1},
    /*57*/{-1,-1},
    /*58*/{-1,-1},
    /*59*/{27,62,31,63,-1,-1},
    /*60*/{-1,-1},
    /*61*/{30,65,-1,-1},
    /*62*/{-1,-1},
    /*63*/{-1,-1},
    /*64*/{-1,-1},
    /*65*/{-1,-1},
    /*66*/{21,55,26,68,27,54,-1,-1},
    /*67*/{-1,-1},
    /*68*/{-1,-1},
    /*69*/{-1,-1},
    /*70*/{-1,-1},
    /*71*/{10,73,17,74,-1,-1},
    /*72*/{38,82,-1,-1},
    /*73*/{-1,-1},
    /*74*/{19,76,24,77,-1,-1},
    /*75*/{-1,-1},
    /*76*/{36,79,-1,-1},
    /*77*/{-1,-1},
    /*78*/{24,81,-1,-1},
    /*79*/{-1,-1},
    /*80*/{-1,-1},
    /*81*/{-1,-1},
    /*82*/{-1,-1},
    /*83*/{-1,-1},
    /*84*/{37,93,-1,-1},
    /*85*/{18,88,23,87,-1,-1},
    /*86*/{-1,-1},
    /*87*/{-1,-1},
    /*88*/{35,89,-1,-1},
    /*89*/{-1,-1},
    /*90*/{23,91,-1,-1},
    /*91*/{-1,-1},
    /*92*/{-1,-1},
    /*93*/{-1,-1},
    /*94*/{-1,-1},
    /*95*/{-1,-1},
    /*96*/{-1,-1},
    /*97*/{-1,-1},
    /*98*/{10,99,-1,-1},
    /*99*/{-1,-1},
    /*100*/{-1,-1},
    /*101*/{-1,-1},
    /*102*/{-1,-1},
    /*103*/{-1,-1},
    /*104*/{-1,-1},
    /*105*/{-1,-1},
    /*106*/{-1,-1},
    /*107*/{-1,-1},
    /*108*/{-1,-1},
    /*109*/{-1,-1},
    /*110*/{-1,-1},
    /*111*/{34,112,-1,-1},
    /*112*/{-1,-1},
    /*113*/{-1,-1},
    /*114*/{-1,-1},
    /*115*/{-1,-1},
    /*116*/{8,117,15,39,27,38,-1,-1},
    /*117*/{9,118,20,49,28,47,-1,-1},
    /*118*/{20,50,28,47,-1,-1},
    /*119*/{-1,-1},
  };

  /** access to reduce_goto table */
  public short[][] reduce_table() {return _reduce_table;}

  /** instance of action encapsulation class */
  protected CUP$actions action_obj;

  /** action encapsulation object initializer */
  protected void init_actions()
    {
      action_obj = new CUP$actions();
    }

  /** 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$do_action(act_num, parser, stack, top);
  }

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

  /** EOF symbol index */
  public int EOF_sym() {return 0;}

  /** error symbol index */
  public int error_sym() {return 1;}


  /** user initialization */
  public void user_init() throws java.lang.Exception
    {
 lexer.init(); 
    }

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



  /* override error routines */

  public void report_fatal_error(
    String   message,
    Object   info)
    {
      done_parsing();
      lexer.emit_error(message);
      System.err.println("Can't recover from previous error(s), giving up.");
      System.exit(1);
    }

    public void report_error(String message, Object info)
    {
      lexer.emit_error(message);
    }

};

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


  /** helper routine to clone a new production part adding a given label */
  protected production_part add_lab(production_part part, String lab)
    throws internal_error
    {
      /* if there is no label, or this is an action, just return the original */
      if (lab == null || part.is_action()) return part;

      /* otherwise build a new one with the given label attached */
      return new symbol_part(((symbol_part)part).the_symbol(),lab);
    }

  /** max size of right hand side we will support */
  protected final int MAX_RHS = 200;

  /** array for accumulating right hand side parts */
  protected production_part[] rhs_parts = new production_part[MAX_RHS];

  /** where we are currently in building a right hand side */
  protected int rhs_pos = 0;

  /** start a new right hand side */
  protected void new_rhs() {rhs_pos = 0; }

  /** add a new right hand side part */
  protected void add_rhs_part(production_part part) throws java.lang.Exception
    {
      if (rhs_pos >= MAX_RHS)
    throw new Exception("Internal Error: Productions limited to " +
                 MAX_RHS + " symbols and actions");

      rhs_parts[rhs_pos] = part;
      rhs_pos++;
    }

  /** string to build up multiple part names */
  protected String multipart_name = new String();

  /** append a new name segment to the accumulated multipart name */
  protected void append_multipart(String name)
    {
      String dot = "";

      /* if we aren't just starting out, put on a dot */
      if (multipart_name.length() != 0)  dot = ".";

      multipart_name = multipart_name.concat(dot + name);
    }

  /** table of declared symbols -- contains production parts indexed by name */
  protected Hashtable symbols = new Hashtable();

  /** table of just non terminals -- contains non_terminals indexed by name */
  protected Hashtable non_terms = new Hashtable();

  /** declared start non_terminal */
  protected non_terminal start_nt = null;

  /** left hand side non terminal of the current production */
  protected non_terminal lhs_nt;



  /** Constructor */
  CUP$actions() { }

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

      /* select the action based on the action number */
      switch (CUP$act_num)
        {
          /*. . . . . . . . . . . . . . . . . . . .*/
          case 64: // empty ::= 
            {
              CUP$result = new java_cup.runtime.symbol(/*empty*/27);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 63: // label_id ::= ID 
            {
              CUP$result = new java_cup.runtime.str_token(/*label_id*/30);
               ((java_cup.runtime.str_token)CUP$result).str_val = (/*the_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val; 
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 62: // symbol_id ::= ID 
            {
              CUP$result = new java_cup.runtime.str_token(/*symbol_id*/29);
               ((java_cup.runtime.str_token)CUP$result).str_val = (/*the_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val; 
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 61: // nt_id ::= ID 
            {
              CUP$result = new java_cup.runtime.str_token(/*nt_id*/28);
               ((java_cup.runtime.str_token)CUP$result).str_val = (/*the_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val; 
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 60: // new_non_term_id ::= ID 
            {
              CUP$result = new java_cup.runtime.symbol(/*new_non_term_id*/24);
              
      /* see if this non terminal has been declared before */
      if (symbols.get((/*non_term_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val) != null)
        {
          /* issue a message */
          lexer.emit_error( "Symbol \"" + (/*non_term_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val +
                                  "\" has already been declared");
        }
      else
        {
          /* build the non terminal object */
              non_terminal this_nt =
        new non_terminal((/*non_term_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val, multipart_name);

          /* put it in the non_terms table */
          non_terms.put((/*non_term_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val, this_nt);

          /* build a production_part and put it in the symbols table */
          symbols.put((/*non_term_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val, new symbol_part(this_nt));
        }
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 59: // new_term_id ::= ID 
            {
              CUP$result = new java_cup.runtime.symbol(/*new_term_id*/23);
              
      /* see if this terminal has been declared before */
      if (symbols.get((/*term_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val) != null)
        {
          /* issue a message */
          lexer.emit_error("Symbol \"" + (/*term_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val +
               "\" has already been declared");
        }
      else
        {
          /* build a production_part and put it in the table */
          symbols.put((/*term_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val,
            new symbol_part(new terminal((/*term_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val, multipart_name)));
        }
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 58: // type_id ::= multipart_id 
            {
              CUP$result = new java_cup.runtime.symbol(/*type_id*/17);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 57: // import_id ::= multipart_id 
            {
              CUP$result = new java_cup.runtime.symbol(/*import_id*/12);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 56: // import_id ::= multipart_id DOT STAR 
            {
              CUP$result = new java_cup.runtime.symbol(/*import_id*/12);
               append_multipart("*"); 
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 55: // multipart_id ::= ID 
            {
              CUP$result = new java_cup.runtime.symbol(/*multipart_id*/10);
               append_multipart((/*an_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val); 
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 54: // multipart_id ::= multipart_id DOT ID 
            {
              CUP$result = new java_cup.runtime.symbol(/*multipart_id*/10);
               append_multipart((/*another_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val); 
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 53: // opt_label ::= empty 
            {
              CUP$result = new java_cup.runtime.str_token(/*opt_label*/31);
               ((java_cup.runtime.str_token)CUP$result).str_val = null; 
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 52: // opt_label ::= COLON label_id 
            {
              CUP$result = new java_cup.runtime.str_token(/*opt_label*/31);
               ((java_cup.runtime.str_token)CUP$result).str_val = (/*labid*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val; 
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 51: // prod_part ::= CODE_STRING 
            {
              CUP$result = new java_cup.runtime.symbol(/*prod_part*/22);
              
      /* add a new production part */
      add_rhs_part(new action_part((/*code_str*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val));
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 50: // prod_part ::= symbol_id opt_label 
            {
              CUP$result = new java_cup.runtime.symbol(/*prod_part*/22);
              
      /* try to look up the id */
      production_part symb = (production_part)symbols.get((/*symid*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-1)).str_val);

      /* if that fails, symbol is undeclared */
      if (symb == null)
        {
          if (lexer.error_count == 0)
            lexer.emit_error("Symbol \"" + (/*symid*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-1)).str_val +
                   "\" has not been declared");
        }
      else
        {
          /* add a labeled production part */
          add_rhs_part(add_lab(symb, (/*labid*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val));
        }
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 49: // prod_part_list ::= empty 
            {
              CUP$result = new java_cup.runtime.symbol(/*prod_part_list*/21);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 48: // prod_part_list ::= prod_part_list prod_part 
            {
              CUP$result = new java_cup.runtime.symbol(/*prod_part_list*/21);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 47: // rhs ::= prod_part_list 
            {
              CUP$result = new java_cup.runtime.symbol(/*rhs*/26);
              
      if (lhs_nt != null)
        {
          /* build the production */
          production p = new production(lhs_nt, rhs_parts, rhs_pos);

          /* if we have no start non-terminal declared and this is
         the first production, make its lhs nt the start_nt
         and build a special start production for it. */
              if (start_nt == null)
        {
          start_nt = lhs_nt;

              /* build a special start production */
              new_rhs();
              add_rhs_part(new symbol_part(start_nt));
              add_rhs_part(new symbol_part(terminal.EOF));
              emit.start_production =
             new production(non_terminal.START_nt, rhs_parts, rhs_pos);
              new_rhs();
        }
        }

      /* reset the rhs accumulation in any case */
      new_rhs();
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 46: // rhs_list ::= rhs 
            {
              CUP$result = new java_cup.runtime.symbol(/*rhs_list*/25);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 45: // rhs_list ::= rhs_list BAR rhs 
            {
              CUP$result = new java_cup.runtime.symbol(/*rhs_list*/25);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 44: // production ::= error NT$9 SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*production*/20);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 43: // NT$9 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$9*/41);
               lexer.emit_error("Syntax Error"); 
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 42: // production ::= nt_id NT$8 COLON_COLON_EQUALS rhs_list SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*production*/20);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 41: // NT$8 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$8*/40);
              
      /* lookup the lhs nt */
      lhs_nt = (non_terminal)non_terms.get((/*lhs_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val);

          /* if it wasn't declared, emit a message */
      if (lhs_nt == null)
        {
          if (lexer.error_count == 0)
            lexer.emit_error("LHS non terminal \"" + (/*lhs_id*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val +
                   "\" has not been declared");
        }

      /* reset the rhs accumulation */
      new_rhs();
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 40: // production_list ::= production 
            {
              CUP$result = new java_cup.runtime.symbol(/*production_list*/9);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 39: // production_list ::= production_list production 
            {
              CUP$result = new java_cup.runtime.symbol(/*production_list*/9);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 38: // start_spec ::= empty 
            {
              CUP$result = new java_cup.runtime.symbol(/*start_spec*/8);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 37: // start_spec ::= START WITH nt_id NT$7 SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*start_spec*/8);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 36: // NT$7 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$7*/39);
              
      /* verify that the name has been declared as a non terminal */
      non_terminal nt = (non_terminal)non_terms.get((/*start_name*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val);
      if (nt == null)
        {
          lexer.emit_error( "Start non terminal \"" + (/*start_name*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-0)).str_val +
                       "\" has not been declared");
        }
          else
        {
          /* remember the non-terminal for later */
          start_nt = nt;

          /* build a special start production */
          new_rhs();
          add_rhs_part(new symbol_part(start_nt));
          add_rhs_part(new symbol_part(terminal.EOF));
          emit.start_production =
             new production(non_terminal.START_nt, rhs_parts, rhs_pos);
          new_rhs();
        }
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 35: // non_term_name_list ::= new_non_term_id 
            {
              CUP$result = new java_cup.runtime.symbol(/*non_term_name_list*/19);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 34: // non_term_name_list ::= non_term_name_list COMMA new_non_term_id 
            {
              CUP$result = new java_cup.runtime.symbol(/*non_term_name_list*/19);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 33: // term_name_list ::= new_term_id 
            {
              CUP$result = new java_cup.runtime.symbol(/*term_name_list*/18);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 32: // term_name_list ::= term_name_list COMMA new_term_id 
            {
              CUP$result = new java_cup.runtime.symbol(/*term_name_list*/18);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 31: // symbol ::= NON TERMINAL error NT$6 SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*symbol*/15);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 30: // NT$6 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$6*/38);
              
      /* reset the accumulated multipart name */
      multipart_name = new String();
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 29: // symbol ::= TERMINAL error NT$5 SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*symbol*/15);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 28: // NT$5 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$5*/37);
              
      /* reset the accumulated multipart name */
      multipart_name = new String();
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 27: // symbol ::= NON TERMINAL type_id non_term_name_list NT$4 SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*symbol*/15);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 26: // NT$4 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$4*/36);
              
      /* reset the accumulated multipart name */
      multipart_name = new String();
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 25: // symbol ::= TERMINAL type_id term_name_list NT$3 SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*symbol*/15);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 24: // NT$3 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$3*/35);
              
      /* reset the accumulated multipart name */
      multipart_name = new String();
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 23: // symbol_list ::= symbol 
            {
              CUP$result = new java_cup.runtime.symbol(/*symbol_list*/7);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 22: // symbol_list ::= symbol_list symbol 
            {
              CUP$result = new java_cup.runtime.symbol(/*symbol_list*/7);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 21: // debug_grammar ::= empty 
            {
              CUP$result = new java_cup.runtime.symbol(/*debug_grammar*/16);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 20: // debug_grammar ::= DEBUG WITH multipart_id SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*debug_grammar*/16);
              
      /* save the procedure name */
          emit.debug_grammar = multipart_name;
          /* reset the accumulated multipart name */
          multipart_name = new String();
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 19: // scan_code ::= empty 
            {
              CUP$result = new java_cup.runtime.symbol(/*scan_code*/14);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 18: // scan_code ::= SCAN WITH CODE_STRING SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*scan_code*/14);
              
      /* save the user code */
      emit.scan_code = (/*user_code*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-1)).str_val;
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 17: // init_code ::= empty 
            {
              CUP$result = new java_cup.runtime.symbol(/*init_code*/13);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 16: // init_code ::= INIT WITH CODE_STRING SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*init_code*/13);
              
      /* save the user code */
      emit.init_code = (/*user_code*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-1)).str_val;
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 15: // parser_code_part ::= empty 
            {
              CUP$result = new java_cup.runtime.symbol(/*parser_code_part*/6);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 14: // parser_code_part ::= PARSER CODE CODE_STRING SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*parser_code_part*/6);
              
      /* save the user included code string */
      emit.parser_code = (/*user_code*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-1)).str_val;
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 13: // action_code_part ::= empty 
            {
              CUP$result = new java_cup.runtime.symbol(/*action_code_part*/5);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 12: // action_code_part ::= ACTION CODE CODE_STRING SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*action_code_part*/5);
              
      /* save the user included code string */
      emit.action_code = (/*user_code*/(java_cup.runtime.str_token)CUP$stack.elementAt(CUP$top-1)).str_val;
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 11: // code_part ::= action_code_part parser_code_part 
            {
              CUP$result = new java_cup.runtime.symbol(/*code_part*/4);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 10: // import_spec ::= IMPORT import_id NT$2 SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*import_spec*/11);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 9: // NT$2 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$2*/34);
              
      /* save this import on the imports list */
      emit.import_list.push(multipart_name);

      /* reset the accumulated multipart name */
      multipart_name = new String();
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 8: // import_list ::= empty 
            {
              CUP$result = new java_cup.runtime.symbol(/*import_list*/3);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 7: // import_list ::= import_list import_spec 
            {
              CUP$result = new java_cup.runtime.symbol(/*import_list*/3);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 6: // package_spec ::= empty 
            {
              CUP$result = new java_cup.runtime.symbol(/*package_spec*/2);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 5: // package_spec ::= PACKAGE multipart_id NT$1 SEMI 
            {
              CUP$result = new java_cup.runtime.symbol(/*package_spec*/2);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 4: // NT$1 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$1*/33);
              
      /* save the package name */
      emit.package_name = multipart_name;

      /* reset the accumulated multipart name */
      multipart_name = new String();
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 3: // spec ::= error symbol_list start_spec production_list 
            {
              CUP$result = new java_cup.runtime.symbol(/*spec*/1);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 2: // spec ::= NT$0 package_spec import_list code_part debug_grammar init_code scan_code symbol_list start_spec production_list 
            {
              CUP$result = new java_cup.runtime.symbol(/*spec*/1);
              
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 1: // NT$0 ::= 
            {
              CUP$result = new java_cup.runtime.token(/*NT$0*/32);
              
          /* declare "error" as a terminal */
          symbols.put("error", new symbol_part(terminal.error));

          /* declare start non terminal */
          non_terms.put("$START", non_terminal.START_nt);
    
            }
          return CUP$result;

          /*. . . . . . . . . . . . . . . . . . . .*/
          case 0: // $START ::= spec EOF 
            {
              CUP$result = new java_cup.runtime.token(/*$START*/0);
              
            }
          /* ACCEPT */
          CUP$parser.done_parsing();
          return CUP$result;

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

        }
    }
};

