content: package java_cup;
  
  /** This class represents a part of a production which is a symbol (terminal
   *  or non terminal).  This simply maintains a reference to the symbol in 
   *  question.
   *
   * @see     java_cup.production
   * @version last updated: 11/25/95
   * @author  Scott Hudson
   */
  public class symbol_part extends production_part {
  
    /*-----------------------------------------------------------*/
    /*--- Constructor(s) ----------------------------------------*/
    /*-----------------------------------------------------------*/
  
    /** Full constructor. 
     * @param sym the symbol that this part is made up of.
     * @param lab an optional label string for the part.
     */
    public symbol_part(symbol sym, String lab) throws internal_error
      {
        super(lab);
  
        if (sym == null)
  	throw new internal_error(
  	  "Attempt to construct a symbol_part with a null symbol");
        _the_symbol = sym;
      }
  
    /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
  
    /** Constructor with no label. 
     * @param sym the symbol that this part is made up of.
     */
    public symbol_part(symbol sym) throws internal_error
      {
        this(sym,null);
      }
  
    /*-----------------------------------------------------------*/
    /*--- (Access to) Instance Variables ------------------------*/
    /*-----------------------------------------------------------*/
  
    /** The symbol that this part is made up of. */
    protected symbol _the_symbol;
  
    /** The symbol that this part is made up of. */
    public symbol the_symbol() {return _the_symbol;}
  
    /*-----------------------------------------------------------*/
    /*--- General Methods ---------------------------------------*/
    /*-----------------------------------------------------------*/
  
    /** Respond that we are not an action part. */
    public boolean is_action() { return false; }
  
    /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
  
    /** Equality comparison. */
    public boolean equals(symbol_part other)
      {
        return other != null && super.equals(other) && 
  	     the_symbol().equals(other.the_symbol());
      }
  
    /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
  
    /** Generic equality comparison. */
    public boolean equals(Object other)
      {
        if (!(other instanceof symbol_part))
  	return false;
        else
  	return equals((symbol_part)other);
      }
  
    /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
  
    /** Produce a hash code. */
    public int hashCode()
      {
        return super.hashCode() ^ 
  	     (the_symbol()==null ? 0 : the_symbol().hashCode());
      }
  
    /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
  
    /** Convert to a string. */
    public String toString()
      {
        if (the_symbol() != null)
  	return super.toString() + the_symbol();
        else
  	return super.toString() + "$$MISSING-SYMBOL$$";
      }
  
    /*-----------------------------------------------------------*/
  
  }
  