diff --git a/src/de/dhbwstuttgart/typeinference/ConstraintPair.java b/src/de/dhbwstuttgart/typeinference/ConstraintPair.java index f4915139..cadbb845 100644 --- a/src/de/dhbwstuttgart/typeinference/ConstraintPair.java +++ b/src/de/dhbwstuttgart/typeinference/ConstraintPair.java @@ -7,7 +7,7 @@ public class ConstraintPair { public ConstraintPair(ConstraintType t1, ConstraintType t2){ p = new Pair(t1.getType(), t2.getType()); } - + public Pair getPair(){ return p; } diff --git a/src/de/dhbwstuttgart/typeinference/ConstraintsSet.java b/src/de/dhbwstuttgart/typeinference/ConstraintsSet.java index ec32cc37..96beb3be 100755 --- a/src/de/dhbwstuttgart/typeinference/ConstraintsSet.java +++ b/src/de/dhbwstuttgart/typeinference/ConstraintsSet.java @@ -1,123 +1,57 @@ package de.dhbwstuttgart.typeinference; import java.util.Iterator; - -import de.dhbwstuttgart.typeinference.Menge; +import java.util.Vector; +import de.dhbwstuttgart.logger.Logger; import de.dhbwstuttgart.logger.*; import de.dhbwstuttgart.typeinference.unify.Unifier; -interface Constraint{ - -} - -public class ConstraintsSet{ - private UndMenge set = new UndMenge<>(); +public class ConstraintsSet implements Iterable{ private static final Logger log = Logger.getLogger(ConstraintsSet.class.getName()); - - public void add(ConstraintsSet CSet){ - for(KomplexeMenge i : CSet.set.set){ - this.set.addItems(i); - } - } - - public void add(KomplexeMenge constraint){ - this.set.addItems(constraint); - } - - - /* - private UndConstraint constraintsSet; + private Menge constraintsSet; public ConstraintsSet(){ - constraintsSet = new UndConstraint(); + constraintsSet = new Menge(); } public void add(ConstraintsSet CSet){ - constraintsSet.addItems(CSet.getConstraints()); + for(OderConstraint element : CSet) + add(element); } public void add(OderConstraint constraint){ - constraintsSet.addItems(constraint); + constraintsSet.add(constraint); } - public UndConstraint getConstraints(){ - return constraintsSet; - } - */ /** * Liefert alle Constraint-Variationen * @return */ - /* - public Menge> getConstraints(){ - - Menge> ret = new Menge>(); + public Vector> getConstraints(){ + Vector> ret = new Vector>(); for(OderConstraint con : constraintsSet){ ret.add(con.getUndConstraints()); } ret = new KarthesischesProdukt().berechneKarthesischesProdukt(ret); return ret; - } - @Override public String toString(){ - return constraintsSet.toString(); - } - -*/ - /** - * - * @param unify - */ - public void filterWrongConstraints(Unifier unify) { - /* - Menge> newSet = new Menge>(); - for(OderMenge orSet : this.getOrSets()){ - OderMenge filtered = this.filterOrSet(unify, orSet); - newSet.add(filtered); - } - for(KomplexeMenge i : this.set.set){ - newSet.addAll(i.getAndSets()); - } - this.set.set = newSet; - - Menge> newSet = new Menge>(); - for(OderMenge orSet : this.getOrSets()){ - Menge> res = unify.apply(orSet.getItems()); - if(res.size()>0){ - newSet.add(orSet); - }else{ - Logger.getLogger(this.getClass().getName()) - .debug("Ausgesondertes Constraint: "+orSet, Section.TYPEINFERENCE); - } - } - for(KomplexeMenge i : set){ - newSet.addAll(i.getAndSets()); - } - this.set = newSet; - - */ - } - - private OderMenge filterOrSet(Unifier unify, OderMenge orMenge){ - /* - OderMenge ret = new OderMenge(); - for(OderMenge m : orMenge.getOrSets()){ - ret.addItems(this.filterOrSet(unify, m)); - } - for(UndMenge m : orMenge.getAndSets()){ - Menge> res = unify.apply(m.getItems()); - if(res.size()>0){ - ret.addItems(m); - }else{ - Logger.getLogger(this.getClass().getName()) - .debug("Ausgesondertes Constraint: "+m, Section.TYPEINFERENCE); - } + String ret =""; + for(OderConstraint constraint : this){ + ret += constraint.toString()+"\n"; } return ret; - */ - return orMenge; + } + + public Iterator iterator() { + return constraintsSet.iterator(); + } + + public void filterWrongConstraints(Unifier unify) { + for(OderConstraint constraint : this){ + constraint.filterWrongConstraints(unify); + } } /** @@ -125,23 +59,21 @@ public class ConstraintsSet{ * @param unifier */ public void unifyUndConstraints(Unifier unifier) { - /* - Menge uCons = this.filterUndConstraints(); - Menge alleUndConstraints = new Menge<>(); + Vector uCons = this.filterUndConstraints(); + Vector alleUndConstraints = new Vector<>(); for(UndConstraint undConstraint : uCons){ alleUndConstraints.addAll(undConstraint.getConstraintPairs()); } this.filterWrongConstraints( (pairs)->{ - Menge undConstraintsUndPairs = new Menge<>(); + Vector undConstraintsUndPairs = new Vector<>(); undConstraintsUndPairs.addAll(pairs); undConstraintsUndPairs.addAll(alleUndConstraints); log.debug("Versuche Pairs auszusondern:\n"+pairs, Section.TYPEINFERENCE); log.debug("Unifiziere:\n"+undConstraintsUndPairs, Section.TYPEINFERENCE); - Menge> unifyResult = unifier.apply(undConstraintsUndPairs); + Vector> unifyResult = unifier.apply(undConstraintsUndPairs); return unifyResult; }); - */ } /** @@ -149,15 +81,12 @@ public class ConstraintsSet{ * UndConstraints, welche sich nicht innerhalb eines OderConstraints befinden, herausgefiltert * @return [u1, ... , uN] */ - private Menge filterUndConstraints() { - /* - Menge ret = new Menge<>(); + private Vector filterUndConstraints() { + Vector ret = new Vector<>(); for(OderConstraint con : constraintsSet){ UndConstraint filtered = con.filterUndConstraints(); if(filtered != null)ret.add(filtered); } return ret; - */ - return null; } } diff --git a/src/de/dhbwstuttgart/typeinference/OderConstraint.java b/src/de/dhbwstuttgart/typeinference/OderConstraint.java index ca3d2b01..1c734f79 100755 --- a/src/de/dhbwstuttgart/typeinference/OderConstraint.java +++ b/src/de/dhbwstuttgart/typeinference/OderConstraint.java @@ -1,6 +1,6 @@ package de.dhbwstuttgart.typeinference; -import de.dhbwstuttgart.typeinference.Menge; +import java.util.Vector; import de.dhbwstuttgart.logger.Logger; import de.dhbwstuttgart.logger.Section; @@ -10,42 +10,41 @@ import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.typeinference.unify.Unifier; public class OderConstraint{ - private OderMenge oSet = new OderMenge(); - //private Menge oderConstraintPairs; + private Menge oderConstraintPairs; private final static Logger logger = Logger.getLogger(OderConstraint.class.getName()); /** - * Erstellt ein neues Oder Constraint und fügt bereits ein Constraint hinzu. + * Erstellt ein neues Oder Constraint und f�gt bereits ein Constraint hinzu. * @param p1 * @param p2 */ public OderConstraint(ConstraintType p1, ConstraintType p2){ if(p1 == null || p2 == null)throw new NullPointerException(); ConstraintPair constraintPair = new ConstraintPair(p1,p2); + oderConstraintPairs = new Menge(); this.addConstraint(constraintPair); } public OderConstraint(){ + oderConstraintPairs = new Menge(); } /** - * Liefert alle in diesem OderConstraint enthaltene Constraints. Dabei gehen die Verknüpfungen (Oder/Und) verloren. + * Liefert alle in diesem OderConstraint enthaltene Constraints. Dabei gehen die Verkn�pfungen (Oder/Und) verloren. * @return - - public Menge getConstraintPairs(){ - Menge ret = new Menge(); + */ + public Vector getConstraintPairs(){ + Vector ret = new Vector(); for(UndConstraint oC : this.oderConstraintPairs){ ret.addAll(oC.getConstraintPairs()); } return ret; - return this.g } - */ /** - * Fügt ein Pair(p1, p2) dem Constraint hinzu + * F�gt ein Pair(p1, p2) dem Constraint hinzu * @param p1 * @param p2 */ @@ -58,19 +57,37 @@ public class OderConstraint{ * @param toAdd */ public void addConstraint(ConstraintPair toAdd){ - //oderConstraintPairs.add(new SingleConstraint(toAdd)); - this.oSet.addItem(toAdd.getPair()); + oderConstraintPairs.add(new SingleConstraint(toAdd)); } - public void addConstraint(UndConstraint methodConstraint) { - this.oSet.addItems(methodConstraint.getConstraints());//oderConstraintPairs.add(methodConstraint); + + @Override + public String toString(){ + String ret = "["; + for(UndConstraint p : this.getUndConstraints()){ + ret += p.toString()+ "| "; + } + return ret+"]"; } - //TODO: Funktionalität für filter implementieren - void filterWrongConstraints(Unifier unifier) { + public Vector getUndConstraints() { + return this.oderConstraintPairs; /* - Menge filteredConstraints = new Menge<>(); + Vector ret = new Vector(); + for(Pair p : this.getConstraintPairs()){ + ret.add(new UndConstraint(p.TA1,p.TA2)); + } + return ret; + */ + } + + public void addConstraint(UndConstraint methodConstraint) { + oderConstraintPairs.add(methodConstraint); + } + + void filterWrongConstraints(Unifier unifier) { + Vector filteredConstraints = new Vector<>(); for(UndConstraint cons : this.getUndConstraints()){ - Menge> unifierResult = unifier.apply(cons.getItems()); + Vector> unifierResult = unifier.apply(cons.getConstraintPairs()); if(!unifierResult.isEmpty()){ filteredConstraints.add(cons); }else{ @@ -78,42 +95,13 @@ public class OderConstraint{ } } this.oderConstraintPairs = filteredConstraints; - */ } UndConstraint filterUndConstraints() { - return null; - /* if(this.oderConstraintPairs.size()==1){ return this.oderConstraintPairs.firstElement(); } return null; - */ - } - - public void addItems(UndConstraint uCons) { - } - /* - @Override - public String toString(){ - String ret = "["; - for(UndConstraint p : this.getUndConstraints()){ - ret += p.toString()+ " | "; - } - return ret+"]"; - } - - public Menge getUndConstraints() { - return this.set; - - Menge ret = new Menge(); - for(Pair p : this.getConstraintPairs()){ - ret.add(new UndConstraint(p.TA1,p.TA2)); - } - return ret; - - } - */ } diff --git a/src/de/dhbwstuttgart/typeinference/OderMenge.java b/src/de/dhbwstuttgart/typeinference/OderMenge.java index 54cabb65..5d2a3ef9 100644 --- a/src/de/dhbwstuttgart/typeinference/OderMenge.java +++ b/src/de/dhbwstuttgart/typeinference/OderMenge.java @@ -18,10 +18,17 @@ import de.dhbwstuttgart.typeinference.unify.Unifier; * Item */ +interface Mapper{ + B applyOrSet(OderMenge i); + B applyAndSet(UndMenge i); + B applySingle(EinzelElement i); +} + interface KomplexeMenge{ void addItems(KomplexeMenge item); void addItem(A item); Menge> cartesianProduct(); + KomplexeMenge map(Mapper m); } public class OderMenge implements KomplexeMenge{ @@ -85,4 +92,9 @@ public class OderMenge implements KomplexeMenge{ } return ret + "]"; } + + @Override + public KomplexeMenge map(Mapper m) { + return m.applyOrSet(this); + } } diff --git a/src/de/dhbwstuttgart/typeinference/SingleConstraint.java b/src/de/dhbwstuttgart/typeinference/SingleConstraint.java index 491910bc..2ab2e624 100755 --- a/src/de/dhbwstuttgart/typeinference/SingleConstraint.java +++ b/src/de/dhbwstuttgart/typeinference/SingleConstraint.java @@ -1,6 +1,6 @@ package de.dhbwstuttgart.typeinference; -import de.dhbwstuttgart.typeinference.Menge; +import java.util.Vector; import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar; import de.dhbwstuttgart.syntaxtree.type.RefType; @@ -11,51 +11,47 @@ import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException; /** - * Beschreibung von Herrn Plümicke: - * "The set of constraints consists of constraints of the form θ R θ' , where θ and - * θ' are Java types and R (R ∈ { < , { - //private Pair constraintPair; //entspricht θ condition θ' +public class SingleConstraint extends UndConstraint{ + private Pair constraintPair; //entspricht θ condition θ' //private R condition; //entspricht der condition (R) public SingleConstraint(ConstraintType p1, ConstraintType p2){ - super(new ConstraintPair(p1,p2).getPair()); //super(p1,p2); - //ConstraintPair constraintPair = new ConstraintPair(p1,p2);//super.getConstraintPairs().firstElement(); - //this.addConstraint(constraintPair); + ConstraintPair constraintPair = new ConstraintPair(p1,p2);//super.getConstraintPairs().firstElement(); + this.addConstraint(constraintPair); } public SingleConstraint(ConstraintPair toAdd) { - super(toAdd.getPair()); - //this.addConstraint(toAdd); + this.addConstraint(toAdd); } public Pair getPair(){ - return this.cartesianProduct().firstElement().firstElement(); + return constraintPair; } - /* - @Override //Methode überschreiben, damit immer nur ein Menge mit nur einem Element zurückgeliefert wird. - public Menge getConstraintPairs(){ - Menge ret = new Menge(); + @Override //Methode überschreiben, damit immer nur ein Vector mit nur einem Element zurückgeliefert wird. + public Vector getConstraintPairs(){ + Vector ret = new Vector(); ret.add(constraintPair); return ret; } - */ public void addConstraint(ConstraintPair toAdd){ - //if(constraintPair != null)throw new DebugException("Ein Constraint darf nur aus einem ConstraintPair bestehen. Das hinzufügen von "+ toAdd + " ist nicht möglich."); + if(constraintPair != null)throw new DebugException("Ein Constraint darf nur aus einem ConstraintPair bestehen. Das hinzufügen von "+ toAdd + " ist nicht möglich."); Type p1 = toAdd.getPair().TA1; Type p2 = toAdd.getPair().TA2; if(p1==null || p2 == null)throw new NullPointerException(); - this.addItem(toAdd.getPair()); + //Hier werden die GTVs zu TPH gewandelt. //if(p1 instanceof RefType)((RefType)p1).GTV2TPH(); @@ -64,24 +60,22 @@ public class SingleConstraint extends EinzelElement{ //if((p1 instanceof GenericTypeVar))p1 = ((GenericTypeVar)p1).getTypePlaceHolder();//throw new DebugException("GenericTypeVar sind in den Constraints nicht erlaubt");// //if((p2 instanceof GenericTypeVar))p2 = ((GenericTypeVar)p2).getTypePlaceHolder();//throw new DebugException("GenericTypeVar sind in den Constraints nicht erlaubt");// - // BaseTypes werden in RefTypes umgewandelt. Constraints dürfen nur RefTypes oder TypePlaceholder enthalten, da sonst der Unify-Algorithmus nicht funktioniert. + // BaseTypes werden in RefTypes umgewandelt. Constraints dürfen nur RefTypes oder TypePlaceholder enthalten, da sonst der Unify-Algorithmus nicht funktioniert. //if(!(p1 instanceof RefType) && !(p1 instanceof TypePlaceholder) && !(p1 instanceof GenericTypeVar))p1 = new RefType(p1); //if(!(p2 instanceof RefType) && !(p2 instanceof TypePlaceholder) && !(p2 instanceof GenericTypeVar))p2 = new RefType(p2); //if(!(TypePlaceholder.class.isInstance(p1)) || !(RefType.class.isInstance(p1)) || !(TypePlaceholder.class.isInstance(p2)) || !(RefType.class.isInstance(p2))) - //{//Wenn die beiden übergebenen Typen weder RefTypes noch TypePlaceholder sind: + //{//Wenn die beiden übergebenen Typen weder RefTypes noch TypePlaceholder sind: // throw new TypinferenzException("Ein Constraint darf nur aus TypePlaceholdern und Reftypes bestehen"); //} //if(!(p1 instanceof RefType) && !(p1 instanceof TypePlaceholder))throw new DebugException("Fehler: "+p2+" kann nicht in TPH oder RefType umgewandelt werden"); //if(!(p2 instanceof RefType) && !(p2 instanceof TypePlaceholder))throw new DebugException("Fehler: "+p2+" kann nicht in TPH oder RefType umgewandelt werden"); - //constraintPair = new Pair(p1,p2); + constraintPair = new Pair(p1,p2); } - /* @Override public String toString(){ return ""+constraintPair.TA1.toString()+" < "+constraintPair.TA2.toString(); } - */ } diff --git a/src/de/dhbwstuttgart/typeinference/UndConstraint.java b/src/de/dhbwstuttgart/typeinference/UndConstraint.java index 99ef38b4..6dd7ec14 100755 --- a/src/de/dhbwstuttgart/typeinference/UndConstraint.java +++ b/src/de/dhbwstuttgart/typeinference/UndConstraint.java @@ -1,57 +1,43 @@ package de.dhbwstuttgart.typeinference; -import java.util.Iterator; +import java.util.Vector; -import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.syntaxtree.type.Type; import de.dhbwstuttgart.typeinference.unify.Unifier; /** - * Stellt ein Constraint dar, welches aus mehreren Constraint-Paaren besteht. Diese gelten alle stets gleichzeitig / sind per "Und" miteinander verknüpft. + * Stellt ein Constraint dar, welches aus mehreren Constraint-Paaren besteht. Diese gelten alle stets gleichzeitig / sind per "Und" miteinander verknüpft. * @author janulrich * */ -public class UndConstraint{ +public class UndConstraint extends OderConstraint { - private UndMenge uSet = new UndMenge(); - public UndConstraint(ConstraintType p1, ConstraintType p2) { - //super(p1, p2); - this.uSet.addItem(new SingleConstraint(p1,p2).getPair()); + super(p1, p2); } public UndConstraint() { super(); } - UndMenge getConstraints(){ - return uSet; - } - - /* @Override - public Menge getUndConstraints() { - Menge ret = new Menge(); + public Vector getUndConstraints() { + Vector ret = new Vector(); ret.add(this); return ret; } - */ @Override public String toString(){ //String ret = super.toString(); //return ret.replace('|', ','); - /* String ret = "["; - for(Pair p : this.uSet.getItems()){ + for(Pair p : this.getConstraintPairs()){ ret += p.toString()+ ", "; } return ret+"]"; - */ - return uSet.toString(); } - /* @Override void filterWrongConstraints(Unifier unifier) { //In einem UndConstraint gibt es keine falschen Constraints @@ -61,18 +47,4 @@ public class UndConstraint{ UndConstraint filterUndConstraints(){ return this; } - - - @Override - public Iterator iterator() { - return this.uSet.getItems().iterator(); - } - */ - public void addConstraint(ConstraintType type, ConstraintType type2) { - this.uSet.addItem(new ConstraintPair(type,type2).getPair()); - } - - public void addConstraint(ConstraintPair constraintPair) { - this.uSet.addItem(constraintPair.getPair()); - } } diff --git a/src/de/dhbwstuttgart/typeinference/unify/Unify.java b/src/de/dhbwstuttgart/typeinference/unify/Unify.java index c44633fe..5ddca360 100755 --- a/src/de/dhbwstuttgart/typeinference/unify/Unify.java +++ b/src/de/dhbwstuttgart/typeinference/unify/Unify.java @@ -638,9 +638,9 @@ public class Unify for(Menge pairs : vecvecpair){ UndConstraint uCons = new UndConstraint(); for(Pair p : pairs){ - uCons.addItem(p); + uCons.addConstraint(new ConstraintPair(p)); } - orConstraints.addItems(uCons); + orConstraints.addConstraint(uCons); } cSet.addItems(orConstraints); }