package java_cup;

/**
 * This class represents a transition in an LALR viable prefix recognition
 * machine. Transitions can be under terminals for non-terminals. They are
 * internally linked together into singly linked lists containing all the
 * transitions out of a single state via the _next field.
 *
 * @see java_cup.lalr_state
 * @version last updated: 11/25/95
 * @author Scott Hudson
 *
 */
public class lalr_transition {

  /*-----------------------------------------------------------*/
  /*--- Constructor(s) ----------------------------------------*/
  /*-----------------------------------------------------------*/

  /**
   * Full constructor.
   * 
   * @param on_sym symbol we are transitioning on.
   * @param to_st  state we transition to.
   * @param nxt    next transition in linked list.
   */
  public lalr_transition(symbol on_sym, lalr_state to_st, lalr_transition nxt) throws internal_error {
    /* sanity checks */
    if (on_sym == null)
      throw new internal_error("Attempt to create transition on null symbol");
    if (to_st == null)
      throw new internal_error("Attempt to create transition to null state");

    /* initialize */
    _on_symbol = on_sym;
    _to_state = to_st;
    _next = nxt;
  }

  /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

  /**
   * Constructor with null next.
   * 
   * @param on_sym symbol we are transitioning on.
   * @param to_st  state we transition to.
   */
  public lalr_transition(symbol on_sym, lalr_state to_st) throws internal_error {
    this(on_sym, to_st, null);
  }

  /*-----------------------------------------------------------*/
  /*--- (Access to) Instance Variables ------------------------*/
  /*-----------------------------------------------------------*/

  /** The symbol we make the transition on. */
  protected symbol _on_symbol;

  /** The symbol we make the transition on. */
  public symbol on_symbol() {
    return _on_symbol;
  }

  /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

  /** The state we transition to. */
  protected lalr_state _to_state;

  /** The state we transition to. */
  public lalr_state to_state() {
    return _to_state;
  }

  /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

  /** Next transition in linked list of transitions out of a state */
  protected lalr_transition _next;

  /** Next transition in linked list of transitions out of a state */
  public lalr_transition next() {
    return _next;
  }

  /*-----------------------------------------------------------*/
  /*--- General Methods ---------------------------------------*/
  /*-----------------------------------------------------------*/

  /** Convert to a string. */
  @Override
  public String toString() {
    String result;

    result = "transition on " + on_symbol().name() + " to state [";
    result += _to_state.index();
    result += "]";

    return result;
  }

  /*-----------------------------------------------------------*/
}
