package de.gaalop.algebra;
import de.gaalop.cfg.AssignmentNode;
import de.gaalop.cfg.BlockEndNode;
import de.gaalop.cfg.BreakNode;
import de.gaalop.cfg.ColorNode;
import de.gaalop.cfg.ControlFlowVisitor;
import de.gaalop.cfg.EndNode;
import de.gaalop.cfg.ExpressionStatement;
import de.gaalop.cfg.IfThenElseNode;
import de.gaalop.cfg.LoopNode;
import de.gaalop.cfg.Macro;
import de.gaalop.cfg.StartNode;
import de.gaalop.cfg.StoreResultNode;
import de.gaalop.dfg.Expression;
import de.gaalop.dfg.Variable;
import java.util.HashMap;
/**
*
* @author Christian Steinmetz
*/
public class MacroVariablesCFGReplacer implements ControlFlowVisitor {
private HashMap<String, Expression> replaceMap;
private MacroVariablesDFGReplacer dfgReplacer;
public MacroVariablesCFGReplacer(HashMap<String, Expression> replaceMap) {
this.replaceMap = replaceMap;
dfgReplacer = new MacroVariablesDFGReplacer(replaceMap);
}
@Override
public void visit(AssignmentNode node) {
node.getValue().accept(dfgReplacer);
if (dfgReplacer.result != null) {
node.setValue(dfgReplacer.result);
dfgReplacer.result = null;
}
if (replaceMap.containsKey(node.getVariable().getName()))
node.setVariable((Variable) replaceMap.get(node.getVariable().getName()).copy());
}
@Override
public void visit(ExpressionStatement node) {
node.getExpression().accept(dfgReplacer);
if (dfgReplacer.result != null) {
node.setExpression(dfgReplacer.result);
dfgReplacer.result = null;
}
}
@Override
public void visit(StoreResultNode node) {
if (replaceMap.containsKey(node.getValue().getName())) {
Expression replacement = replaceMap.get(node.getValue().getName());
if (replacement instanceof Variable) {
node.setValue((Variable) replacement.copy());
}
}
}
@Override
public void visit(StartNode node) {
throw new IllegalStateException();
}
@Override
public void visit(IfThenElseNode node) {
throw new IllegalStateException();
}
@Override
public void visit(BlockEndNode node) {
throw new IllegalStateException();
}
@Override
public void visit(LoopNode node) {
throw new IllegalStateException();
}
@Override
public void visit(BreakNode node) {
throw new IllegalStateException();
}
@Override
public void visit(Macro node) {
throw new IllegalStateException();
}
@Override
public void visit(EndNode node) {
throw new IllegalStateException();
}
@Override
public void visit(ColorNode node) {
throw new IllegalStateException();
}
}