// Path: language/src/com/infdot/analysis/language/expression/visitor/AbstractExpressionVisitor.java
// 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);
// 	
// 	public abstract V visitIdentifier(Identifier identifier);
// 	
// 	public abstract V visitInput(Input input);
// 	
// 	public abstract V visitSub(Sub sub, V e1, V e2);
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/visitor/ExpressionNumberingVisitor.java
// 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) {
// 		setId(div);
// 		return null;
// 	}
// 
// 	@Override
// 	public Void visitGt(Gt gt, Void e1, Void e2) {
// 		setId(gt);
// 		return null;
// 	}
// 
// 	@Override
// 	public Void visitIdentifier(Identifier identifier) {
// 		setId(identifier);
// 		return null;
// 	}
// 
// 	@Override
// 	public Void visitInput(Input input) {
// 		setId(input);
// 		return null;
// 	}
// 
// 	@Override
// 	public Void visitSub(Sub sub, Void e1, Void e2) {
// 		setId(sub);
// 		return null;
// 	}
// 	
// 	private void setId(Expression e) {
// 		e.setId(expressionId++);
// 	}
// 
// }


import java.util.Set;
import com.infdot.analysis.language.expression.visitor.AbstractExpressionVisitor;
import com.infdot.analysis.language.expression.visitor.ExpressionNumberingVisitor;
package com.infdot.analysis.language.expression;



/**
 * Base class for language expressions.
 * 
 * @author Raivo Laanemets
 */
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.
	 */
// Path: language/src/com/infdot/analysis/language/expression/visitor/AbstractExpressionVisitor.java
// 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);
// 	
// 	public abstract V visitIdentifier(Identifier identifier);
// 	
// 	public abstract V visitInput(Input input);
// 	
// 	public abstract V visitSub(Sub sub, V e1, V e2);
// }
// 
// Path: language/src/com/infdot/analysis/language/expression/visitor/ExpressionNumberingVisitor.java
// 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) {
// 		setId(div);
// 		return null;
// 	}
// 
// 	@Override
// 	public Void visitGt(Gt gt, Void e1, Void e2) {
// 		setId(gt);
// 		return null;
// 	}
// 
// 	@Override
// 	public Void visitIdentifier(Identifier identifier) {
// 		setId(identifier);
// 		return null;
// 	}
// 
// 	@Override
// 	public Void visitInput(Input input) {
// 		setId(input);
// 		return null;
// 	}
// 
// 	@Override
// 	public Void visitSub(Sub sub, Void e1, Void e2) {
// 		setId(sub);
// 		return null;
// 	}
// 	
// 	private void setId(Expression e) {
// 		e.setId(expressionId++);
// 	}
// 
// }


// Path: language/src/com/infdot/analysis/language/expression/Expression.java
import java.util.Set;
import com.infdot.analysis.language.expression.visitor.AbstractExpressionVisitor;
import com.infdot.analysis.language.expression.visitor.ExpressionNumberingVisitor;

package com.infdot.analysis.language.expression;



/**
 * Base class for language expressions.
 * 
 * @author Raivo Laanemets
 */
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);