Skip to content
Snippets Groups Projects
Verified Commit 89ab8731 authored by Miles Vella's avatar Miles Vella
Browse files

improve functionality for freetype code gen

parent 06fc0466
Branches
No related tags found
No related merge requests found
Pipeline #151259 failed
......@@ -412,4 +412,24 @@ public class DeclarationGenerator {
return result;
}
public String callFreetype(DeclarationNode declNode) {
ST ftCall = currentGroup.getInstanceOf("freetype_call");
TemplateHandler.add(ftCall, "name", nameHandler.handleIdentifier(declNode.getName(), NameHandler.IdentifierHandlingEnum.FUNCTION_NAMES));
return ftCall.render();
}
public String callFreetypeElement(DeclarationNode declNode) {
ST ftCall;
if (declNode instanceof FreetypeElementNode) {
ftCall = currentGroup.getInstanceOf("freetype_element_call");
} else if (declNode instanceof FreetypeConstructorNode) {
ftCall = currentGroup.getInstanceOf("freetype_constructor_call");
} else {
throw new AssertionError();
}
TemplateHandler.add(ftCall, "name", nameHandler.handleIdentifier(declNode.getName(), NameHandler.IdentifierHandlingEnum.FUNCTION_NAMES));
return ftCall.render();
}
}
package de.hhu.stups.codegenerator.generators;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import de.hhu.stups.codegenerator.GeneratorMode;
import de.hhu.stups.codegenerator.handlers.IterationConstructHandler;
import de.hhu.stups.codegenerator.handlers.NameHandler;
......@@ -30,18 +39,10 @@ import de.prob.parser.ast.types.CoupleType;
import de.prob.parser.ast.types.IntegerType;
import de.prob.parser.ast.types.SetType;
import de.prob.parser.ast.types.UntypedType;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.STGroup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static de.prob.parser.ast.nodes.expression.ExpressionOperatorNode.ExpressionOperator.BOOL;
import static de.prob.parser.ast.nodes.expression.ExpressionOperatorNode.ExpressionOperator.CARD;
import static de.prob.parser.ast.nodes.expression.ExpressionOperatorNode.ExpressionOperator.CARTESIAN_PRODUCT;
......@@ -224,6 +225,16 @@ public class ExpressionGenerator {
EnumeratedSetElementNode element = (EnumeratedSetElementNode) node;
return declarationGenerator.callEnum(element.getType().toString(), element.getDeclarationNode());
} else if(node instanceof IdentifierExprNode) {
IdentifierExprNode identNode = (IdentifierExprNode) node;
DeclarationNode declNode = identNode.getDeclarationNode();
if (declNode != null) {
switch (declNode.getKind()) {
case FREETYPE:
return declarationGenerator.callFreetype(declNode);
case FREETYPE_ELEMENT:
return declarationGenerator.callFreetypeElement(declNode);
}
}
Map<String, List<String>> enumTypes = nameHandler.getEnumTypes();
//This is the case where the name of an enumerated set element is returned as an IdentifierExprNode
String nodeName = ((IdentifierExprNode) node).getName();
......
package de.hhu.stups.codegenerator.generators;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import de.hhu.stups.codegenerator.handlers.NameHandler;
import de.hhu.stups.codegenerator.handlers.TemplateHandler;
import de.prob.parser.ast.nodes.MachineNode;
......@@ -10,19 +14,15 @@ import de.prob.parser.ast.types.BoolType;
import de.prob.parser.ast.types.CoupleType;
import de.prob.parser.ast.types.DeferredSetElementType;
import de.prob.parser.ast.types.EnumeratedSetElementType;
import de.prob.parser.ast.types.FreetypeType;
import de.prob.parser.ast.types.IntegerType;
import de.prob.parser.ast.types.RecordType;
import de.prob.parser.ast.types.SetType;
import de.prob.parser.ast.types.StringType;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.STGroup;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class ImportGenerator {
private final STGroup group;
......@@ -81,6 +81,13 @@ public class ImportGenerator {
importBObject();
importStruct((RecordType) type);
importBBoolean();
} else if (type instanceof FreetypeType) {
importBObject();
importBFreetype();
importFreetype((FreetypeType) type);
importBBoolean();
} else {
throw new IllegalArgumentException("Unsupported type: " + type);
}
}
......@@ -104,6 +111,18 @@ public class ImportGenerator {
}
}
/*
* This function generates code for importing the given freetype
*/
private void importFreetype(FreetypeType type) {
boolean fromOtherMachine = nameHandler.getFreetypeToMachine().get(type.getName()) != null && !nameHandler.getMachineName().equals(nameHandler.getFreetypeToMachine().get(type.getName()));
if (fromOtherMachine || forVisualization) {
ST enumImport = group.getInstanceOf("freetype_import");
TemplateHandler.add(enumImport, "name", type.getName());
TemplateHandler.add(enumImport, "machineName", nameHandler.getEnumToMachine().get(type.getName()));
importedEnums.add(enumImport.render());
}
}
/*
* This function generates an import for a type and its subtype
......@@ -204,6 +223,17 @@ public class ImportGenerator {
importedTypes.add("BStruct");
}
/*
* This function generates code for importing BFreetype
*/
private void importBFreetype() {
ST template = group.getInstanceOf("import_type");
TemplateHandler.add(template, "type", "BFreetype");
TemplateHandler.add(template, "useBigInteger", useBigInteger);
imports.add(template.render());
importedTypes.add("BFreetype");
}
/*
* This function generates code for importing BSet and its subtype
*/
......
......@@ -111,11 +111,17 @@ public class NameHandler {
reservedMachinesAndFunctionsAndVariables.addAll(node.getDeferredSets().stream()
.map(set -> handleIdentifier(set.getName(), FUNCTION_NAMES))
.collect(Collectors.toList()));
reservedMachinesAndFunctionsAndVariables.addAll(node.getFreetypes().stream()
.map(set -> handleIdentifier(set.getFreetypeDeclarationNode().getName(), FUNCTION_NAMES))
.collect(Collectors.toList()));
globals.addAll(reservedMachinesAndFunctionsAndVariables);
globals.addAll(node.getEnumeratedSets().stream()
.map(set -> handleIdentifier(set.getSetDeclarationNode().getName(), NameHandler.IdentifierHandlingEnum.VARIABLES))
.collect(Collectors.toList()));
globals.addAll(node.getFreetypes().stream()
.map(set -> handleIdentifier(set.getFreetypeDeclarationNode().getName(), NameHandler.IdentifierHandlingEnum.VARIABLES))
.collect(Collectors.toList()));
}
......@@ -219,6 +225,10 @@ public class NameHandler {
return machineGenerator.getDeclarationGenerator().getEnumToMachine();
}
public Map<String, String> getFreetypeToMachine() {
return machineGenerator.getDeclarationGenerator().getFreetypeToMachine();
}
public String getMachineName() {
return machineGenerator.getMachineName();
}
......
......@@ -673,6 +673,99 @@ public static final class <name> extends <freetype> {
return "<name>(" + this.value + ")";
}
}
public static final class <name>Constructor implements BObject {
public static final <name>Constructor INSTANCE = new <name>Constructor();
private <name>Constructor() {
}
public static <name>Destructor inverse() {
return <name>Destructor.INSTANCE;
}
public static <name> functionCall(<subtype> value) {
return new <name>(value);
}
public static BBoolean isInRange(<freetype> o) {
return new BBoolean(o instanceof <name>);
}
public BBoolean equal(<name>Constructor o) {
return new BBoolean(true);
}
public BBoolean unequal(<name>Constructor o) {
return new BBoolean(false);
}
@Override
public boolean equals(Object o) {
return o instanceof <name>Constructor;
}
@Override
public int hashCode() {
return <name>Constructor.class.hashCode();
}
@Override
public String toString() {
return "<name>";
}
}
public static final class <name>Destructor implements BObject {
public static final <name>Destructor INSTANCE = new <name>Destructor();
private <name>Destructor() {
}
public static <subtype> functionCall(<freetype> value) {
return ((<name>) value).getValue();
}
public BBoolean equal(<name>Destructor o) {
return new BBoolean(true);
}
public BBoolean unequal(<name>Destructor o) {
return new BBoolean(false);
}
@Override
public boolean equals(Object o) {
return o instanceof <name>Destructor;
}
@Override
public int hashCode() {
return <name>Destructor.class.hashCode();
}
@Override
public String toString() {
return "<name>~";
}
}
>>
freetype_import() ::= <<
>>
freetype_call(name) ::= <<
<name>
>>
freetype_element_call(name) ::= <<
<name>.INSTANCE
>>
freetype_constructor_call(name) ::= <<
<name>Constructor.INSTANCE
>>
bool() ::= <<
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment