// Path: language/src/com/infdot/analysis/language/statement/visitor/AbstractStatementVisitor.java
// public abstract class AbstractStatementVisitor<T> {
// 
// 	public abstract T visitAssignment(Assignment assignment);
// 	
// 	public abstract T visitCompound(Compound compound, T s1, T s2);
// 	
// 	public abstract T visitDeclaration(Declaration declaration);
// 	
// 	public abstract T visitIf(If ifStatement, T body);
// 	
// 	public abstract T visitOutput(Output output);
// 	
// 	public abstract T visitWhile(While whileStatement, T body);
// }


import com.infdot.analysis.language.statement.visitor.AbstractStatementVisitor;
	public static Statement makeCompound(Statement... statements) {
		Statement ret = statements[0];
		for (int i = 1; i < statements.length; i++) {
			ret = new Compound(ret, statements[i]);
		}
		
		return ret;
	}

	@Override
	public boolean equals(Object obj) {
		return obj instanceof Compound
			&& ((Compound) obj).statement1.equals(statement1)
			&& ((Compound) obj).statement2.equals(statement2);
	}

	@Override
	public int hashCode() {
		return statement1.hashCode() ^ statement2.hashCode();
	}

	public Statement getStatement1() {
		return statement1;
	}

	public Statement getStatement2() {
		return statement2;
	}

	@Override
// Path: language/src/com/infdot/analysis/language/statement/visitor/AbstractStatementVisitor.java
// public abstract class AbstractStatementVisitor<T> {
// 
// 	public abstract T visitAssignment(Assignment assignment);
// 	
// 	public abstract T visitCompound(Compound compound, T s1, T s2);
// 	
// 	public abstract T visitDeclaration(Declaration declaration);
// 	
// 	public abstract T visitIf(If ifStatement, T body);
// 	
// 	public abstract T visitOutput(Output output);
// 	
// 	public abstract T visitWhile(While whileStatement, T body);
// }


// Path: language/src/com/infdot/analysis/language/statement/Compound.java
import com.infdot.analysis.language.statement.visitor.AbstractStatementVisitor;

	public static Statement makeCompound(Statement... statements) {
		Statement ret = statements[0];
		for (int i = 1; i < statements.length; i++) {
			ret = new Compound(ret, statements[i]);
		}
		
		return ret;
	}

	@Override
	public boolean equals(Object obj) {
		return obj instanceof Compound
			&& ((Compound) obj).statement1.equals(statement1)
			&& ((Compound) obj).statement2.equals(statement2);
	}

	@Override
	public int hashCode() {
		return statement1.hashCode() ^ statement2.hashCode();
	}

	public Statement getStatement1() {
		return statement1;
	}

	public Statement getStatement2() {
		return statement2;
	}

	@Override
	public <T> T visit(AbstractStatementVisitor<T> visitor) {