diff --git a/build.gradle b/build.gradle index 00921941fde2ef9a756c23c4997cc491c8b0521a..745e80c37a77a0bb8f75e9586be5c05e7639ed4c 100644 --- a/build.gradle +++ b/build.gradle @@ -67,15 +67,15 @@ tasks.withType(JavaExec) { if(project.hasProperty('language') && project.hasProperty('big_integer') && project.hasProperty('deferred_set_size') && project.hasProperty('file')) { if(!(project.hasProperty('minint') && project.hasProperty('maxint'))) { if (project.hasProperty('addition')) { - args([language, big_integer, -2147483648, 2147483647, deferred_set_size, project.rootDir.path.toString() + File.separator + file, addition]) + args([language, big_integer, -2147483648, 2147483647, deferred_set_size, true, project.rootDir.path.toString() + File.separator + file, addition]) } else { - args([language, big_integer, -2147483648, 2147483647, deferred_set_size, project.rootDir.path.toString() + File.separator + file]) + args([language, big_integer, -2147483648, 2147483647, deferred_set_size, true, project.rootDir.path.toString() + File.separator + file]) } } else { if (project.hasProperty('addition')) { - args([language, big_integer, minint, maxint, deferred_set_size, project.rootDir.path.toString() + File.separator + file, addition]) + args([language, big_integer, minint, maxint, deferred_set_size, true, project.rootDir.path.toString() + File.separator + file, addition]) } else { - args([language, big_integer, minint, maxint, deferred_set_size, project.rootDir.path.toString() + File.separator + file]) + args([language, big_integer, minint, maxint, deferred_set_size, true, project.rootDir.path.toString() + File.separator + file]) } } } diff --git a/src/main/java/de/hhu/stups/codegenerator/CodeGenerator.java b/src/main/java/de/hhu/stups/codegenerator/CodeGenerator.java index 3e9ccada7310d3f6dcc43d5740238087cd03cae4..9a7b24c5063ab53a026968060cbe436a3741ea80 100644 --- a/src/main/java/de/hhu/stups/codegenerator/CodeGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/CodeGenerator.java @@ -40,7 +40,7 @@ public class CodeGenerator { * Example: gradle run -Planguage = "java" -Pbig_integer="false" -Pminint=-2047 -Pmaxint=2048 -Pdeferred_set_size="10" -Pfile = "Lift.mch" */ public static void main(String[] args) throws URISyntaxException, MalformedURLException, CodeGenerationException { - if(args.length < 6 || args.length > 7) { + if(args.length < 7 || args.length > 8) { System.err.println("Wrong number of arguments"); return; } @@ -49,15 +49,16 @@ public class CodeGenerator { String minint = args[2]; String maxint = args[3]; String deferredSetSize = args[4]; + boolean useConstraintSolving = useConstraintSolving(args[5]); CodeGenerator codeGenerator = new CodeGenerator(); - Path path = Paths.get(args[5]); + Path path = Paths.get(args[6]); checkPath(path); checkIntegerRange(useBigInteger, minint, maxint); String addition = null; - if(args.length == 7) { - addition = args[6]; + if(args.length == 8) { + addition = args[7]; } - codeGenerator.generate(path, mode, useBigInteger, minint, maxint, deferredSetSize, true, addition, false); + codeGenerator.generate(path, mode, useBigInteger, minint, maxint, deferredSetSize, useConstraintSolving, true, addition, false); } /* @@ -97,6 +98,21 @@ public class CodeGenerator { return useBigInteger; } + /* + * This functon extracts boolean for using constraint solving from the given string + */ + private static boolean useConstraintSolving(String constraintOption) { + boolean useConstraintSolving; + if("true".equals(constraintOption)) { + useConstraintSolving = true; + } else if("false".equals(constraintOption)) { + useConstraintSolving = false; + } else { + throw new RuntimeException("Wrong argument for choice of constraints"); + } + return useConstraintSolving; + } + private static void checkPath(Path path) { if(path == null) { throw new RuntimeException("File not found"); @@ -118,7 +134,7 @@ public class CodeGenerator { /* * This function generates code from a given path for a machine, the target language and the information whether it is a main machine of a project */ - public List<Path> generate(Path path, GeneratorMode mode, boolean useBigInteger, String minint, String maxint, String deferredSetSize, boolean isMain, String addition, boolean isIncludedMachine) throws CodeGenerationException { + public List<Path> generate(Path path, GeneratorMode mode, boolean useBigInteger, String minint, String maxint, String deferredSetSize, boolean useConstraintSolving, boolean isMain, String addition, boolean isIncludedMachine) throws CodeGenerationException { if(isMain) { paths.clear(); } @@ -128,16 +144,16 @@ public class CodeGenerator { if(addition != null) { additionAsList[additionAsList.length - 1] = addition; } - machineReferenceGenerator.generateIncludedMachines(project, pathAsList, mode, useBigInteger, minint, maxint, deferredSetSize); - paths.add(writeToFile(path, mode, useBigInteger, minint, maxint, deferredSetSize, project.getMainMachine(), addition != null ? Paths.get(String.join("/",additionAsList)) : null, isIncludedMachine)); + machineReferenceGenerator.generateIncludedMachines(project, pathAsList, mode, useBigInteger, minint, maxint, deferredSetSize, useConstraintSolving); + paths.add(writeToFile(path, mode, useBigInteger, minint, maxint, deferredSetSize, useConstraintSolving, project.getMainMachine(), addition != null ? Paths.get(String.join("/",additionAsList)) : null, isIncludedMachine)); return paths; } /* * This function generates code for a targeted programming language with creating the belonging file */ - private Path writeToFile(Path path, GeneratorMode mode, boolean useBigInteger, String minint, String maxint, String deferredSetSize, MachineNode node, Path addition, boolean isIncludedMachine) { - MachineGenerator generator = new MachineGenerator(mode, useBigInteger, minint, maxint, deferredSetSize, addition, isIncludedMachine); + private Path writeToFile(Path path, GeneratorMode mode, boolean useBigInteger, String minint, String maxint, String deferredSetSize, boolean useConstraintSolving, MachineNode node, Path addition, boolean isIncludedMachine) { + MachineGenerator generator = new MachineGenerator(mode, useBigInteger, minint, maxint, deferredSetSize, useConstraintSolving, addition, isIncludedMachine); machineReferenceGenerator.updateNameHandler(generator); machineReferenceGenerator.updateDeclarationGenerator(generator); machineReferenceGenerator.updateRecordStructGenerator(generator); diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/ExpressionGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/ExpressionGenerator.java index a086ff8101fe69d47b55c14c7eddc6e74f272d95..1afecedd5d29c79e1e6f6886fa34532977f85e22 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/ExpressionGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/ExpressionGenerator.java @@ -179,6 +179,7 @@ public class ExpressionGenerator { this.identifierGenerator = identifierGenerator; this.typeGenerator = typeGenerator; this.iterationConstructHandler = iterationConstructHandler; + this.iterationConstructHandler.setExpressionGenerator(this); this.recordStructGenerator = recordStructGenerator; } @@ -800,7 +801,7 @@ public class ExpressionGenerator { /* * This function generates code for MININT */ - private String generateMinInt() { + public String generateMinInt() { ST number = currentGroup.getInstanceOf("number"); TemplateHandler.add(number, "number", minint); TemplateHandler.add(number, "useBigInteger", useBigInteger); @@ -820,7 +821,7 @@ public class ExpressionGenerator { /* * This function generates code for MAXINT */ - private String generateMaxInt() { + public String generateMaxInt() { ST number = currentGroup.getInstanceOf("number"); TemplateHandler.add(number, "number", maxint); TemplateHandler.add(number, "useBigInteger", useBigInteger); diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java index efec3dc70fb6927cb67dd469c9bb85cd8fbd18c3..9ee3f00a4adf99b48d96e0e61c04491bb60bdc03 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java @@ -123,7 +123,7 @@ public class MachineGenerator implements AbstractVisitor<String, Void> { private Set<String> infiniteSets; - public MachineGenerator(GeneratorMode mode, boolean useBigInteger, String minint, String maxint, String deferredSetSize, Path addition, boolean isIncludedMachine) { + public MachineGenerator(GeneratorMode mode, boolean useBigInteger, String minint, String maxint, String deferredSetSize, boolean useConstraintSolving, Path addition, boolean isIncludedMachine) { this.currentGroup = CodeGeneratorUtils.getGroup(mode); this.useBigInteger = useBigInteger; this.boundedVariablesDepth = new HashMap<>(); @@ -138,7 +138,7 @@ public class MachineGenerator implements AbstractVisitor<String, Void> { this.parallelConstructHandler = new ParallelConstructHandler(); this.typeGenerator = new TypeGenerator(currentGroup, nameHandler, this); this.importGenerator = new ImportGenerator(currentGroup, nameHandler, useBigInteger); - this.iterationConstructHandler = new IterationConstructHandler(currentGroup, this, nameHandler, typeGenerator, importGenerator); + this.iterationConstructHandler = new IterationConstructHandler(currentGroup, this, nameHandler, typeGenerator, importGenerator, useConstraintSolving); this.deferredSetAnalyzer = new DeferredSetAnalyzer(Integer.parseInt(deferredSetSize)); this.infiniteSetGenerator = new InfiniteSetGenerator(currentGroup, this, nameHandler); this.identifierGenerator = new IdentifierGenerator(currentGroup, this, nameHandler, parallelConstructHandler, declarationGenerator); diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/MachineReferenceGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/MachineReferenceGenerator.java index 28f7caf40b2aacf3af32472ac26810e2668f2817..6adf7d7738dc297024ea105d71c8f81706cb1bc0 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/MachineReferenceGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/MachineReferenceGenerator.java @@ -29,14 +29,14 @@ public class MachineReferenceGenerator { /* * This function generates code for all included machines from the given options */ - public void generateIncludedMachines(BProject project, String[] pathAsList, GeneratorMode mode, boolean useBigInteger, String minint, String maxint, String deferredSetSize) { + public void generateIncludedMachines(BProject project, String[] pathAsList, GeneratorMode mode, boolean useBigInteger, String minint, String maxint, String deferredSetSize, boolean useConstraintSolving) { String last = project.getMainMachine().getName(); for(MachineReferenceNode referenceNode : project.getMainMachine().getMachineReferences()) { pathAsList[pathAsList.length - 1] = pathAsList[pathAsList.length - 1].replaceAll(last, referenceNode.getMachineName()); last = referenceNode.getMachineName(); Path currentPath = Paths.get(String.join("/", pathAsList)); if(!codeGenerator.getPaths().contains(currentPath)) { - codeGenerator.generate(currentPath, mode, useBigInteger, minint, maxint, deferredSetSize, false, null, true); + codeGenerator.generate(currentPath, mode, useBigInteger, minint, maxint, deferredSetSize, useConstraintSolving, false, null, true); } } } diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/PredicateGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/PredicateGenerator.java index 69a8d97d678525981889fc376b301b5ce2488417..0a5726cf4cbc39fbb05e1eaf354a3f2d78a248ee 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/PredicateGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/PredicateGenerator.java @@ -67,6 +67,7 @@ public class PredicateGenerator { this.nameHandler = nameHandler; this.importGenerator = importGenerator; this.iterationConstructHandler = iterationConstructHandler; + this.iterationConstructHandler.setPredicateGenerator(this); this.infiniteSetGenerator = infiniteSetGenerator; this.infiniteSetGenerator.setPredicateGenerator(this); this.relationSetGenerator = new RelationSetGenerator(currentGroup, machineGenerator, nameHandler, infiniteSetGenerator); diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/iteration/IterationConstructGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/iteration/IterationConstructGenerator.java index 0e48b158b79fe049eaf4232d7ad0219273350a3b..508fc28ff40a6656287a3d588cc4c987f3a16ce4 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/iteration/IterationConstructGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/iteration/IterationConstructGenerator.java @@ -1,7 +1,9 @@ package de.hhu.stups.codegenerator.generators.iteration; +import de.hhu.stups.codegenerator.generators.ExpressionGenerator; import de.hhu.stups.codegenerator.generators.ImportGenerator; import de.hhu.stups.codegenerator.generators.MachineGenerator; +import de.hhu.stups.codegenerator.generators.PredicateGenerator; import de.hhu.stups.codegenerator.generators.TypeGenerator; import de.hhu.stups.codegenerator.handlers.IterationConstructHandler; import de.hhu.stups.codegenerator.handlers.NameHandler; @@ -85,11 +87,14 @@ public class IterationConstructGenerator implements AbstractVisitor<Void, Void> private final List<String> allBoundedVariables; + private final boolean useConstraintSolving; + public IterationConstructGenerator(final IterationConstructHandler iterationConstructHandler, final MachineGenerator machineGenerator, final NameHandler nameHandler, final STGroup group, - final TypeGenerator typeGenerator, final ImportGenerator importGenerator) { + final TypeGenerator typeGenerator, final ImportGenerator importGenerator, final ExpressionGenerator expressionGenerator, + final PredicateGenerator predicateGenerator, final boolean useConstraintSolving) { this.iterationConstructHandler = iterationConstructHandler; this.iterationPredicateGenerator = new IterationPredicateGenerator(group, machineGenerator, typeGenerator, iterationConstructHandler); - this.setComprehensionGenerator = new SetComprehensionGenerator(group, machineGenerator, this, iterationConstructHandler, iterationPredicateGenerator, typeGenerator); + this.setComprehensionGenerator = new SetComprehensionGenerator(group, machineGenerator, this, iterationConstructHandler, iterationPredicateGenerator, typeGenerator, expressionGenerator, predicateGenerator); this.lambdaGenerator = new LambdaGenerator(group, machineGenerator, this, iterationConstructHandler, iterationPredicateGenerator, typeGenerator); this.quantifiedPredicateGenerator = new QuantifiedPredicateGenerator(group, machineGenerator, this, iterationConstructHandler, iterationPredicateGenerator); this.quantifiedExpressionGenerator = new QuantifiedExpressionGenerator(group, machineGenerator, nameHandler, typeGenerator, this, iterationConstructHandler, iterationPredicateGenerator); @@ -101,6 +106,7 @@ public class IterationConstructGenerator implements AbstractVisitor<Void, Void> this.iterationsMapIdentifier = new HashMap<>(); this.boundedVariables = new ArrayList<>(); this.allBoundedVariables = new ArrayList<>(); + this.useConstraintSolving = useConstraintSolving; } @@ -148,7 +154,11 @@ public class IterationConstructGenerator implements AbstractVisitor<Void, Void> */ @Override public Void visitSetComprehensionNode(SetComprehensionNode node, Void expected) { - iterationsMapCode.put(node.toString(), setComprehensionGenerator.generateSetComprehension(node)); + if(!useConstraintSolving) { + iterationsMapCode.put(node.toString(), setComprehensionGenerator.generateSetComprehension(node)); + } else { + iterationsMapCode.put(node.toString(), setComprehensionGenerator.generateConstraintSet(node)); + } iterationConstructHandler.incrementIterationConstructCounter(); return null; } diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/iteration/SetComprehensionGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/iteration/SetComprehensionGenerator.java index bc046e8a942a6dd29d7bed48ba35628febb5c86a..cd35e520b5ef541b32512e8d1a41e94632cd318b 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/iteration/SetComprehensionGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/iteration/SetComprehensionGenerator.java @@ -1,6 +1,9 @@ package de.hhu.stups.codegenerator.generators.iteration; +import de.hhu.stups.codegenerator.generators.CodeGenerationException; +import de.hhu.stups.codegenerator.generators.ExpressionGenerator; import de.hhu.stups.codegenerator.generators.MachineGenerator; +import de.hhu.stups.codegenerator.generators.PredicateGenerator; import de.hhu.stups.codegenerator.generators.TypeGenerator; import de.hhu.stups.codegenerator.handlers.IterationConstructHandler; import de.hhu.stups.codegenerator.handlers.TemplateHandler; @@ -16,6 +19,7 @@ import org.stringtemplate.v4.STGroup; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; /** * Created by fabian on 04.03.19. @@ -34,15 +38,21 @@ public class SetComprehensionGenerator { private final TypeGenerator typeGenerator; + private final PredicateGenerator predicateGenerator; + + private final ExpressionGenerator expressionGenerator; + public SetComprehensionGenerator(final STGroup group, final MachineGenerator machineGenerator, final IterationConstructGenerator iterationConstructGenerator, final IterationConstructHandler iterationConstructHandler, final IterationPredicateGenerator iterationPredicateGenerator, - final TypeGenerator typeGenerator) { + final TypeGenerator typeGenerator, final ExpressionGenerator expressionGenerator, final PredicateGenerator predicateGenerator) { this.group = group; this.machineGenerator = machineGenerator; this.iterationConstructGenerator = iterationConstructGenerator; this.iterationConstructHandler = iterationConstructHandler; this.iterationPredicateGenerator = iterationPredicateGenerator; this.typeGenerator = typeGenerator; + this.predicateGenerator = predicateGenerator; + this.expressionGenerator = expressionGenerator; } /* @@ -73,6 +83,79 @@ public class SetComprehensionGenerator { return result; } + /* + * This function generates code for a set comprehension by constraint solving from the belonging AST node + */ + public String generateConstraintSet(SetComprehensionNode node) { + machineGenerator.inIterationConstruct(node.getDeclarationList()); + List<DeclarationNode> declarations = node.getDeclarationList(); + + ST template = group.getInstanceOf("constraint_solving"); + + List<ST> declarationTemplates = new ArrayList<>(); + for (DeclarationNode declaration: declarations) { + declarationTemplates.add(generateConstraintVariableDeclaration(declaration)); + } + + int iterationConstructCounter = iterationConstructHandler.getIterationConstructCounter(); + String identifier = "_cs_set_" + iterationConstructCounter; + String problemIdentifier = "_cs_problem_" + iterationConstructCounter; + + boolean isRelation = node.getDeclarationList().size() > 1; + //generateBody(template, enumerationTemplates, otherConstructs, identifier, isRelation, predicate, declarations, type); + + template.add("identifier", identifier); + template.add("isRelation", isRelation); + template.add("problemIdentifier", problemIdentifier); + template.add("variableDeclarations", declarationTemplates); + template.add("constraint", generateConstraint((PredicateOperatorNode) node.getPredicateNode(), declarations)); + + String result = template.render(); + iterationConstructGenerator.addGeneration(node.toString(), identifier, declarations, result); + + machineGenerator.leaveIterationConstruct(node.getDeclarationList()); + return result; + } + + public ST generateConstraintVariableDeclaration(DeclarationNode declaration) { + ST range = group.getInstanceOf("constraint_type"); + switch (declaration.getType().toString()){ + case "INTEGER": + range.add("isInteger", true); + range.add("minInt", expressionGenerator.generateMinInt()); + range.add("maxInt", expressionGenerator.generateMaxInt()); + break; + case "BOOL": + range.add("isBoolean", true); + break; + default: + throw new CodeGenerationException("Type " + declaration.getType().toString() + " not supported for constraint solving!"); + } + + int iterationConstructCounter = iterationConstructHandler.getIterationConstructCounter(); + String problemIdentifier = "_cs_problem_" + iterationConstructCounter; + + ST template = group.getInstanceOf("constraint_variable_declaration"); + template.add("identifier", declaration.getName()); + template.add("range", range.render()); + template.add("problemIdentifier", problemIdentifier); + return template; + } + + public String generateConstraint(PredicateOperatorNode predicate, List<DeclarationNode> declarations) { + ST constraint = group.getInstanceOf("constraint"); + + int iterationConstructCounter = iterationConstructHandler.getIterationConstructCounter(); + String problemIdentifier = "_cs_problem_" + iterationConstructCounter; + + constraint.add("problemIdentifier", problemIdentifier); + constraint.add("var1", declarations.get(0).getName()); + constraint.add("var2",declarations.subList(1,declarations.size()).stream().map(DeclarationNode::getName).collect(Collectors.toList())); + constraint.add("constraintFunction", predicateGenerator.visitPredicateOperatorNode(predicate)); + + return constraint.render(); + } + /* * This function generates code for the predicate of a set comprehension */ diff --git a/src/main/java/de/hhu/stups/codegenerator/handlers/IterationConstructHandler.java b/src/main/java/de/hhu/stups/codegenerator/handlers/IterationConstructHandler.java index f5c82146de8aabca228d4dcbe6ec69f1b56161f0..7ea631b876bf4b28174c96e6be1ddaa4ffe28fe4 100644 --- a/src/main/java/de/hhu/stups/codegenerator/handlers/IterationConstructHandler.java +++ b/src/main/java/de/hhu/stups/codegenerator/handlers/IterationConstructHandler.java @@ -1,6 +1,8 @@ package de.hhu.stups.codegenerator.handlers; +import de.hhu.stups.codegenerator.generators.ExpressionGenerator; import de.hhu.stups.codegenerator.generators.ImportGenerator; +import de.hhu.stups.codegenerator.generators.PredicateGenerator; import de.hhu.stups.codegenerator.generators.iteration.IterationConstructGenerator; import de.hhu.stups.codegenerator.generators.MachineGenerator; import de.hhu.stups.codegenerator.generators.TypeGenerator; @@ -31,8 +33,13 @@ public class IterationConstructHandler { private final STGroup group; + private final boolean useConstraintSolving; + + private ExpressionGenerator expressionGenerator; + private PredicateGenerator predicateGenerator; + public IterationConstructHandler(final STGroup group, final MachineGenerator machineGenerator, final NameHandler nameHandler, - final TypeGenerator typeGenerator, final ImportGenerator importGenerator) { + final TypeGenerator typeGenerator, final ImportGenerator importGenerator, final boolean useConstraintSolving) { this.currentIterationConstructGenerator = null; this.iterationConstructCounter = 0; this.machineGenerator = machineGenerator; @@ -40,6 +47,7 @@ public class IterationConstructHandler { this.typeGenerator = typeGenerator; this.importGenerator = importGenerator; this.group = group; + this.useConstraintSolving = useConstraintSolving; } public void setIterationConstructGenerator(IterationConstructGenerator iterationConstructGenerator) { @@ -61,7 +69,7 @@ public class IterationConstructHandler { * This function returns a new IterationConstructGenerator */ public IterationConstructGenerator getNewIterationConstructGenerator() { - return new IterationConstructGenerator(this, machineGenerator, nameHandler, group, typeGenerator, importGenerator); + return new IterationConstructGenerator(this, machineGenerator, nameHandler, group, typeGenerator, importGenerator, expressionGenerator, predicateGenerator, useConstraintSolving); } /* @@ -153,4 +161,12 @@ public class IterationConstructHandler { public IterationConstructGenerator getCurrentIterationConstructGenerator() { return currentIterationConstructGenerator; } + + public void setExpressionGenerator(ExpressionGenerator expressionGenerator) { + this.expressionGenerator = expressionGenerator; + } + + public void setPredicateGenerator(PredicateGenerator predicateGenerator) { + this.predicateGenerator = predicateGenerator; + } } diff --git a/src/main/resources/de/hhu/stups/codegenerator/PythonTemplate.stg b/src/main/resources/de/hhu/stups/codegenerator/PythonTemplate.stg index 118d0fd6707621ab00e34ae1ad6ff147671b56e6..6b3a772cdc5e2b44b0f80a9d9fad698776a3af24 100644 --- a/src/main/resources/de/hhu/stups/codegenerator/PythonTemplate.stg +++ b/src/main/resources/de/hhu/stups/codegenerator/PythonTemplate.stg @@ -15,8 +15,6 @@ from btypes.BUtils import BUtils class <machine>: - - <sets; separator="\n"> <initialization> @@ -199,6 +197,38 @@ if(<predicate>).booleanValue(): <endif> >> +constraint_solving(identifier, problemIdentifier, variableDeclarations, constraint, isRelation) ::= << +from constraint import Problem +from functools import reduce +from btypes.BSet import BSet +from btypes.BUtils import BUtils +<problemIdentifier> = Problem() +<variableDeclarations; separator="\n"> +<constraint> +<identifier> = <problemIdentifier>.getSolutions() +<if(isRelation)><identifier> = reduce(lambda a,e: a.union(BRelation(reduce(lambda b,f: BTuple(b,f), + list(e.values())[2:], + BTuple(list(e.values())[0],list(e.values())[1])))), + <identifier>, + BRelation()) +<else><identifier> = reduce(lambda a,e: a.union(BSet(e.values())), + <identifier>, + BSet()) +<endif> +>> + +constraint_variable_declaration(identifier, problemIdentifier, range) ::= << +<identifier> = <problemIdentifier>.addVariable("<identifier>", <range>) +>> + +constraint_type(isInteger, minInt, maxInt, isBoolean, isSet) ::= << +<if(isInteger)>BSet.interval(<minInt>, <maxInt>).getSet()<elseif(isBoolean)>BUtils.BOOL.getSet()<endif> +>> + +constraint(problemIdentifier, var1, var2, constraintFunction) ::= << +<problemIdentifier>.addConstraint(lambda <var1><var2 : {var |, <var>}>: <constraintFunction>, ("<var1>"<var2 : {var |, "<var>"}>)) +>> + lambda(type, identifier, lambda, leftType, rightType) ::= << <identifier> = BRelation() <lambda> @@ -407,11 +437,11 @@ binary(arg1,operator,arg2) ::= << >> or(arg1, arg2) ::= << -<arg1> or <arg2> +(<arg1> or <arg2>) >> and(arg1, arg2) ::= << -<arg1> and <arg2> +(<arg1> and <arg2>) >> implies(arg1, arg2) ::= << @@ -529,8 +559,8 @@ identifier(identifier, rhsOnLhs, fromOtherMachine, otherMachine, isPrivate) ::= <if(fromOtherMachine)>self.<otherMachine>._get_<identifier>()<else><if(rhsOnLhs)>_ld_<identifier><else><if(isPrivate)>self.<endif><identifier><endif><endif> >> -number(number, useBigInteger) ::= << -<if(useBigInteger)>BInteger("<number>")<else>BInteger(<number>)<endif> +number(number) ::= << +BInteger(<number>) >> infinite_predicate(arg, operator) ::= << diff --git a/src/test/java/de/hhu/stups/codegenerator/TestC.java b/src/test/java/de/hhu/stups/codegenerator/TestC.java index 95d8fe8c62eed244de72f9116ea34047de8668fd..ce94f3b41aca949053935ee8f207315e5ca49de3 100644 --- a/src/test/java/de/hhu/stups/codegenerator/TestC.java +++ b/src/test/java/de/hhu/stups/codegenerator/TestC.java @@ -29,7 +29,7 @@ public class TestC { Path mchPath = Paths.get(CodeGenerator.class.getClassLoader() .getResource("de/hhu/stups/codegenerator/" + machine + ".mch").toURI()); CodeGenerator codeGenerator = new CodeGenerator(); - List<Path> cFilePaths = codeGenerator.generate(mchPath, GeneratorMode.C, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, null, false); + List<Path> cFilePaths = codeGenerator.generate(mchPath, GeneratorMode.C, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", false,true, null, false); //cFilePaths.forEach(path -> cleanUp(path.toString())); } diff --git a/src/test/java/de/hhu/stups/codegenerator/TestClojure.java b/src/test/java/de/hhu/stups/codegenerator/TestClojure.java index eef63ea2b7aff0dab6e0eaee2fdcee4e850c3d81..f990327f02478021d6a8a163dde6d9f7f476785a 100644 --- a/src/test/java/de/hhu/stups/codegenerator/TestClojure.java +++ b/src/test/java/de/hhu/stups/codegenerator/TestClojure.java @@ -25,7 +25,7 @@ public class TestClojure { Path mchPath = Paths.get(CodeGenerator.class.getClassLoader() .getResource("de/hhu/stups/codegenerator/" + machine + ".mch").toURI()); CodeGenerator codeGenerator = new CodeGenerator(); - List<Path> cljFilePaths = codeGenerator.generate(mchPath, GeneratorMode.CLJ, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, null, false); + List<Path> cljFilePaths = codeGenerator.generate(mchPath, GeneratorMode.CLJ, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", false, true, null, false); //cljFilePaths.forEach(path -> cleanUp(path.toString())); } diff --git a/src/test/java/de/hhu/stups/codegenerator/cpp/TestCpp.java b/src/test/java/de/hhu/stups/codegenerator/cpp/TestCpp.java index 66f5d54a376334c061048d7e4b590b6474e705dc..093339e911d1ea740fac63e7cbacb34995df2689 100644 --- a/src/test/java/de/hhu/stups/codegenerator/cpp/TestCpp.java +++ b/src/test/java/de/hhu/stups/codegenerator/cpp/TestCpp.java @@ -48,7 +48,7 @@ public class TestCpp { Path mchPath = Paths.get(CodeGenerator.class.getClassLoader() .getResource("de/hhu/stups/codegenerator/" + machine + ".mch").toURI()); CodeGenerator codeGenerator = new CodeGenerator(); - List<Path> cppFilePaths = codeGenerator.generate(mchPath, GeneratorMode.CPP, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, null, false); + List<Path> cppFilePaths = codeGenerator.generate(mchPath, GeneratorMode.CPP, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", false,true, null, false); Process process = Runtime.getRuntime() .exec("g++ -std=c++14 -O2 -march=native -g -DIMMER_NO_THREAD_SAFETY -c " + cppFilePaths.get(cppFilePaths.size() - 1).toFile().getAbsoluteFile().toString()); @@ -63,7 +63,7 @@ public class TestCpp { Path mchPath = Paths.get(CodeGenerator.class.getClassLoader() .getResource("de/hhu/stups/codegenerator/" + machine + ".mch").toURI()); CodeGenerator codeGenerator = new CodeGenerator(); - List<Path> cppFilePaths = codeGenerator.generate(mchPath, GeneratorMode.CPP, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, addition, false); + List<Path> cppFilePaths = codeGenerator.generate(mchPath, GeneratorMode.CPP, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", false,true, addition, false); Runtime runtime = Runtime.getRuntime(); diff --git a/src/test/java/de/hhu/stups/codegenerator/java/TestJava.java b/src/test/java/de/hhu/stups/codegenerator/java/TestJava.java index be55a3b26533dae955c95f8585dfc7004d32ffa5..f305c81c884f6fd9ea35b731c9fcd80113b47103 100644 --- a/src/test/java/de/hhu/stups/codegenerator/java/TestJava.java +++ b/src/test/java/de/hhu/stups/codegenerator/java/TestJava.java @@ -48,7 +48,7 @@ public class TestJava { Path mchPath = Paths.get(CodeGenerator.class.getClassLoader() .getResource("de/hhu/stups/codegenerator/" + machine + ".mch").toURI()); CodeGenerator codeGenerator = new CodeGenerator(); - List<Path> javaFilePaths = codeGenerator.generate(mchPath, GeneratorMode.JAVA, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, null, false); + List<Path> javaFilePaths = codeGenerator.generate(mchPath, GeneratorMode.JAVA, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", false,true, null, false); Process process = Runtime.getRuntime() .exec("javac -classpath btypes_persistent.jar " + String.join(" ", javaFilePaths.stream() .map(path -> path.toFile().getAbsoluteFile().toString()) @@ -71,7 +71,7 @@ public class TestJava { Path mchPath = Paths.get(CodeGenerator.class.getClassLoader() .getResource("de/hhu/stups/codegenerator/" + machinePath + ".mch").toURI()); CodeGenerator codeGenerator = new CodeGenerator(); - List<Path> javaFilePaths = codeGenerator.generate(mchPath, GeneratorMode.JAVA, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, addition, false); + List<Path> javaFilePaths = codeGenerator.generate(mchPath, GeneratorMode.JAVA, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", false, true, addition, false); Runtime runtime = Runtime.getRuntime(); Process compileProcess = runtime.exec("javac -cp btypes_persistent.jar " + String.join(" ", javaFilePaths.stream() diff --git a/src/test/java/de/hhu/stups/codegenerator/python/TestPython.java b/src/test/java/de/hhu/stups/codegenerator/python/TestPython.java index 4e4230bc746b8c13f514dc9ac388ff1b5a886418..c81134d15e4b373611c3804cb8706e639c7bd28f 100644 --- a/src/test/java/de/hhu/stups/codegenerator/python/TestPython.java +++ b/src/test/java/de/hhu/stups/codegenerator/python/TestPython.java @@ -45,7 +45,7 @@ public class TestPython { Path mchPath = Paths.get(CodeGenerator.class.getClassLoader() .getResource("de/hhu/stups/codegenerator/" + machine + ".mch").toURI()); CodeGenerator codeGenerator = new CodeGenerator(); - List<Path> pythonFilePaths = codeGenerator.generate(mchPath, GeneratorMode.PY, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, null, false); + List<Path> pythonFilePaths = codeGenerator.generate(mchPath, GeneratorMode.PY, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, true, null, false); //pythonFilePaths.forEach(path -> cleanUp(path.toString())); } @@ -55,7 +55,7 @@ public class TestPython { Path mchPath = Paths.get(CodeGenerator.class.getClassLoader() .getResource("de/hhu/stups/codegenerator/" + machinePath + ".mch").toURI()); CodeGenerator codeGenerator = new CodeGenerator(); - List<Path> pythonFilePaths = codeGenerator.generate(mchPath, GeneratorMode.PY, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, addition, false); + List<Path> pythonFilePaths = codeGenerator.generate(mchPath, GeneratorMode.PY, false, String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), "10", true, true, addition, false); Path mainPath = pythonFilePaths.get(pythonFilePaths.size() - 1); diff --git a/src/test/java/de/hhu/stups/codegenerator/python/TestSetComprehension.java b/src/test/java/de/hhu/stups/codegenerator/python/TestSetComprehension.java new file mode 100644 index 0000000000000000000000000000000000000000..24c03c17bd86e7db22bb31c094af6ebdb70c4092 --- /dev/null +++ b/src/test/java/de/hhu/stups/codegenerator/python/TestSetComprehension.java @@ -0,0 +1,36 @@ +package de.hhu.stups.codegenerator.python; + +import org.junit.Test; + +public class TestSetComprehension extends TestPython { + + @Test + public void testSetComprehensionInteger() throws Exception { + testPython("set_comprehension/SetComprehensionInteger", "SetComprehensionInteger", "SetComprehensionIntegerAddition.stpy", true); + } + + @Test + public void testSetComprehensionInteger2() throws Exception { + testPython("set_comprehension/SetComprehensionInteger2", "SetComprehensionInteger2", "SetComprehensionInteger2Addition.stpy", true); + } + + @Test + public void testSetComprehensionInteger3() throws Exception { + testPython("set_comprehension/SetComprehensionInteger3", "SetComprehensionInteger3", "SetComprehensionInteger3Addition.stpy", true); + } + + @Test + public void testSetComprehensionBool() throws Exception { + testPython("set_comprehension/SetComprehensionBool", "SetComprehensionBool", "SetComprehensionBoolAddition.stpy", true); + } + + @Test + public void testSetComprehensionBool2() throws Exception { + testPython("set_comprehension/SetComprehensionBool2", "SetComprehensionBool2", "SetComprehensionBool2Addition.stpy", true); + } + + @Test + public void testSetComprehensionExists() throws Exception { + testPython("set_comprehension/SetComprehensionExists", "SetComprehensionExists", "SetComprehensionExistsAddition.stpy", true); + } +} diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool.mch b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool.mch new file mode 100644 index 0000000000000000000000000000000000000000..9b9b95f74c46ad6698845cdcd5cb79a64e6e28d0 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool.mch @@ -0,0 +1,18 @@ +MACHINE SetComprehensionBool + +VARIABLES x + +INVARIANT x : POW(BOOL*BOOL) + +INITIALISATION x := {} + +OPERATIONS + + calculate = + x:={a,b|a=TRUE or b=TRUE}; + + out <-- getCard = out := card(x); + + out <-- getSet = out := x + +END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool.out b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool.out new file mode 100644 index 0000000000000000000000000000000000000000..e440e5c842586965a7fb77deda2eca68612b1f53 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool.out @@ -0,0 +1 @@ +3 \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool2.mch b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool2.mch new file mode 100644 index 0000000000000000000000000000000000000000..785a3ac51dd7f3557f7a8a5ed3e16e93c8b76b0d --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool2.mch @@ -0,0 +1,18 @@ +MACHINE SetComprehensionBool2 + +VARIABLES x + +INVARIANT x : POW(BOOL*BOOL*BOOL*BOOL) + +INITIALISATION x := {} + +OPERATIONS + + calculate = + x:={a,b,c,d|(a=TRUE or b=TRUE) & (c=TRUE or d=TRUE)}; + + out <-- getCard = out := card(x); + + out <-- getSet = out := x + +END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool2.out b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool2.out new file mode 100644 index 0000000000000000000000000000000000000000..f11c82a4cb6cc2e8f3bdf52b5cdeaad4d5bb214e --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool2.out @@ -0,0 +1 @@ +9 \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool2Addition.stpy b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool2Addition.stpy new file mode 100644 index 0000000000000000000000000000000000000000..9511277c2623934e3a0fc9fde8b851345f2b4773 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBool2Addition.stpy @@ -0,0 +1,4 @@ +if __name__ == '__main__': + setComprehension = SetComprehensionBool2() + setComprehension.calculate() + print(setComprehension.getCard()) \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBoolAddition.stpy b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBoolAddition.stpy new file mode 100644 index 0000000000000000000000000000000000000000..5442bf624cc2da234ab675a86fd5949574c2729d --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionBoolAddition.stpy @@ -0,0 +1,4 @@ +if __name__ == '__main__': + setComprehension = SetComprehensionBool() + setComprehension.calculate() + print(setComprehension.getCard()) \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionExists.mch b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionExists.mch new file mode 100644 index 0000000000000000000000000000000000000000..1115ab67febf6038fe7493d8337c37437f73842f --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionExists.mch @@ -0,0 +1,18 @@ +MACHINE SetComprehensionExists + +VARIABLES x + +INVARIANT x : POW(INTEGER*INTEGER) + +INITIALISATION x := {} + +OPERATIONS + + calculate = + x:={a,b|a:1..100 & b:1..100 & 3<a & b<10 & ∃c.(c:1..100 & a<c & c<b)}; + + out <-- getCard = out := card(x); + + out <-- getSet = out := x + +END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionExists.out b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionExists.out new file mode 100644 index 0000000000000000000000000000000000000000..e440e5c842586965a7fb77deda2eca68612b1f53 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionExists.out @@ -0,0 +1 @@ +3 \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionExistsAddition.stpy b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionExistsAddition.stpy new file mode 100644 index 0000000000000000000000000000000000000000..0209448b1475d8f1ea19f21d3110c9a0e3dc020e --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionExistsAddition.stpy @@ -0,0 +1,4 @@ +if __name__ == '__main__': + setComprehension = SetComprehensionExists() + setComprehension.calculate() + print(setComprehension.getCard()) \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger.mch b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger.mch new file mode 100644 index 0000000000000000000000000000000000000000..5ef8f7311500a7408d0fc9a84643f3b25a45f7a6 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger.mch @@ -0,0 +1,18 @@ +MACHINE SetComprehensionInteger + +VARIABLES x + +INVARIANT x : POW(INTEGER*INTEGER) + +INITIALISATION x := {} + +OPERATIONS + + calculate = + x:={a,b|a>3 & a<6 & b=a}; + + out <-- getCard = out := card(x); + + out <-- getSet = out := x + +END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger.out b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger.out new file mode 100644 index 0000000000000000000000000000000000000000..d8263ee9860594d2806b0dfd1bfd17528b0ba2a4 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger.out @@ -0,0 +1 @@ +2 \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger2.mch b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger2.mch new file mode 100644 index 0000000000000000000000000000000000000000..7509d5487e66f165661f624a7bfcbaf009f28350 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger2.mch @@ -0,0 +1,18 @@ +MACHINE SetComprehensionInteger2 + +VARIABLES x + +INVARIANT x : POW(INTEGER*INTEGER*INTEGER) + +INITIALISATION x := {} + +OPERATIONS + + calculate = + x:={a, b, c|a:3..6 & b: 3..6 & c=1 & a>3 & a<6 & b=a}; + + out <-- getCard = out := card(x); + + out <-- getSet = out := x + +END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger2.out b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger2.out new file mode 100644 index 0000000000000000000000000000000000000000..d8263ee9860594d2806b0dfd1bfd17528b0ba2a4 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger2.out @@ -0,0 +1 @@ +2 \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger2Addition.stpy b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger2Addition.stpy new file mode 100644 index 0000000000000000000000000000000000000000..6fb81631a52a1fe27b60fe17cdf94eccbc13ecb7 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger2Addition.stpy @@ -0,0 +1,4 @@ +if __name__ == '__main__': + setComprehension = SetComprehensionInteger2() + setComprehension.calculate() + print(setComprehension.getCard()) \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger3.mch b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger3.mch new file mode 100644 index 0000000000000000000000000000000000000000..fdf6ae321772d375840b46ef1581c2e5009f540c --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger3.mch @@ -0,0 +1,18 @@ +MACHINE SetComprehensionInteger3 + +VARIABLES x + +INVARIANT x : POW(INTEGER) + +INITIALISATION x := {} + +OPERATIONS + + calculate = + x:={a|0<a & a<5}; + + out <-- getCard = out := card(x); + + out <-- getSet = out := x + +END \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger3.out b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger3.out new file mode 100644 index 0000000000000000000000000000000000000000..bf0d87ab1b2b0ec1a11a3973d2845b42413d9767 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger3.out @@ -0,0 +1 @@ +4 \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger3Addition.stpy b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger3Addition.stpy new file mode 100644 index 0000000000000000000000000000000000000000..84499333d85eac476cca3cb2350907a077f3660a --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionInteger3Addition.stpy @@ -0,0 +1,4 @@ +if __name__ == '__main__': + setComprehension = SetComprehensionInteger3() + setComprehension.calculate() + print(setComprehension.getCard()) \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionIntegerAddition.stpy b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionIntegerAddition.stpy new file mode 100644 index 0000000000000000000000000000000000000000..de8fcf47092c6a1af6ff1bdc0fbd302370db45f9 --- /dev/null +++ b/src/test/resources/de/hhu/stups/codegenerator/set_comprehension/SetComprehensionIntegerAddition.stpy @@ -0,0 +1,4 @@ +if __name__ == '__main__': + setComprehension = SetComprehensionInteger() + setComprehension.calculate() + print(setComprehension.getCard()) \ No newline at end of file