diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/DeclarationGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/DeclarationGenerator.java index 606629834518eac75b5e597329eb2f80b1ff99d4..c12e28eaca4d3f9d05c3d19b409f9be12792b11a 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/DeclarationGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/DeclarationGenerator.java @@ -92,7 +92,7 @@ public class DeclarationGenerator { /* * This function generates code for a parameter with the given node from the AST and the information whether it is an output parameter */ - private String generateParameter(DeclarationNode node, boolean isReturn) { + public String generateParameter(DeclarationNode node, boolean isReturn) { ST declaration = currentGroup.getInstanceOf("parameter"); TemplateHandler.add(declaration, "isReturn", isReturn); TemplateHandler.add(declaration, "type", typeGenerator.generate(node.getType())); 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 836aa2e9bffa10497a7a91c37c6a647dfd75da01..252a2bd59a38d670f6a811d70d5a6f9e8b169fc2 100755 --- a/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/MachineGenerator.java @@ -279,9 +279,10 @@ public class MachineGenerator implements AbstractVisitor<String, Void> { TemplateHandler.add(machine, "externalFunctions", machineNode.getOperations() .stream() .filter(op -> op.getName().startsWith("EXTERNAL_")) - .map(op -> generateExternalFunction(op.getName(), op.getParams() + .map(op -> generateExternalFunction(operationGenerator.generateReturnType(op), op.getName(), op.getParams() .stream() - .map(DeclarationNode::getName).collect(Collectors.toList()))) + .map(parameter -> declarationGenerator.generateParameter(parameter, false)) + .collect(Collectors.toList()))) .collect(Collectors.toList())); generateBody(node, machine); return machine.render(); @@ -372,8 +373,9 @@ public class MachineGenerator implements AbstractVisitor<String, Void> { TemplateHandler.add(machine, "structs", recordStructGenerator.generateStructs()); } - private String generateExternalFunction(String name, List<String> parameters) { + private String generateExternalFunction(String type, String name, List<String> parameters) { ST template = currentGroup.getInstanceOf("external_function"); + TemplateHandler.add(template, "type", type); TemplateHandler.add(template, "name", name); TemplateHandler.add(template, "parameters", parameters); return template.render(); diff --git a/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java b/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java index 54d851f2602b642b1c609fc58f244d1981529c64..8a61e33895cf7c266bf3705bd86db701d12029fd 100644 --- a/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java +++ b/src/main/java/de/hhu/stups/codegenerator/generators/OperationGenerator.java @@ -125,6 +125,7 @@ public class OperationGenerator { TemplateHandler.add(operation, "parameters", declarationGenerator.generateDeclarations(node.getParams(), DeclarationType.PARAMETER, false)); TemplateHandler.add(operation, "parameterNames", node.getParams().stream().map(DeclarationNode::getName).collect(Collectors.toList())); TemplateHandler.add(operation, "returnParameters", declarationGenerator.generateDeclarations(node.getOutputParams(), DeclarationType.PARAMETER, true)); + TemplateHandler.add(operation, "hasReturnParameters", !node.getOutputParams().isEmpty()); return operation; } @@ -142,6 +143,17 @@ public class OperationGenerator { } } + public String generateReturnType(OperationNode node) { + List<DeclarationNode> outputs = node.getOutputParams(); + if(outputs.size() > 1) { + return recordStructGenerator.getStruct(node); + } else if(outputs.size() == 1) { + return typeGenerator.generate(outputs.get(0).getType()); + } else { + return typeGenerator.generateVoid(); + } + } + /* * This function generates code for empty output parameters */ diff --git a/src/main/resources/de/hhu/stups/codegenerator/JavaTemplate.stg b/src/main/resources/de/hhu/stups/codegenerator/JavaTemplate.stg index fc4b0607e57be92efcc4ec3b26b657e879e74a8f..c140af61ea1ea8df78bb3d3a723afe243ebacb76 100644 --- a/src/main/resources/de/hhu/stups/codegenerator/JavaTemplate.stg +++ b/src/main/resources/de/hhu/stups/codegenerator/JavaTemplate.stg @@ -317,10 +317,14 @@ public <machine>(<if(hasExternalFunctions)>ExternalFunctionsInterface _externalF method() ::= << >> -operation(returnType, operationName, parameters, locals, body, return, isExternal, parameterNames) ::= << +operation(returnType, operationName, parameters, locals, body, return, isExternal, hasReturnParameters, parameterNames) ::= << public <returnType> <operationName>(<parameters; separator=", ">) { <if(isExternal)> + <if(hasReturnParameters)> + return _externalFunctions.<operationName>(<parameterNames; separator=", ">); + <else> _externalFunctions.<operationName>(<parameterNames; separator=", ">); + <endif> <else> <locals; separator="\n"> <body> @@ -1867,6 +1871,6 @@ transition_cache_declaration(type, identifier, operationHasParams) ::= << set_initialization(identifier, type, enums) ::= <<>> -external_function(name, parameters) ::= << -void <name>(<parameters; separator=",">); +external_function(type, name, parameters) ::= << +<type> <name>(<parameters; separator=",">); >> \ No newline at end of file diff --git a/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch index 51e761ded8ab7e6ee415e58317a9e6a0b7f1271f..0ada38950496d633255f2ec7b5d885c14a6badd0 100644 --- a/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch +++ b/src/test/resources/de/hhu/stups/codegenerator/drone/DroneCommunicator_Mockup.mch @@ -12,12 +12,12 @@ INITIALISATION cycle := 1 OPERATIONS - EXTERN_Init = + EXTERNAL_Init = SELECT init = FALSE THEN init := TRUE END; - EXTERN_open_link = + EXTERNAL_open_link = SELECT init = TRUE THEN skip END; @@ -28,7 +28,7 @@ OPERATIONS "high_level" - cflib.crazyflie.high_level_commander.HighLevelCommander "position_high_level" (the default) - cflib.positioning.position_hl_commander.PositionHlCommander */ - EXTERN_open_link_with_commander_type(commander) = + EXTERNAL_open_link_with_commander_type(commander) = SELECT init = TRUE & commander : STRING @@ -36,27 +36,27 @@ OPERATIONS skip END; - EXTERN_close_link = + EXTERNAL_close_link = SELECT init = TRUE THEN skip END; - EXTERN_register_sensors = + EXTERNAL_register_sensors = SELECT init = TRUE THEN skip END; - EXTERN_Drone_Takeoff = + EXTERNAL_Drone_Takeoff = SELECT init = TRUE THEN skip END; - EXTERN_Drone_Land = + EXTERNAL_Drone_Land = SELECT init = TRUE THEN skip END; - EXTERN_Drone_Left(dist) = + EXTERNAL_Drone_Left(dist) = SELECT init = TRUE & dist : 0..2000 @@ -64,7 +64,7 @@ OPERATIONS skip END; - EXTERN_Drone_Right(dist) = + EXTERNAL_Drone_Right(dist) = SELECT init = TRUE & dist : 0..2000 @@ -72,7 +72,7 @@ OPERATIONS skip END; - EXTERN_Drone_Up(dist) = + EXTERNAL_Drone_Up(dist) = SELECT init = TRUE & dist : 0..2000 @@ -80,7 +80,7 @@ OPERATIONS skip END; - EXTERN_Drone_Down(dist) = + EXTERNAL_Drone_Down(dist) = SELECT init = TRUE & dist : 0..2000 @@ -88,7 +88,7 @@ OPERATIONS skip END; - EXTERN_Drone_Forward(dist) = + EXTERNAL_Drone_Forward(dist) = SELECT init = TRUE & dist : 0..2000 @@ -96,7 +96,7 @@ OPERATIONS skip END; - EXTERN_Drone_Backward(dist) = + EXTERNAL_Drone_Backward(dist) = SELECT init = TRUE & dist : 0..2000 @@ -104,7 +104,7 @@ OPERATIONS skip END; - Drone_Turn_Left(degrees) = + EXTERNAL_Drone_Turn_Left(degrees) = SELECT init = TRUE & degrees : -360..360 @@ -112,7 +112,7 @@ OPERATIONS skip END; - Drone_Turn_Right(degrees) = + EXTERNAL_Drone_Turn_Right(degrees) = SELECT init = TRUE & degrees : -360..360 @@ -120,85 +120,85 @@ OPERATIONS skip END; - out <-- EXTERN_Drone_GetX = + out <-- EXTERNAL_Drone_GetX = SELECT init = TRUE THEN out := 2000; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetY = + out <-- EXTERNAL_Drone_GetY = SELECT init = TRUE THEN out := 2000; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetZ = + out <-- EXTERNAL_Drone_GetZ = SELECT init = TRUE THEN out := 2000; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetBattery = + out <-- EXTERNAL_Drone_GetBattery = SELECT init = TRUE THEN out := 100; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetFrontDistance = + out <-- EXTERNAL_Drone_GetFrontDistance = SELECT init = TRUE THEN out := 2000; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetBackDistance = + out <-- EXTERNAL_Drone_GetBackDistance = SELECT init = TRUE THEN out := 2000; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetUpDistance = + out <-- EXTERNAL_Drone_GetUpDistance = SELECT init = TRUE THEN out := 2000; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetDownDistance = + out <-- EXTERNAL_Drone_GetDownDistance = SELECT init = TRUE THEN out := 2000; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetLeftDistance = + out <-- EXTERNAL_Drone_GetLeftDistance = SELECT init = TRUE THEN out := 2000; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetRightDistance = + out <-- EXTERNAL_Drone_GetRightDistance = SELECT init = TRUE THEN out := 2000; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetRoll = + out <-- EXTERNAL_Drone_GetRoll = SELECT init = TRUE THEN out := 0; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetPitch = + out <-- EXTERNAL_Drone_GetPitch = SELECT init = TRUE THEN out := 0; cycle := cycle + 1 END; - out <-- EXTERN_Drone_GetYaw = + out <-- EXTERNAL_Drone_GetYaw = SELECT init = TRUE THEN out := 0; cycle := cycle + 1 END; - Destroy = + EXTERNAL_Destroy = SELECT init = TRUE THEN init := FALSE END