Home | History | Annotate | Download | only in java_cup
      1 package java_cup;
      2 
      3 import java.util.Enumeration;
      4 import java.util.Hashtable;
      5 
      6 /** This class represents a terminal symbol in the grammar.  Each terminal
      7  *  has a textual name, an index, and a string which indicates the type of
      8  *  object it will be implemented with at runtime (i.e. the class of object
      9  *  that will be returned by the scanner and pushed on the parse stack to
     10  *  represent it).
     11  *
     12  * @version last updated: 11/25/95
     13  * @author  Scott Hudson
     14  */
     15 public class terminal extends symbol {
     16 
     17   /*-----------------------------------------------------------*/
     18   /*--- Constructor(s) ----------------------------------------*/
     19   /*-----------------------------------------------------------*/
     20 
     21   /** Full constructor.
     22    * @param nm the name of the terminal.
     23    * @param tp the type of the terminal.
     24    */
     25   public terminal(String nm, String tp)
     26     {
     27       /* superclass does most of the work */
     28       super(nm, tp);
     29 
     30       /* add to set of all terminals and check for duplicates */
     31       Object conflict = _all.put(nm,this);
     32       if (conflict != null)
     33     // can't throw an execption here because this is used in static
     34     // initializers, so we do a crash instead
     35     // was:
     36     // throw new internal_error("Duplicate terminal (" + nm + ") created");
     37     (new internal_error("Duplicate terminal (" + nm + ") created")).crash();
     38 
     39       /* assign a unique index */
     40       _index = next_index++;
     41 
     42       /* add to by_index set */
     43       _all_by_index.put(new Integer(_index), this);
     44     }
     45 
     46   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
     47 
     48   /** Constructor with default type.
     49    * @param nm the name of the terminal.
     50    */
     51   public terminal(String nm)
     52     {
     53       this(nm, null);
     54     }
     55 
     56   /*-----------------------------------------------------------*/
     57   /*--- (Access to) Static (Class) Variables ------------------*/
     58   /*-----------------------------------------------------------*/
     59 
     60   /** Table of all terminals.  Elements are stored using name strings as
     61    *  the key
     62    */
     63   protected static Hashtable _all = new Hashtable();
     64 
     65   /** Access to all terminals. */
     66   public static Enumeration all() {return _all.elements();};
     67 
     68   /** Lookup a terminal by name string. */
     69   public static terminal find(String with_name)
     70     {
     71       if (with_name == null)
     72     return null;
     73       else
     74     return (terminal)_all.get(with_name);
     75     }
     76 
     77   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
     78 
     79   /** Table of all terminals indexed by their index number. */
     80   protected static Hashtable _all_by_index = new Hashtable();
     81 
     82   /** Lookup a terminal by index. */
     83   public static terminal find(int indx)
     84     {
     85       Integer the_indx = new Integer(indx);
     86 
     87       return (terminal)_all_by_index.get(the_indx);
     88     }
     89 
     90   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
     91 
     92   /** Total number of terminals. */
     93   public static int number() {return _all.size();};
     94 
     95   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
     96 
     97   /** Static counter to assign unique index. */
     98   protected static int next_index = 0;
     99 
    100   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
    101 
    102   /** Special terminal for end of input. */
    103   public static final terminal EOF = new terminal("EOF");
    104 
    105   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
    106 
    107   /** special terminal used for error recovery */
    108   public static final terminal error = new terminal("error");
    109 
    110   /*-----------------------------------------------------------*/
    111   /*--- General Methods ---------------------------------------*/
    112   /*-----------------------------------------------------------*/
    113 
    114   /** Report this symbol as not being a non-terminal. */
    115   public boolean is_non_term()
    116     {
    117       return false;
    118     }
    119 
    120   /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
    121 
    122   /** Convert to a string. */
    123   public String toString()
    124     {
    125       return super.toString() + "[" + index() + "]";
    126     }
    127 
    128   /*-----------------------------------------------------------*/
    129 
    130 };
    131