package java_cup;
|
|
import java.util.Enumeration;
|
import java.util.Hashtable;
|
|
/** This class represents a terminal symbol in the grammar. Each terminal
|
* has a textual name, an index, and a string which indicates the type of
|
* object it will be implemented with at runtime (i.e. the class of object
|
* that will be returned by the scanner and pushed on the parse stack to
|
* represent it).
|
*
|
* @version last updated: 11/25/95
|
* @author Scott Hudson
|
*/
|
public class terminal extends symbol {
|
|
/*-----------------------------------------------------------*/
|
/*--- Constructor(s) ----------------------------------------*/
|
/*-----------------------------------------------------------*/
|
|
/** Full constructor.
|
* @param nm the name of the terminal.
|
* @param tp the type of the terminal.
|
*/
|
public terminal(String nm, String tp)
|
{
|
/* superclass does most of the work */
|
super(nm, tp);
|
|
/* add to set of all terminals and check for duplicates */
|
Object conflict = _all.put(nm,this);
|
if (conflict != null)
|
// can't throw an execption here because this is used in static
|
// initializers, so we do a crash instead
|
// was:
|
// throw new internal_error("Duplicate terminal (" + nm + ") created");
|
(new internal_error("Duplicate terminal (" + nm + ") created")).crash();
|
|
/* assign a unique index */
|
_index = next_index++;
|
|
/* add to by_index set */
|
_all_by_index.put(new Integer(_index), this);
|
}
|
|
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
|
/** Constructor with default type.
|
* @param nm the name of the terminal.
|
*/
|
public terminal(String nm)
|
{
|
this(nm, null);
|
}
|
|
/*-----------------------------------------------------------*/
|
/*--- (Access to) Static (Class) Variables ------------------*/
|
/*-----------------------------------------------------------*/
|
|
/** Table of all terminals. Elements are stored using name strings as
|
* the key
|
*/
|
protected static Hashtable _all = new Hashtable();
|
|
/** Access to all terminals. */
|
public static Enumeration all() {return _all.elements();};
|
|
/** Lookup a terminal by name string. */
|
public static terminal find(String with_name)
|
{
|
if (with_name == null)
|
return null;
|
else
|
return (terminal)_all.get(with_name);
|
}
|
|
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
|
/** Table of all terminals indexed by their index number. */
|
protected static Hashtable _all_by_index = new Hashtable();
|
|
/** Lookup a terminal by index. */
|
public static terminal find(int indx)
|
{
|
Integer the_indx = new Integer(indx);
|
|
return (terminal)_all_by_index.get(the_indx);
|
}
|
|
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
|
/** Total number of terminals. */
|
public static int number() {return _all.size();};
|
|
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
|
/** Static counter to assign unique index. */
|
protected static int next_index = 0;
|
|
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
|
/** Special terminal for end of input. */
|
public static final terminal EOF = new terminal("EOF");
|
|
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
|
/** special terminal used for error recovery */
|
public static final terminal error = new terminal("error");
|
|
/*-----------------------------------------------------------*/
|
/*--- General Methods ---------------------------------------*/
|
/*-----------------------------------------------------------*/
|
|
/** Report this symbol as not being a non-terminal. */
|
public boolean is_non_term()
|
{
|
return false;
|
}
|
|
/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/
|
|
/** Convert to a string. */
|
public String toString()
|
{
|
return super.toString() + "[" + index() + "]";
|
}
|
|
/*-----------------------------------------------------------*/
|
|
};
|