// Path: decaf_PA1/Compiler/src/decaf/Driver.java
// public final class Driver {
// 
// 	private static Driver driver;
// 
// 	private Option option;
// 
// 	private List<DecafError> errors;
// 
// 	private Lexer lexer;
// 
// 	private Parser parser;
// 
// 	public static Driver getDriver() {
// 		return driver;
// 	}
// 
// 	public void issueError(DecafError error) {
// 		errors.add(error);
// 	}
// 
// 	public void checkPoint() {
// 		if (errors.size() > 0) {
// 			Collections.sort(errors, new Comparator<DecafError>() {
// 
// 				@Override
// 				public int compare(DecafError o1, DecafError o2) {
// 					return o1.getLocation().compareTo(o2.getLocation());
// 				}
// 
// 			});
// 			for (DecafError error : errors) {
// 				option.getErr().println(error);
// 			}
// 			System.exit(1);
// 		}
// 	}
// 
// 	private void init() {
// 		lexer = new Lexer(option.getInput());
// 		parser = new Parser();
// 		lexer.setParser(parser);
// 		parser.setLexer(lexer);
// 		errors = new ArrayList<DecafError>();
// 	}
// 
// 	private void compile() {
// 
// 		Tree.TopLevel tree = parser.parseFile();
// 		
// 		checkPoint();
// 		if (option.getLevel() == Option.Level.LEVEL0) {
// 			IndentPrintWriter pw = new IndentPrintWriter(option.getOutput(), 4);
// 			tree.printTo(pw);
// 			pw.close();
// 			return;
// 		}
// 	}
// 
// 	public static void main(String[] args) throws IOException {
// 		driver = new Driver();
// 		driver.option = new Option(args);
// 		driver.init();
// 		driver.compile();
// 	}
// 
// 	public Option getOption() {
// 		return option;
// 	}
// }
// 
// Path: decaf_PA2/src/decaf/type/ClassType.java
// public class ClassType extends Type {
// 
// 	private Class symbol;
// 
// 	private ClassType parent;
// 
// 	public ClassType(Class symbol, ClassType parent) {
// 		this.symbol = symbol;
// 		this.parent = parent;
// 	}
// 
// 	@Override
// 	public boolean compatible(Type type) {
// 		if (type.equal(BaseType.ERROR)) {
// 			return true;
// 		}
// ////////////////////////////////////////////////////////////////////////////////////////////////		
// //		if (type.equal(BaseType.NULL)) {
// //			return true;
// //		}
// ////////////////////////////////////////////////////////////////////////////////////////////////		
// 		if (!type.isClassType()) {
// 			return false;
// 		}
// 		for (ClassType t = this; t != null; t = t.parent) {
// 			if (t.equal(type)) {
// 				return true;
// 			}
// 		}
// 		return false;
// 
// 	}
// 
// 	@Override
// 	public boolean equal(Type type) {
// 		return type.isClassType() && symbol == ((ClassType) type).symbol;
// 	}
// 
// 	@Override
// 	public boolean isClassType() {
// 		return true;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "class : " + symbol.getName();
// 	}
// 
// 	public Class getSymbol() {
// 		return symbol;
// 	}
// 
// 	public ClassType getParentType() {
// 		return parent;
// 	}
// 
// 	public ClassScope getClassScope() {
// 		return symbol.getAssociatedScope();
// 	}
// 
// }


import decaf.Driver;
import decaf.Location;
import decaf.scope.ClassScope;
import decaf.scope.GlobalScope;
import decaf.type.ClassType;
	public boolean isClass() {
		return true;
	}

	@Override
	public GlobalScope getScope() {
		return (GlobalScope) definedIn;
	}

	public int getOrder() {
		return order;
	}

	public void setOrder(int order) {
		this.order = order;
	}

	public void dettachParent() {
		parentName = null;
	}

	public boolean isCheck() {
		return check;
	}

	public void setCheck(boolean check) {
		this.check = check;
	}

	@Override
// Path: decaf_PA1/Compiler/src/decaf/Driver.java
// public final class Driver {
// 
// 	private static Driver driver;
// 
// 	private Option option;
// 
// 	private List<DecafError> errors;
// 
// 	private Lexer lexer;
// 
// 	private Parser parser;
// 
// 	public static Driver getDriver() {
// 		return driver;
// 	}
// 
// 	public void issueError(DecafError error) {
// 		errors.add(error);
// 	}
// 
// 	public void checkPoint() {
// 		if (errors.size() > 0) {
// 			Collections.sort(errors, new Comparator<DecafError>() {
// 
// 				@Override
// 				public int compare(DecafError o1, DecafError o2) {
// 					return o1.getLocation().compareTo(o2.getLocation());
// 				}
// 
// 			});
// 			for (DecafError error : errors) {
// 				option.getErr().println(error);
// 			}
// 			System.exit(1);
// 		}
// 	}
// 
// 	private void init() {
// 		lexer = new Lexer(option.getInput());
// 		parser = new Parser();
// 		lexer.setParser(parser);
// 		parser.setLexer(lexer);
// 		errors = new ArrayList<DecafError>();
// 	}
// 
// 	private void compile() {
// 
// 		Tree.TopLevel tree = parser.parseFile();
// 		
// 		checkPoint();
// 		if (option.getLevel() == Option.Level.LEVEL0) {
// 			IndentPrintWriter pw = new IndentPrintWriter(option.getOutput(), 4);
// 			tree.printTo(pw);
// 			pw.close();
// 			return;
// 		}
// 	}
// 
// 	public static void main(String[] args) throws IOException {
// 		driver = new Driver();
// 		driver.option = new Option(args);
// 		driver.init();
// 		driver.compile();
// 	}
// 
// 	public Option getOption() {
// 		return option;
// 	}
// }
// 
// Path: decaf_PA2/src/decaf/type/ClassType.java
// public class ClassType extends Type {
// 
// 	private Class symbol;
// 
// 	private ClassType parent;
// 
// 	public ClassType(Class symbol, ClassType parent) {
// 		this.symbol = symbol;
// 		this.parent = parent;
// 	}
// 
// 	@Override
// 	public boolean compatible(Type type) {
// 		if (type.equal(BaseType.ERROR)) {
// 			return true;
// 		}
// ////////////////////////////////////////////////////////////////////////////////////////////////		
// //		if (type.equal(BaseType.NULL)) {
// //			return true;
// //		}
// ////////////////////////////////////////////////////////////////////////////////////////////////		
// 		if (!type.isClassType()) {
// 			return false;
// 		}
// 		for (ClassType t = this; t != null; t = t.parent) {
// 			if (t.equal(type)) {
// 				return true;
// 			}
// 		}
// 		return false;
// 
// 	}
// 
// 	@Override
// 	public boolean equal(Type type) {
// 		return type.isClassType() && symbol == ((ClassType) type).symbol;
// 	}
// 
// 	@Override
// 	public boolean isClassType() {
// 		return true;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "class : " + symbol.getName();
// 	}
// 
// 	public Class getSymbol() {
// 		return symbol;
// 	}
// 
// 	public ClassType getParentType() {
// 		return parent;
// 	}
// 
// 	public ClassScope getClassScope() {
// 		return symbol.getAssociatedScope();
// 	}
// 
// }


// Path: decaf_PA2/src/decaf/symbol/Class.java
import decaf.Driver;
import decaf.Location;
import decaf.scope.ClassScope;
import decaf.scope.GlobalScope;
import decaf.type.ClassType;

	public boolean isClass() {
		return true;
	}

	@Override
	public GlobalScope getScope() {
		return (GlobalScope) definedIn;
	}

	public int getOrder() {
		return order;
	}

	public void setOrder(int order) {
		this.order = order;
	}

	public void dettachParent() {
		parentName = null;
	}

	public boolean isCheck() {
		return check;
	}

	public void setCheck(boolean check) {
		this.check = check;
	}

	@Override
	public boolean isFunction() {