Skip to content
Snippets Groups Projects
Commit 812da092 authored by hansen's avatar hansen
Browse files

Fixed some bugs handling tuples

parent 0c22b221
No related branches found
No related tags found
No related merge requests found
Showing
with 820 additions and 491 deletions
...@@ -117,7 +117,7 @@ public class AbstractASTVisitor extends BuiltInOPs implements ASTConstants { ...@@ -117,7 +117,7 @@ public class AbstractASTVisitor extends BuiltInOPs implements ASTConstants {
} }
private void visitBBuiltinsNode(OpApplNode n) { public void visitBBuiltinsNode(OpApplNode n) {
ExprNode[] in = n.getBdedQuantBounds(); ExprNode[] in = n.getBdedQuantBounds();
for (ExprNode exprNode : in) { for (ExprNode exprNode : in) {
visitExprNode(exprNode); visitExprNode(exprNode);
......
...@@ -83,7 +83,7 @@ public class BOperation extends BuiltInOPs implements ASTConstants, ...@@ -83,7 +83,7 @@ public class BOperation extends BuiltInOPs implements ASTConstants,
} }
for (int j = 0; j < this.getExistQuans().size(); j++) { for (int j = 0; j < this.getExistQuans().size(); j++) {
OpApplNode o = this.getExistQuans().get(j); OpApplNode o = this.getExistQuans().get(j);
whereList.add(bASTCreator.visitBounded(o)); whereList.add(bASTCreator.visitBoundsOfLocalVariables(o));
} }
operation.setOpName(BAstCreator.createTIdentifierLiteral(name)); operation.setOpName(BAstCreator.createTIdentifierLiteral(name));
......
...@@ -109,6 +109,9 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants, ...@@ -109,6 +109,9 @@ public class SpecAnalyser extends BuiltInOPs implements ASTConstants,
specAnalyser.spec = definitions.get("Spec"); specAnalyser.spec = definitions.get("Spec");
specAnalyser.init = definitions.get("Init"); specAnalyser.init = definitions.get("Init");
specAnalyser.next = definitions.get("Next"); specAnalyser.next = definitions.get("Next");
if(definitions.containsKey("Inv")){
specAnalyser.invariants.add(definitions.get("Inv"));
}
// TODO are constant in the right order // TODO are constant in the right order
specAnalyser.bConstants.addAll(Arrays.asList(m.getConstantDecls())); specAnalyser.bConstants.addAll(Arrays.asList(m.getConstantDecls()));
......
...@@ -36,6 +36,7 @@ import tla2sany.semantic.NumeralNode; ...@@ -36,6 +36,7 @@ import tla2sany.semantic.NumeralNode;
import tla2sany.semantic.OpApplNode; import tla2sany.semantic.OpApplNode;
import tla2sany.semantic.OpDeclNode; import tla2sany.semantic.OpDeclNode;
import tla2sany.semantic.OpDefNode; import tla2sany.semantic.OpDefNode;
import tla2sany.semantic.SemanticNode;
import tla2sany.semantic.StringNode; import tla2sany.semantic.StringNode;
import tla2sany.semantic.SymbolNode; import tla2sany.semantic.SymbolNode;
import tlc2.tool.BuiltInOPs; import tlc2.tool.BuiltInOPs;
...@@ -50,8 +51,9 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -50,8 +51,9 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
private ExprNode nextExpr; private ExprNode nextExpr;
private Set<OpDefNode> usedDefinitions; private Set<OpDefNode> usedDefinitions;
private ArrayList<OpApplNode> recList = new ArrayList<OpApplNode>(); private ArrayList<SymbolNode> symbolNodeList = new ArrayList<SymbolNode>();
// every record node [a |-> 1 .. ] will be added to this List private ArrayList<SemanticNode> tupleNodeList = new ArrayList<SemanticNode>();
private ModuleNode moduleNode; private ModuleNode moduleNode;
private ArrayList<OpDeclNode> bConstList; private ArrayList<OpDeclNode> bConstList;
private SpecAnalyser specAnalyser; private SpecAnalyser specAnalyser;
...@@ -158,7 +160,13 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -158,7 +160,13 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
visitExprNode(nextExpr, BoolType.getInstance()); visitExprNode(nextExpr, BoolType.getInstance());
} }
checkIfAllIdentifiersHaveAType();
}
private void checkIfAllIdentifiersHaveAType() throws TypeErrorException {
// check if a variable has no type // check if a variable has no type
OpDeclNode[] vars = moduleNode.getVariableDecls();
for (int i = 0; i < vars.length; i++) { for (int i = 0; i < vars.length; i++) {
OpDeclNode var = vars[i]; OpDeclNode var = vars[i];
TLAType varType = (TLAType) var.getToolObject(TYPE_ID); TLAType varType = (TLAType) var.getToolObject(TYPE_ID);
...@@ -170,6 +178,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -170,6 +178,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
// check if a constant has no type, only constants which will appear in // check if a constant has no type, only constants which will appear in
// the resulting B Machine are considered // the resulting B Machine are considered
OpDeclNode[] cons = moduleNode.getConstantDecls();
for (int i = 0; i < cons.length; i++) { for (int i = 0; i < cons.length; i++) {
OpDeclNode con = cons[i]; OpDeclNode con = cons[i];
if (bConstList == null || bConstList.contains(con)) { if (bConstList == null || bConstList.contains(con)) {
...@@ -181,30 +190,19 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -181,30 +190,19 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
} }
} }
evalRecList(); for (SymbolNode symbol : symbolNodeList) {
TLAType type = (TLAType) symbol.getToolObject(TYPE_ID);
if (type.isUntyped()) {
throw new TypeErrorException("Symbol '" + symbol.getName()
+ "' has no type.\n" + symbol.getLocation());
} }
/**
*
*/
private void evalRecList() {
for (int i = 0; i < recList.size(); i++) {
OpApplNode n = recList.get(i);
StructType struct = (StructType) n.getToolObject(TYPE_ID);
ArrayList<String> fieldNames = new ArrayList<String>();
ExprOrOpArgNode[] args = n.getArgs();
for (int j = 0; j < args.length; j++) {
OpApplNode pair = (OpApplNode) args[j];
StringNode stringNode = (StringNode) pair.getArgs()[0];
fieldNames.add(stringNode.getRep().toString());
}
for (int j = 0; j < struct.getFields().size(); j++) {
String fieldName = struct.getFields().get(j);
if (!fieldNames.contains(fieldName)
&& struct.getType(fieldName).getKind() == IType.MODELVALUE) {
EnumType e = (EnumType) struct.getType(fieldName);
e.setNoVal();
} }
for (SemanticNode tuple : tupleNodeList) {
TLAType type = (TLAType) tuple.getToolObject(TYPE_ID);
if (type instanceof TupleOrFunction) {
TupleOrFunction tOrF = (TupleOrFunction) type;
tOrF.getFinalType();
} }
} }
...@@ -423,6 +421,10 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -423,6 +421,10 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
if (t == null) { if (t == null) {
t = (TLAType) symbolNode.getToolObject(TYPE_ID); t = (TLAType) symbolNode.getToolObject(TYPE_ID);
} }
if(t == null){
throw new RuntimeException();
}
try { try {
TLAType result = expected.unify(t); TLAType result = expected.unify(t);
symbolNode.setToolObject(paramId, result); symbolNode.setToolObject(paramId, result);
...@@ -751,6 +753,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -751,6 +753,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
n.getLocation())); n.getLocation()));
} }
n.setToolObject(TYPE_ID, found); n.setToolObject(TYPE_ID, found);
tupleNodeList.add(n);
if (found instanceof AbstractHasFollowers) { if (found instanceof AbstractHasFollowers) {
((AbstractHasFollowers) found).addFollower(n); ((AbstractHasFollowers) found).addFollower(n);
} }
...@@ -765,6 +768,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -765,6 +768,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
{ {
FormalParamNode recFunc = n.getUnbdedQuantSymbols()[0]; FormalParamNode recFunc = n.getUnbdedQuantSymbols()[0];
symbolNodeList.add(recFunc);
FunctionType recType = new FunctionType(); FunctionType recType = new FunctionType();
recFunc.setToolObject(TYPE_ID, recType); recFunc.setToolObject(TYPE_ID, recType);
recType.addFollower(recFunc); recType.addFollower(recFunc);
...@@ -825,10 +829,19 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -825,10 +829,19 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
new UntypedType()); new UntypedType());
domList.add(d); domList.add(d);
} }
if (domList.size() == 1) { // one-tuple
domType = new FunctionType(IntType.getInstance(),
domList.get(0));
FunctionType func = new FunctionType(domType, expected);
TLAType res = visitExprOrOpArgNode(n.getArgs()[0], func);
return ((FunctionType) res).getRange();
} else {
domType = new TupleType(domList); domType = new TupleType(domList);
FunctionType func = new FunctionType(domType, expected); FunctionType func = new FunctionType(domType, expected);
TLAType res = visitExprOrOpArgNode(n.getArgs()[0], func); TLAType res = visitExprOrOpArgNode(n.getArgs()[0], func);
return ((FunctionType) res).getRange(); return ((FunctionType) res).getRange();
}
} else { } else {
ExprOrOpArgNode arg = n.getArgs()[1]; ExprOrOpArgNode arg = n.getArgs()[1];
if (arg instanceof NumeralNode) { if (arg instanceof NumeralNode) {
...@@ -838,10 +851,14 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -838,10 +851,14 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
u.addFollower(n); u.addFollower(n);
TupleOrFunction tupleOrFunc = new TupleOrFunction( TupleOrFunction tupleOrFunc = new TupleOrFunction(
num.val(), u); num.val(), u);
TLAType funcOrTuple = visitExprOrOpArgNode(n.getArgs()[0], tupleOrFunc);
TLAType funcOrTuple = visitExprOrOpArgNode(n.getArgs()[0],
tupleOrFunc);
n.getArgs()[0].setToolObject(TYPE_ID, funcOrTuple); n.getArgs()[0].setToolObject(TYPE_ID, funcOrTuple);
tupleNodeList.add(n.getArgs()[0]);
if (funcOrTuple instanceof AbstractHasFollowers) { if (funcOrTuple instanceof AbstractHasFollowers) {
((AbstractHasFollowers) funcOrTuple).addFollower(n.getArgs()[0]); ((AbstractHasFollowers) funcOrTuple).addFollower(n
.getArgs()[0]);
} }
TLAType found = (TLAType) n.getToolObject(TYPE_ID); TLAType found = (TLAType) n.getToolObject(TYPE_ID);
...@@ -849,7 +866,8 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -849,7 +866,8 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
found = found.unify(expected); found = found.unify(expected);
} catch (UnificationException e) { } catch (UnificationException e) {
throw new TypeErrorException("Expected '" + expected throw new TypeErrorException("Expected '" + expected
+ "', found '" + found + "'.\n" + n.getLocation()); + "', found '" + found + "'.\n"
+ n.getLocation());
} }
return found; return found;
} }
...@@ -905,7 +923,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -905,7 +923,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
/********************************************************************** /**********************************************************************
* Except * Except
**********************************************************************/ **********************************************************************/
case OPCODE_exc: // Except case OPCODE_exc: // $Except
{ {
return evalExcept(n, expected); return evalExcept(n, expected);
} }
...@@ -980,7 +998,6 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -980,7 +998,6 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
n.setToolObject(TYPE_ID, found); n.setToolObject(TYPE_ID, found);
found.addFollower(n); found.addFollower(n);
recList.add(n);
return found; return found;
} }
...@@ -1002,8 +1019,8 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -1002,8 +1019,8 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
"Struct has no field %s with type %s: %s%n%s", "Struct has no field %s with type %s: %s%n%s",
fieldName, r.getType(fieldName), r, n.getLocation())); fieldName, r.getType(fieldName), r, n.getLocation()));
} }
n.setToolObject(TYPE_ID, r); n.getArgs()[0].setToolObject(TYPE_ID, r);
r.addFollower(n); r.addFollower(n.getArgs()[0]);
return r.getType(fieldName); return r.getType(fieldName);
} }
...@@ -1045,6 +1062,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -1045,6 +1062,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
case OPCODE_uc: { case OPCODE_uc: {
TLAType found = new UntypedType(); TLAType found = new UntypedType();
FormalParamNode x = n.getUnbdedQuantSymbols()[0]; FormalParamNode x = n.getUnbdedQuantSymbols()[0];
symbolNodeList.add(x);
x.setToolObject(TYPE_ID, found); x.setToolObject(TYPE_ID, found);
((AbstractHasFollowers) found).addFollower(x); ((AbstractHasFollowers) found).addFollower(x);
visitExprOrOpArgNode(n.getArgs()[0], BoolType.getInstance()); visitExprOrOpArgNode(n.getArgs()[0], BoolType.getInstance());
...@@ -1079,6 +1097,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -1079,6 +1097,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
found, n.getLocation())); found, n.getLocation()));
} }
FormalParamNode x = n.getBdedQuantSymbolLists()[0][0]; FormalParamNode x = n.getBdedQuantSymbolLists()[0][0];
symbolNodeList.add(x);
x.setToolObject(TYPE_ID, found); x.setToolObject(TYPE_ID, found);
if (found instanceof AbstractHasFollowers) { if (found instanceof AbstractHasFollowers) {
((AbstractHasFollowers) found).addFollower(x); ((AbstractHasFollowers) found).addFollower(x);
...@@ -1113,37 +1132,38 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -1113,37 +1132,38 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
TLAType subType = boundType.getSubType(); TLAType subType = boundType.getSubType();
if (n.isBdedQuantATuple()[i]) { if (n.isBdedQuantATuple()[i]) {
if (subType instanceof TupleType) { if (params[i].length == 1) {
domList.add(subType); FormalParamNode p = params[i][0];
TupleType t = (TupleType) subType; FunctionType expected = new FunctionType(
if (params[i].length != t.getTypes().size()) { IntType.getInstance(), new UntypedType());
throw new TypeErrorException("Expected tuple with " try {
+ params[i].length expected = expected.unify(subType);
+ " components, found tuple with " } catch (UnificationException e) {
+ t.getTypes().size() + " components.\n" throw new TypeErrorException(String.format(
+ bounds[i].getLocation()); "Expected %s, found %s at parameter %s,%n%s",
} expected, subType, p.getName().toString(),
for (int j = 0; j < params[i].length; j++) { bounds[i].getLocation()));
FormalParamNode p = params[i][j];
TLAType paramType = t.getTypes().get(j);
p.setToolObject(TYPE_ID, paramType);
if (paramType instanceof AbstractHasFollowers) {
((AbstractHasFollowers) paramType).addFollower(p);
} }
domList.add(expected);
symbolNodeList.add(p);
p.setToolObject(TYPE_ID, expected.getRange());
if (expected.getRange() instanceof AbstractHasFollowers) {
((AbstractHasFollowers) expected.getRange())
.addFollower(p);
} }
} else if (subType instanceof UntypedType) { } else {
TupleType tuple = new TupleType(params[i].length); TupleType tuple = new TupleType(params[i].length);
try { try {
tuple = (TupleType) tuple.unify(subType); tuple = (TupleType) tuple.unify(subType);
} catch (UnificationException e) { } catch (UnificationException e) {
throw new TypeErrorException(String.format( throw new TypeErrorException(String.format(
"Expected %s, found %s ,%n%s", tuple, subType, "Expected %s, found %s at tuple,%n%s", tuple,
n.getLocation())); subType, bounds[i].getLocation()));
} }
domList.add(tuple); domList.add(tuple);
for (int j = 0; j < params[i].length; j++) { for (int j = 0; j < params[i].length; j++) {
FormalParamNode p = params[i][j]; FormalParamNode p = params[i][j];
symbolNodeList.add(p);
TLAType paramType = tuple.getTypes().get(j); TLAType paramType = tuple.getTypes().get(j);
p.setToolObject(TYPE_ID, paramType); p.setToolObject(TYPE_ID, paramType);
if (paramType instanceof AbstractHasFollowers) { if (paramType instanceof AbstractHasFollowers) {
...@@ -1151,15 +1171,14 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -1151,15 +1171,14 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
} }
} }
} else {
throw new TypeErrorException("Expected tuple, found '"
+ subType + "'.\n" + bounds[i].getLocation());
} }
} else { } else {
// is not a tuple: all parameter have the same type // is not a tuple: all parameter have the same type
for (int j = 0; j < params[i].length; j++) { for (int j = 0; j < params[i].length; j++) {
domList.add(subType); domList.add(subType);
FormalParamNode p = params[i][j]; FormalParamNode p = params[i][j];
symbolNodeList.add(p);
p.setToolObject(TYPE_ID, subType); p.setToolObject(TYPE_ID, subType);
if (subType instanceof AbstractHasFollowers) { if (subType instanceof AbstractHasFollowers) {
((AbstractHasFollowers) subType).addFollower(p); ((AbstractHasFollowers) subType).addFollower(p);
...@@ -1236,6 +1255,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -1236,6 +1255,7 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
domList.add(d); domList.add(d);
} }
domType = new TupleType(domList); domType = new TupleType(domList);
domExpr.setToolObject(TYPE_ID, domType); // store type
} else { } else {
domType = visitExprOrOpArgNode(domExpr, new UntypedType()); domType = visitExprOrOpArgNode(domExpr, new UntypedType());
} }
...@@ -1635,6 +1655,17 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns, ...@@ -1635,6 +1655,17 @@ public class TypeChecker extends BuiltInOPs implements ASTConstants, BBuildIns,
.getOperator().getName(), n.getLocation())); .getOperator().getName(), n.getLocation()));
} }
case B_OPCODE_assert: {
try {
BoolType.getInstance().unify(expected);
return BoolType.getInstance();
} catch (Exception e) {
throw new TypeErrorException(String.format(
"Expected %s, found BOOL at '%s',%n%s", expected, n
.getOperator().getName(), n.getLocation()));
}
}
default: { default: {
throw new NotImplementedException(n.getOperator().getName() throw new NotImplementedException(n.getOperator().getName()
.toString()); .toString());
......
...@@ -3,16 +3,18 @@ package de.tla2b.analysis; ...@@ -3,16 +3,18 @@ package de.tla2b.analysis;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import de.tla2b.global.BBuildIns;
import de.tla2b.global.BBuiltInOPs;
import tla2sany.semantic.ExprNode; import tla2sany.semantic.ExprNode;
import tla2sany.semantic.ExprOrOpArgNode; import tla2sany.semantic.ExprOrOpArgNode;
import tla2sany.semantic.ModuleNode; import tla2sany.semantic.ModuleNode;
import tla2sany.semantic.OpApplNode; import tla2sany.semantic.OpApplNode;
import tla2sany.semantic.OpDefNode; import tla2sany.semantic.OpDefNode;
public class UsedExternalFunctions extends AbstractASTVisitor { public class UsedExternalFunctions extends AbstractASTVisitor implements BBuildIns{
public enum EXTERNAL_FUNCTIONS { public enum EXTERNAL_FUNCTIONS {
CHOOSE CHOOSE, ASSERT
} }
private final Set<EXTERNAL_FUNCTIONS> usedExternalFunctions; private final Set<EXTERNAL_FUNCTIONS> usedExternalFunctions;
...@@ -58,4 +60,25 @@ public class UsedExternalFunctions extends AbstractASTVisitor { ...@@ -58,4 +60,25 @@ public class UsedExternalFunctions extends AbstractASTVisitor {
} }
} }
@Override
public void visitBBuiltinsNode(OpApplNode n) {
switch (BBuiltInOPs.getOpcode(n.getOperator().getName())) {
case B_OPCODE_assert: {
usedExternalFunctions.add(EXTERNAL_FUNCTIONS.ASSERT);
}
}
ExprNode[] in = n.getBdedQuantBounds();
for (ExprNode exprNode : in) {
visitExprNode(exprNode);
}
ExprOrOpArgNode[] arguments = n.getArgs();
for (ExprOrOpArgNode exprOrOpArgNode : arguments) {
visitExprOrOpArgNode(exprOrOpArgNode);
}
}
} }
...@@ -81,6 +81,10 @@ public interface BBuildIns { ...@@ -81,6 +81,10 @@ public interface BBuildIns {
public static final UniqueString OP_rel_inverse = UniqueString public static final UniqueString OP_rel_inverse = UniqueString
.uniqueStringOf("rel_inverse"); .uniqueStringOf("rel_inverse");
//TLC
public static final UniqueString OP_assert = UniqueString
.uniqueStringOf("Assert");
public static final int B_OPCODE_dotdot = 1; public static final int B_OPCODE_dotdot = 1;
public static final int B_OPCODE_plus = 2; public static final int B_OPCODE_plus = 2;
public static final int B_OPCODE_minus = 3; public static final int B_OPCODE_minus = 3;
...@@ -123,4 +127,6 @@ public interface BBuildIns { ...@@ -123,4 +127,6 @@ public interface BBuildIns {
public static final int B_OPCODE_rel_inverse = B_OPCODE_pow1 + 1; public static final int B_OPCODE_rel_inverse = B_OPCODE_pow1 + 1;
public static final int B_OPCODE_assert = B_OPCODE_rel_inverse + 1;
} }
...@@ -51,7 +51,7 @@ public class BBuiltInOPs implements BBuildIns{ ...@@ -51,7 +51,7 @@ public class BBuiltInOPs implements BBuildIns{
//relations //relations
B_Opcode_Table.put(OP_rel_inverse, B_OPCODE_rel_inverse); B_Opcode_Table.put(OP_rel_inverse, B_OPCODE_rel_inverse);
B_Opcode_Table.put(OP_assert, B_OPCODE_assert);
} }
public static boolean contains(UniqueString s){ public static boolean contains(UniqueString s){
......
...@@ -20,10 +20,12 @@ public interface TranslationGlobals { ...@@ -20,10 +20,12 @@ public interface TranslationGlobals {
final int DEF_OBJECT = 19; final int DEF_OBJECT = 19;
final int PRINT_DEFINITION = 11; final int PRINT_DEFINITION = 11;
final int TYPE_ID = 5; final int TYPE_ID = 5;
final int EXCEPT_BASE = 6;
final int LET_PARAMS_ID = 13; final int LET_PARAMS_ID = 13;
final int NEW_NAME = 20; final int NEW_NAME = 20;
final int SUBSTITUTE_PARAM = 29; final int SUBSTITUTE_PARAM = 29;
final int TUPLE = 30;
final String CHOOSE = " CHOOSE(X) == \"a member of X\"; EXTERNAL_FUNCTION_CHOOSE(T) == (POW(T)-->T)"; final String CHOOSE = " CHOOSE(X) == \"a member of X\"; EXTERNAL_FUNCTION_CHOOSE(T) == (POW(T)-->T)";
final String IF_THEN_ELSE = " IF_THEN_ELSE(P, a, b) == (%t_.(t_ = TRUE & P = TRUE | a )\\/%t_.(t_= TRUE & not(P= TRUE) | b ))(TRUE)"; final String IF_THEN_ELSE = " IF_THEN_ELSE(P, a, b) == (%t_.(t_ = TRUE & P = TRUE | a )\\/%t_.(t_= TRUE & not(P= TRUE) | b ))(TRUE)";
......
...@@ -9,6 +9,7 @@ import de.be4.classicalb.core.parser.analysis.ExtendedDFAdapter; ...@@ -9,6 +9,7 @@ import de.be4.classicalb.core.parser.analysis.ExtendedDFAdapter;
import de.be4.classicalb.core.parser.node.AAbstractMachineParseUnit; import de.be4.classicalb.core.parser.node.AAbstractMachineParseUnit;
import de.be4.classicalb.core.parser.node.AAnySubstitution; import de.be4.classicalb.core.parser.node.AAnySubstitution;
import de.be4.classicalb.core.parser.node.ABecomesSuchSubstitution; import de.be4.classicalb.core.parser.node.ABecomesSuchSubstitution;
import de.be4.classicalb.core.parser.node.AConjunctPredicate;
import de.be4.classicalb.core.parser.node.ADefinitionExpression; import de.be4.classicalb.core.parser.node.ADefinitionExpression;
import de.be4.classicalb.core.parser.node.ADefinitionPredicate; import de.be4.classicalb.core.parser.node.ADefinitionPredicate;
import de.be4.classicalb.core.parser.node.AExpressionDefinitionDefinition; import de.be4.classicalb.core.parser.node.AExpressionDefinitionDefinition;
...@@ -33,6 +34,7 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter { ...@@ -33,6 +34,7 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
private final StringBuilder builder = new StringBuilder(); private final StringBuilder builder = new StringBuilder();
private final StringBuilder sb = new StringBuilder(); private final StringBuilder sb = new StringBuilder();
private Renamer renamer; private Renamer renamer;
private final Indentation indentation;
private static final int no = 0; private static final int no = 0;
private static final int left = 1; private static final int left = 1;
...@@ -41,11 +43,14 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter { ...@@ -41,11 +43,14 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
private final static Hashtable<String, NodeInfo> infoTable = new Hashtable<String, NodeInfo>(); private final static Hashtable<String, NodeInfo> infoTable = new Hashtable<String, NodeInfo>();
public ASTPrettyPrinter(Renamer renamer) { public ASTPrettyPrinter(Start start, Renamer renamer) {
this.renamer = renamer; this.renamer = renamer;
this.indentation = new Indentation(start);
} }
public ASTPrettyPrinter() { public ASTPrettyPrinter(Start start) {
this.indentation = new Indentation(start);
} }
private static void putInfixOperator(String nodeName, String symbol, private static void putInfixOperator(String nodeName, String symbol,
...@@ -251,7 +256,6 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter { ...@@ -251,7 +256,6 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
@Override @Override
public void defaultIn(final Node node) { public void defaultIn(final Node node) {
super.defaultIn(node);
if (makeBrackets(node)) { if (makeBrackets(node)) {
sb.append("("); sb.append("(");
} }
...@@ -260,6 +264,30 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter { ...@@ -260,6 +264,30 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
builder.append("("); builder.append("(");
} }
@Override
public void defaultCase(final Node node) {
super.defaultCase(node);
if (node instanceof Token) {
builder.append(((Token) node).getText());
sb.append(((Token) node).getText());
} else {
builder.append(node.toString());
sb.append(node.toString());
}
}
@Override
public void defaultOut(final Node node) {
builder.append(")");
sb.append(getInfo(node).end);
if (makeBrackets(node)) {
sb.append(")");
}
}
private boolean makeBrackets(Node node) { private boolean makeBrackets(Node node) {
NodeInfo infoNode = getInfo(node); NodeInfo infoNode = getInfo(node);
Node parent = node.parent(); Node parent = node.parent();
...@@ -287,40 +315,15 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter { ...@@ -287,40 +315,15 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
} }
@Override
public void defaultCase(final Node node) {
super.defaultCase(node);
if (node instanceof Token) {
builder.append(((Token) node).getText());
sb.append(((Token) node).getText());
} else {
builder.append(node.toString());
sb.append(node.toString());
}
}
@Override
public void defaultOut(final Node node) {
super.defaultOut(node);
builder.append(")");
sb.append(getInfo(node).end);
if (makeBrackets(node)) {
sb.append(")");
}
}
@Override
public void beginList(final Node parent) { public void beginList(final Node parent) {
builder.append('['); builder.append('[');
sb.append(getInfo(parent).beginList); sb.append(getInfo(parent).beginList);
} }
@Override @Override
public void betweenListElements(final Node parent) { public void betweenListElements(final Node node) {
builder.append(','); builder.append(',');
sb.append(getInfo(parent).betweenListElements); sb.append(getInfo(node).betweenListElements);
} }
@Override @Override
...@@ -330,9 +333,12 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter { ...@@ -330,9 +333,12 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
} }
@Override @Override
public void betweenChildren(final Node parent) { public void betweenChildren(final Node node) {
builder.append(','); builder.append(',');
sb.append(getInfo(parent).betweenChildren); if(indentation.printNewLineInTheMiddle(node)){
sb.append("\n");
}
sb.append(getInfo(node).betweenChildren);
} }
@Override @Override
...@@ -622,6 +628,11 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter { ...@@ -622,6 +628,11 @@ public class ASTPrettyPrinter extends ExtendedDFAdapter {
sb.append(")"); sb.append(")");
} }
public void inAConjunctPredicate(AConjunctPredicate node)
{
super.inAConjunctPredicate(node);
}
} }
class NodeInfo { class NodeInfo {
...@@ -702,6 +713,7 @@ class NodeInfo { ...@@ -702,6 +713,7 @@ class NodeInfo {
} }
public NodeInfo(String pre, String beginList, String betweenListElements, public NodeInfo(String pre, String beginList, String betweenListElements,
String endList, String betweenChildren, String end, String endList, String betweenChildren, String end,
Integer precedence, Integer associative) { Integer precedence, Integer associative) {
......
package de.tla2b.output;
import java.util.HashSet;
import java.util.Hashtable;
import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter;
import de.be4.classicalb.core.parser.node.AConjunctPredicate;
import de.be4.classicalb.core.parser.node.APredicateDefinitionDefinition;
import de.be4.classicalb.core.parser.node.APropertiesMachineClause;
import de.be4.classicalb.core.parser.node.Node;
import de.be4.classicalb.core.parser.node.Start;
public class Indentation extends DepthFirstAdapter {
private Hashtable<Node, Integer> indentation = new Hashtable<Node, Integer>();
private HashSet<Node> newlineMiddle = new HashSet<Node>();
public Indentation(Start start) {
start.apply(this);
}
public void inAPropertiesMachineClause(APropertiesMachineClause node) {
indentation.put(node.getPredicates(), 0);
}
@Override
public void inAConjunctPredicate(AConjunctPredicate node) {
Integer indent = indentation.get(node);
if (indent != null) {
indentation.put(node.getLeft(), indent);
indentation.put(node.getRight(), indent);
newlineMiddle.add(node);
}
}
public void inAPredicateDefinitionDefinition(APredicateDefinitionDefinition node)
{
indentation.put(node.getRhs(), 0);
}
public boolean printNewLineInTheMiddle(Node node) {
return newlineMiddle.contains(node);
}
public Integer getIndent(Node node) {
Integer res = indentation.get(node);
if (res == null) {
res = 0;
}
return res;
}
}
...@@ -102,7 +102,7 @@ public class OperationsFinder extends AbstractASTVisitor implements ...@@ -102,7 +102,7 @@ public class OperationsFinder extends AbstractASTVisitor implements
for (int i = 0; i < n.getArgs().length; i++) { for (int i = 0; i < n.getArgs().length; i++) {
exists = new ArrayList<OpApplNode>(oldExists); exists = new ArrayList<OpApplNode>(oldExists);
currentName = oldName; currentName = oldName + i;
visitExprOrOpArgNode(n.getArgs()[i]); visitExprOrOpArgNode(n.getArgs()[i]);
} }
return; return;
...@@ -114,7 +114,7 @@ public class OperationsFinder extends AbstractASTVisitor implements ...@@ -114,7 +114,7 @@ public class OperationsFinder extends AbstractASTVisitor implements
for (int i = 0; i < n.getArgs().length; i++) { for (int i = 0; i < n.getArgs().length; i++) {
exists = new ArrayList<OpApplNode>(oldExists); exists = new ArrayList<OpApplNode>(oldExists);
currentName = oldName; currentName = oldName+ i;
visitExprOrOpArgNode(n.getArgs()[i]); visitExprOrOpArgNode(n.getArgs()[i]);
} }
return; return;
......
package de.tla2b.types; package de.tla2b.types;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import de.be4.classicalb.core.parser.node.PExpression; import de.be4.classicalb.core.parser.node.PExpression;
import de.tla2b.exceptions.TypeErrorException;
import de.tla2b.exceptions.UnificationException; import de.tla2b.exceptions.UnificationException;
import de.tla2b.output.TypeVisitorInterface; import de.tla2b.output.TypeVisitorInterface;
...@@ -28,13 +26,9 @@ public class TupleOrFunction extends AbstractHasFollowers { ...@@ -28,13 +26,9 @@ public class TupleOrFunction extends AbstractHasFollowers {
} }
public static TLAType createTupleOrFunctionType(List<TLAType> list) { public static TLAType createTupleOrFunctionType(List<TLAType> list) {
if (comparable(list)) {
TupleOrFunction tOrF = new TupleOrFunction(); TupleOrFunction tOrF = new TupleOrFunction();
tOrF.add(list); tOrF.add(list);
return tOrF; return tOrF.update();
} else {
return new TupleType(list);
}
} }
public void add(List<TLAType> list) { public void add(List<TLAType> list) {
...@@ -53,33 +47,11 @@ public class TupleOrFunction extends AbstractHasFollowers { ...@@ -53,33 +47,11 @@ public class TupleOrFunction extends AbstractHasFollowers {
@Override @Override
public String toString() { public String toString() {
FunctionType func = new FunctionType();
func.setDomain(IntType.getInstance());
func.setRange(new UntypedType());
FunctionType res;
try {
res = func.unify(this);
return res.toString();
} catch (UnificationException e) {
// tuple
boolean isTuple = true;
ArrayList<TLAType> typeList = new ArrayList<TLAType>();
for (int i = 1; i <= types.keySet().size(); i++) {
if (types.keySet().contains(i)) {
typeList.add(types.get(i));
} else {
isTuple = false;
break;
}
}
if (isTuple) {
return new TupleType(typeList).toString();
} else {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("TupleOrFunction");
sb.append("("); sb.append("(");
for (Iterator<Integer> keys = types.keySet().iterator(); keys for (Iterator<Integer> keys = types.keySet().iterator(); keys.hasNext();) {
.hasNext();) {
Integer key = keys.next(); Integer key = keys.next();
sb.append(key); sb.append(key);
sb.append(" : ").append(types.get(key)); sb.append(" : ").append(types.get(key));
...@@ -87,11 +59,8 @@ public class TupleOrFunction extends AbstractHasFollowers { ...@@ -87,11 +59,8 @@ public class TupleOrFunction extends AbstractHasFollowers {
sb.append(", "); sb.append(", ");
} }
sb.append(")"); sb.append(")");
throw new RuntimeException("Type " + sb + "is incomplete"); return sb.toString();
} // throw new RuntimeException("Type " + sb + "is incomplete");
}
} }
@Override @Override
...@@ -187,18 +156,7 @@ public class TupleOrFunction extends AbstractHasFollowers { ...@@ -187,18 +156,7 @@ public class TupleOrFunction extends AbstractHasFollowers {
return true; return true;
} }
// if (o instanceof TupleOrFunction) { // this type is not comparable to all other types
// TupleOrFunction t = (TupleOrFunction) o;
// for (Entry<Integer, TLAType> entry : types.entrySet()) {
// if (t.types.containsKey(entry.getKey())
// && entry.getValue()
// .compare(t.types.get(entry.getKey()))) {
// return false;
// }
// }
// }
// this type is not comparable with all other types
return false; return false;
} }
...@@ -225,6 +183,9 @@ public class TupleOrFunction extends AbstractHasFollowers { ...@@ -225,6 +183,9 @@ public class TupleOrFunction extends AbstractHasFollowers {
@Override @Override
public boolean isUntyped() { public boolean isUntyped() {
// if (complete == false) {
// return true;
// }
for (TLAType type : types.values()) { for (TLAType type : types.values()) {
if (type.isUntyped()) if (type.isUntyped())
return true; return true;
...@@ -274,7 +235,8 @@ public class TupleOrFunction extends AbstractHasFollowers { ...@@ -274,7 +235,8 @@ public class TupleOrFunction extends AbstractHasFollowers {
List<TLAType> typeList = new ArrayList<TLAType>(); List<TLAType> typeList = new ArrayList<TLAType>();
for (int i = 0; i < tupleType.getTypes().size(); i++) { for (int i = 0; i < tupleType.getTypes().size(); i++) {
if (this.types.containsKey(i + 1)) { if (this.types.containsKey(i + 1)) {
TLAType res = tupleType.getTypes().get(i).unify(this.types.get(i+1)); TLAType res = tupleType.getTypes().get(i)
.unify(this.types.get(i + 1));
typeList.add(res); typeList.add(res);
} else { } else {
typeList.add(tupleType.getTypes().get(i)); typeList.add(tupleType.getTypes().get(i));
...@@ -284,71 +246,61 @@ public class TupleOrFunction extends AbstractHasFollowers { ...@@ -284,71 +246,61 @@ public class TupleOrFunction extends AbstractHasFollowers {
this.setFollowersTo(r); this.setFollowersTo(r);
tupleType.setFollowersTo(r); tupleType.setFollowersTo(r);
return r; return r;
// int max = Collections.max(types.keySet());
// if (max <= tupleType.getTypes().size()) {
// for (Entry<Integer, TLAType> entry : this.types.entrySet()) {
// int index = entry.getKey();
// TLAType type = entry.getValue();
// if (type instanceof AbstractHasFollowers) {
// ((AbstractHasFollowers) type).removeFollower(this);
// }
// TLAType elementOfTuple = tupleType.getTypes()
// .get(index - 1);
// elementOfTuple.unify(type);
// }
// return tupleType;
// } else {
// TLAType range = new UntypedType();
// for (TLAType type : types.values()) {
// if (type instanceof AbstractHasFollowers) {
// ((AbstractHasFollowers) type).removeFollower(this);
// }
// range = range.unify(type);
// }
// FunctionType funcType = new FunctionType(IntType.getInstance(),
// range);
// return funcType.unify(tupleType);
// }
} }
if (o instanceof TupleOrFunction) { if (o instanceof TupleOrFunction) {
TupleOrFunction other = (TupleOrFunction) o; TupleOrFunction other = (TupleOrFunction) o;
if (isTupleOrFunction(this, other)) { for (Integer i : other.types.keySet()) {
for (Integer i : this.types.keySet()) { if(this.types.containsKey(i)){
if (other.types.containsKey(i)) { TLAType res = other.types.get(i).unify(this.types.get(i));
TLAType res = this.types.get(i).unify( if(res instanceof AbstractHasFollowers)
other.types.get(i));
if (res instanceof AbstractHasFollowers) {
((AbstractHasFollowers) res).addFollower(this); ((AbstractHasFollowers) res).addFollower(this);
}
this.types.put(i, res); this.types.put(i, res);
} }else{
}
for (Integer i : other.types.keySet()) {
if (!this.types.containsKey(i)) {
TLAType res = other.types.get(i); TLAType res = other.types.get(i);
if (res instanceof AbstractHasFollowers) { if(res instanceof AbstractHasFollowers)
((AbstractHasFollowers) res).addFollower(this); ((AbstractHasFollowers) res).addFollower(this);
}
this.types.put(i, res); this.types.put(i, res);
} }
}
return this;
} else{
ArrayList<TLAType> list1 = new ArrayList<TLAType>();
for (int i = 1; i <= types.keySet().size(); i++) {
list1.add(types.get(i));
}
TupleType tuple1 = new TupleType(list1);
ArrayList<TLAType> list2 = new ArrayList<TLAType>();
for (int i = 1; i <= other.types.keySet().size(); i++) {
list2.add(other.types.get(i));
}
TupleType tuple2 = new TupleType(list2);
return tuple1.unify(tuple2);
} }
other.setFollowersTo(this);
return this;
// if (isTupleOrFunction(this, other)) {
// for (Integer i : this.types.keySet()) {
// if (other.types.containsKey(i)) {
// TLAType res = this.types.get(i).unify(
// other.types.get(i));
// if (res instanceof AbstractHasFollowers) {
// ((AbstractHasFollowers) res).addFollower(this);
// }
// this.types.put(i, res);
// }
// }
// for (Integer i : other.types.keySet()) {
// if (!this.types.containsKey(i)) {
// TLAType res = other.types.get(i);
// if (res instanceof AbstractHasFollowers) {
// ((AbstractHasFollowers) res).addFollower(this);
// }
// this.types.put(i, res);
// }
// }
// return this;
// } else {
// ArrayList<TLAType> list1 = new ArrayList<TLAType>();
// for (int i = 1; i <= types.keySet().size(); i++) {
// list1.add(types.get(i));
// }
// TupleType tuple1 = new TupleType(list1);
//
// ArrayList<TLAType> list2 = new ArrayList<TLAType>();
// for (int i = 1; i <= other.types.keySet().size(); i++) {
// list2.add(other.types.get(i));
// }
// TupleType tuple2 = new TupleType(list2);
// return tuple1.unify(tuple2);
// }
} }
...@@ -370,6 +322,62 @@ public class TupleOrFunction extends AbstractHasFollowers { ...@@ -370,6 +322,62 @@ public class TupleOrFunction extends AbstractHasFollowers {
} }
public TLAType getFinalType() {
List<TLAType> list = new ArrayList<TLAType>(this.types.values());
if (comparable(list)) {
FunctionType func = new FunctionType(IntType.getInstance(),
new UntypedType());
try {
func = func.unify(this);
this.setFollowersTo(func);
return func;
} catch (UnificationException e) {
throw new RuntimeException();
}
} else {
TupleType tuple = new TupleType(list);
this.setFollowersTo(tuple);
return tuple;
}
}
private TLAType update() {
List<TLAType> list = new ArrayList<TLAType>(this.types.values());
// if (allTyped(list) && comparable(list)) {
// FunctionType func = new FunctionType(IntType.getInstance(),
// new UntypedType());
// try {
// func = func.unify(this);
// this.setFollowersTo(func);
// return func;
// } catch (UnificationException e) {
// throw new RuntimeException();
// }
// } else
if (!comparable(list)) {
TupleType tuple = new TupleType(list);
this.setFollowersTo(tuple);
return tuple;
// boolean isTuple = true;
// ArrayList<TLAType> typeList = new ArrayList<TLAType>();
// for (int i = 1; i <= types.keySet().size(); i++) {
// if (types.keySet().contains(i)) {
// typeList.add(types.get(i));
// } else {
// isTuple = false;
// break;
// }
// }
//
// if (isTuple) {
// return new TupleType(typeList).toString();
}
return this;
}
private static boolean comparable(List<TLAType> typeList) { private static boolean comparable(List<TLAType> typeList) {
for (int i = 0; i < typeList.size() - 1; i++) { for (int i = 0; i < typeList.size() - 1; i++) {
TLAType t1 = typeList.get(i); TLAType t1 = typeList.get(i);
...@@ -382,4 +390,13 @@ public class TupleOrFunction extends AbstractHasFollowers { ...@@ -382,4 +390,13 @@ public class TupleOrFunction extends AbstractHasFollowers {
return true; return true;
} }
private static boolean allTyped(List<TLAType> typeList) {
for (int i = 0; i < typeList.size(); i++) {
if (typeList.get(i).isUntyped()) {
return false;
}
}
return true;
}
} }
...@@ -59,39 +59,15 @@ public class TupleType extends AbstractHasFollowers { ...@@ -59,39 +59,15 @@ public class TupleType extends AbstractHasFollowers {
if (o instanceof TupleType) { if (o instanceof TupleType) {
TupleType t = (TupleType) o; TupleType t = (TupleType) o;
if (this.types.size() != t.types.size()) { if (this.types.size() != t.types.size()) {
for (int i = 0; i < t.types.size(); i++) {
if (!compareToAll(t.types.get(i))) {
return false; return false;
} }
}
// both are sequences with different lengths
return true;
}
for (int i = 0; i < types.size(); i++) { for (int i = 0; i < types.size(); i++) {
if (!types.get(i).compare(t.types.get(i))) if (!types.get(i).compare(t.types.get(i)))
return false; return false;
} }
return true; return true;
} }
if (o instanceof FunctionType) {
// TODO
FunctionType func = (FunctionType) o;
if (!(func.getDomain() instanceof IntType)) {
return false;
}
TLAType range = func.getRange();
for (int i = 0; i < types.size(); i++) {
if (types.get(i).compare(range)) {
continue;
} else {
return false;
}
}
if (!compareToAll(range)) {
return false;
}
return true;
}
if (o instanceof TupleOrFunction) { if (o instanceof TupleOrFunction) {
return o.compare(this); return o.compare(this);
} }
...@@ -99,18 +75,6 @@ public class TupleType extends AbstractHasFollowers { ...@@ -99,18 +75,6 @@ public class TupleType extends AbstractHasFollowers {
return false; return false;
} }
private boolean compareToAll(TLAType other) {
for (int i = 0; i < types.size(); i++) {
for (int j = i + 1; j < types.size(); j++) {
if (!types.get(i).compare(types.get(j)))
return false;
}
if (!types.get(i).compare(other))
return false;
}
return true;
}
@Override @Override
public boolean contains(TLAType o) { public boolean contains(TLAType o) {
for (TLAType tlaType : types) { for (TLAType tlaType : types) {
...@@ -149,16 +113,7 @@ public class TupleType extends AbstractHasFollowers { ...@@ -149,16 +113,7 @@ public class TupleType extends AbstractHasFollowers {
} }
if (o instanceof TupleType) { if (o instanceof TupleType) {
TupleType tuple = (TupleType) o; TupleType tuple = (TupleType) o;
if (this.types.size() != tuple.types.size()) {
TLAType t = types.get(0);
for (int i = 1; i < types.size(); i++) {
t = t.unify(types.get(i));
}
for (int i = 0; i < tuple.types.size(); i++) {
t = t.unify(tuple.types.get(i));
}
return new FunctionType(IntType.getInstance(), t);
} else {
for (int i = 0; i < types.size(); i++) { for (int i = 0; i < types.size(); i++) {
TLAType res = types.get(i).unify(tuple.types.get(i)); TLAType res = types.get(i).unify(tuple.types.get(i));
types.set(i, res); types.set(i, res);
...@@ -167,25 +122,7 @@ public class TupleType extends AbstractHasFollowers { ...@@ -167,25 +122,7 @@ public class TupleType extends AbstractHasFollowers {
} }
return this; return this;
} }
}
if (o instanceof FunctionType) {
// TODO
if (compareToAll(new UntypedType())) {
// Function
TLAType t = types.get(0);
for (int i = 1; i < types.size(); i++) {
t = t.unify(types.get(i));
}
FunctionType func = new FunctionType(IntType.getInstance(), t);
this.setFollowersTo(func);
return func.unify(o);
} else {
TLAType res = types.get(1).unify(((FunctionType) o).getRange());
types.set(1, res);
return this;
}
}
if (o instanceof TupleOrFunction) { if (o instanceof TupleOrFunction) {
return o.unify(this); return o.unify(this);
} }
......
This diff is collapsed.
...@@ -308,7 +308,7 @@ public class Translator implements TranslationGlobals { ...@@ -308,7 +308,7 @@ public class Translator implements TranslationGlobals {
} }
Renamer renamer = new Renamer(BAst); Renamer renamer = new Renamer(BAst);
ASTPrettyPrinter aP = new ASTPrettyPrinter(renamer); ASTPrettyPrinter aP = new ASTPrettyPrinter(BAst, renamer);
BAst.apply(aP); BAst.apply(aP);
StringBuilder result = aP.getResultAsStringbuilder(); StringBuilder result = aP.getResultAsStringbuilder();
result.insert(0, "/*@ generated by TLA2B " + VERSION + " " + new Date() result.insert(0, "/*@ generated by TLA2B " + VERSION + " " + new Date()
......
...@@ -36,7 +36,7 @@ public class ExampleFilesTest extends AbstractParseModuleTest { ...@@ -36,7 +36,7 @@ public class ExampleFilesTest extends AbstractParseModuleTest {
Start start = t.translate(); Start start = t.translate();
String resultTree = TestUtil.getTreeAsString(start); String resultTree = TestUtil.getTreeAsString(start);
ASTPrettyPrinter aP = new ASTPrettyPrinter(); ASTPrettyPrinter aP = new ASTPrettyPrinter(start);
start.apply(aP); start.apply(aP);
System.out.println(aP.getResultString()); System.out.println(aP.getResultString());
......
...@@ -17,8 +17,25 @@ public class ExceptTest { ...@@ -17,8 +17,25 @@ public class ExceptTest {
+ "================================="; + "=================================";
final String expected = "MACHINE Testing\n" + "CONSTANTS k\n" final String expected = "MACHINE Testing\n" + "CONSTANTS k\n"
+ "PROPERTIES " + " k : BOOL +-> INTEGER " + "PROPERTIES "
+ "& k = k <+ {TRUE |-> 0, FALSE |-> 0}" + "END"; + "k : BOOL +-> INTEGER & k = (k <+ {(TRUE,0)}) <+ {(FALSE,0)} \n "
+ "END";
compare(expected, module);
}
@Test
public void testFunctionExcept2() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n"
+ "EXTENDS Naturals \n"
+ "CONSTANTS k, k2 \n"
+ "ASSUME k = [i \\in {3} |-> i] /\\ k2 = [k EXCEPT ![3] = @+1, ![3] = @+1] \n"
+ "=================================";
final String expected = "MACHINE Testing\n"
+ "CONSTANTS k, k2\n"
+ "PROPERTIES "
+ "(k : INTEGER +-> INTEGER & k2 : INTEGER +-> INTEGER) & (k = %(i).(i : {3} | i) & k2 = (k <+ {(3,k(3) + 1)}) <+ {(3,(k <+ {(3,k(3) + 1)})(3) + 1)}) \n "
+ "END";
compare(expected, module); compare(expected, module);
} }
...@@ -36,6 +53,21 @@ public class ExceptTest { ...@@ -36,6 +53,21 @@ public class ExceptTest {
+ "END"; + "END";
compare(expected, module); compare(expected, module);
} }
@Test
public void testFunctionTuple() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n"
+ "EXTENDS Naturals \n"
+ "CONSTANTS k \n"
+ "ASSUME k = [i \\in {3,4}, j \\in {5,6} |-> i+j] /\\ k # [k EXCEPT ![3,5] = 1] \n"
+ "=================================";
final String expected = "MACHINE Testing\n" + "CONSTANTS k\n"
+ "PROPERTIES "
+ "k : INTEGER * INTEGER +-> INTEGER & (k = %(i, j).(i : {3, 4} & j : {5, 6} | i + j) & k /= k <+ {((3,5),1)}) \n"
+ "END";
compare(expected, module);
}
@Test @Test
public void testNestedFunctionAt() throws Exception { public void testNestedFunctionAt() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n" final String module = "-------------- MODULE Testing ----------------\n"
...@@ -60,7 +92,7 @@ public class ExceptTest { ...@@ -60,7 +92,7 @@ public class ExceptTest {
final String expected = "MACHINE Testing\n" + "CONSTANTS k\n" final String expected = "MACHINE Testing\n" + "CONSTANTS k\n"
+ "PROPERTIES " + "PROPERTIES "
+ "k : struct(a:INTEGER, b:BOOL) & (k = rec(a:1, b:TRUE) & k /= rec(a:2, b:FALSE))" + "k : struct(a:INTEGER, b:BOOL) & (k = rec(a:1, b:TRUE) & k /= rec(a:rec(a:2, b:k'b)'a, b:FALSE)) \n"
+ "END"; + "END";
compare(expected, module); compare(expected, module);
...@@ -70,13 +102,13 @@ public class ExceptTest { ...@@ -70,13 +102,13 @@ public class ExceptTest {
public void testRecordAt() throws Exception { public void testRecordAt() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n" final String module = "-------------- MODULE Testing ----------------\n"
+ "EXTENDS Naturals \n" + "EXTENDS Naturals \n"
+ "CONSTANTS k \n" + "CONSTANTS k, k2 \n"
+ "ASSUME k = [a |-> 1, b |-> TRUE] /\\ k /= [k EXCEPT !.a = @ + 1] \n" + "ASSUME k = [a |-> 1, b |-> 1] /\\ k2 = [k EXCEPT !.b = @ + 1, !.b = @ + 1] \n"
+ "================================="; + "=================================";
final String expected = "MACHINE Testing\n" + "CONSTANTS k\n" final String expected = "MACHINE Testing\n" + "CONSTANTS k, k2\n"
+ "PROPERTIES " + "PROPERTIES "
+ "k : struct(a:INTEGER, b:BOOL) & (k = rec(a:1, b:TRUE) & k /= rec(a:k'a + 1, b:k'b)) \n" + "(k : struct(a:INTEGER, b:INTEGER) & k2 : struct(a:INTEGER, b:INTEGER)) & (k = rec(a:1, b:1) & k2 = rec(a:rec(a:k'a, b:k'b + 1)'a, b:rec(a:k'a, b:k'b + 1)'b + 1)) \n"
+ "END"; + "END";
compare(expected, module); compare(expected, module);
......
package de.tla2b.prettyprintb;
import static de.tla2b.util.TestUtil.compare;
import org.junit.Test;
public class ExternelFunctionsTest {
@Test
public void testAssert() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n"
+ "EXTENDS TLC \n"
+ "ASSUME Assert(TRUE, \"abc\") \n"
+ "=================================";
final String expected = "MACHINE Testing\n"
+ "DEFINITIONS "
+ "ASSERT_TRUE(P, Msg) == 1 = 1; \n"
+ "EXTERNAL_PREDICATE_ASSERT_TRUE == BOOL * STRING; \n"
+ "PROPERTIES ASSERT_TRUE(TRUE, \"abc\") \n"
+ "END";
compare(expected, module);
}
}
...@@ -53,6 +53,51 @@ public class FunctionTest { ...@@ -53,6 +53,51 @@ public class FunctionTest {
compare(expected, module); compare(expected, module);
} }
@Test
public void testFunctionConstructor4() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n"
+ "EXTENDS Naturals \n"
+ "CONSTANTS k\n"
+ "ASSUME k = [<<x,y>> \\in {1} \\X {2} |-> x + y] \n"
+ "=================================";
final String expected = "MACHINE Testing\n"
+ "CONSTANTS k\n"
+ "PROPERTIES k : INTEGER * INTEGER +-> INTEGER & k = %(x, y).((x,y) : {1} * {2} | x + y) \n"
+ "END";
compare(expected, module);
}
@Test
public void testFunctionConstructorTuple() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n"
+ "EXTENDS Naturals \n"
+ "CONSTANTS k\n"
+ "ASSUME k = [a \\in {1}, <<b,c>> \\in {2} \\X {3} |-> a + b + c] \n"
+ "=================================";
final String expected = "MACHINE Testing\n"
+ "CONSTANTS k\n"
+ "PROPERTIES k : INTEGER * (INTEGER * INTEGER) +-> INTEGER & k = %(a, bc).(a : {1} & bc : {2} * {3} | (a + prj1(INTEGER, INTEGER)(bc)) + prj2(INTEGER, INTEGER)(bc)) \n"
+ "END";
compare(expected, module);
}
@Test
public void testFunctionConstructorSequence() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n"
+ "EXTENDS Naturals \n"
+ "CONSTANTS k\n"
+ "ASSUME k = [<<a>> \\in {<<1>>}, <<b,c>> \\in {2} \\X {3} |-> a + b + c] \n"
+ "=================================";
final String expected = "MACHINE Testing\n"
+ "CONSTANTS k\n"
+ "PROPERTIES k : (INTEGER +-> INTEGER) * (INTEGER * INTEGER) +-> INTEGER & k = %(a, bc).(a : {[1]} & bc : {2} * {3} | (a(1) + prj1(INTEGER, INTEGER)(bc)) + prj2(INTEGER, INTEGER)(bc)) \n"
+ "END";
compare(expected, module);
}
/********************************************************************** /**********************************************************************
* recursive Function * recursive Function
**********************************************************************/ **********************************************************************/
......
...@@ -137,6 +137,39 @@ public class LogicOperatorsTest { ...@@ -137,6 +137,39 @@ public class LogicOperatorsTest {
compare(expected, module); compare(expected, module);
} }
@Test
public void testExistentialQuantifierSequence() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n"
+ "ASSUME \\E <<x>> \\in {<<1>>} : x = 1 \n"
+ "=================================";
final String expected = "MACHINE Testing\n"
+ "PROPERTIES #x.([x] : {[1]} & x = 1) \n"
+ "END";
compare(expected, module);
}
@Test
public void testExistentialQuantifierTuple() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n"
+ "ASSUME \\E <<a,b>> \\in {<<1,TRUE>>} : a = 1 /\\ b = TRUE \n"
+ "=================================";
final String expected = "MACHINE Testing\n"
+ "PROPERTIES #(a,b).((a,b) : {(1,TRUE)} & (a = 1 & b = TRUE)) \n"
+ "END";
compare(expected, module);
}
@Test
public void testExistentialQuantifierAll() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n"
+ "ASSUME \\E <<a,b>> \\in {<<1,TRUE>>}, <<c>> \\in {<<3>>}, d,e \\in {TRUE}: a= 1 /\\ b = TRUE /\\ c = 3 /\\ d = TRUE /\\ e \n"
+ "=================================";
final String expected = "MACHINE Testing\n"
+ "PROPERTIES #(a,b,c,d,e).(((((a,b) : {(1,TRUE)} & [c] : {[3]}) & d : {TRUE}) & e : {TRUE}) & ((((a = 1 & b = TRUE) & c = 3) & d = TRUE) & e = TRUE)) \n"
+ "END";
compare(expected, module);
}
@Test @Test
public void testQuantifier() throws Exception { public void testQuantifier() throws Exception {
final String module = "-------------- MODULE Testing ----------------\n" final String module = "-------------- MODULE Testing ----------------\n"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment