getConstraints() eingeführt

This commit is contained in:
JanUlrich 2017-03-06 17:59:01 +01:00
parent a44baeaa34
commit 4c4c0d5ada
61 changed files with 732 additions and 517 deletions

View File

@ -2,6 +2,9 @@ package de.dhbwstuttgart.core;
import de.dhbwstuttgart.parser.JavaTXParser; import de.dhbwstuttgart.parser.JavaTXParser;
import de.dhbwstuttgart.syntaxtree.SourceFile; import de.dhbwstuttgart.syntaxtree.SourceFile;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -13,7 +16,10 @@ public class JavaTXCompiler {
private List<SourceFile> sourceFiles = new ArrayList<>(); private List<SourceFile> sourceFiles = new ArrayList<>();
public void typeInference(){ public void typeInference(){
ConstraintSet cons = new ConstraintSet();
for(SourceFile sf : sourceFiles){
cons.addAll(sf.getConstraints(new TypeInferenceInformation()));
}
} }
public void parse(File sourceFile) throws IOException, ClassNotFoundException { public void parse(File sourceFile) throws IOException, ClassNotFoundException {

View File

@ -203,12 +203,28 @@ public class SyntaxTreeGenerator{
JavaClassName name = convert(ctx.Identifier()); JavaClassName name = convert(ctx.Identifier());
Block class_block = null; Block class_block = null;
List<Field> fielddecl = convertFields(ctx.classBody()); List<Field> fielddecl = convertFields(ctx.classBody());
List<Method> methods = convertMethods(ctx.classBody());
GenericDeclarationList genericClassParameters = null; GenericDeclarationList genericClassParameters = null;
Token offset = ctx.getStart(); Token offset = ctx.getStart();
RefTypeOrTPH superClass = null; RefTypeOrTPH superClass = null;
Boolean isInterface = false; Boolean isInterface = false;
List<RefTypeOrTPH> implementedInterfaces = null; List<RefTypeOrTPH> implementedInterfaces = null;
return new ClassOrInterface(modifiers, name, fielddecl, genericClassParameters, superClass, isInterface, implementedInterfaces, offset); return new ClassOrInterface(modifiers, name, fielddecl, methods, genericClassParameters, superClass, isInterface, implementedInterfaces, offset);
}
private List<Method> convertMethods(Java8Parser.ClassBodyContext classBodyContext) {
List<Method> ret = new ArrayList<>();
for(Java8Parser.ClassBodyDeclarationContext classMember : classBodyContext.classBodyDeclaration()){
if(classMember.classMemberDeclaration() != null){
Java8Parser.ClassMemberDeclarationContext classMemberDeclarationContext = classMember.classMemberDeclaration();
if(classMemberDeclarationContext.fieldDeclaration() != null){
//Do nothing!
}else if(classMemberDeclarationContext.methodDeclaration()!= null){
ret.add(convert(classMemberDeclarationContext.methodDeclaration()));
}
}
}
return ret;
} }
private List<Field> convertFields(Java8Parser.ClassBodyContext classBodyContext) { private List<Field> convertFields(Java8Parser.ClassBodyContext classBodyContext) {
@ -219,7 +235,7 @@ public class SyntaxTreeGenerator{
if(classMemberDeclarationContext.fieldDeclaration() != null){ if(classMemberDeclarationContext.fieldDeclaration() != null){
ret.addAll(convert(classMember.classMemberDeclaration().fieldDeclaration())); ret.addAll(convert(classMember.classMemberDeclaration().fieldDeclaration()));
}else if(classMemberDeclarationContext.methodDeclaration()!= null){ }else if(classMemberDeclarationContext.methodDeclaration()!= null){
ret.add(convert(classMemberDeclarationContext.methodDeclaration())); //Do nothing!
} }
} }
} }
@ -550,7 +566,7 @@ public class SyntaxTreeGenerator{
}else{// if(methodInvocationContext.Identifier() != null){ }else{// if(methodInvocationContext.Identifier() != null){
name = methodInvocationContext.Identifier().getText(); name = methodInvocationContext.Identifier().getText();
} }
Expr receiver; Expression receiver;
if(methodInvocationContext.typeName() != null){ if(methodInvocationContext.typeName() != null){
receiver = new LocalOrFieldVarOrClassname(methodInvocationContext.typeName().getText(), methodInvocationContext.typeName().getStart()); receiver = new LocalOrFieldVarOrClassname(methodInvocationContext.typeName().getText(), methodInvocationContext.typeName().getStart());
}else if(methodInvocationContext.expressionName()!=null){ }else if(methodInvocationContext.expressionName()!=null){
@ -566,7 +582,7 @@ public class SyntaxTreeGenerator{
return ret; return ret;
} }
private Expr convert(Java8Parser.ExpressionNameContext expressionNameContext) { private Expression convert(Java8Parser.ExpressionNameContext expressionNameContext) {
/* /*
Der Parser könnte feststellen, ob es sich um einen Klassennamen, Der Parser könnte feststellen, ob es sich um einen Klassennamen,
eine lokale Variable oder einen Feldzugriff handelt. eine lokale Variable oder einen Feldzugriff handelt.
@ -583,12 +599,12 @@ public class SyntaxTreeGenerator{
throw new NotImplementedException(); throw new NotImplementedException();
} }
private ExprStmt convert(Java8Parser.PreIncrementExpressionContext stmt) { private Statement convert(Java8Parser.PreIncrementExpressionContext stmt) {
//TODO //TODO
throw new NotImplementedException(); throw new NotImplementedException();
} }
private ExprStmt convert(Java8Parser.PreDecrementExpressionContext stmt) { private Statement convert(Java8Parser.PreDecrementExpressionContext stmt) {
//TODO //TODO
throw new NotImplementedException(); throw new NotImplementedException();
} }
@ -603,10 +619,13 @@ public class SyntaxTreeGenerator{
throw new NotImplementedException(); throw new NotImplementedException();
} }
private ExprStmt convert(Java8Parser.AssignmentContext stmt) { private Statement convert(Java8Parser.AssignmentContext stmt) {
//TODO LocalOrFieldVar leftHandSide = convert(stmt.leftHandSide());
//return new StatementReturn(new Assign()) return new Assign(leftHandSide, convert(stmt.expression()), stmt.getStart());
throw new NotImplementedException(); }
private LocalOrFieldVar convert(Java8Parser.LeftHandSideContext leftHandSide) {
return new LocalOrFieldVar(leftHandSide.toString(), leftHandSide.getStart());
} }
private Statement convert(Java8Parser.IfThenStatementContext stmt){ private Statement convert(Java8Parser.IfThenStatementContext stmt){
@ -775,7 +794,7 @@ public class SyntaxTreeGenerator{
***************+ Expression Conversions: ***************+ Expression Conversions:
*/ */
private Expr convert(Java8Parser.ExpressionContext expression) { private Expression convert(Java8Parser.ExpressionContext expression) {
if(expression.lambdaExpression()!=null){ if(expression.lambdaExpression()!=null){
return convert(expression.lambdaExpression()); return convert(expression.lambdaExpression());
}else{ }else{
@ -783,7 +802,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.AssignmentExpressionContext expression) { private Expression convert(Java8Parser.AssignmentExpressionContext expression) {
if(expression.conditionalExpression() != null){ if(expression.conditionalExpression() != null){
return convert(expression.conditionalExpression()); return convert(expression.conditionalExpression());
}else{ }else{
@ -791,7 +810,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.ConditionalExpressionContext expression) { private Expression convert(Java8Parser.ConditionalExpressionContext expression) {
if(expression.conditionalOrExpression() != null){ if(expression.conditionalOrExpression() != null){
return convert(expression.conditionalOrExpression()); return convert(expression.conditionalOrExpression());
}else{ }else{
@ -799,7 +818,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.ConditionalOrExpressionContext expression) { private Expression convert(Java8Parser.ConditionalOrExpressionContext expression) {
if(expression.conditionalOrExpression() == null){ if(expression.conditionalOrExpression() == null){
return convert(expression.conditionalAndExpression()); return convert(expression.conditionalAndExpression());
}else{ }else{
@ -808,7 +827,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.ConditionalAndExpressionContext expression) { private Expression convert(Java8Parser.ConditionalAndExpressionContext expression) {
if(expression.conditionalAndExpression() == null){ if(expression.conditionalAndExpression() == null){
return convert(expression.inclusiveOrExpression()); return convert(expression.inclusiveOrExpression());
}else{ }else{
@ -817,7 +836,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.InclusiveOrExpressionContext expression) { private Expression convert(Java8Parser.InclusiveOrExpressionContext expression) {
if(expression.inclusiveOrExpression() == null){ if(expression.inclusiveOrExpression() == null){
return convert(expression.exclusiveOrExpression()); return convert(expression.exclusiveOrExpression());
}else{ }else{
@ -825,7 +844,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.ExclusiveOrExpressionContext expression) { private Expression convert(Java8Parser.ExclusiveOrExpressionContext expression) {
if(expression.exclusiveOrExpression() == null){ if(expression.exclusiveOrExpression() == null){
return convert(expression.andExpression()); return convert(expression.andExpression());
}else{ }else{
@ -833,7 +852,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.AndExpressionContext expression) { private Expression convert(Java8Parser.AndExpressionContext expression) {
if(expression.andExpression() == null){ if(expression.andExpression() == null){
return convert(expression.equalityExpression()); return convert(expression.equalityExpression());
}else{ }else{
@ -841,7 +860,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.EqualityExpressionContext expression) { private Expression convert(Java8Parser.EqualityExpressionContext expression) {
if(expression.equalityExpression() == null){ if(expression.equalityExpression() == null){
return convert(expression.relationalExpression()); return convert(expression.relationalExpression());
}else{ }else{
@ -849,7 +868,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.RelationalExpressionContext expression) { private Expression convert(Java8Parser.RelationalExpressionContext expression) {
if(expression.relationalExpression() == null){ if(expression.relationalExpression() == null){
return convert(expression.shiftExpression()); return convert(expression.shiftExpression());
}else{ }else{
@ -857,7 +876,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.ShiftExpressionContext expression) { private Expression convert(Java8Parser.ShiftExpressionContext expression) {
if(expression.shiftExpression() == null){ if(expression.shiftExpression() == null){
return convert(expression.additiveExpression()); return convert(expression.additiveExpression());
}else{ }else{
@ -865,7 +884,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.AdditiveExpressionContext expression) { private Expression convert(Java8Parser.AdditiveExpressionContext expression) {
if(expression.additiveExpression() == null){ if(expression.additiveExpression() == null){
return convert(expression.multiplicativeExpression()); return convert(expression.multiplicativeExpression());
}else{ }else{
@ -873,7 +892,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.MultiplicativeExpressionContext expression) { private Expression convert(Java8Parser.MultiplicativeExpressionContext expression) {
if(expression.multiplicativeExpression() == null){ if(expression.multiplicativeExpression() == null){
return convert(expression.unaryExpression()); return convert(expression.unaryExpression());
}else{ }else{
@ -881,7 +900,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.UnaryExpressionContext expression) { private Expression convert(Java8Parser.UnaryExpressionContext expression) {
if(expression.preIncrementExpression() != null){ if(expression.preIncrementExpression() != null){
return convert(expression.preIncrementExpression()); return convert(expression.preIncrementExpression());
}else if(expression.preDecrementExpression() != null){ }else if(expression.preDecrementExpression() != null){
@ -899,7 +918,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.UnaryExpressionNotPlusMinusContext expression) { private Expression convert(Java8Parser.UnaryExpressionNotPlusMinusContext expression) {
if(expression.postfixExpression() != null){ if(expression.postfixExpression() != null){
return convert(expression.postfixExpression()); return convert(expression.postfixExpression());
}else if(expression.castExpression() != null){ }else if(expression.castExpression() != null){
@ -909,12 +928,12 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.CastExpressionContext expressionContext) { private Expression convert(Java8Parser.CastExpressionContext expressionContext) {
throw new NotImplementedException(); throw new NotImplementedException();
} }
private Expr convert(Java8Parser.PostfixExpressionContext expression) { private Expression convert(Java8Parser.PostfixExpressionContext expression) {
Expr expr; Expression expr;
if(expression.primary() != null){ if(expression.primary() != null){
expr = convert(expression.primary()); expr = convert(expression.primary());
}else{ }else{
@ -935,8 +954,8 @@ public class SyntaxTreeGenerator{
return expr; return expr;
} }
private Expr convert(Java8Parser.PrimaryContext primary) { private Expression convert(Java8Parser.PrimaryContext primary) {
Expr expr; Expression expr;
if(primary.primaryNoNewArray_lfno_primary()!=null){ if(primary.primaryNoNewArray_lfno_primary()!=null){
expr = convert(primary.primaryNoNewArray_lfno_primary()); expr = convert(primary.primaryNoNewArray_lfno_primary());
}else{ }else{
@ -951,11 +970,11 @@ public class SyntaxTreeGenerator{
return expr; return expr;
} }
private Expr convert(Java8Parser.ArrayCreationExpressionContext expression) { private Expression convert(Java8Parser.ArrayCreationExpressionContext expression) {
throw new NotImplementedException(); throw new NotImplementedException();
} }
private Expr convert(Java8Parser.PrimaryNoNewArray_lfno_primaryContext expression) { private Expression convert(Java8Parser.PrimaryNoNewArray_lfno_primaryContext expression) {
if(expression.literal() != null){ if(expression.literal() != null){
return convert(expression.literal()); return convert(expression.literal());
}else if(expression.expression()!=null){ }else if(expression.expression()!=null){
@ -967,7 +986,7 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.LiteralContext literal) { private Expression convert(Java8Parser.LiteralContext literal) {
/*if(literal.IntegerLiteral() != null){ /*if(literal.IntegerLiteral() != null){
RefType type = new RefType(reg.getName("java.lang.Integer"),literal.getStart()); RefType type = new RefType(reg.getName("java.lang.Integer"),literal.getStart());
@ -1005,14 +1024,14 @@ public class SyntaxTreeGenerator{
} }
} }
private Expr convert(Java8Parser.MethodInvocation_lfno_primaryContext methodInvocationContext) { private Expression convert(Java8Parser.MethodInvocation_lfno_primaryContext methodInvocationContext) {
String name; String name;
if(methodInvocationContext.methodName()!=null){ if(methodInvocationContext.methodName()!=null){
name = methodInvocationContext.methodName().Identifier().getText(); name = methodInvocationContext.methodName().Identifier().getText();
}else{// if(methodInvocationContext.Identifier() != null){ }else{// if(methodInvocationContext.Identifier() != null){
name = methodInvocationContext.Identifier().getText(); name = methodInvocationContext.Identifier().getText();
} }
Expr receiver; Expression receiver;
if(methodInvocationContext.typeName() != null){ if(methodInvocationContext.typeName() != null){
receiver = new LocalOrFieldVarOrClassname(methodInvocationContext.typeName().getText(), methodInvocationContext.typeName().getStart()); receiver = new LocalOrFieldVarOrClassname(methodInvocationContext.typeName().getText(), methodInvocationContext.typeName().getStart());
}else if(methodInvocationContext.expressionName()!=null){ }else if(methodInvocationContext.expressionName()!=null){
@ -1026,7 +1045,7 @@ public class SyntaxTreeGenerator{
return ret; return ret;
} }
private static Expr convert(Java8Parser.LambdaExpressionContext expression) { private static Expression convert(Java8Parser.LambdaExpressionContext expression) {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View File

@ -4,9 +4,13 @@ import de.dhbwstuttgart.core.IItemWithOffset;
import de.dhbwstuttgart.typecheck.JavaClassName; import de.dhbwstuttgart.typecheck.JavaClassName;
import de.dhbwstuttgart.syntaxtree.modifier.Modifiers; import de.dhbwstuttgart.syntaxtree.modifier.Modifiers;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
@ -15,14 +19,15 @@ import java.util.List;
public class ClassOrInterface extends GTVDeclarationContext implements IItemWithOffset, Generic{ public class ClassOrInterface extends GTVDeclarationContext implements IItemWithOffset, Generic{
protected Modifiers modifiers; protected Modifiers modifiers;
protected JavaClassName name; protected JavaClassName name;
private List<Field> fielddecl = new ArrayList<>(); private List<Field> fields = new ArrayList<>();
private List<Method> methods = new ArrayList<>();
private GenericDeclarationList genericClassParameters; private GenericDeclarationList genericClassParameters;
private Token offset; private Token offset;
private RefTypeOrTPH superClass; private RefTypeOrTPH superClass;
protected boolean isInterface; protected boolean isInterface;
private List<RefTypeOrTPH> implementedInterfaces; private List<RefTypeOrTPH> implementedInterfaces;
public ClassOrInterface(Modifiers modifiers, JavaClassName name, List<Field> fielddecl, GenericDeclarationList genericClassParameters, public ClassOrInterface(Modifiers modifiers, JavaClassName name, List<Field> fielddecl, List<Method> methods, GenericDeclarationList genericClassParameters,
RefTypeOrTPH superClass, Boolean isInterface, List<RefTypeOrTPH> implementedInterfaces, Token offset){ RefTypeOrTPH superClass, Boolean isInterface, List<RefTypeOrTPH> implementedInterfaces, Token offset){
super(offset); super(offset);
if(modifiers != null){ if(modifiers != null){
@ -32,7 +37,7 @@ public class ClassOrInterface extends GTVDeclarationContext implements IItemWith
this.name = name; this.name = name;
} }
if(fielddecl != null){ if(fielddecl != null){
this.fielddecl = fielddecl; this.fields = fielddecl;
} }
if(genericClassParameters != null){ if(genericClassParameters != null){
this.genericClassParameters = genericClassParameters; this.genericClassParameters = genericClassParameters;
@ -45,6 +50,7 @@ public class ClassOrInterface extends GTVDeclarationContext implements IItemWith
if(implementedInterfaces != null){ if(implementedInterfaces != null){
this.implementedInterfaces = implementedInterfaces; this.implementedInterfaces = implementedInterfaces;
} }
this.methods = methods;
} }
// Gets class name // Gets class name
@ -58,7 +64,17 @@ public class ClassOrInterface extends GTVDeclarationContext implements IItemWith
} }
public List<Field> getFieldDecl(){ public List<Field> getFieldDecl(){
return this.fielddecl; return this.fields;
}
public List<Method> getMethods(){
return this.methods;
} }
public ConstraintSet getConstraints(TypeInferenceInformation info) {
ConstraintSet ret = new ConstraintSet();
for(Method m : this.getMethods()){
m.getConstraints(info);
}
return ret;
}
} }

View File

@ -1,9 +1,9 @@
package de.dhbwstuttgart.syntaxtree; package de.dhbwstuttgart.syntaxtree;
import de.dhbwstuttgart.syntaxtree.modifier.fieldModifier.FieldModifier; import de.dhbwstuttgart.syntaxtree.modifier.fieldModifier.FieldModifier;
import de.dhbwstuttgart.syntaxtree.statement.Expression;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import de.dhbwstuttgart.syntaxtree.statement.Expr;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import java.util.List; import java.util.List;
@ -16,13 +16,13 @@ import java.util.List;
*/ */
public class FieldDeclaration extends Field{ public class FieldDeclaration extends Field{
private Expr wert; private Expression wert;
/** /**
* Dieser Konstruktor der FieldDeclaration erstellt den Syntaxknoten vollständig. * Dieser Konstruktor der FieldDeclaration erstellt den Syntaxknoten vollständig.
* Kein nachträgliches hinzfügen von Informationen oder aufrufen von parserPostProcessing ist notwendig. * Kein nachträgliches hinzfügen von Informationen oder aufrufen von parserPostProcessing ist notwendig.
*/ */
public FieldDeclaration(String name, RefTypeOrTPH typ, List<FieldModifier> modifier, Expr value, Token offset){ public FieldDeclaration(String name, RefTypeOrTPH typ, List<FieldModifier> modifier, Expression value, Token offset){
super(name, typ, modifier, offset);//Dieser Deklarator wird nicht vom Parser aufgerufen. Dadurch gibt es auch keinen Offset super(name, typ, modifier, offset);//Dieser Deklarator wird nicht vom Parser aufgerufen. Dadurch gibt es auch keinen Offset
this.wert = value; this.wert = value;
} }

View File

@ -6,6 +6,9 @@ import java.util.List;
import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.NullToken;
import de.dhbwstuttgart.syntaxtree.modifier.methodModifier.MethodModifier; import de.dhbwstuttgart.syntaxtree.modifier.methodModifier.MethodModifier;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import de.dhbwstuttgart.core.IItemWithOffset; import de.dhbwstuttgart.core.IItemWithOffset;
@ -38,4 +41,10 @@ public class Method extends Field implements IItemWithOffset
this.block = block; this.block = block;
} }
public ConstraintSet getConstraints(TypeInferenceInformation info) {
ConstraintSet ret = new ConstraintSet();
info.setMethodContext(this);
ret.addAll(block.getConstraints(info));
return ret;
}
} }

View File

@ -3,7 +3,11 @@ import java.util.*;
import de.dhbwstuttgart.parser.NullToken; import de.dhbwstuttgart.parser.NullToken;
import de.dhbwstuttgart.parser.antlr.Java8Parser;
import de.dhbwstuttgart.typecheck.JavaClassName; import de.dhbwstuttgart.typecheck.JavaClassName;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
public class SourceFile extends SyntaxTreeNode{ public class SourceFile extends SyntaxTreeNode{
@ -47,4 +51,12 @@ public class SourceFile extends SyntaxTreeNode{
public List<JavaClassName> getImports(){ public List<JavaClassName> getImports(){
return this.imports; return this.imports;
} }
public ConstraintSet getConstraints(TypeInferenceInformation info){
ConstraintSet ret = new ConstraintSet();
for(ClassOrInterface cl : this.KlassenVektor){
ret.addAll(cl.getConstraints(info));
}
return ret;
}
} }

View File

@ -1,9 +1,11 @@
package de.dhbwstuttgart.syntaxtree; package de.dhbwstuttgart.syntaxtree;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import de.dhbwstuttgart.core.IItemWithOffset; import de.dhbwstuttgart.core.IItemWithOffset;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.Pair;
public abstract class SyntaxTreeNode implements IItemWithOffset{ public abstract class SyntaxTreeNode implements IItemWithOffset{
private final Token offset; private final Token offset;

View File

@ -1,20 +1,6 @@
package de.dhbwstuttgart.syntaxtree.operator; package de.dhbwstuttgart.syntaxtree.operator;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.generic.ArithmeticInstruction;
import org.apache.bcel.generic.DADD;
import org.apache.bcel.generic.DDIV;
import org.apache.bcel.generic.FADD;
import org.apache.bcel.generic.FDIV;
import org.apache.bcel.generic.IADD;
import org.apache.bcel.generic.IDIV;
import org.apache.bcel.generic.LADD;
import org.apache.bcel.generic.LDIV;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.statement.Binary;
import de.dhbwstuttgart.syntaxtree.statement.Expr;

View File

@ -1,12 +1,6 @@
package de.dhbwstuttgart.syntaxtree.operator; package de.dhbwstuttgart.syntaxtree.operator;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.generic.BranchInstruction;
import org.apache.bcel.generic.IF_ICMPLT;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.statement.Binary;
import de.dhbwstuttgart.syntaxtree.statement.Expr;

View File

@ -1,9 +1,5 @@
package de.dhbwstuttgart.syntaxtree.operator; package de.dhbwstuttgart.syntaxtree.operator;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.generic.BranchInstruction;
import org.apache.bcel.generic.IF_ICMPLE;
import de.dhbwstuttgart.syntaxtree.statement.Binary;
import de.dhbwstuttgart.syntaxtree.statement.Expr;

View File

@ -1,10 +1,6 @@
package de.dhbwstuttgart.syntaxtree.operator; package de.dhbwstuttgart.syntaxtree.operator;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.generic.BranchInstruction;
import org.apache.bcel.generic.IF_ICMPGT;
import de.dhbwstuttgart.syntaxtree.statement.Binary;
import de.dhbwstuttgart.syntaxtree.statement.Expr;

View File

@ -1,9 +1,5 @@
package de.dhbwstuttgart.syntaxtree.operator; package de.dhbwstuttgart.syntaxtree.operator;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.generic.BranchInstruction;
import org.apache.bcel.generic.IF_ICMPGE;
import de.dhbwstuttgart.syntaxtree.statement.Binary;
import de.dhbwstuttgart.syntaxtree.statement.Expr;

View File

@ -1,10 +1,6 @@
package de.dhbwstuttgart.syntaxtree.operator; package de.dhbwstuttgart.syntaxtree.operator;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.generic.ArithmeticInstruction;
import org.apache.bcel.generic.IREM;
import de.dhbwstuttgart.syntaxtree.statement.Binary;
import de.dhbwstuttgart.syntaxtree.statement.Expr;

View File

@ -1,14 +1,6 @@
package de.dhbwstuttgart.syntaxtree.operator; package de.dhbwstuttgart.syntaxtree.operator;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.generic.ArithmeticInstruction;
import org.apache.bcel.generic.DMUL;
import org.apache.bcel.generic.FMUL;
import org.apache.bcel.generic.IMUL;
import org.apache.bcel.generic.LMUL;
import de.dhbwstuttgart.syntaxtree.statement.Binary;
import de.dhbwstuttgart.syntaxtree.statement.Expr;
public class TimesOp extends MulOp public class TimesOp extends MulOp
{ {
@ -16,6 +8,4 @@ public class TimesOp extends MulOp
{ {
super(offset); super(offset);
} }
} }

View File

@ -12,7 +12,7 @@ public class ArgumentList extends SyntaxTreeNode
super(offset); super(offset);
} }
public List<Expr> expr; public List<Expression> expr;
} }

View File

@ -2,34 +2,31 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
public class Assign extends ExprStmt public class Assign extends Statement
{ {
private final Expression rightSide;
private final LocalOrFieldVar lefSide;
public Assign(RefTypeOrTPH type, Token offset) { public Assign(LocalOrFieldVar leftHandSide, Expression value, Token offset) {
super(type, offset); super(leftHandSide.getType(), offset);
this.rightSide = value;
this.lefSide = leftHandSide;
} }
public Expr expr1; @Override
public Expr expr2; public ConstraintSet getConstraints(TypeInferenceInformation info) {
/** ConstraintSet ret = lefSide.getConstraints(info);
* Logger log4j ret.addAll(rightSide.getConstraints(info));
*/ ret.add(new Pair(rightSide.getType(), lefSide.getType()));
return ret;
public void set_Expr(Expr expr1,Expr expr2)
{
this.expr1 = expr1;
this.expr2 = expr2;
} }
public String get_Name()
{
return null;
}
} }

View File

@ -1,24 +1,27 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ClassGen;
import org.apache.bcel.generic.InstructionList; import org.apache.bcel.generic.InstructionList;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.operator.Operator; import de.dhbwstuttgart.syntaxtree.operator.Operator;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
// neu von Felix // neu von Felix
public class Binary extends BinaryExpr public class Binary extends Expression
{ {
public Binary(Expression expr1, Expression expr2, Operator op){
public Binary(int offset, int variableLength) super(null, null);
{
super(null);
} }
public Binary(Expr expr1, Expr expr2, Operator op){ @Override
super(null); public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
} }
} }

View File

@ -1,6 +1,9 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import java.util.*; import java.util.*;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.Constants; import org.apache.bcel.Constants;
import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ClassGen;
@ -15,10 +18,6 @@ import org.apache.bcel.generic.MethodGen;
public class Block extends Statement public class Block extends Statement
{ {
private InstructionFactory _factory;
private ConstantPoolGen _cp;
private ClassGen _cg;
public Block(List<Statement> statements, Token offset) { public Block(List<Statement> statements, Token offset) {
super(null, offset); super(null, offset);
this.statements = statements; this.statements = statements;
@ -28,18 +27,19 @@ public class Block extends Statement
public List<Statement> statements = new ArrayList<>(); public List<Statement> statements = new ArrayList<>();
public List<Statement> getStatements()
public List<Statement> get_Statement()
{ {
return statements; return statements;
} }
///////////////////////////////////////////////////////////////////////// @Override
// TypeReconstructionAlgorithmus public ConstraintSet getConstraints(TypeInferenceInformation info) {
///////////////////////////////////////////////////////////////////////// ConstraintSet ret = new ConstraintSet();
for(Statement stmt : getStatements()){
ret.addAll(stmt.getConstraints(info));
}
return ret;
}
} }

View File

@ -1,34 +1,25 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
public class CastExpr extends Expression public class CastExpr extends Expression
{ {
public CastExpr(RefTypeOrTPH castType, Expr expr, int offset) public CastExpr(RefTypeOrTPH castType, Expression expr, int offset)
{ {
super(null, null); super(null, null);
} }
public Expr expr; public Expression expr;
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
public String get_Name()
{
return null;
} }
public void set_Expr(Expr ex)
{
this.expr = ex;
}
} }

View File

@ -1,6 +1,11 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import java.util.ArrayList;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ClassGen;
import org.apache.bcel.generic.InstructionList; import org.apache.bcel.generic.InstructionList;
@ -16,6 +21,8 @@ public class EmptyStmt extends Statement
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
return new ConstraintSet();
}
} }

View File

@ -1,11 +0,0 @@
package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.core.IItemWithOffset;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import org.antlr.v4.runtime.Token;
public interface Expr extends IItemWithOffset
{
}

View File

@ -1,11 +0,0 @@
package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import org.antlr.v4.runtime.Token;
public abstract class ExprStmt extends Statement implements Expr {
public ExprStmt(RefTypeOrTPH type, Token offset) {
super(type, offset);
}
}

View File

@ -4,11 +4,25 @@ package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
public class Expression extends SyntaxTreeNode implements Expr import java.util.List;
public abstract class Expression extends SyntaxTreeNode
{ {
private RefTypeOrTPH type;
public Expression(RefTypeOrTPH type, Token offset){ public Expression(RefTypeOrTPH type, Token offset){
super(offset); super(offset);
this.type = type;
} }
public RefTypeOrTPH getType(){
return type;
}
public abstract ConstraintSet getConstraints(TypeInferenceInformation info);
} }

View File

@ -4,16 +4,20 @@ import java.util.Hashtable;
import java.util.List; import java.util.List;
import de.dhbwstuttgart.syntaxtree.ClassOrInterface; import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class ForStmt extends Statement public class ForStmt extends Statement
{ {
private Expr head_Initializer_1; private Expression head_Initializer_1;
private Expr head_Condition_1; private Expression head_Condition_1;
private Expr head_Loop_expr_1; private Expression head_Loop_expr_1;
private Expr head_Initializer; private Expression head_Initializer;
private Expr head_Condition; private Expression head_Condition;
private Expr head_Loop_expr; private Expression head_Loop_expr;
private Statement body_Loop_block; private Statement body_Loop_block;
public ForStmt(int offset, int variableLength) public ForStmt(int offset, int variableLength)
@ -21,10 +25,9 @@ public class ForStmt extends Statement
super(null,null); super(null,null);
} }
void sc_check(List<ClassOrInterface> classname, Hashtable ch, Hashtable<String, String> bh, boolean ext, Hashtable parach, Hashtable<String, Hashtable> parabh)
{
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
} }
} }

View File

@ -2,7 +2,11 @@ package de.dhbwstuttgart.syntaxtree.statement;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.apache.bcel.Constants; import org.apache.bcel.Constants;
import org.apache.bcel.generic.ALOAD; import org.apache.bcel.generic.ALOAD;
import org.apache.bcel.generic.ASTORE; import org.apache.bcel.generic.ASTORE;
@ -29,22 +33,12 @@ public class IfStmt extends Statement
} }
public boolean hamaDebug = true; //hama: Debug Ausgaben von mir ein- bzw. ausschalten public boolean hamaDebug = true; //hama: Debug Ausgaben von mir ein- bzw. ausschalten
public Expr expr; public Expression expr;
public Statement then_block; public Statement then_block;
public Statement else_block; public Statement else_block;
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
public void set_Expr(Expr exp) return null;
{
this.expr = exp;
} }
public void set_Then_block(Statement blk)
{
this.then_block = blk;
}
} }

View File

@ -2,22 +2,29 @@ package de.dhbwstuttgart.syntaxtree.statement;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ClassGen;
import org.apache.bcel.generic.InstructionList; import org.apache.bcel.generic.InstructionList;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class InstVar extends Expression
public class InstVar extends SyntaxTreeNode implements Expr
{ {
private Expr expr; private Expression expr;
public InstVar(Expr instanz, String name, Token offset) public InstVar(Expression instanz, String name, Token offset)
{ {
super(offset); super(instanz.getType(),offset);
expr = instanz; expr = instanz;
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -1,15 +1,18 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
public class InstanceOf extends BinaryExpr public class InstanceOf extends BinaryExpr
{ {
public Expr expr; public Expression expr;
private RefTypeOrTPH reftype; private RefTypeOrTPH reftype;
// private boolean is_instance = false;
public InstanceOf(int offset,int variableLength) public InstanceOf(int offset,int variableLength)
{ {
@ -17,21 +20,8 @@ public class InstanceOf extends BinaryExpr
// #JB# 20.04.2005 // #JB# 20.04.2005
} }
public void set_Expr(Expr exp) @Override
{ public ConstraintSet getConstraints(TypeInferenceInformation info) {
this.expr = exp; throw new NotImplementedException();
} }
public void set_Type(RefTypeOrTPH typ)
{
this.reftype = typ;
}
public String get_Name()
{
return null;
}
} }

View File

@ -3,6 +3,12 @@ package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.ParameterList; import de.dhbwstuttgart.syntaxtree.ParameterList;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.type.FunN; import de.dhbwstuttgart.syntaxtree.type.FunN;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
/** /**
* @author A10023 - Andreas Stadelmeier * @author A10023 - Andreas Stadelmeier
@ -27,5 +33,8 @@ public class LambdaExpression extends Expression{
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -0,0 +1,31 @@
package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token;
import java.util.List;
public class LocalOrFieldVar extends Statement{
protected final String expression;
public LocalOrFieldVar(String n, Token offset)
{
super(TypePlaceholder.fresh(offset),offset);
this.expression = n;
}
public LocalOrFieldVar(Expression e1, String access)
{
super(TypePlaceholder.fresh(e1.getOffset()),e1.getOffset());
this.expression = access;
}
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
return null;
}
}

View File

@ -1,8 +1,12 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.Constants; import org.apache.bcel.Constants;
import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ClassGen;
@ -12,6 +16,7 @@ import org.apache.bcel.generic.LocalVariableInstruction;
import org.apache.bcel.generic.ObjectType; import org.apache.bcel.generic.ObjectType;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
/* /*
@ -22,26 +27,17 @@ import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
* LocalOrFieldVarOrClassname.FieldVar[.Fieldvar...] - FieldVar * LocalOrFieldVarOrClassname.FieldVar[.Fieldvar...] - FieldVar
* Identifier - Lokale Variable oder FieldVar * Identifier - Lokale Variable oder FieldVar
*/ */
public class LocalOrFieldVarOrClassname extends Expression public class LocalOrFieldVarOrClassname extends LocalOrFieldVar
{ {
public LocalOrFieldVarOrClassname(String n, Token offset) {
private final String expression; super(n, offset);
private boolean isFieldAccess = false; }
private boolean isClassAccess = false; public LocalOrFieldVarOrClassname(Expression e1, String access){
super(e1, access);
public LocalOrFieldVarOrClassname(String n, Token offset)
{
super(TypePlaceholder.fresh(offset),offset);
this.expression = n;
} }
@Override
public LocalOrFieldVarOrClassname(Expr e1, String access) public ConstraintSet getConstraints(TypeInferenceInformation info) {
{ throw new NotImplementedException();
super(TypePlaceholder.fresh(null),null);
this.expression = access;
} }
} }

View File

@ -2,15 +2,21 @@ package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.syntaxtree.type.Void; import de.dhbwstuttgart.syntaxtree.type.Void;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List; import java.util.List;
/**
* Created by janulrich on 27.02.17.
*/
public class LocalVarBunchDeclaration extends Statement { public class LocalVarBunchDeclaration extends Statement {
public LocalVarBunchDeclaration(List<LocalVarDecl> declarations, Token start) { public LocalVarBunchDeclaration(List<LocalVarDecl> declarations, Token start) {
super(new Void(start), start); super(new Void(start), start);
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -3,7 +3,13 @@ package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.type.RefType; import de.dhbwstuttgart.syntaxtree.type.RefType;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
public class LocalVarDecl extends Statement public class LocalVarDecl extends Statement
{ {
@ -16,4 +22,8 @@ public class LocalVarDecl extends Statement
this.name = name; this.name = name;
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -1,6 +1,10 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.Const; import org.apache.bcel.Const;
import org.apache.bcel.Constants; import org.apache.bcel.Constants;
@ -15,35 +19,25 @@ import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
public class MethodCall extends ExprStmt public class MethodCall extends Statement
{ {
public MethodCall(Receiver receiver, String methodName, ArgumentList argumentList, Token offset){ private final String name;
super(TypePlaceholder.fresh(offset),offset);
this.set_ArgumentList(argumentList);
}
/**
* Diese Variable speichert die Expression, welche die Klasse von welcher die Methode aufgerufen wird darstellt.
*/
private Receiver receiver; private Receiver receiver;
private ArgumentList arglist; private ArgumentList arglist;
public MethodCall(Receiver receiver, String methodName, ArgumentList argumentList, Token offset){
super(TypePlaceholder.fresh(offset),offset);
this.arglist = argumentList;
this.name = methodName;
}
public void set_ArgumentList(ArgumentList al) @Override
{ public ConstraintSet getConstraints(TypeInferenceInformation info) {
this.arglist = al; ConstraintSet ret = receiver.getConstraints(info);
//Overloading:
for(Method m : info.getMethods(name, arglist)){
//TODO
}
return ret;
} }
public ArgumentList getArgumentList()
{
return this.arglist;
}
public Receiver get_Receiver()
{
return receiver;
}
} }

View File

@ -15,21 +15,6 @@ public class NegativeExpr extends UnaryExpr
super(offset); super(offset);
} }
private UnaryMinus neg; private UnaryMinus neg;
public Expr expr; public Expression expr;
public String get_Name()
{
return null;
}
public void set_UnaryMinus(UnaryMinus umin)
{
this.neg = umin;
}
public void set_Expr(Expr ex)
{
this.expr = ex;
}
} }

View File

@ -2,6 +2,10 @@ package de.dhbwstuttgart.syntaxtree.statement;
import java.util.List; import java.util.List;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class NewArray extends Expression public class NewArray extends Expression
@ -11,8 +15,11 @@ public class NewArray extends Expression
super(null,null); super(null,null);
} }
private RefTypeOrTPH type; private RefTypeOrTPH type;
public List<Expr> expr; public List<Expression> expr;
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -3,11 +3,13 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class NewClass extends Statement
public class NewClass extends ExprStmt
{ {
public NewClass(int offset,int variableLength) public NewClass(int offset,int variableLength)
{ {
@ -25,4 +27,8 @@ public class NewClass extends ExprStmt
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -10,27 +10,5 @@ public class NotExpr extends UnaryExpr
super(offset); super(offset);
} }
private UnaryNot not; private UnaryNot not;
public Expr expr; public Expression expr;
public String get_Name()
{
return null;
}
public Expr get_Expr()
{
return expr;
}
public void set_UnaryNot(UnaryNot unot)
{
this.not = unot;
}
public void set_Expr(Expr ex)
{
this.expr = ex;
}
} }

View File

@ -10,33 +10,6 @@ public class PositivExpr extends UnaryExpr
super(offset); super(offset);
} }
protected UnaryPlus plus; protected UnaryPlus plus;
public Expr expr; public Expression expr;
public void set_UnaryPlus(UnaryPlus up)
{
this.plus = up;
}
public void set_Expr(Expr ex)
{
this.expr = ex;
}
public String get_Name()
{
return null;
}
/*
public void sc_check(Menge<Class> classname, Hashtable ch, Hashtable<String, String> bh, boolean ext, Hashtable parach, Hashtable<String, Hashtable> parabh)
{
if(ext)
parserlog.debug(" ---PositivExpr---");
//Wartet noch auf Implementierung
}
*/
} }

View File

@ -12,18 +12,8 @@ import org.apache.bcel.generic.InstructionList;
public class PostDecExpr extends PostIncExpr public class PostDecExpr extends PostIncExpr
{ {
public PostDecExpr(Expr expr) { public PostDecExpr(Expression expr) {
super(expr); super(expr);
} }
public void set_Expr(Expr ex)
{
this.expr = ex;
}
public String get_Name()
{
return null;
}
} }

View File

@ -1,7 +1,11 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.apache.bcel.generic.BIPUSH; import org.apache.bcel.generic.BIPUSH;
import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ClassGen;
import org.apache.bcel.generic.IINC; import org.apache.bcel.generic.IINC;
@ -9,26 +13,17 @@ import org.apache.bcel.generic.InstructionFactory;
import org.apache.bcel.generic.InstructionList; import org.apache.bcel.generic.InstructionList;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class PostIncExpr extends UnaryExpr public class PostIncExpr extends UnaryExpr
{ {
public PostIncExpr(Expr expr) { public PostIncExpr(Expression expr) {
super(null); super(null);
} }
@Override
public void set_Expr(Expr ex) public ConstraintSet getConstraints(TypeInferenceInformation info) {
{ throw new NotImplementedException();
this.expr = ex;
} }
public String get_Name()
{
return null;
}
} }

View File

@ -16,17 +16,4 @@ public class PreDecExpr extends UnaryExpr
{ {
super(offset); super(offset);
} }
public void set_Expr(Expr ex)
{
this.expr = ex;
}
public String get_Name()
{
return null;
}
} }

View File

@ -9,19 +9,4 @@ public class PreIncExpr extends UnaryExpr
{ {
super(offset); super(offset);
} }
public void set_Expr(Expr ex)
{
this.expr = ex;
}
public String get_Name()
{
return null;
}
} }

View File

@ -1,16 +1,28 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
public class Receiver import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
public class Receiver extends Expression
{ {
private Expr expr; private Expression expr;
/** /**
* Autor: ¯Â¿Â½rg ¯Â¿Â½uerle * Autor: ¯Â¿Â½rg ¯Â¿Â½uerle
* @param expr * @param expr
*/ */
public Receiver(Expr expr) public Receiver(Expression expr)
{ {
super(expr.getType(), expr.getOffset());
this.expr = expr; this.expr = expr;
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
return expr.getConstraints(info);
}
} }

View File

@ -1,7 +1,11 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.List;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import org.apache.bcel.generic.ConstantPoolGen; import org.apache.bcel.generic.ConstantPoolGen;
import org.apache.bcel.generic.InstructionFactory; import org.apache.bcel.generic.InstructionFactory;
@ -10,22 +14,22 @@ import org.apache.bcel.generic.ClassGen;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class Return extends Statement public class Return extends Statement
{ {
public Return(Expr retExpr, Token offset) private Expression retexpr;
{
super(null,null);
}
public Expr retexpr;
public Return(Expression retExpr, Token offset)
public Return set_ReturnExpr(Expr ret)
{ {
this.retexpr=ret; super(retExpr.getType(),offset);
return this; this.retexpr = retExpr;
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -2,19 +2,20 @@ package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import java.util.List;
public abstract class Statement extends SyntaxTreeNode
public abstract class Statement extends Expression
{ {
public Statement(RefTypeOrTPH type, Token offset) public Statement(RefTypeOrTPH type, Token offset)
{ {
super(offset); super(type, offset);
} }
} }

View File

@ -1,6 +1,12 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
public class Super extends Expression public class Super extends Expression
{ {
@ -9,4 +15,8 @@ public class Super extends Expression
super(null,null); super(null,null);
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -1,7 +1,13 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
public class This extends Expression public class This extends Expression
{ {
@ -12,4 +18,8 @@ public class This extends Expression
public ArgumentList arglist; public ArgumentList arglist;
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -5,12 +5,10 @@ import org.antlr.v4.runtime.Token;
public abstract class UnaryExpr extends MethodCall public abstract class UnaryExpr extends MethodCall
{ {
public Expr expr; public Expression expr;
public UnaryExpr(Token offset) public UnaryExpr(Token offset)
{ {
super(null,null,null,null); super(null,null,null,null);
} }
} }

View File

@ -6,7 +6,7 @@ import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
public class UnaryMinus extends UnaryPlus public class UnaryMinus extends UnaryPlus
{ {
public UnaryMinus(Expr expression) { public UnaryMinus(Expression expression) {
super(expression); super(expression);
} }
} }

View File

@ -1,11 +1,22 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode; import de.dhbwstuttgart.syntaxtree.SyntaxTreeNode;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
public class UnaryPlus extends SyntaxTreeNode implements Expr import java.util.List;
public class UnaryPlus extends Expression
{ {
public UnaryPlus(Expr expression){ public UnaryPlus(Expression expression){
super(expression.getOffset()); super(expression.getType(),expression.getOffset());
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -1,6 +1,13 @@
package de.dhbwstuttgart.syntaxtree.statement; package de.dhbwstuttgart.syntaxtree.statement;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
public class WhileStmt extends Statement public class WhileStmt extends Statement
{ {
public WhileStmt(int offset, int variableLength) public WhileStmt(int offset, int variableLength)
@ -8,21 +15,9 @@ public class WhileStmt extends Statement
super(null,null); super(null,null);
} }
public Expr expr; public Expression expr;
public Statement loop_block; public Statement loop_block;
public void set_Expr(Expr exp)
{
this.expr = exp;
}
public void set_Loop_block(Statement blk)
{
this.loop_block = blk;
}
/** /**
* <br/>Author: Martin Pl�micke * <br/>Author: Martin Pl�micke
* @return * @return
@ -33,5 +28,8 @@ public class WhileStmt extends Statement
} }
@Override
public ConstraintSet getConstraints(TypeInferenceInformation info) {
throw new NotImplementedException();
}
} }

View File

@ -3,6 +3,8 @@ package de.dhbwstuttgart.syntaxtree.statement.literal;
import de.dhbwstuttgart.syntaxtree.statement.Expression; import de.dhbwstuttgart.syntaxtree.statement.Expression;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH; import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.ConstraintSet;
import de.dhbwstuttgart.typeinference.TypeInferenceInformation;
import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.Token;
public abstract class Literal extends Expression public abstract class Literal extends Expression
@ -10,4 +12,8 @@ public abstract class Literal extends Expression
public Literal(RefTypeOrTPH type, Token offset) { public Literal(RefTypeOrTPH type, Token offset) {
super(type, offset); super(type, offset);
} }
public ConstraintSet getConstraints(TypeInferenceInformation info){
return new ConstraintSet();
}
} }

View File

@ -0,0 +1,11 @@
package de.dhbwstuttgart.typeinference;
public class ConstraintSet {
public void addAll(ConstraintSet constraints) {
}
public void add(Pair pair) {
}
}

View File

@ -0,0 +1,39 @@
package de.dhbwstuttgart.typeinference;
import java.util.Set;
import java.util.TreeSet;
public class EinzelElement<A> implements KomplexeMenge<A>{
private A item;
public EinzelElement(A element){
item = element;
}
public Set<KomplexeMenge<A>> getSet(){
Set<KomplexeMenge<A>> ret = new TreeSet<>();
ret.add(this);
return ret;
}
@Override
public Set<Set<A>> cartesianProduct() {
Set<Set<A>> ret = new TreeSet<>();
Set<A> i = new TreeSet<>();
i.add(item);
ret.add(i);
return ret;
//throw new NotImplementedException();
}
@Override
public String toString(){
return item.toString();
}
public A getItem(){
return item;
}
}

View File

@ -0,0 +1,8 @@
package de.dhbwstuttgart.typeinference;
import java.util.Set;
public interface KomplexeMenge<A>{
Set<? extends KomplexeMenge<A>> getSet();
Set<Set<A>> cartesianProduct();
}

View File

@ -0,0 +1,69 @@
package de.dhbwstuttgart.typeinference;
import java.util.ArrayList;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;
public class OderConstraint extends OderMenge<Pair>{
private Set<UndConstraint> oderConstraintPairs;
public OderConstraint(){
oderConstraintPairs = new TreeSet<>();
}
/**
* Liefert alle in diesem OderConstraint enthaltene Constraints. Dabei gehen die Verkn<EFBFBD>pfungen (Oder/Und) verloren.
* @return
*/
public Set<Pair> getConstraintPairs(){
Set<Pair> ret = new TreeSet<>();
for(UndConstraint oC : this.oderConstraintPairs){
ret.addAll(oC.getConstraintPairs());
}
return ret;
}
/**
* Falls die Type des toAdd-Pairs nicht vom Typ RefType bzw. TypePlaceholder sind, so werden sie in einen RefType umgewandelt.
* @param toAdd
*/
public void addConstraint(Pair toAdd){
UndConstraint uCons = new UndConstraint();
uCons.addConstraint(toAdd);
oderConstraintPairs.add(uCons);
}
@Override
public String toString(){
String ret = "[";
for(UndConstraint p : this.getUndConstraints()){
ret += p.toString()+ "| ";
}
return ret+"]";
}
public Set<UndConstraint> getUndConstraints() {
return this.oderConstraintPairs;
/*
Vector<UndConstraint> ret = new Vector<UndConstraint>();
for(Pair p : this.getConstraintPairs()){
ret.add(new UndConstraint(p.TA1,p.TA2));
}
return ret;
*/
}
public void addConstraint(UndConstraint constraint) {
oderConstraintPairs.add(constraint);
}
@Override
public Set<? extends KomplexeMenge<Pair>> getSet() {
return this.oderConstraintPairs;
}
}

View File

@ -0,0 +1,28 @@
package de.dhbwstuttgart.typeinference;
import java.util.Set;
import java.util.TreeSet;
public abstract class OderMenge<A> implements KomplexeMenge<A>{
public abstract Set<? extends KomplexeMenge<A>> getSet();
@Override
public Set<Set<A>> cartesianProduct() {
Set<Set<A>> ret = new TreeSet<>();
for(KomplexeMenge<A> km : this.getSet()){
ret.addAll(km.cartesianProduct());
}
return ret;
}
@Override
public String toString(){
String ret = "[";
for(KomplexeMenge<A> i : this.getSet()){
ret += i.toString() + " | ";
}
return ret + "]";
}
}

View File

@ -0,0 +1,31 @@
package de.dhbwstuttgart.typeinference;
import de.dhbwstuttgart.syntaxtree.Method;
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import java.util.List;
/*
Anmerkung:
Zwei Möglichkeiten, die TypeAssumptions zu speichern.
1. Die Klassen mit bedeutenden Informationen generieren diese und übergeben sie dann dieser Klasse.
2. Oder es werden nur Referenzen auf den SyntaxTree übergeben, welche diese Klasse hier dann verarbeitet.
Bei Änderungen des SyntaxTrees müssen beide Methoden angepasst werden.
Zweiteres hat den Vorteil, dass bei der Entwicklung leichter Dinge hinzugefügt werden können.
Die ganze Logik steckt in dieser Klasse.
*/
public class TypeInferenceInformation {
private Method methodContext;
public void setMethodContext(Method methodContext) {
this.methodContext = methodContext;
}
public List<Method> getMethods(String name, ArgumentList arglist) {
throw new NotImplementedException();
}
}

View File

@ -0,0 +1,53 @@
package de.dhbwstuttgart.typeinference;
import java.util.Collection;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;
import de.dhbwstuttgart.exceptions.DebugException;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH;
import de.dhbwstuttgart.typeinference.unify.Unifikationsalgorithmus;
/**
* 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 extends UndMenge<Pair> {
Set<EinzelElement<Pair>> set = new TreeSet<>();
@Override
public Set<? extends KomplexeMenge<Pair>> getSet() {
return set;
}
public Set<Pair> getConstraintPairs() {
Set<Set<Pair>> ret = this.cartesianProduct();
if(ret.size() != 1){
//UndConstraints enthalten nur SingleConstraints, wodurch das Karthesische Produkt nur aus einem Element bestehen kann.
throw new DebugException("Fehler in ConstraintPairs-Bildung");
}
return ret.iterator().next();
}
public void addConstraint(RefTypeOrTPH type, RefTypeOrTPH rT) {
Pair p = new Pair(type, rT);
addConstraint(p);
}
public void addConstraint(Pair toAdd){
this.set.add(new EinzelElement<Pair>(toAdd));
}
@Override
public String toString() {
String ret = this.getConstraintPairs().toString();
return ret;
}
public Set<EinzelElement<Pair>> getPairs(){
return set;
}
}

View File

@ -0,0 +1,44 @@
package de.dhbwstuttgart.typeinference;
import de.dhbwstuttgart.typeinference.unify.TypeUnify;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
//import com.rits.cloning.Cloner;
public abstract class UndMenge<A> implements KomplexeMenge<A>{
public abstract Set<? extends KomplexeMenge<A>> getSet();
@Override
public Set<Set<A>> cartesianProduct() {
Set<Set<A>> ret = null;
for(KomplexeMenge<A> km : this.getSet()){
if(ret == null){
ret = km.cartesianProduct();
}else{
Set<Set<A>> cartesianProduct = new TreeSet<>();
for(Set<A> r : ret)for(Set<A> m : km.cartesianProduct()){ //¼r jedes Element aus dem Karthesischen Produkt:
Set<A> undElement = new TreeSet<>();
undElement.addAll(r);
undElement.addAll(m);
cartesianProduct.add(undElement);
}
ret = cartesianProduct;
}
}
if(ret == null)return new TreeSet<>();
return ret;
}
public String toString(){
String ret = "[";
for(KomplexeMenge<A> item : this.getSet()){
ret += item.toString() + " , ";
}
return ret + "]";
}
}

View File

@ -1,72 +0,0 @@
package de.dhbwstuttgart.typeinference.unify;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import de.dhbwstuttgart.typeinference.Pair;
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
public class Mapping {
private HashMap<de.dhbwstuttgart.typeinference.unify.model.UnifyType, de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH> backwardMap = new HashMap<>();
private HashMap<de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH, de.dhbwstuttgart.typeinference.unify.model.UnifyType> forwardMap = new HashMap<>();
private Set<de.dhbwstuttgart.typeinference.unify.model.UnifyType> irreversible = new HashSet<>();
public Mapping(Set<de.dhbwstuttgart.syntaxtree.type.RefType> types) {
for(de.dhbwstuttgart.syntaxtree.type.RefType t : types) {
}
}
public de.dhbwstuttgart.typeinference.unify.model.UnifyType map(de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH type) {
return forwardMap.get(type);
}
public de.dhbwstuttgart.typeinference.unify.model.UnifyPair map(de.dhbwstuttgart.typeinference.Pair pair) {
return new de.dhbwstuttgart.typeinference.unify.model.UnifyPair(forwardMap.get(pair.TA1), forwardMap.get(pair.TA2), mapOp(pair.GetOperator()));
}
public Set<de.dhbwstuttgart.typeinference.unify.model.UnifyType> mapTypeSet(Set<de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH> types) {
return types.stream().map(this::map).collect(Collectors.toCollection(HashSet::new));
}
public Set<de.dhbwstuttgart.typeinference.unify.model.UnifyPair> mapPairSet(Set<de.dhbwstuttgart.typeinference.Pair> pairs) {
return pairs.stream().map(this::map).collect(Collectors.toCollection(HashSet::new));
}
public Optional<de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH> unmap(de.dhbwstuttgart.typeinference.unify.model.UnifyType type) {
return irreversible.contains(type) ? Optional.of(backwardMap.get(type)) : Optional.empty();
}
public Optional<Pair> unmap(de.dhbwstuttgart.typeinference.unify.model.UnifyPair mpair) {
de.dhbwstuttgart.typeinference.unify.model.UnifyType lhs = mpair.getLhsType();
de.dhbwstuttgart.typeinference.unify.model.UnifyType rhs = mpair.getRhsType();
if(irreversible.contains(lhs) || irreversible.contains(rhs))
return Optional.empty();
return Optional.of(new Pair(backwardMap.get(lhs), backwardMap.get(rhs), unmapOp(mpair.getPairOp())));
}
public Optional<Set<de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH>> unmapTypeSet(Set<de.dhbwstuttgart.typeinference.unify.model.UnifyType> types) {
Set<de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPH> result = types.stream().map(this::unmap).filter(x -> x.isPresent()).map(x -> x.get()).collect(Collectors.toCollection(HashSet::new));
return result.size() == types.size() ? Optional.of(result) : Optional.empty();
}
public Optional<Set<de.dhbwstuttgart.typeinference.Pair>> unmapPairSet(Set<de.dhbwstuttgart.typeinference.unify.model.UnifyPair> pairs) {
Set<de.dhbwstuttgart.typeinference.Pair> result = pairs.stream().map(this::unmap).filter(x -> x.isPresent()).map(x -> x.get()).collect(Collectors.toCollection(HashSet::new));
return result.size() == pairs.size() ? Optional.of(result) : Optional.empty();
}
private PairOperator mapOp(PairOperator op) {
//TODO: Methode kann entfernt werden:
return op;
}
private PairOperator unmapOp(PairOperator op) {
//TODO: Methode kann entfernt werden:
return op;
}
}