diff --git a/.gitignore b/.gitignore index 98b5964b..c71c9ed2 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,7 @@ bin *.jar *.war *.ear + +# IDEs +.classpath + diff --git a/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java b/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java index 2b641125..39ea0eff 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java +++ b/src/de/dhbwstuttgart/typeinference/unify/RuleSet.java @@ -575,8 +575,9 @@ public class RuleSet implements IRuleSet{ if(pair.getPairOp() == PairOperator.EQUALSDOT && pair.getLhsType() instanceof PlaceholderType) lhsType = (PlaceholderType) pair.getLhsType(); + rhsType = pair.getRhsType(); //PL eingefuegt 2017-09-29 statt !((rhsType = pair.getRhsType()) instanceof PlaceholderType) if(lhsType != null - && !((rhsType = pair.getRhsType()) instanceof PlaceholderType) + //&& !((rhsType = pair.getRhsType()) instanceof PlaceholderType) //PL geloescht am 2017-09-29 Begründung: auch Typvariablen muessen ersetzt werden. && typeMap.get(lhsType) > 1 // The type occurs in more pairs in the set than just the recent pair. && !rhsType.getTypeParams().occurs(lhsType)) { Unifier uni = new Unifier(lhsType, rhsType); @@ -688,7 +689,10 @@ public class RuleSet implements IRuleSet{ @Override public Optional> reduceFunN(UnifyPair pair) { - if(pair.getPairOp() != PairOperator.SMALLERDOT) + if((pair.getPairOp() != PairOperator.SMALLERDOT) + && (pair.getPairOp() != PairOperator.EQUALSDOT)) //PL 2017-10-03 hinzugefuegt + //da Regel auch fuer EQUALSDOT anwendbar + //TODO: fuer allen anderen Relationen noch pruefen return Optional.empty(); UnifyType lhsType = pair.getLhsType(); diff --git a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index be67ea09..af672837 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -73,7 +73,8 @@ public class TypeUnifyTask extends RecursiveTask>> { * @param fc The finite closure * @return The set of all principal type unifiers */ - protected Set> unify(Set eq, IFiniteClosure fc, boolean parallel) { + protected Set> unify(Set eq, IFiniteClosure fc, boolean parallel) { + System.out.println(eq); /* * Step 1: Repeated application of reduce, adapt, erase, swap */ @@ -119,7 +120,10 @@ public class TypeUnifyTask extends RecursiveTask>> { // Sets of the "second level" Set undefinedPairs = new HashSet<>(); Set>>> secondLevelSets = calculatePairSets(eq2s, fc, undefinedPairs); - + //PL 2017-09-20: Im calculatePairSets wird möglicherweise O .< java.lang.Integer + //nicht ausgewertet Faculty Beispiel im 1. Schritt + //PL 2017-10-03 geloest, muesste noch mit FCs mit kleineren + //Typen getestet werden. // If pairs occured that did not match one of the cartesian product cases, // those pairs are contradictory and the unification is impossible. if(!undefinedPairs.isEmpty()) @@ -158,18 +162,23 @@ public class TypeUnifyTask extends RecursiveTask>> { // Flatten the cartesian product Set eqPrime = new HashSet<>(); setToFlatten.stream().forEach(x -> eqPrime.addAll(x)); + System.out.println(eqPrime); /* * Step 5: Substitution */ Optional> eqPrimePrime = rules.subst(eqPrime); - + System.out.println(eq); + System.out.println(eqPrimePrime); /* * Step 6 a) Restart (fork) for pairs where subst was applied */ if(parallel) { - if (eqPrime.equals(eq)) + if //(eqPrime.equals(eq)) //PL 2017-09-29 auskommentiert und durch + (!eqPrimePrime.isPresent()) //PL 2071-09-29 dies ersetzt + //Begruendung: Wenn in der Substitution keine Veraenderung + //(!eqPrimePrime.isPresent()) erfolgt ist, ist das Ergebnis erzielt. eqPrimePrimeSet.add(eqPrime); else if(eqPrimePrime.isPresent()) { TypeUnifyTask fork = new TypeUnifyTask(eqPrimePrime.get(), fc, true); @@ -183,7 +192,10 @@ public class TypeUnifyTask extends RecursiveTask>> { } } else { // sequentiell (Step 6b is included) - if (eqPrime.equals(eq)) + if //(eqPrime.equals(eq)) //PL 2017-09-29 auskommentiert und durch + (!eqPrimePrime.isPresent()) //PL 2071-09-29 dies ersetzt + //Begruendung: Wenn in der Substitution keine Veraenderung + //(!eqPrimePrime.isPresent()) erfolgt ist, ist das Ergebnis erzielt. eqPrimePrimeSet.add(eqPrime); else if(eqPrimePrime.isPresent()) eqPrimePrimeSet.addAll(unify(eqPrimePrime.get(), fc, false)); @@ -440,7 +452,8 @@ public class TypeUnifyTask extends RecursiveTask>> { for(UnifyType c : cs) { Set thetaQs = fc.getChildren(c).stream().collect(Collectors.toCollection(HashSet::new)); - //thetaQs.add(thetaPrime); + thetaQs.add(thetaPrime); //PL 2017-10-03: War auskommentiert habe ich wieder einkommentiert, + //da children offensichtlich ein echtes kleiner und kein kleinergleich ist Set thetaQPrimes = new HashSet<>(); TypeParams cParams = c.getTypeParams(); if(cParams.size() == 0) diff --git a/test/typeinference/JavaTXCompilerTest.java b/test/typeinference/JavaTXCompilerTest.java index 915702dc..b44a710b 100644 --- a/test/typeinference/JavaTXCompilerTest.java +++ b/test/typeinference/JavaTXCompilerTest.java @@ -45,12 +45,12 @@ public class JavaTXCompilerTest { //filesToTest.add(new File(rootDirectory+"Matrix.jav")); //filesToTest.add(new File(rootDirectory+"Import.jav")); JavaTXCompiler compiler = new JavaTXCompiler(fileToTest); - compiler.typeInference(); + List results = compiler.typeInference(); for(File f : compiler.sourceFiles.keySet()){ SourceFile sf = compiler.sourceFiles.get(f); System.out.println(ASTTypePrinter.print(sf)); - List results = compiler.typeInference(); + //List results = compiler.typeInference(); PL 2017-10-03 vor die For-Schleife gezogen assert results.size()>0; for(ResultSet resultSet : results){ Set result = TypeInsertFactory.createTypeInsertPoints(sf, resultSet);