content: package java_cup.runtime;
  
  import edu.mit.csail.sdg.alloy4.Pos;
  
  /**
   * Defines the Symbol class, which is used to represent all terminals and
   * nonterminals while parsing. The lexer should pass CUP Symbols and CUP returns
   * a Symbol.
   *
   * @version last updated: 7/3/96
   * @author Frank Flannery
   */
  
  /*
   * ********************************************************* ******* Class
   * Symbol what the parser expects to receive from the lexer. the token is
   * identified as follows: sym: the symbol type parse_state: the parse state.
   * value: is the lexical value of type Object left : is the left position in the
   * original input file right: is the right position in the original input file
   * xleft: is the left position Object in the original input file xright: is the
   * left position Object in the original input file
   ******************************************************************/
  
  public class Symbol {
  
      // TUM 20060327: Added new Constructor to provide more flexible way
      // for location handling
      /*******************************
       *******************************/
      public Symbol(int id, Symbol left, Symbol right, Object o) {
          this(id, left.left, right.right, o);
      }
  
      public Symbol(int id, Symbol left, Symbol right) {
          this(id, left.left, right.right);
      }
  
      /*******************************
       * Constructor for l,r values
       *******************************/
  
      public Symbol(int id, int l, int r, Object o) {
          this(id);
          left = l;
          right = r;
          value = o;
      }
  
      /*******************************
       * Constructor for no l,r values
       ********************************/
  
      public Symbol(int id, Pos pos, Object o) {
          this(id, -1, -1, o);
          this.pos = pos;
      }
  
      /*****************************
       * Constructor for no value
       ***************************/
  
      public Symbol(int id, int l, int r) {
          this(id, l, r, null);
      }
  
      /***********************************
       * Constructor for no value or l,r
       ***********************************/
  
      public Symbol(int sym_num) {
          this(sym_num, -1);
          left = -1;
          right = -1;
      }
  
      /***********************************
       * Constructor to give a start state
       ***********************************/
      Symbol(int sym_num, int state) {
          sym = sym_num;
          parse_state = state;
      }
  
      /*
       * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
       */
  
      /**
       * The symbol number of the terminal or non terminal being represented
       */
      public int    sym;
  
      /*
       * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
       */
  
      /**
       * The parse state to be recorded on the parse stack with this symbol. This
       * field is for the convenience of the parser and shouldn't be modified except
       * by the parser.
       */
      public int    parse_state;
      /**
       * This allows us to catch some errors caused by scanners recycling symbols. For
       * the use of the parser only. [CSA, 23-Jul-1999]
       */
      boolean       used_by_parser = false;
  
      /*******************************
       * The data passed to parser
       *******************************/
  
      public Pos    pos;
      public int    left, right;
      public Object value;
  
      /*****************************
       * Printing this token out. (Override for pretty-print).
       ****************************/
      @Override
      public String toString() {
          return "#" + sym;
      }
  }
  