diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/EnhancedForStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/EnhancedForStatement.java index a447d10..77377f4 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/EnhancedForStatement.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/EnhancedForStatement.java @@ -17,6 +17,7 @@ @Override public String toString() { - return "for (" + singleVariableDeclaration + " : " + expression + ") " + body; + String typeName = singleVariableDeclaration.getType().getImplementationTypeName(); + return "for (" + typeName + " " + singleVariableDeclaration.getName() + " : " + expression + ") " + body; } } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ForStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ForStatement.java index 479d6b5..3acee16 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/ForStatement.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ForStatement.java @@ -48,7 +48,8 @@ sb.append("for ("); for (int i = 0; i < initializers.size(); i++) { - sb.append(initializers.get(i)); + String init = initializers.get(i).toString(); + sb.append(init.endsWith(";") ? init.substring(0, init.length() - 1) : init); if (i < initializers.size() - 1) sb.append(", "); } sb.append("; "); @@ -57,13 +58,13 @@ sb.append("; "); for (int i = 0; i < updaters.size(); i++) { - sb.append(updaters.get(i)); + String update = updaters.get(i).toString(); + sb.append(update.endsWith(";") ? update.substring(0, update.length() - 1) : update); if (i < updaters.size() - 1) sb.append(", "); } sb.append(") "); if (body != null) sb.append(body); - return sb.toString(); } } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/IfStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/IfStatement.java index d688700..3ad4b77 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/IfStatement.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/IfStatement.java @@ -33,7 +33,7 @@ @Override public String toString() { StringBuilder sb = new StringBuilder(); - sb.append("if (").append(expression).append(") "); + sb.append("if ").append(expression); sb.append(thenStatement); if (elseStatement != null) { sb.append(" else ").append(elseStatement); diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclaration.java index 5d86c98..b841603 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclaration.java @@ -56,13 +56,13 @@ public void addAnnotation(Annotation annotation) { annotations.put(annotation.getElementName(), annotation); } - + public String toString() { String code = ""; - for (Annotation annotation: getAnnotations()) { - code += annotation.toString() + " "; + code += variableName; + if (optionalInitializer != null) { + code += " = " + optionalInitializer; } - code += type.getInterfaceTypeName() + " " + variableName; return code; } } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclarationStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclarationStatement.java index bdc0ad4..a5f3c8a 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclarationStatement.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclarationStatement.java @@ -2,11 +2,12 @@ import java.util.ArrayList; import java.util.List; +import models.algebra.Type; public class VariableDeclarationStatement extends Statement { private List modifiers = new ArrayList<>(); - private Type type; + private Type type = null; private List fragments = new ArrayList<>(); public List getModifiers() { @@ -28,13 +29,30 @@ public List getFragments() { return fragments; } - + public void addFragment(VariableDeclaration fragment) { - this.fragments.add(fragment); + if (fragment == null) return; + + if (this.type == null) { + this.type = fragment.getType(); + this.fragments.add(fragment); + } else { + if (this.type.equals(fragment.getType())) { + this.fragments.add(fragment); + } else { + System.err.println("Type mismatch: " + fragment); + } + } } public void setFragments(List fragments) { this.fragments = fragments; + + if (fragments != null && !fragments.isEmpty()) { + this.type = fragments.get(0).getType(); + } else { + this.type = null; + } } @Override @@ -42,16 +60,19 @@ StringBuilder sb = new StringBuilder(); for (Integer mod : modifiers) { - sb.append(mod.toString()).append(" "); + if (mod == Modifier.PRIVATE) sb.append("private "); + else if (mod == Modifier.PUBLIC) sb.append("public "); + else if (mod == Modifier.PROTECTED) sb.append("protected "); + else if (mod == Modifier.STATIC) sb.append("static "); } - if (type != null) { - sb.append(type.toString()).append(" "); + if (this.type != null) { + sb.append(this.type.getImplementationTypeName()).append(" "); } for (int i = 0; i < fragments.size(); i++) { - sb.append(fragments.get(i).getName()); - if (i < fragments.size() - 1) sb.append(", "); + sb.append(fragments.get(i).toString()); + if (i < fragments.size() - 1) sb.append(", "); } sb.append(";"); diff --git a/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java b/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java index 74be013..784fab2 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java @@ -7,7 +7,6 @@ import models.dataConstraintModel.DataConstraintModel; import org.junit.Test; -import java.util.Arrays; import java.util.List; public class ASTTest { @@ -15,30 +14,35 @@ public void test() { JavaSpecific javaGen = new JavaSpecific(); - MethodDeclaration methodDeclaration = javaGen.newMethodDeclaration("Test", JavaSpecific.typeVoid); + MethodDeclaration methodDeclaration = javaGen.newMethodDeclaration("Test", DataConstraintModel.typeInt); Block methodBody = new Block(); VariableDeclarationStatement variableDeclarationStatement = new VariableDeclarationStatement(); - variableDeclarationStatement.setModifiers(List.of(Modifier.PRIVATE)); - variableDeclarationStatement.setFragments(List.of( - new VariableDeclaration(DataConstraintModel.typeInt, "x"), - new VariableDeclaration(DataConstraintModel.typeInt, "sum") - )); + VariableDeclaration varX = javaGen.newVariableDeclaration(DataConstraintModel.typeInt, "x"); + varX.setInitializer(new Constant("20")); + VariableDeclaration varSum = javaGen.newVariableDeclaration(DataConstraintModel.typeInt, "sum"); + varSum.setInitializer(new Constant("0")); + variableDeclarationStatement.addFragment(varX); + variableDeclarationStatement.addFragment(varSum); methodBody.addStatement(variableDeclarationStatement); ForStatement forStatement = javaGen.getForStatementForList("j", "list"); Block forBody = new Block(); forBody.addStatement(new ExpressionStatement( - new InfixExpression(new Symbol("+=", 2, Symbol.Type.INFIX), new Variable("sum"), new Variable("j")) + new InfixExpression(new Symbol("+=", 2, Symbol.Type.INFIX), + new Variable("sum"), + new Variable("j")) )); forStatement.setBody(forBody); methodBody.addStatement(forStatement); - EnhancedForStatement efStmt = javaGen.getForStatementForCollection(new VariableDeclaration(DataConstraintModel.typeString, "s"), "list"); + VariableDeclaration stringVarDec = javaGen.newVariableDeclaration(DataConstraintModel.typeString, "s"); + EnhancedForStatement enhancedForStatement = javaGen.getForStatementForCollection(stringVarDec, "list"); + Block efBody = new Block(); efBody.addStatement("System.out.println(s);"); - efStmt.setBody(efBody); - methodBody.addStatement(efStmt); + enhancedForStatement.setBody(efBody); + methodBody.addStatement(enhancedForStatement); Term moduloTerm = new Term(new Symbol("%", 2, Symbol.Type.INFIX)); moduloTerm.addChild(new models.algebra.Variable("sum")); @@ -63,108 +67,8 @@ methodBody.addStatement(javaGen.getReturnStatement("sum")); methodDeclaration.setBody(methodBody); - System.out.println("--- Generated Code"); + System.out.println("--- Generated Code ---"); System.out.println(methodDeclaration.toString()); -// -// MethodDeclaration methodDeclaration = new MethodDeclaration("Test", false); -// Block methodBody = new Block(); -// -// VariableDeclarationStatement variableDeclarationStatement = new VariableDeclarationStatement(); -// variableDeclarationStatement.setModifiers(List.of(new PlainStatement("private"))); -// -// variableDeclarationStatement.setFragments(List.of( -// new VariableDeclaration(new SimpleType("int"), "x"), -// new VariableDeclaration(new SimpleType("int"), "sum") -// )); -// methodBody.addStatement(variableDeclarationStatement); -// -// ForStatement forStatement = new ForStatement(); -// -// forStatement.setInitializers(Arrays.asList(new PlainStatement("int j = 0"))); -// -// InfixExpression condition = new InfixExpression( -// new Symbol("<", 2, Symbol.Type.INFIX), -// new Variable("j"), -// new Constant("5") -// ); -// forStatement.setExpression(condition); -// -// PostfixExpression increment = new PostfixExpression( -// new Variable("j"), -// PostfixExpression.Operator.INCREMENT -// ); -// forStatement.setUpdaters(Arrays.asList(new ExpressionStatement(increment))); -// -// Block forBody = new Block(); -// InfixExpression forAddition = new InfixExpression( -// new Symbol("+=", 2, Symbol.Type.INFIX), -// new Variable("sum"), -// new Variable("j") -// ); -// forBody.addStatement(new ExpressionStatement(forAddition)); -// forStatement.setBody(forBody); -// methodBody.addStatement(forStatement); -// -// EnhancedForStatement enhancedForStatement = new EnhancedForStatement(); -// enhancedForStatement.setParameter(new SimpleType("String"), "s"); -// enhancedForStatement.setExpression(new Variable("list")); -// -// Block enhancedForBody = new Block(); -// enhancedForBody.addStatement("System.out.println(s);"); -// enhancedForStatement.setBody(enhancedForBody); -// methodBody.addStatement(enhancedForStatement); -// -// WhileStatement whileStatement = new WhileStatement(); -// InfixExpression whileCondition = new InfixExpression( -// new Symbol("<", 2, Symbol.Type.INFIX), -// new Variable("sum"), -// new Constant("100") -// ); -// whileStatement.setExpression(whileCondition); -// -// Block whileBody = new Block(); -// IfStatement ifStatement = new IfStatement(); -// -// InfixExpression moduloExpression = new InfixExpression( -// new Symbol("%", 2, Symbol.Type.INFIX), -// new Variable("sum"), -// new Constant("2") -// ); -// InfixExpression ifCondition = new InfixExpression( -// new Symbol("==", 2, Symbol.Type.INFIX), -// moduloExpression, -// new Constant("0") -// ); -// ifStatement.setExpression(ifCondition); -// -// Block thenBlock = new Block(); -// thenBlock.addStatement(new ExpressionStatement(new InfixExpression( -// new Symbol("+=", 2, Symbol.Type.INFIX), -// new Variable("sum"), -// new Constant("10") -// ))); -// -// Block elseBlock = new Block(); -// elseBlock.addStatement(new ExpressionStatement(new InfixExpression( -// new Symbol("+=", 2, Symbol.Type.INFIX), -// new Variable("sum"), -// new Constant("5") -// ))); -// -// ifStatement.setThenStatement(thenBlock); -// ifStatement.setElseStatement(elseBlock); -// whileBody.addStatement(ifStatement); -// whileStatement.setBody(whileBody); -// methodBody.addStatement(whileStatement); -// -// ReturnStatement returnStatement = new ReturnStatement(); -// returnStatement.setExpression(new Variable("sum")); -// methodBody.addStatement(returnStatement); -// -// methodDeclaration.setBody(methodBody); -// -// System.out.println("--- Generated Code ---"); -// System.out.println(methodDeclaration.toString()); } } \ No newline at end of file