All Downloads are FREE. Search and download functionalities are using the official Maven repository.

java_cup.terminal Maven / Gradle / Ivy

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).
 *
 * @author Frank Flannery
 * @version last updated: 7/3/96
 */
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, int precedence_side, int precedence_num) {
      /* 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++;

      /* set the precedence */
        _precedence_num = precedence_num;
        _precedence_side = precedence_side;

      /* add to by_index set */
        _all_by_index.put(new Integer(_index), this);
    }

  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/

    /**
     * Constructor for non-precedented terminal
     */

    public terminal(String nm, String tp) {
        this(nm, tp, assoc.no_prec, -1);
    }

  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/

    /**
     * Constructor with default type.
     *
     * @param nm the name of the terminal.
     */
    public terminal(String nm) {
        this(nm, null);
    }

  /*-----------------------------------------------------------*/
  /*-------------------  Class Variables  ---------------------*/
  /*-----------------------------------------------------------*/

    private int _precedence_num;
    private int _precedence_side;

  /*-----------------------------------------------------------*/
  /*--- (Access to) Static (Class) Variables ------------------*/
  /*-----------------------------------------------------------*/

    /**
     * Table of all terminals.  Elements are stored using name strings as
     * the key
     */
    protected static Hashtable _all = new Hashtable();

    //Hm Added clear  to clear all static fields
    public static void clear() {
        _all.clear();
        _all_by_index.clear();
        next_index = 0;
        EOF = new terminal("EOF");
        error = new terminal("error");
    }

    /**
     * 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 terminal EOF = new terminal("EOF");

  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/

    /**
     * special terminal used for error recovery
     */
    public static 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() + "]";
    }

  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/

    /**
     * get the precedence of a terminal
     */
    public int precedence_num() {
        return _precedence_num;
    }

    public int precedence_side() {
        return _precedence_side;
    }

    /**
     * set the precedence of a terminal
     */
    public void set_precedence(int p, int new_prec) {
        _precedence_side = p;
        _precedence_num = new_prec;
    }

  /*-----------------------------------------------------------*/

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy