/* SetSym - mnozina symbolu.
 *
 * Michal Beran, berny@students.zcu.cz
 * 4.1.2001
 */
package pl0prog;

import java.util.*;

/** Trida SetSym eviduje symboly pouzivane v jazyce PL/0 a umoznuje s 
  * nimi pracovat,
  */
public class SetSym {
	static final int NULL = 0;
	static final int IDENT = 1;
	static final int NUMBER = 2;
	static final int PLUS = 3;
	static final int MINUS = 4;
	static final int TIMES = 5;
	static final int SLASH = 6;
	static final int MODULO = 7;
	static final int ODDSYM = 8;
	static final int EQL = 9;
	static final int NEQ = 10;
	static final int LSS = 11;
	static final int LEQ = 12;
	static final int GTR = 13;
	static final int GEQ = 14;
	static final int LPAREN = 15;
	static final int RPAREN = 16;
	static final int COMMA = 17;
	static final int SEMICOLON = 18;
	static final int PERIOD = 19;
	static final int BECOMES = 20;
	static final int BEGINSYM = 21;
	static final int ENDSYM = 22;
	static final int IFSYM = 23;
	static final int THENSYM = 24;
	static final int WHILESYM = 25;
	static final int DOSYM = 26;
	static final int CALLSYM = 27;
	static final int CONSTSYM = 28;
	static final int VARSYM = 29;
	static final int PROCSYM = 30;
	static final int SYMBOLS = 31;

	/** Systemova mnozina symbolu */
	private BitSet languageSet = new BitSet(SYMBOLS);

	/** Vloz symbol bit do mnoziny
	  * @param bit vkladany symbol.
	  */
	public void set(final int bit) {
		if (bit >= 0 && bit <= SYMBOLS - 1)
			languageSet.set(bit);	
	}

	/** Vyjmi symbol bit z mnoziny
	  * @param bit vyjimany symbol.
	  */
	public void clear(final int bit) {
		if (bit >= 0 && bit <= SYMBOLS - 1)
			languageSet.clear(bit);	
	}
	/** Urci, zda se prislusny bit nachazi v mnozine 
	  * @param bit zkoumany bit,
	  * @return vraci TRUE, pokud se bit nachazi v mnozine, jinak FALSE
	  */
	public boolean get(final int bit) {
		if (bit >= 0 && bit <= SYMBOLS - 1)
			return languageSet.get(bit);	
		else
			return false;
	}
	/** Vytvori novou mnozinu jako prunik teto mnoziny a mnoziny sset 
	  * @param sset mnozina, jez je pouzivana pri konjunkci s danou mnozinou 
	  * @return vraci nove vytvorenou mnozinu.
	  */
	public SetSym and(final SetSym sset) {
		SetSym retvalue = new SetSym();
		
		retvalue.languageSet.or(languageSet);
		retvalue.languageSet.and(sset.languageSet);
		return retvalue;
		}

	/** Vytvori novou mnozinu jako sjednoceni teto mnoziny a mnoziny sset 
	  * @param sset mnozina, jez je pouzivana pri disjunkci s danou mnozinou 
	  * @return vraci nove vytvorenou mnozinu.
	  */
	public SetSym or(final SetSym sset) {
		SetSym retvalue = new SetSym();
		retvalue.languageSet.or(languageSet);
		retvalue.languageSet.or(sset.languageSet);
		return retvalue;
		}		
	/** Vyjmi vsechny prvky z mnoziny */
	public void zero() {
		languageSet = new BitSet(SYMBOLS);
	}
}

/********************************************************/
/* end of class SetSym 									*/
/********************************************************/
