package de.gaalop.algebra;
import de.gaalop.visitors.ReplaceVisitor;
import de.gaalop.cfg.AssignmentNode;
import de.gaalop.cfg.EmptyControlFlowVisitor;
import de.gaalop.dfg.BaseVector;
import de.gaalop.dfg.Variable;
/**
* Replaces Variables in a Control Flow Graph which are base vectors
* @author Christian Steinmetz
*/
public class BaseVectorReplaceVisitor extends EmptyControlFlowVisitor {
private BaseVectorDefiner definer;
public BaseVectorReplaceVisitor(BaseVectorDefiner definer) {
this.definer = definer;
}
public BaseVectorDefiner getDefiner() {
return definer;
}
public void setDefiner(BaseVectorDefiner definer) {
this.definer = definer;
}
private ReplaceVisitor dfgVisitor = new ReplaceVisitor() {
@Override
public void visit(Variable node) {
if (definer.isBaseVector(node.getName()))
result = new BaseVector(node.getName().substring(1));
super.visit(node);
}
};
@Override
public void visit(AssignmentNode node) {
node.getValue().accept(dfgVisitor);
if (dfgVisitor.result != null) {
node.setValue(dfgVisitor.result);
dfgVisitor.result = null;
}
super.visit(node);
}
}