⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 terminal_set.java

📁 我开发的一个用java语言实现的编译器,内含词法分析器,语法分析器,而且可以实现中间代码生成.用到了SLR算法和LR(1)算法
💻 JAVA
字号:
package java_cup;import java.util.BitSet;/** A set of terminals implemented as a bitset.  * @version last updated: 11/25/95 * @author  Scott Hudson */public class terminal_set {  /*-----------------------------------------------------------*/  /*--- Constructor(s) ----------------------------------------*/  /*-----------------------------------------------------------*/  /** Constructor for an empty set. */  public terminal_set()     {       /* allocate the bitset at what is probably the right size */      _elements = new BitSet(terminal.number());    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Constructor for cloning from another set.    * @param other the set we are cloning from.   */  public terminal_set(terminal_set other)     throws internal_error    {      not_null(other);      _elements = (BitSet)other._elements.clone();    }  /*-----------------------------------------------------------*/  /*--- (Access to) Static (Class) Variables ------------------*/  /*-----------------------------------------------------------*/  /** Constant for the empty set. */  public static final terminal_set EMPTY = new terminal_set();  /*-----------------------------------------------------------*/  /*--- (Access to) Instance Variables ------------------------*/  /*-----------------------------------------------------------*/  /** Bitset to implement the actual set. */  protected BitSet _elements;  /*-----------------------------------------------------------*/  /*--- General Methods ----------------------------------------*/  /*-----------------------------------------------------------*/  /** Helper function to test for a null object and throw an exception if   *  one is found.    * @param obj the object we are testing.   */  protected void not_null(Object obj) throws internal_error    {      if (obj == null) 	throw new internal_error("Null object used in set operation");    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Determine if the set is empty. */  public boolean empty()    {      return equals(EMPTY);    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Determine if the set contains a particular terminal.    * @param sym the terminal symbol we are looking for.   */  public boolean contains(terminal sym)     throws internal_error    {      not_null(sym);       return _elements.get(sym.index());    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Given its index determine if the set contains a particular terminal.    * @param indx the index of the terminal in question.   */  public boolean contains(int indx)     {      return _elements.get(indx);    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Determine if this set is an (improper) subset of another.   * @param other the set we are testing against.   */  public boolean is_subset_of(terminal_set other)    throws internal_error    {      not_null(other);      /* make a copy of the other set */      BitSet copy_other = (BitSet)other._elements.clone();      /* and or in */      copy_other.or(_elements);      /* if it hasn't changed, we were a subset */      return copy_other.equals(other._elements);    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Determine if this set is an (improper) superset of another.   * @param other the set we are testing against.   */  public boolean is_superset_of(terminal_set other)    throws internal_error    {      not_null(other);      return other.is_subset_of(this);    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Add a single terminal to the set.     * @param sym the terminal being added.   * @return true if this changes the set.   */  public boolean add(terminal sym)     throws internal_error    {      boolean result;      not_null(sym);       /* see if we already have this */       result = _elements.get(sym.index());      /* if not we add it */      if (!result)	_elements.set(sym.index());      return result;    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Remove a terminal if it is in the set.   * @param sym the terminal being removed.   */  public void remove(terminal sym)     throws internal_error    {      not_null(sym);       _elements.clear(sym.index());    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Add (union) in a complete set.     * @param other the set being added.   * @return true if this changes the set.   */  public boolean add(terminal_set other)    throws internal_error    {      not_null(other);      /* make a copy */      BitSet copy = (BitSet)_elements.clone();      /* or in the other set */      _elements.or(other._elements);      /* changed if we are not the same as the copy */      return !_elements.equals(copy);    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Determine if this set intersects another.   * @param other the other set in question.   */   public boolean intersects(terminal_set other)     throws internal_error     {       not_null(other);       /* make a copy of the other set */       BitSet copy = (BitSet)other._elements.clone();       /* xor out our values */       copy.xor(this._elements);       /* see if its different */       return !copy.equals(other._elements);     }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Equality comparison. */  public boolean equals(terminal_set other)    {      if (other == null) 	return false;      else	return _elements.equals(other._elements);    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Generic equality comparison. */  public boolean equals(Object other)    {      if (!(other instanceof terminal_set))	return false;      else	return equals((terminal_set)other);    }  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/  /** Convert to string. */  public String toString()    {      String result;      boolean comma_flag;            result = "{";      comma_flag = false;      for (int t = 0; t < terminal.number(); t++)	{	  if (_elements.get(t))	    {	      if (comma_flag)	        result += ", ";	      else	        comma_flag = true;	      result += terminal.find(t).name();	    }	}      result += "}";      return result;    }  /*-----------------------------------------------------------*/}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -