Skip to content
Snippets Groups Projects
Commit 1396a88a authored by Jan Gruteser's avatar Jan Gruteser
Browse files

further simplifications

parent f89d5e1c
Branches
Tags
No related merge requests found
...@@ -503,7 +503,6 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -503,7 +503,6 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
default: default:
throw new NotImplementedException(exprNode.getClass().toString()); throw new NotImplementedException(exprNode.getClass().toString());
} }
} }
private PExpression visitExprNodeExpression(ExprNode exprNode) { private PExpression visitExprNodeExpression(ExprNode exprNode) {
...@@ -527,21 +526,18 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -527,21 +526,18 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
} }
case AtNodeKind: { // @ case AtNodeKind: { // @
AtNode at = (AtNode) exprNode; AtNode at = (AtNode) exprNode;
TLAType type = (TLAType) at.getExceptRef().getToolObject(TYPE_ID);
OpApplNode seq = at.getAtModifier();
LinkedList<ExprOrOpArgNode> list = new LinkedList<>(Arrays.asList(seq.getArgs()));
// PExpression base = visitExprNodeExpression(at.getAtBase()); // PExpression base = visitExprNodeExpression(at.getAtBase());
PExpression base = (PExpression) at.getExceptComponentRef().getToolObject(EXCEPT_BASE); return evalAtNode(
return evalAtNode(list, type, base.clone()); new LinkedList<>(Arrays.asList(at.getAtModifier().getArgs())), // seq
} (TLAType) at.getExceptRef().getToolObject(TYPE_ID),
case LetInKind: { ((PExpression) at.getExceptComponentRef().getToolObject(EXCEPT_BASE)).clone()
LetInNode letInNode = (LetInNode) exprNode; );
return visitExprNodeExpression(letInNode.getBody());
} }
case LetInKind:
return visitExprNodeExpression(((LetInNode) exprNode).getBody());
default: default:
throw new NotImplementedException(exprNode.getClass().toString()); throw new NotImplementedException(exprNode.getClass().toString());
} }
} }
private PExpression evalAtNode(LinkedList<ExprOrOpArgNode> list, TLAType type, PExpression base) { private PExpression evalAtNode(LinkedList<ExprOrOpArgNode> list, TLAType type, PExpression base) {
...@@ -549,23 +545,14 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -549,23 +545,14 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
return base; return base;
} }
if (type instanceof FunctionType) { if (type instanceof FunctionType) {
FunctionType funcType = (FunctionType) type; return evalAtNode(list, ((FunctionType) type).getRange(),
PExpression param = visitExprOrOpArgNodeExpression(list.poll()); new AFunctionExpression(base, Collections.singletonList(visitExprOrOpArgNodeExpression(list.poll()))));
List<PExpression> params = new ArrayList<>();
params.add(param);
AFunctionExpression funCall = new AFunctionExpression();
funCall.setIdentifier(base);
funCall.setParameters(params);
return evalAtNode(list, funcType.getRange(), funCall);
} else { } else {
StructType structType = (StructType) type;
ARecordFieldExpression select = new ARecordFieldExpression();
select.setRecord(base);
StringNode stringNode = (StringNode) list.poll(); StringNode stringNode = (StringNode) list.poll();
// TODO rename field name // TODO rename field name
String fieldName = stringNode.getRep().toString(); String fieldName = stringNode.getRep().toString();
select.setIdentifier(new TIdentifierLiteral(fieldName)); return evalAtNode(list, ((StructType) type).getType(fieldName),
return evalAtNode(list, structType.getType(fieldName), select); new ARecordFieldExpression(base, new TIdentifierLiteral(fieldName)));
} }
} }
...@@ -573,17 +560,14 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -573,17 +560,14 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
switch (opApplNode.getOperator().getKind()) { switch (opApplNode.getOperator().getKind()) {
case VariableDeclKind: case VariableDeclKind:
case ConstantDeclKind: case ConstantDeclKind:
case FormalParamKind: { case FormalParamKind:
return createPositionedNode( return createPositionedNode(
new AEqualPredicate(createIdentifierNode(opApplNode.getOperator()), new ABooleanTrueExpression()), new AEqualPredicate(createIdentifierNode(opApplNode.getOperator()), new ABooleanTrueExpression()),
opApplNode); opApplNode);
}
case BuiltInKind: case BuiltInKind:
return visitBuiltInKindPredicate(opApplNode); return visitBuiltInKindPredicate(opApplNode);
case UserDefinedOpKind:
case UserDefinedOpKind: {
return visitUserdefinedOpPredicate(opApplNode); return visitUserdefinedOpPredicate(opApplNode);
}
default: default:
throw new NotImplementedException(opApplNode.getClass().toString()); throw new NotImplementedException(opApplNode.getClass().toString());
} }
...@@ -593,9 +577,8 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -593,9 +577,8 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
private PExpression visitOpApplNodeExpression(OpApplNode n) { private PExpression visitOpApplNodeExpression(OpApplNode n) {
switch (n.getOperator().getKind()) { switch (n.getOperator().getKind()) {
case ConstantDeclKind: case ConstantDeclKind:
case VariableDeclKind: { case VariableDeclKind:
return createIdentifierNode(n.getOperator()); return createIdentifierNode(n.getOperator());
}
case FormalParamKind: { case FormalParamKind: {
FormalParamNode param = (FormalParamNode) n.getOperator(); FormalParamNode param = (FormalParamNode) n.getOperator();
ExprOrOpArgNode e = (ExprOrOpArgNode) param.getToolObject(SUBSTITUTE_PARAM); ExprOrOpArgNode e = (ExprOrOpArgNode) param.getToolObject(SUBSTITUTE_PARAM);
...@@ -604,29 +587,22 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -604,29 +587,22 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
} }
if (recursiveFunctionHandler.isRecursiveFunction(param)) { if (recursiveFunctionHandler.isRecursiveFunction(param)) {
ArrayList<SymbolNode> list = recursiveFunctionHandler.getAdditionalParams(param); List<SymbolNode> list = recursiveFunctionHandler.getAdditionalParams(param);
if (!list.isEmpty()) { if (!list.isEmpty()) {
AFunctionExpression call = new AFunctionExpression(); List<PExpression> params = new ArrayList<>();
call.setIdentifier(createIdentifierNode(param));
ArrayList<PExpression> params = new ArrayList<>();
for (SymbolNode symbolNode : list) { for (SymbolNode symbolNode : list) {
params.add(createIdentifierNode(symbolNode)); params.add(createIdentifierNode(symbolNode));
} }
call.setParameters(params); return new AFunctionExpression(createIdentifierNode(param), params);
return call;
} }
} }
FormalParamNode[] tuple = (FormalParamNode[]) param.getToolObject(TUPLE); FormalParamNode[] tuple = (FormalParamNode[]) param.getToolObject(TUPLE);
if (tuple != null) { if (tuple != null) {
if (tuple.length == 1) { if (tuple.length == 1) {
AFunctionExpression functionCall = new AFunctionExpression();
functionCall.setIdentifier(createIdentifierNode(n.getOperator()));
List<PExpression> paramList = new ArrayList<>(); List<PExpression> paramList = new ArrayList<>();
paramList.add(new AIntegerExpression(new TIntegerLiteral("1"))); paramList.add(new AIntegerExpression(new TIntegerLiteral("1")));
functionCall.setParameters(paramList); return new AFunctionExpression(createIdentifierNode(n.getOperator()), paramList);
return functionCall;
} else { } else {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
List<TLAType> typeList = new ArrayList<>(); List<TLAType> typeList = new ArrayList<>();
int number = -1; int number = -1;
...@@ -639,19 +615,15 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -639,19 +615,15 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
number = j + 1; number = j + 1;
} }
} }
TupleType tupleType = new TupleType(typeList); return createProjectionFunction(createIdentifierNode(sb.toString()), number, new TupleType(typeList));
PExpression id = createIdentifierNode(sb.toString());
return createProjectionFunction(id, number, tupleType);
} }
} }
return createIdentifierNode(n.getOperator()); return createIdentifierNode(n.getOperator());
} }
case BuiltInKind: case BuiltInKind:
return visitBuiltInKindExpression(n); return visitBuiltInKindExpression(n);
case UserDefinedOpKind:
case UserDefinedOpKind: {
return visitUserdefinedOpExpression(n); return visitUserdefinedOpExpression(n);
}
default: default:
throw new NotImplementedException(n.getOperator().getName().toString()); throw new NotImplementedException(n.getOperator().getName().toString());
} }
...@@ -659,8 +631,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -659,8 +631,7 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
private PPredicate visitUserdefinedOpPredicate(OpApplNode n) { private PPredicate visitUserdefinedOpPredicate(OpApplNode n) {
OpDefNode def = (OpDefNode) n.getOperator(); OpDefNode def = (OpDefNode) n.getOperator();
if (BBuiltInOPs.contains(def.getName()) // Operator is a B built-in if (BBuiltInOPs.contains(def.getName()) // Operator is a B built-in operator
// operator
&& STANDARD_MODULES.contains(def.getSource().getOriginallyDefinedInModuleNode().getName().toString())) { && STANDARD_MODULES.contains(def.getSource().getOriginallyDefinedInModuleNode().getName().toString())) {
return visitBBuiltInsPredicate(n); return visitBBuiltInsPredicate(n);
} }
...@@ -1080,99 +1051,78 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -1080,99 +1051,78 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
switch (getOpCode(n.getOperator().getName())) { switch (getOpCode(n.getOperator().getName())) {
case OPCODE_land: // \land case OPCODE_land: // \land
{ return new AConvertBoolExpression(new AConjunctPredicate(
AConjunctPredicate conjunction = new AConjunctPredicate(); visitExprOrOpArgNodePredicate(n.getArgs()[0]),
conjunction.setLeft(visitExprOrOpArgNodePredicate(n.getArgs()[0])); visitExprOrOpArgNodePredicate(n.getArgs()[1])
conjunction.setRight(visitExprOrOpArgNodePredicate(n.getArgs()[1])); ));
return new AConvertBoolExpression(conjunction);
}
case OPCODE_equiv: // \equiv case OPCODE_equiv: // \equiv
AEquivalencePredicate equiv = new AEquivalencePredicate(visitExprOrOpArgNodePredicate(n.getArgs()[0]), return new AConvertBoolExpression(new AEquivalencePredicate(
visitExprOrOpArgNodePredicate(n.getArgs()[1])); visitExprOrOpArgNodePredicate(n.getArgs()[0]),
return new AConvertBoolExpression(equiv); visitExprOrOpArgNodePredicate(n.getArgs()[1])
));
case OPCODE_implies: // => case OPCODE_implies: // =>
AImplicationPredicate impl = new AImplicationPredicate(visitExprOrOpArgNodePredicate(n.getArgs()[0]), new AConvertBoolExpression(new AImplicationPredicate(
visitExprOrOpArgNodePredicate(n.getArgs()[1])); visitExprOrOpArgNodePredicate(n.getArgs()[0]),
new AConvertBoolExpression(impl); visitExprOrOpArgNodePredicate(n.getArgs()[1])
));
case OPCODE_cl: // $ConjList case OPCODE_cl: // $ConjList
{ return new AConvertBoolExpression(createConjunction(Arrays.stream(n.getArgs())
List<PPredicate> list = new ArrayList<>(); .map(this::visitExprOrOpArgNodePredicate)
for (int i = 0; i < n.getArgs().length; i++) { .collect(Collectors.toList())
list.add(visitExprOrOpArgNodePredicate(n.getArgs()[i])); ));
}
return new AConvertBoolExpression(createConjunction(list));
}
case OPCODE_dl: // $DisjList case OPCODE_dl: // $DisjList
{ return new AConvertBoolExpression(createDisjunction(Arrays.stream(n.getArgs())
List<PPredicate> list = new ArrayList<>(); .map(this::visitExprOrOpArgNodePredicate)
for (int i = 0; i < n.getArgs().length; i++) { .collect(Collectors.toList())));
list.add(visitExprOrOpArgNodePredicate(n.getArgs()[i]));
}
return new AConvertBoolExpression(createDisjunction(list));
}
case OPCODE_lor: // \/ case OPCODE_lor: // \/
{ return new AConvertBoolExpression(new ADisjunctPredicate(
ADisjunctPredicate disjunction = new ADisjunctPredicate(); visitExprOrOpArgNodePredicate(n.getArgs()[0]),
disjunction.setLeft(visitExprOrOpArgNodePredicate(n.getArgs()[0])); visitExprOrOpArgNodePredicate(n.getArgs()[1])
disjunction.setRight(visitExprOrOpArgNodePredicate(n.getArgs()[1])); ));
return new AConvertBoolExpression(disjunction);
}
case OPCODE_lnot: // \lnot case OPCODE_lnot: // \lnot
return new AConvertBoolExpression(new ANegationPredicate(visitExprOrOpArgNodePredicate(n.getArgs()[0]))); return new AConvertBoolExpression(new ANegationPredicate(visitExprOrOpArgNodePredicate(n.getArgs()[0])));
case OPCODE_in: // \in case OPCODE_in: // \in
{ return new AConvertBoolExpression(new AMemberPredicate(
AMemberPredicate memberPredicate = new AMemberPredicate(); visitExprOrOpArgNodeExpression(n.getArgs()[0]),
memberPredicate.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0])); visitExprOrOpArgNodeExpression(n.getArgs()[1])
memberPredicate.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1])); ));
return new AConvertBoolExpression(memberPredicate);
}
case OPCODE_notin: // \notin case OPCODE_notin: // \notin
{ return new AConvertBoolExpression(new ANotMemberPredicate(
ANotMemberPredicate notMemberPredicate = new ANotMemberPredicate(); visitExprOrOpArgNodeExpression(n.getArgs()[0]),
notMemberPredicate.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0])); visitExprOrOpArgNodeExpression(n.getArgs()[1])
notMemberPredicate.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1])); ));
return new AConvertBoolExpression(notMemberPredicate);
}
case OPCODE_eq: { // = case OPCODE_eq: // =
AEqualPredicate equal = new AEqualPredicate(); return new AConvertBoolExpression(new AEqualPredicate(
equal.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0])); visitExprOrOpArgNodeExpression(n.getArgs()[0]),
equal.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1])); visitExprOrOpArgNodeExpression(n.getArgs()[1])
return new AConvertBoolExpression(equal); ));
}
case OPCODE_noteq: // /= case OPCODE_noteq: // /=
{ return new AConvertBoolExpression(new ANotEqualPredicate(
ANotEqualPredicate notEqual = new ANotEqualPredicate(); visitExprOrOpArgNodeExpression(n.getArgs()[0]),
notEqual.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0])); visitExprOrOpArgNodeExpression(n.getArgs()[1])
notEqual.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1])); ));
return new AConvertBoolExpression(notEqual);
}
/* /*
* Set Operators * Set Operators
*/ */
case OPCODE_se: // SetEnumeration {..} case OPCODE_se: // SetEnumeration {..}
{
if (n.getArgs().length == 0) { if (n.getArgs().length == 0) {
return new AEmptySetExpression(); return new AEmptySetExpression();
} else { } else {
List<PExpression> list = new ArrayList<>(); return new ASetExtensionExpression(Arrays.stream(n.getArgs())
.map(this::visitExprOrOpArgNodeExpression)
for (int i = 0; i < n.getArgs().length; i++) { .collect(Collectors.toList()));
list.add(visitExprOrOpArgNodeExpression(n.getArgs()[i]));
}
return new ASetExtensionExpression(list);
}
} }
case 0: { case 0: {
...@@ -1180,28 +1130,22 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil ...@@ -1180,28 +1130,22 @@ public class BAstCreator extends BuiltInOPs implements TranslationGlobals, BBuil
} }
case OPCODE_setdiff: // set difference case OPCODE_setdiff: // set difference
{ return new AMinusOrSetSubtractExpression(
AMinusOrSetSubtractExpression minus = new AMinusOrSetSubtractExpression(); visitExprOrOpArgNodeExpression(n.getArgs()[0]),
minus.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0])); visitExprOrOpArgNodeExpression(n.getArgs()[1])
minus.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1])); );
return minus;
}
case OPCODE_cup: // set union case OPCODE_cup: // set union
{ return new AUnionExpression(
AUnionExpression union = new AUnionExpression(); visitExprOrOpArgNodeExpression(n.getArgs()[0]),
union.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0])); visitExprOrOpArgNodeExpression(n.getArgs()[1])
union.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1])); );
return union;
}
case OPCODE_cap: // set intersection case OPCODE_cap: // set intersection
{ return new AIntersectionExpression(
AIntersectionExpression inter = new AIntersectionExpression(); visitExprOrOpArgNodeExpression(n.getArgs()[0]),
inter.setLeft(visitExprOrOpArgNodeExpression(n.getArgs()[0])); visitExprOrOpArgNodeExpression(n.getArgs()[1])
inter.setRight(visitExprOrOpArgNodeExpression(n.getArgs()[1])); );
return inter;
}
case OPCODE_subset: // SUBSET case OPCODE_subset: // SUBSET
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment