/* PL0Compiler.java - kompilator jazyka PL/0
 *
 * Michal Beran, berny@students.zcu.cz
 * 4.1.2001
 */
package pl0prog;

import java.io.*;

public class PL0Compiler {

	public PL0Compiler() {;};

	/** Pouzivana lexikalni analyzator */
	private LexicalA lexicalA;
	/** Pouzivana tabulka symbolu */
	private SymbolT Symbol = new SymbolT();
	/** Pouzivana tabulka instrukci */
	private CodeGen Code = new CodeGen();
	/** Spravce chyb */
	private BugBox bug = new BugBox();
	
	/** Ziskani tabulky symbolu.
	  * @return vraci tabulku symbolu.
	  */
	public SymbolT getSymbolTable() { return Symbol;};

	/** Ziskani tabulky instrukci.
	  * @return vraci tabulku instrukci.
	  */
	public CodeGen getCode() { return Code;};

	/** Ziskani spravce chyb.
	  * @return vraci referenci na spravce chyb.
	  */
	public BugBox getBugBox() {return bug;};


	/** Metoda spravujici vyskytnutvsise chybu.
	  * @param ErrorType kod chyby.
	  */
	protected void error(int ErrorType) {
		lexicalA.writeError(ErrorType);
		bug.error(ErrorType);
	}
	
	
	/** Kompilace zdrojoveho textu v jazyce PL/0. Generuje vyjimku IOException a
	  * muze generovat RunTime vyjimku ErrorsException 
	  * @param Path cesta ke zdrojovemu souboru.
	  */
	public void Compile(String Path) throws IOException{
		try {
		
			lexicalA = new LexicalA(Path); // otevre soubor a nacte prvni symbol
			SetSym pom = new SetSym(); 
			pom = pom.or(BegSys.DeclBegSys);
			pom = pom.or(BegSys.StatBegSys);
			pom.set(SetSym.PERIOD);
		
			Block block = new Block(0,0,pom);
			block.setBugBox(bug);
			block.run(lexicalA, Symbol, Code);

			if (lexicalA.getCurrentSymbol() !=	SetSym.PERIOD) 
				error(BugBox.DOT_REQ);	
		}
		catch (IOException e) {
			// zachyceni vyjimky pri neexistujicim souboru
			throw e;
		}	
	}

}