/* BugBox.java - trida zapouzdrujici spravce chyb
 * jazyka PL0
 *
 * Michal Beran, berny@students.zcu.cz
 * 4.1.2001
 */

package pl0prog;

/** Trida BugBox je pouzivana je pouzivana spravu chyb prekladace
    jazyka PL0. V teto verzi zatim neobsahuje metody pro registraci
	chyb. */
public class BugBox {

	/** Pocet chyb v programu */
	int Errors = 0;
	/** Maximalni pocet chyb v programu - pri prekroceni se generuje
      * vyjimka ErrorsException */	 
	public int MaxErrors = 30;
	
	public static final int BAD_BECOMES = 1;
	public static final int NUM_REQ = 2;
	public static final int EQUALS_REQ = 3;
	public static final int ID_REQ = 4;
	public static final int SEMI_COMO_REQ = 5;
	public static final int BAD_PAST_PROC = 6;
	public static final int STATEMENT_REQ = 7;
	public static final int BAD_PAST_STATEMENT = 8;
	public static final int DOT_REQ = 9;
	public static final int BAD_SYMB = 10;
	public static final int UNDECLARED_ID = 11;
	public static final int WRONG_BECOMES = 12;
	public static final int BECOMES = 13;
	public static final int ID_PAS_CALL = 14;
	public static final int INVALID_CALL = 15;
	public static final int THEN_REQ = 16;
	public static final int END_BLOCK_REQ = 17;
	public static final int DO_REQ = 18;
	public static final int INVALID_SYMB = 19;
	public static final int RELATION_REQ = 20;
	public static final int INVALID_PROC_USE = 21;
	public static final int RPARENT_REQ = 22;
	public static final int INVALID_FACTOR_END = 23;
	public static final int INVALID_EXPRESS_BEG = 24;
	public static final int TOO_BIG_NUMBER = 30;
	public static final int TOO_BIG_LEVEL = 32;

	

	public void error(int ErrorCode) {
		Errors++;
		if (Errors > MaxErrors)
			throw new ErrorsException();		
	}

	/** Vraci pocet celkovy pocet chyb v programu.
	  * @return celkovy pocet chyb v programu
	  */
	public int getErrorsCount() 
	{
		return Errors;
	}

	/** Nastaveni maximalniho poctu chyb v programu. Pokud je pocet chyb
	  * v programu vetsi nez nastavovane mnozstvi, generuje se vyjimka
	  * ErrorsException.
	  *
	  * @param max maximalne akceptovatelny pocet chyb v programu.
	  */
	public void setMaxErrors(int max) {
		MaxErrors = max;
		if (Errors > MaxErrors)
			throw new ErrorsException();
	
	}

	/** Ziskani maximalniho poctu chyb v programu
	  * @return Vraci nastaveni maximalniho poctu chyb v programu 
	  */
	public int getMaxErrors() {
		return MaxErrors;
	}

	/** Chybovy text odpovidajici kodu chyby
	  * @param ErrorCode cislo chyby,
	  * @return Popis chyby.
	  */
	public String getErrorText(int ErrorCode) {
		
		switch (ErrorCode) 
		{
			case BAD_BECOMES: return("pouzito \"=\" misto \":=\"");
			case NUM_REQ: return ("za \"=\" musi nasledovat cislo");
			case EQUALS_REQ: return("za identifikatorem ma nasledovat \"=\"");
			case ID_REQ: return("za \"const\", \"var\", \"procedure\"" 
							+ " musi nasledovat identifikator");
			case SEMI_COMO_REQ: return ("chybi strednik nebo carka");
			case BAD_PAST_PROC: return("nespravny symbol po deklaraci procedury");
			case STATEMENT_REQ: return("je ocekavan prikaz");
			case BAD_PAST_STATEMENT: return("neocekavany symbol za prikazovou casti bloku");
			case DOT_REQ: return("ocekavam tecku");
			case BAD_SYMB: return("nespravny symbol v prikazu");
			case UNDECLARED_ID: return("nedeklarovany identifikator");
			case WRONG_BECOMES: return("prirazeni konstante a procedure neni dovoleno");
			case BECOMES: return("operator prirazeni je \":=\"");
			case ID_PAS_CALL: return("za \"call\" musi nasledovat identifikator");
			case INVALID_CALL: return("volani konstanty nebo promenne neni dovoleno");
			case THEN_REQ: return("ocekavano \"then\"");
			case END_BLOCK_REQ: return("ocekavano \"end\" nebo \";\"");
			case DO_REQ: return("ocekavano \"do\"");
			case INVALID_SYMB: return("nespravne pouzity symbol za prikazem");
			case RELATION_REQ: return("ocekavam relaci");
			case INVALID_PROC_USE: return("jmeno procedury nelze pouzit ve vyrazu");
			case RPARENT_REQ: return("chybi uzaviraci zavorka");
			case INVALID_FACTOR_END: return("faktor nesmi koncit timto symbolem");
			case INVALID_EXPRESS_BEG: return("vyraz nesmi zacinat timto symbolem");
			case TOO_BIG_NUMBER: return("prilis velke cislo");		
		}
		return ("");
	}
}