content: package java_cup.runtime;
  
  /**
   * Default Implementation for SymbolFactory, creates
   * plain old Symbols
   *
   * @version last updated 27-03-2006
   * @author Michael Petter
   */
  
  /* *************************************************
    class DefaultSymbolFactory
  
    interface for creating new symbols  
   ***************************************************/
  public class ComplexSymbolFactory implements SymbolFactory{
      public static class Location {
          private String unit="unknown";
          private int line, column;
          public Location(String unit, int line, int column){
              this.unit=unit;
              this.line=line;
              this.column=column;
          }
          public Location(int line, int column){
              this.line=line;
              this.column=column;
          }
          public String toString(){
              return unit+":"+line+"/"+column;
          }
          public int getColumn(){
              return column;
          }
          public int getLine(){
              return line;
          }
          public String getUnit(){
              return unit;
          }
      }
      /**
       * ComplexSymbol with detailed Location Informations and a Name
       */
      public static class ComplexSymbol extends Symbol {
          protected String name;
          protected Location xleft,xright;
          public ComplexSymbol(String name, int id) {
              super(id);
              this.name=name;
          }
          public ComplexSymbol(String name, int id, Object value) {
              super(id,value);
              this.name=name;
          }
          public String toString(){
              if (xleft==null || xright==null) return "Symbol: "+name;
              return "Symbol: "+name+" ("+xleft+" - "+xright+")";
          }
          public ComplexSymbol(String name, int id, int state) {
              super(id,state);
              this.name=name;
          }
          public ComplexSymbol(String name, int id, Symbol left, Symbol right) {
              super(id,left,right);
              this.name=name;
              if (left!=null)  this.xleft = ((ComplexSymbol)left).xleft;
              if (right!=null) this.xright= ((ComplexSymbol)right).xright;
          }
          public ComplexSymbol(String name, int id, Location left, Location right) {
              super(id);
              this.name=name;
              this.xleft=left;
              this.xright=right;
          }
          public ComplexSymbol(String name, int id, Symbol left, Symbol right, Object value) {
              super(id,value);
              this.name=name;
              if (left!=null)  this.xleft = ((ComplexSymbol)left).xleft;
              if (right!=null) this.xright= ((ComplexSymbol)right).xright;
          }
          public ComplexSymbol(String name, int id, Location left, Location right, Object value) {
              super(id,value);
              this.name=name;
              this.xleft=left;
              this.xright=right;
          }
          public Location getLeft(){
              return xleft;
          }
          public Location getRight(){
              return xright;
          }
      }
  
  
      // Factory methods
      public Symbol newSymbol(String name, int id, Location left, Location right, Object value){
          return new ComplexSymbol(name,id,left,right,value);
      }
      public Symbol newSymbol(String name, int id, Location left, Location right){
          return new ComplexSymbol(name,id,left,right);
      }
      public Symbol newSymbol(String name, int id, Symbol left, Symbol right, Object value){
          return new ComplexSymbol(name,id,left,right,value);
      }
      public Symbol newSymbol(String name, int id, Symbol left, Symbol right){
          return new ComplexSymbol(name,id,left,right);
      }
      public Symbol newSymbol(String name, int id){
          return new ComplexSymbol(name,id);
      }
      public Symbol newSymbol(String name, int id, Object value){
          return new ComplexSymbol(name,id,value);
      }
      public Symbol startSymbol(String name, int id, int state){
          return new ComplexSymbol(name,id,state);
      }
  }
  