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