// Path: src/com/infdot/analysis/cfg/node/visitor/AbstractNodeVisitor.java
// public abstract class AbstractNodeVisitor<V> {
// 	
// 	private Map<AbstractNode, DataflowExpression<V>> visited =
// 		new HashMap<AbstractNode, DataflowExpression<V>>();
// 	
// 	private int currentVarId = 0;
// 	private Map<AbstractNode, Integer> variables =
// 		new HashMap<AbstractNode, Integer>();
// 	
// 	public abstract void visitAssignment(AssignmentNode node);
// 	
// 	public abstract void visitDeclaration(DeclarationNode node);
// 	
// 	public abstract void visitExit(ExitNode node);
// 	
// 	public abstract void visitOutput(OutputNode node);
// 	
// 	public abstract void visitCondition(ConditionNode node);
// 	
// 	public abstract void visitEntry(EntryNode node);
// 	
// 	public boolean hasVisited(AbstractNode node) {
// 		return visited.containsKey(node);
// 	}
// 	
// 	public void markVisited(AbstractNode node) {
// 		visited.put(node, null);
// 	}
// 	
// 	protected void setConstraint(AbstractNode node, DataflowExpression<V> expression) {
// 		visited.put(node, expression);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		StringBuilder builder = new StringBuilder();
// 		
// 		for (Entry<AbstractNode, DataflowExpression<V>> e : visited.entrySet()) {
// 			builder.append("[[").append(e.getKey()).append("]]")
// 				.append(" = ").append(e.getValue()).append('\n');
// 		}
// 		
// 		return builder.toString();
// 	}
// 	
// 	/**
// 	 * Returns collected dataflow expressions.
// 	 */
// 	public Map<AbstractNode, DataflowExpression<V>> getExpressions() {
// 		return visited;
// 	}
// 	
// 	/**
// 	 * Helper method to generate variable id from given node.
// 	 * For this analysis each node is a variable.
// 	 */
// 	protected int getVariableId(AbstractNode node) {
// 		Integer id = variables.get(node);
// 		if (id == null) {
// 			id = currentVarId++;
// 			variables.put(node, id);
// 		}
// 		
// 		return id;
// 	}
// 	
// 	/**
// 	 * Creates constraint set from found expressions.
// 	 */
// 	public DataflowConstraintSet<V, AbstractNode> getConstraints() {
// 		
// 		DataflowConstraintSet<V, AbstractNode> set =
// 			new DataflowConstraintSet<V, AbstractNode>();
// 		
// 		for (Entry<AbstractNode, DataflowExpression<V>> e : visited.entrySet()) {
// 			
// 			// Ignore if there is no constraint
// 			// for the node.
// 			if (e.getValue() == null) {
// 				continue;
// 			}
// 			
// 			set.addConstraint(getVariableId(e.getKey()), e.getValue(), e.getKey());
// 		}
// 		
// 		return set;
// 	}
// 
// }
// 
// 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/statement/Output.java
// public class Output implements Statement {
// 	private Identifier identifier;
// 	
// 	public Output(String name) {
// 		this.identifier = new Identifier(name);
// 	}
// 
// 	public Output(Identifier identifier) {
// 		this.identifier = identifier;
// 	}
// 
// 	@Override
// 	public void toCodeString(StringBuilder builder, String ident) {
// 		builder.append(ident).append(this).append(';');
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "output " + identifier;
// 	}
// 
// 	public Identifier getIdentifier() {
// 		return identifier;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		return obj instanceof Output
// 			&& ((Output) obj).identifier.equals(identifier);
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return identifier.hashCode();
// 	}
// 
// 	@Override
// 	public <T> T visit(AbstractStatementVisitor<T> visitor) {
// 		return visitor.visitOutput(this);
// 	}
// 	
// }


import com.infdot.analysis.cfg.node.visitor.AbstractNodeVisitor;
import com.infdot.analysis.language.expression.Identifier;
import com.infdot.analysis.language.statement.Output;
package com.infdot.analysis.cfg.node;


/**
 * Node for outout statement.
 * 
 * @author Raivo Laanemets
 */
public class OutputNode extends AbstractNode {
	private Output output;

	public OutputNode(Output output) {
		this.output = output;
	}

// Path: src/com/infdot/analysis/cfg/node/visitor/AbstractNodeVisitor.java
// public abstract class AbstractNodeVisitor<V> {
// 	
// 	private Map<AbstractNode, DataflowExpression<V>> visited =
// 		new HashMap<AbstractNode, DataflowExpression<V>>();
// 	
// 	private int currentVarId = 0;
// 	private Map<AbstractNode, Integer> variables =
// 		new HashMap<AbstractNode, Integer>();
// 	
// 	public abstract void visitAssignment(AssignmentNode node);
// 	
// 	public abstract void visitDeclaration(DeclarationNode node);
// 	
// 	public abstract void visitExit(ExitNode node);
// 	
// 	public abstract void visitOutput(OutputNode node);
// 	
// 	public abstract void visitCondition(ConditionNode node);
// 	
// 	public abstract void visitEntry(EntryNode node);
// 	
// 	public boolean hasVisited(AbstractNode node) {
// 		return visited.containsKey(node);
// 	}
// 	
// 	public void markVisited(AbstractNode node) {
// 		visited.put(node, null);
// 	}
// 	
// 	protected void setConstraint(AbstractNode node, DataflowExpression<V> expression) {
// 		visited.put(node, expression);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		StringBuilder builder = new StringBuilder();
// 		
// 		for (Entry<AbstractNode, DataflowExpression<V>> e : visited.entrySet()) {
// 			builder.append("[[").append(e.getKey()).append("]]")
// 				.append(" = ").append(e.getValue()).append('\n');
// 		}
// 		
// 		return builder.toString();
// 	}
// 	
// 	/**
// 	 * Returns collected dataflow expressions.
// 	 */
// 	public Map<AbstractNode, DataflowExpression<V>> getExpressions() {
// 		return visited;
// 	}
// 	
// 	/**
// 	 * Helper method to generate variable id from given node.
// 	 * For this analysis each node is a variable.
// 	 */
// 	protected int getVariableId(AbstractNode node) {
// 		Integer id = variables.get(node);
// 		if (id == null) {
// 			id = currentVarId++;
// 			variables.put(node, id);
// 		}
// 		
// 		return id;
// 	}
// 	
// 	/**
// 	 * Creates constraint set from found expressions.
// 	 */
// 	public DataflowConstraintSet<V, AbstractNode> getConstraints() {
// 		
// 		DataflowConstraintSet<V, AbstractNode> set =
// 			new DataflowConstraintSet<V, AbstractNode>();
// 		
// 		for (Entry<AbstractNode, DataflowExpression<V>> e : visited.entrySet()) {
// 			
// 			// Ignore if there is no constraint
// 			// for the node.
// 			if (e.getValue() == null) {
// 				continue;
// 			}
// 			
// 			set.addConstraint(getVariableId(e.getKey()), e.getValue(), e.getKey());
// 		}
// 		
// 		return set;
// 	}
// 
// }
// 
// 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/statement/Output.java
// public class Output implements Statement {
// 	private Identifier identifier;
// 	
// 	public Output(String name) {
// 		this.identifier = new Identifier(name);
// 	}
// 
// 	public Output(Identifier identifier) {
// 		this.identifier = identifier;
// 	}
// 
// 	@Override
// 	public void toCodeString(StringBuilder builder, String ident) {
// 		builder.append(ident).append(this).append(';');
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return "output " + identifier;
// 	}
// 
// 	public Identifier getIdentifier() {
// 		return identifier;
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		return obj instanceof Output
// 			&& ((Output) obj).identifier.equals(identifier);
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return identifier.hashCode();
// 	}
// 
// 	@Override
// 	public <T> T visit(AbstractStatementVisitor<T> visitor) {
// 		return visitor.visitOutput(this);
// 	}
// 	
// }


// Path: src/com/infdot/analysis/cfg/node/OutputNode.java
import com.infdot.analysis.cfg.node.visitor.AbstractNodeVisitor;
import com.infdot.analysis.language.expression.Identifier;
import com.infdot.analysis.language.statement.Output;

package com.infdot.analysis.cfg.node;


/**
 * Node for outout statement.
 * 
 * @author Raivo Laanemets
 */
public class OutputNode extends AbstractNode {
	private Output output;

	public OutputNode(Output output) {
		this.output = output;
	}

	public Identifier getIdentifier() {