diff --git a/src/main/java/de/tla2b/config/ModuleOverrider.java b/src/main/java/de/tla2b/config/ModuleOverrider.java index 4fa75efadb6bb329971f40331069e778a064bf00..e7e9cbe5e46a0221b6a1ae3ed0370c9ab50e112d 100644 --- a/src/main/java/de/tla2b/config/ModuleOverrider.java +++ b/src/main/java/de/tla2b/config/ModuleOverrider.java @@ -5,18 +5,20 @@ import tlc2.tool.BuiltInOPs; import java.util.Map; -public class ModuleOverrider extends BuiltInOPs implements ASTConstants { +/** + * Apply overrides specified in the configuration file. + */ +public class ModuleOverrider extends BuiltInOPs { private final ModuleNode moduleNode; - private final Map<OpDeclNode, OpDefNode> constantOverrideTable; - private final Map<OpDefNode, OpDefNode> operatorOverrideTable; - private final Map<OpDefNode, TLCValueNode> operatorAssignments; + private final ConfigfileEvaluator conEval; private ModuleOverrider(ModuleNode moduleNode, ConfigfileEvaluator conEval) { this.moduleNode = moduleNode; - this.constantOverrideTable = conEval.getConstantOverrides(); - this.operatorOverrideTable = conEval.getOperatorOverrides(); - this.operatorAssignments = conEval.getOperatorAssignments(); + if (conEval == null) { + throw new IllegalArgumentException("ConfigfileEvaluator cannot be null"); + } + this.conEval = conEval; } public static void run(ModuleNode moduleNode, ConfigfileEvaluator conEval) { @@ -24,17 +26,16 @@ public class ModuleOverrider extends BuiltInOPs implements ASTConstants { } private void start() { - OpDefNode[] defs = moduleNode.getOpDefs(); - for (OpDefNode def : defs) { + Map<OpDefNode, TLCValueNode> operatorAssignments = conEval.getOperatorAssignments(); + for (OpDefNode def : moduleNode.getOpDefs()) { if (operatorAssignments.containsKey(def)) { def.setBody(operatorAssignments.get(def)); } else if (operatorAssignments.containsKey(def.getSource())) { def.setBody(operatorAssignments.get(def.getSource())); } - } - for (OpDefNode def : defs) { + for (OpDefNode def : moduleNode.getOpDefs()) { OpApplNode res = visitExprNode(def.getBody()); if (res != null) { def.setBody(res); @@ -43,43 +44,34 @@ public class ModuleOverrider extends BuiltInOPs implements ASTConstants { AssumeNode[] assumes = moduleNode.getAssumptions(); for (int i = 0; i < assumes.length; i++) { - AssumeNode assume = assumes[i]; - OpApplNode res = visitExprNode(assume.getAssume()); + OpApplNode res = visitExprNode(assumes[i].getAssume()); if (res != null) { - - AssumeNode newAssume = new AssumeNode(assume.stn, res, null, - null); - assumes[i] = newAssume; + assumes[i] = new AssumeNode(assumes[i].stn, res, null, null); } } } private OpApplNode visitExprOrOpArgNode(ExprOrOpArgNode n) { if (n instanceof ExprNode) { - return visitExprNode((ExprNode) n); } else { - throw new RuntimeException("OpArgNode not implemented jet"); + throw new RuntimeException("OpArgNode not implemented yet"); } } private OpApplNode visitExprNode(ExprNode n) { - switch (n.getKind()) { case OpApplKind: return visitOpApplNode((OpApplNode) n); - case StringKind: case AtNodeKind: // @ case NumeralKind: - case DecimalKind: { + case DecimalKind: return null; - } - case LetInKind: { LetInNode l = (LetInNode) n; - for (int i = 0; i < l.getLets().length; i++) { - visitExprNode(l.getLets()[i].getBody()); + for (OpDefNode let : l.getLets()) { + visitExprOrOpArgNode(let.getBody()); } OpApplNode res = visitExprNode(l.getBody()); @@ -96,98 +88,68 @@ public class ModuleOverrider extends BuiltInOPs implements ASTConstants { SymbolNode s = n.getOperator(); switch (s.getKind()) { case ConstantDeclKind: { - if (constantOverrideTable.containsKey(s) && s.getArity() > 0) { - SymbolNode newOperator = constantOverrideTable.get(s); + if (conEval.getConstantOverrides().containsKey((OpDeclNode) s) && s.getArity() > 0) { + SymbolNode newOperator = conEval.getConstantOverrides().get((OpDeclNode) s); OpApplNode newNode; try { - newNode = new OpApplNode(newOperator, n.getArgs(), - n.getTreeNode(), null); + newNode = new OpApplNode(newOperator, n.getArgs(), n.getTreeNode(), null); } catch (AbortException e) { - throw new RuntimeException(); - } - for (int i = 0; i < n.getArgs().length; i++) { - if (n.getArgs()[i] != null) { - OpApplNode res = visitExprOrOpArgNode(n.getArgs()[i]); - if (res != null) { - n.getArgs()[i] = res; - } - } + throw new RuntimeException(e); } // n.setOperator(constantOverrideTable.get(s)); return newNode; } break; - } case FormalParamKind: // Params are not global in the module case VariableDeclKind: // TODO try to override variable break; - case BuiltInKind:// Buildin operator can not be overridden by in the - // configuration file - ExprNode[] ins = n.getBdedQuantBounds(); - if (ins != null) { - for (int i = 0; i < ins.length; i++) { - - OpApplNode res = visitExprOrOpArgNode(ins[i]); - if (res != null) { - ins[i] = res; - } - } - } - + case BuiltInKind: // Buildin operator can not be overridden by in the configuration file + replaceArgs(n.getBdedQuantBounds()); // ins break; case UserDefinedOpKind: { + Map<OpDefNode, OpDefNode> operatorOverrides = conEval.getOperatorOverrides(); OpDefNode operator = (OpDefNode) n.getOperator(); - if (!operatorOverrideTable.containsKey(operator.getSource()) - && !operatorOverrideTable.containsKey(operator)) + if (!operatorOverrides.containsKey(operator.getSource()) && !operatorOverrides.containsKey(operator)) break; SymbolNode newOperator; // IF there are two override statements in the configuration file //(a: Add <- (Rule) Add2, b: R1!Add <- Add3) // TLC uses variant a) overriding the source definition - if (operatorOverrideTable.containsKey(operator.getSource())) { - newOperator = operatorOverrideTable.get(operator.getSource()); + if (operatorOverrides.containsKey(operator.getSource())) { + newOperator = operatorOverrides.get(operator.getSource()); } else { - newOperator = operatorOverrideTable.get(operator); + newOperator = operatorOverrides.get(operator); } - OpApplNode newNode = null; - OpDefNode def = (OpDefNode) n.getOperator(); + OpApplNode newNode; try { - newNode = new OpApplNode(newOperator, n.getArgs(), - n.getTreeNode(), def.getOriginallyDefinedInModuleNode()); + newNode = new OpApplNode(newOperator, n.getArgs(), n.getTreeNode(), + ((OpDefNode) n.getOperator()).getOriginallyDefinedInModuleNode()); } catch (AbortException e) { - e.printStackTrace(); - } - for (int i = 0; i < n.getArgs().length; i++) { - if (n.getArgs()[i] != null) { - OpApplNode res = visitExprOrOpArgNode(n.getArgs()[i]); - if (res != null) { - n.getArgs()[i] = res; - } - } - + throw new RuntimeException(e); } // n.setOperator(constantOverrideTable.get(s)); return newNode; } } + replaceArgs(n.getArgs()); + return null; + } - for (int i = 0; i < n.getArgs().length; i++) { - if (n.getArgs()[i] != null) { - ExprOrOpArgNode arg = n.getArgs()[i]; - if (arg != null) { - OpApplNode res = visitExprOrOpArgNode(n.getArgs()[i]); + private void replaceArgs(ExprOrOpArgNode[] args) { + if (args != null) { + for (int i = 0; i < args.length; i++) { + if (args[i] != null) { + OpApplNode res = visitExprOrOpArgNode(args[i]); if (res != null) { - n.getArgs()[i] = res; + args[i] = res; } } } - } - return null; } }