// 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/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.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;


/**
 * Base class for expression visitors. Assumes that there are no loops
 * in expression (trees). Has no cycle detection.
 * 
 * @author Raivo Laanemets
 */
public abstract class AbstractExpressionVisitor<V> {
	
	public abstract V visitConstant(Constant constant);
	
	public abstract V visitDiv(Div div, V e1, V e2);
	
// 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/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/AbstractExpressionVisitor.java
import com.infdot.analysis.language.expression.Constant;
import com.infdot.analysis.language.expression.Div;
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;


/**
 * Base class for expression visitors. Assumes that there are no loops
 * in expression (trees). Has no cycle detection.
 * 
 * @author Raivo Laanemets
 */
public abstract class AbstractExpressionVisitor<V> {
	
	public abstract V visitConstant(Constant constant);
	
	public abstract V visitDiv(Div div, V e1, V e2);
	
	public abstract V visitGt(Gt gt, V e1, V e2);