forked from JavaTX/JavaCompilerCore
.
This commit is contained in:
parent
05187aa49f
commit
b0153be1cd
@ -14,3 +14,15 @@
|
|||||||
/*
|
/*
|
||||||
* Test b <. a, a <. b
|
* Test b <. a, a <. b
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- Equals der Typen schreiben um instanceof Prüfungen zu vermeiden
|
||||||
|
|
||||||
|
|
||||||
|
SPEED UP
|
||||||
|
- Anwendungsreihenfolge der Regeln (wahrscheinlichste zuerst, evtl ist nach regel 1 regel 2 nie möglich etc...)
|
||||||
|
- Erase vor Reduce
|
||||||
|
- Rechenarm vor rechenintensiv
|
@ -0,0 +1,5 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify.interfaces;
|
||||||
|
|
||||||
|
public interface IFiniteClosure {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unify.interfaces;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
|
|
||||||
|
public interface ITypeMapper<T> {
|
||||||
|
|
||||||
|
}
|
31
src/de/dhbwstuttgart/typeinference/unifynew/TypeMapper.java
Normal file
31
src/de/dhbwstuttgart/typeinference/unifynew/TypeMapper.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unifynew;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.Type;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: Ist es möglich das Mapping austauschbar zu machen indem man ein IMapper Interface erstellt?
|
||||||
|
* Zu einem späteren Zeitpunkt prüfen.
|
||||||
|
*
|
||||||
|
* interface IMapper<T>
|
||||||
|
* Menge<T> createMapping(Menge<Type>)
|
||||||
|
* Menge<Type> resolveMapping(Menge<T>)
|
||||||
|
* bool isTPH(T)
|
||||||
|
* bool isSimpleType(T)
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Mapping Pair To long
|
||||||
|
*
|
||||||
|
* 0-1 Pair Operator
|
||||||
|
* 2-3 LHS type (00 = Simple, 01 = extends, 02 = super, 03 = function)
|
||||||
|
* 4-5 RHS type (00 = Simple, 01 = extends, 02 = super, 03 = function)
|
||||||
|
* 6-35 LHS Simple Type (500.000.000 possible simple types)
|
||||||
|
* 36-64 RHS Simple Type (500.000.000 possible simple types)
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class TypeMapper {
|
||||||
|
public int[] createMapping(Iterable<Type> types) {
|
||||||
|
return new int[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
68
src/de/dhbwstuttgart/typeinference/unifynew/Unify.java
Normal file
68
src/de/dhbwstuttgart/typeinference/unifynew/Unify.java
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
package de.dhbwstuttgart.typeinference.unifynew;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.Menge;
|
||||||
|
import de.dhbwstuttgart.typeinference.Pair;
|
||||||
|
import de.dhbwstuttgart.typeinference.exceptions.NotImplementedException;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typinference.unify.model.MPair;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementierung des Unifikationsalgorithmus.
|
||||||
|
* @author Florian Steurer
|
||||||
|
*/
|
||||||
|
public class Unify {
|
||||||
|
|
||||||
|
public Menge<Menge<Pair>> unify(Menge<Pair> eq, IFiniteClosure fc) {
|
||||||
|
/*
|
||||||
|
* Preparations: Create Mapping
|
||||||
|
*/
|
||||||
|
Set<MPair> eq0 = null;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 1: Repeated application of reduce, adapt, erase, swap
|
||||||
|
*/
|
||||||
|
Set<MPair> eq1 = applyTypeUnificationRules(eq0, fc);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 2: Create subset of pairs where both sides are TPH
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 3: Create subset of pairs that where not included in Step 2
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 4: Magic
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 5: Repeated substitution
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 6: a) Restart for pairs where subst was applied
|
||||||
|
* b) Union over everything
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 7: Filter result for solved pairs
|
||||||
|
*/
|
||||||
|
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<MPair> applyTypeUnificationRules(Set<MPair> eq, IFiniteClosure fc) {
|
||||||
|
|
||||||
|
boolean changedInLastIteration = true;
|
||||||
|
|
||||||
|
HashSet<MPair>
|
||||||
|
|
||||||
|
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.interfaces.IFiniteClosure;
|
||||||
|
|
||||||
|
public class FiniteClosure implements IFiniteClosure {
|
||||||
|
|
||||||
|
}
|
22
src/de/dhbwstuttgart/typinference/unify/model/MPair.java
Normal file
22
src/de/dhbwstuttgart/typinference/unify/model/MPair.java
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.Pair.PairOperator;
|
||||||
|
|
||||||
|
public class MPair {
|
||||||
|
|
||||||
|
public final MType TYPE_1;
|
||||||
|
public final MType TYPE_2;
|
||||||
|
public final PairOperator PAIR_OP;
|
||||||
|
|
||||||
|
public MPair(MType t1, MType t2) {
|
||||||
|
TYPE_1 = t1;
|
||||||
|
TYPE_2 = t2;
|
||||||
|
PAIR_OP = PairOperator.SmallerExtends;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MPair(MType t1, MType t2, PairOperator pairOp) {
|
||||||
|
TYPE_1 = t1;
|
||||||
|
TYPE_2 = t2;
|
||||||
|
PAIR_OP = pairOp;
|
||||||
|
}
|
||||||
|
}
|
84
src/de/dhbwstuttgart/typinference/unify/model/MType.java
Normal file
84
src/de/dhbwstuttgart/typinference/unify/model/MType.java
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
package de.dhbwstuttgart.typinference.unify.model;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.typeinference.exceptions.NotImplementedException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author DH10STF
|
||||||
|
*
|
||||||
|
* SPEEDUP
|
||||||
|
* - Caching of the results
|
||||||
|
*/
|
||||||
|
public class MType {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* First three bits indicate the meta type:
|
||||||
|
* 000b = 0 = Simpletype
|
||||||
|
* 001b = 1 = Extends
|
||||||
|
* 010b = 2 = Super
|
||||||
|
* 011b = 3 = Type Placeholder
|
||||||
|
* 100b = 4 = Function
|
||||||
|
*
|
||||||
|
* Advantages of using a unique identifier for mapping:
|
||||||
|
* - Fast checks (Equality and Membership)
|
||||||
|
* - Perfect Hashing
|
||||||
|
*/
|
||||||
|
private int identifier = 0;
|
||||||
|
|
||||||
|
private int[] typeArgs = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to mask the first three bits of an integer.
|
||||||
|
* -53870912d == 1110000...00b
|
||||||
|
*/
|
||||||
|
private final int mask = -53870912;
|
||||||
|
|
||||||
|
public MType(int identifier, int...typeArgs) {
|
||||||
|
this.identifier = identifier;
|
||||||
|
|
||||||
|
if(typeArgs.length != 0) {
|
||||||
|
this.typeArgs = Arrays.copyOf(typeArgs, typeArgs.length);
|
||||||
|
Arrays.sort(typeArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSimpleType() {
|
||||||
|
return (identifier & mask) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isExtendsType() {
|
||||||
|
return (identifier & mask) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSuperType() {
|
||||||
|
return (identifier & mask) == 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTypePlaceholder() {
|
||||||
|
return (identifier & mask) == 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isFunctionType() {
|
||||||
|
return (identifier & mask) == 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getIdentifier() {
|
||||||
|
return identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if(!(obj instanceof MType))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return super.hashCode();
|
||||||
|
}
|
||||||
|
}
|
@ -18,7 +18,6 @@ public class UnifyTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void unifyTestSimpleTypes() {
|
public void unifyTestSimpleTypes() {
|
||||||
|
|
||||||
// Init Factories and Builders
|
// Init Factories and Builders
|
||||||
UnifyTypeFactory typeFactory = new UnifyTypeFactory();
|
UnifyTypeFactory typeFactory = new UnifyTypeFactory();
|
||||||
Unify_FC_TTO_Builder fcBuilder = new Unify_FC_TTO_Builder();
|
Unify_FC_TTO_Builder fcBuilder = new Unify_FC_TTO_Builder();
|
||||||
|
Loading…
Reference in New Issue
Block a user