// Path: language/src/com/infdot/analysis/language/expression/Constant.java
// public class Constant extends Expression {
// 	private int value;
// 
// 	public Constant(int value) {
// 		this.value = value;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return String.valueOf(value);
// 	}
// 
// 	@Override
// 	public void collectVariables(Set<Identifier> variables) {}
// 	
// 	@Override
// 	public <V> V visit(AbstractExpressionVisitor<V> visitor) {
// 		return visitor.visitConstant(this);
// 	}
// 
// 	public int getValue() {
// 		return value;
// 	}
// 	
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Div.java
// public class Div extends AbstractBinaryOperator {
// 
// 	public Div(Expression e1, Expression e2) {
// 		super("/", e1, e2);
// 	}
// 
// 	public Div(String name, int value) {
// 		super("/", name, value);
// 	}
// 
// 	@Override
// 	protected <V> V visitOperator(AbstractExpressionVisitor<V> visitor, V e1, V e2) {
// 		return visitor.visitDiv(this, e1, e2);
// 	}
// 
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Expression.java
// public abstract class Expression {
// 	/**
// 	 * Unique identifier for each expression.
// 	 * @see {@link ExpressionNumberingVisitor}
// 	 */
// 	private int id = -1;
// 	
// 	public int getId() {
// 		return id;
// 	}
// 
// 	public void setId(int id) {
// 		this.id = id;
// 	}
// 
// 	/**
// 	 * Helper method to collect variables.
// 	 */
// 	public abstract void collectVariables(Set<Identifier> variables);
// 	
// 	/**
// 	 * Method to accept visitor.
// 	 */
// 	public abstract <V> V visit(AbstractExpressionVisitor<V> visitor);
// 
// 	@Override
// 	public final boolean equals(Object obj) {
// 		checkId();
// 		return obj instanceof Expression
// 			&& ((Expression) obj).id == id;
// 	}
// 
// 	@Override
// 	public final int hashCode() {
// 		checkId();
// 		return id;
// 	}
// 	
// 	private void checkId() {
// 		if (id < 0) {
// 			throw new IllegalStateException("Expression " + this + " has no id set");
// 		}
// 	}
// 
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Gt.java
// public class Gt extends AbstractBinaryOperator {
// 	
// 	public Gt(String name, int value) {
// 		super(">", name, value);
// 	}
// 	
// 	public Gt(Expression e1, Expression e2) {
// 		super(">", e1, e2);
// 	}
// 
// 	@Override
// 	protected <V> V visitOperator(AbstractExpressionVisitor<V> visitor, V e1, V e2) {
// 		return visitor.visitGt(this, e1, e2);
// 	}
// 	
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Identifier.java
// public class Identifier extends Expression {
// 	private String name;
// 
// 	public Identifier(String name) {
// 		this.name = name;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return name;
// 	}
// 
// 	@Override
// 	public void collectVariables(Set<Identifier> variables) {
// 		variables.add(this);
// 	}
// 
// 	@Override
// 	public <V> V visit(AbstractExpressionVisitor<V> visitor) {
// 		return visitor.visitIdentifier(this);
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 	
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Input.java
// public class Input extends Expression {
// 
// 	@Override
// 	public String toString() {
// 		return "input";
// 	}
// 
// 	@Override
// 	public void collectVariables(Set<Identifier> variables) {}
// 
// 	@Override
// 	public <V> V visit(AbstractExpressionVisitor<V> visitor) {
// 		return visitor.visitInput(this);
// 	}
// 	
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Sub.java
// public class Sub extends AbstractBinaryOperator {
// 	
// 	public Sub(String name, int value) {
// 		super("-", name, value);
// 	}
// 	
// 	public Sub(String name1, String name2) {
// 		super("-", name1, name2);
// 	}
// 	
// 	public Sub(Expression e1, Expression e2) {
// 		super("-", e1, e2);
// 	}
// 
// 	@Override
// 	protected <V> V visitOperator(AbstractExpressionVisitor<V> visitor, V e1, V e2) {
// 		return visitor.visitSub(this, e1, e2);
// 	}
// 	
// }


import com.infdot.analysis.language.expression.Constant;
import com.infdot.analysis.language.expression.Div;
import com.infdot.analysis.language.expression.Expression;
import com.infdot.analysis.language.expression.Gt;
import com.infdot.analysis.language.expression.Identifier;
import com.infdot.analysis.language.expression.Input;
import com.infdot.analysis.language.expression.Sub;
package com.infdot.analysis.language.expression.visitor;


/**
 * Expression visitor that gives each expression an unique identifier.
 * Identifiers start from 0.
 * 
 * @author Raivo Laanemets
 */
public class ExpressionNumberingVisitor extends AbstractExpressionVisitor<Void> {
	private int expressionId = 0;
	
	@Override
	public Void visitConstant(Constant constant) {
		setId(constant);
		return null;
	}

	@Override
// Path: language/src/com/infdot/analysis/language/expression/Constant.java
// public class Constant extends Expression {
// 	private int value;
// 
// 	public Constant(int value) {
// 		this.value = value;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return String.valueOf(value);
// 	}
// 
// 	@Override
// 	public void collectVariables(Set<Identifier> variables) {}
// 	
// 	@Override
// 	public <V> V visit(AbstractExpressionVisitor<V> visitor) {
// 		return visitor.visitConstant(this);
// 	}
// 
// 	public int getValue() {
// 		return value;
// 	}
// 	
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Div.java
// public class Div extends AbstractBinaryOperator {
// 
// 	public Div(Expression e1, Expression e2) {
// 		super("/", e1, e2);
// 	}
// 
// 	public Div(String name, int value) {
// 		super("/", name, value);
// 	}
// 
// 	@Override
// 	protected <V> V visitOperator(AbstractExpressionVisitor<V> visitor, V e1, V e2) {
// 		return visitor.visitDiv(this, e1, e2);
// 	}
// 
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Expression.java
// public abstract class Expression {
// 	/**
// 	 * Unique identifier for each expression.
// 	 * @see {@link ExpressionNumberingVisitor}
// 	 */
// 	private int id = -1;
// 	
// 	public int getId() {
// 		return id;
// 	}
// 
// 	public void setId(int id) {
// 		this.id = id;
// 	}
// 
// 	/**
// 	 * Helper method to collect variables.
// 	 */
// 	public abstract void collectVariables(Set<Identifier> variables);
// 	
// 	/**
// 	 * Method to accept visitor.
// 	 */
// 	public abstract <V> V visit(AbstractExpressionVisitor<V> visitor);
// 
// 	@Override
// 	public final boolean equals(Object obj) {
// 		checkId();
// 		return obj instanceof Expression
// 			&& ((Expression) obj).id == id;
// 	}
// 
// 	@Override
// 	public final int hashCode() {
// 		checkId();
// 		return id;
// 	}
// 	
// 	private void checkId() {
// 		if (id < 0) {
// 			throw new IllegalStateException("Expression " + this + " has no id set");
// 		}
// 	}
// 
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Gt.java
// public class Gt extends AbstractBinaryOperator {
// 	
// 	public Gt(String name, int value) {
// 		super(">", name, value);
// 	}
// 	
// 	public Gt(Expression e1, Expression e2) {
// 		super(">", e1, e2);
// 	}
// 
// 	@Override
// 	protected <V> V visitOperator(AbstractExpressionVisitor<V> visitor, V e1, V e2) {
// 		return visitor.visitGt(this, e1, e2);
// 	}
// 	
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Identifier.java
// public class Identifier extends Expression {
// 	private String name;
// 
// 	public Identifier(String name) {
// 		this.name = name;
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return name;
// 	}
// 
// 	@Override
// 	public void collectVariables(Set<Identifier> variables) {
// 		variables.add(this);
// 	}
// 
// 	@Override
// 	public <V> V visit(AbstractExpressionVisitor<V> visitor) {
// 		return visitor.visitIdentifier(this);
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 	
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Input.java
// public class Input extends Expression {
// 
// 	@Override
// 	public String toString() {
// 		return "input";
// 	}
// 
// 	@Override
// 	public void collectVariables(Set<Identifier> variables) {}
// 
// 	@Override
// 	public <V> V visit(AbstractExpressionVisitor<V> visitor) {
// 		return visitor.visitInput(this);
// 	}
// 	
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/Sub.java
// public class Sub extends AbstractBinaryOperator {
// 	
// 	public Sub(String name, int value) {
// 		super("-", name, value);
// 	}
// 	
// 	public Sub(String name1, String name2) {
// 		super("-", name1, name2);
// 	}
// 	
// 	public Sub(Expression e1, Expression e2) {
// 		super("-", e1, e2);
// 	}
// 
// 	@Override
// 	protected <V> V visitOperator(AbstractExpressionVisitor<V> visitor, V e1, V e2) {
// 		return visitor.visitSub(this, e1, e2);
// 	}
// 	
// }


// Path: language/src/com/infdot/analysis/language/expression/visitor/ExpressionNumberingVisitor.java
import com.infdot.analysis.language.expression.Constant;
import com.infdot.analysis.language.expression.Div;
import com.infdot.analysis.language.expression.Expression;
import com.infdot.analysis.language.expression.Gt;
import com.infdot.analysis.language.expression.Identifier;
import com.infdot.analysis.language.expression.Input;
import com.infdot.analysis.language.expression.Sub;

package com.infdot.analysis.language.expression.visitor;


/**
 * Expression visitor that gives each expression an unique identifier.
 * Identifiers start from 0.
 * 
 * @author Raivo Laanemets
 */
public class ExpressionNumberingVisitor extends AbstractExpressionVisitor<Void> {
	private int expressionId = 0;
	
	@Override
	public Void visitConstant(Constant constant) {
		setId(constant);
		return null;
	}

	@Override
	public Void visitDiv(Div div, Void e1, Void e2) {