diff --git a/src/main/java/de/dhbwstuttgart/input/ConstraintParser.java b/src/main/java/de/dhbwstuttgart/input/ConstraintParser.java index 0a7a4c7..7ff17e1 100644 --- a/src/main/java/de/dhbwstuttgart/input/ConstraintParser.java +++ b/src/main/java/de/dhbwstuttgart/input/ConstraintParser.java @@ -15,6 +15,16 @@ import java.util.stream.Collectors; public class ConstraintParser { + public static NamedType replaceGenerics(NamedType in, Set genericNames){ + List superParams = in.params().stream().map(p -> { + if(genericNames.contains(p.name())){ + return (Type) new TypeParameter(p.name()); + }else{ + return replaceGenerics((NamedType) p, genericNames); + } + }).toList(); + return new NamedType(in.name(), superParams); + } public static List parseExtendsRelations(String cons){ CharStream input = CharStreams.fromString(cons); de.dhbwstuttgart.input.parser.ConstraintSetLexer lexer = new ConstraintSetLexer(input); @@ -24,7 +34,11 @@ public class ConstraintParser { List ret = new ArrayList<>(); for(var ext : conSet.extendsRelation()){ if(ext.typeParams()!=null){ - ret.add(new ExtendsRelation(ext.IDENTIFIER().getText(), ext.typeParams().IDENTIFIER().stream().map(x -> new TypeParameter(x.getText())).toList(), (NamedType) parseType(ext.type()))); + var typeParams = ext.typeParams().IDENTIFIER().stream().map(x -> new TypeParameter(x.getText())).toList(); + var typeParamNames = typeParams.stream().map(tp -> tp.name()).collect(Collectors.toSet()); + NamedType parsedSuperType = (NamedType) parseType(ext.type()); + parsedSuperType = replaceGenerics(parsedSuperType, typeParamNames); + ret.add(new ExtendsRelation(ext.IDENTIFIER().getText(), typeParams, parsedSuperType)); }else{ ret.add(new ExtendsRelation(ext.IDENTIFIER().getText(), List.of(), (NamedType) parseType(ext.type()))); } diff --git a/src/main/java/de/dhbwstuttgart/sat/asp/ASPGenerator.java b/src/main/java/de/dhbwstuttgart/sat/asp/ASPGenerator.java index 3c56666..5ed016a 100644 --- a/src/main/java/de/dhbwstuttgart/sat/asp/ASPGenerator.java +++ b/src/main/java/de/dhbwstuttgart/sat/asp/ASPGenerator.java @@ -46,7 +46,7 @@ public class ASPGenerator { String ret = ""; for(var x : extendsRelations){ NamedType subtype = new NamedType(x.subtypeName(), x.subtypeParams().stream().map(i -> (Type)i).toList()); - ret += "super("+subtype.toASP()+","+x.superType().toASP()+"):-super("+subtype.toASP()+")."; + ret += "subtype("+subtype.toASP()+","+x.superType().toASP()+"):-subtype("+subtype.toASP()+")."; } return ret; } diff --git a/src/main/java/de/dhbwstuttgart/sat/asp/Type.java b/src/main/java/de/dhbwstuttgart/sat/asp/Type.java index 3a66319..17ed3ae 100644 --- a/src/main/java/de/dhbwstuttgart/sat/asp/Type.java +++ b/src/main/java/de/dhbwstuttgart/sat/asp/Type.java @@ -1,5 +1,6 @@ package de.dhbwstuttgart.sat.asp; public interface Type { + String name(); String toASP(); } diff --git a/src/test/java/UnifyTest.java b/src/test/java/UnifyTest.java index 32411cb..851c965 100644 --- a/src/test/java/UnifyTest.java +++ b/src/test/java/UnifyTest.java @@ -46,11 +46,11 @@ public class UnifyTest { "Vector < List," + "MyPair < Pair," + "Pair < Object," + - "List < Object," + - "Integer < Object, String < Object, " + - "{List <. _a | List <. _a}{List<_c> <. _b | List<_c> <. _b} {List <. _b | List <. _b}"+ - "{List <. _aa | List <. _aa}{List<_c> <. _ba | List<_c> <. _ba} {List <. _ba | List <. _ba}"+ - "{List <. _a | List <. _aaa}{List<_c> <. _baa | List<_c> <. _baa} {List <. _baa | List <. _baa}"; + "List < Object," + + "Integer < Object, String < Object, " + + "{List <. _a | List <. _a}{List<_c> <. _b, String <. Object | List<_c> <. _b} {Vector <. _b | Vector <. _b}"+ + "{List <. _aa | List <. _aa}{List<_c> <. _ba | List<_c> <. _ba} {Vector <. _ba | Vector <. _ba}"+ + "{List <. _aaa | List <. _aaa}{List<_c> <. _baa | List<_c> <. _baa} {Vector <. _baa | Vector <. _baa}"; System.out.println(ASPGenerator.generateASP(ConstraintParser.parse(input))); System.out.println(ASPGenerator.generateExtendsRelations(ConstraintParser.parseExtendsRelations(input)));