diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java index 2b4f654..844691d 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Block.java @@ -2,31 +2,88 @@ import java.util.List; import java.util.ArrayList; +import java.util.stream.Collectors; -public class Block extends ASTNode { - private List statements = new ArrayList(); +public class Block extends Statement { + private List statements = new ArrayList(); - public List getStatements() { + public List getStatements2() { return statements; } - public void setStatements(List statements) { + public void setStatements(List statements) { this.statements = statements; } - public void addFirstStatement(String statement) { + public void addFirstStatement(Statement statement) { statements.add(0, statement); } - - public void addStatement(String statement) { + + public void addStatement(Statement statement) { statements.add(statement); } - - public String toString() { - String code = ""; - for (String statement: statements) { - code += (statement + "\n"); + + public void addFirstStatements(List statements) { + this.statements.addAll(0, statements); + } + + public void addStatements(List statements) { + this.statements.addAll(statements); + } + + //==================================================== + //TODO: CodeGenerator修正後削除 + + public List getStatements() { + List strings = new ArrayList<>(); + for (Statement stmt : statements) { + if (stmt != null) { + strings.add(stmt.toString()); + } } - return code; + return strings; + } + + public void addFirstStatement(String code) { + if (code != null) { + this.addFirstStatement(new Statement() { + @Override + public String toString() { + return code; + } + }.toString()); + } + } + + public void addStatement(String code) { + if (code != null) { + this.addStatement(new PlainStatement(code)); + } + } + + //==================================================== + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("{\n"); + + for (Statement statement : statements) { + if (statement != null) { + String content = statement.toString(); + + // split statement + String[] lines = content.split("\n"); + + // Tab + for (String line : lines) { + sb.append("\t").append(line).append("\n"); + } + } + } + + sb.append("}"); + return sb.toString(); } } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/EnhancedForStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/EnhancedForStatement.java new file mode 100644 index 0000000..e1d1b42 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/EnhancedForStatement.java @@ -0,0 +1,22 @@ +package code.ast; + +public class EnhancedForStatement extends Statement { + + private VariableDeclaration singleVariableDeclaration; + private Statement expression; + private Statement body; + + public VariableDeclaration getParameter() { return singleVariableDeclaration; } + public void setParameter(VariableDeclaration parameter) { this.singleVariableDeclaration = parameter; } + + public Statement getExpression() { return expression; } + public void setExpression(Statement expression) { this.expression = expression; } + + public Statement getBody() { return body; } + public void setBody(Statement body) { this.body = body; } + + @Override + public String toString() { + return "for (" + singleVariableDeclaration + " : " + expression + ") " + body; + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ExpressionStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ExpressionStatement.java new file mode 100644 index 0000000..1d23a01 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ExpressionStatement.java @@ -0,0 +1,13 @@ +package code.ast; + +public class ExpressionStatement extends Statement{ + private Statement expression; + + public Statement getExpression() { return expression; } + public void setExpression(Statement expression) { this.expression = expression; } + + @Override + public String toString() { + return expression + ";"; + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ForStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ForStatement.java new file mode 100644 index 0000000..bf736a5 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ForStatement.java @@ -0,0 +1,69 @@ +package code.ast; + +import java.util.ArrayList; +import java.util.List; + +public class ForStatement extends Statement { + + private List initializers = new ArrayList<>(); + private Statement condition; + private List updaters = new ArrayList<>(); + private Statement body; + + public List getInitializers() { + return initializers; + } + + public void setInitializers(List initializers) { + this.initializers = initializers; + } + + public Statement getCondition() { + return condition; + } + + public void setCondition(Statement condition) { + this.condition = condition; + } + + public List getUpdaters() { + return updaters; + } + + public void setUpdaters(List updaters) { + this.updaters = updaters; + } + + public Statement getBody() { + return body; + } + + public void setBody(Statement body) { + this.body = body; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("for ("); + + for (int i = 0; i < initializers.size(); i++) { + sb.append(initializers.get(i)); + if (i < initializers.size() - 1) sb.append(", "); + } + sb.append("; "); + + if (condition != null) sb.append(condition); + sb.append("; "); + + for (int i = 0; i < updaters.size(); i++) { + sb.append(updaters.get(i)); + 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 new file mode 100644 index 0000000..e7521f1 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/IfStatement.java @@ -0,0 +1,43 @@ +package code.ast; + +public class IfStatement extends Statement { + + private Statement expression; + private Statement thenStatement; + private Statement elseStatement; + + public Statement getExpression() { + return expression; + } + + public void setExpression(Statement expression) { + this.expression = expression; + } + + public Statement getThenStatement() { + return thenStatement; + } + + public void setThenStatement(Statement thenStatement) { + this.thenStatement = thenStatement; + } + + public Statement getElseStatement() { + return elseStatement; + } + + public void setElseStatement(Statement elseStatement) { + this.elseStatement = elseStatement; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("if (").append(expression).append(") "); + sb.append(thenStatement); + if (elseStatement != null) { + sb.append(" else ").append(elseStatement); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java index 5f5aafc..b541ce6 100644 --- a/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/MethodDeclaration.java @@ -142,21 +142,18 @@ } code += (name + "("); if (parameters != null) { - String delimitar = ""; - for (VariableDeclaration parameter: parameters) { - code = code + delimitar + parameter.toString(); - delimitar = ", "; + for (int i = 0; i < parameters.size(); i++) { + code += parameters.get(i).toString(); + if (i < parameters.size() - 1) code += ", "; } } code += ") "; - if (thrws != null) { - code += thrws.toString() + " "; - } - code += "{\n"; + if (body != null) { - code += CodeUtil.insertTab(body.toString()); + code += body.toString(); + } else { + code += ";"; } - code += "}"; return code; } } diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/PlainStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/PlainStatement.java new file mode 100644 index 0000000..edc9ff5 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/PlainStatement.java @@ -0,0 +1,18 @@ +package code.ast; + +//==================================================== +//TODO: CodeGenerator修正後削除 +//==================================================== + +public class PlainStatement extends Statement { + private String code; + + public PlainStatement(String code) { + this.code = code; + } + + @Override + public String toString() { + return code; + } +} \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/ReturnStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/ReturnStatement.java new file mode 100644 index 0000000..501cd26 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/ReturnStatement.java @@ -0,0 +1,21 @@ +package code.ast; + +public class ReturnStatement extends Statement{ + private Statement expression; + + public Statement getExpression() { + return expression; + } + + public void setExpression(Statement expression) { + this.expression = expression; + } + + @Override + public String toString() { + if (expression != null) { + return "return " + expression + ";"; + } + return "return;"; + } +} diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/Statement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/Statement.java new file mode 100644 index 0000000..96d1af1 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/Statement.java @@ -0,0 +1,7 @@ +package code.ast; + +public abstract class Statement extends ASTNode { + + @Override + public abstract String toString(); +} diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclarationStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclarationStatement.java new file mode 100644 index 0000000..0348fce --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/VariableDeclarationStatement.java @@ -0,0 +1,56 @@ +package code.ast; + +import java.util.ArrayList; +import java.util.List; + +public class VariableDeclarationStatement extends Statement { + + private List modifiers = new ArrayList<>(); + private Type type; + private List fragments = new ArrayList<>(); + + public List getModifiers() { + return modifiers; + } + + public void setModifiers(List modifiers) { + this.modifiers = modifiers; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public List getFragments() { + return fragments; + } + + public void setFragments(List fragments) { + this.fragments = fragments; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + for (Statement mod : modifiers) { + sb.append(mod.toString()).append(" "); + } + + if (type != null) { + sb.append(type.toString()).append(" "); + } + + for (int i = 0; i < fragments.size(); i++) { + sb.append(fragments.get(i).getName()); + if (i < fragments.size() - 1) sb.append(", "); + } + + sb.append(";"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/code/ast/WhileStatement.java b/AlgebraicDataflowArchitectureModel/src/code/ast/WhileStatement.java new file mode 100644 index 0000000..be37a35 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/code/ast/WhileStatement.java @@ -0,0 +1,33 @@ +package code.ast; + +public class WhileStatement extends Statement { + + private Statement expression; + private Statement body; + + public Statement getExpression() { + return expression; + } + + public void setExpression(Statement expression) { + this.expression = expression; + } + + public Statement getBody() { + return body; + } + + public void setBody(Statement body) { + this.body = body; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("while (").append(expression).append(") "); + if (body != null) { + sb.append(body); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java b/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java new file mode 100644 index 0000000..c29320f --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/tests/ASTTest.java @@ -0,0 +1,72 @@ +package tests; + +import code.ast.*; +import models.dataConstraintModel.DataConstraintModel; + +import java.util.Arrays; +import java.util.List; + +public class ASTTest { + public static void main(String[] args) { + + MethodDeclaration method = new MethodDeclaration("Test", false); + Block methodBody = new Block(); + + VariableDeclarationStatement varStmt = new VariableDeclarationStatement(); + varStmt.setModifiers(List.of(new PlainStatement("private"))); + varStmt.setType(new PrimitiveType(new SimpleName("int"))); + varStmt.setFragments(List.of( + new VariableDeclaration(DataConstraintModel.typeInt, "x"), + new VariableDeclaration(DataConstraintModel.typeInt, "sum") + )); + methodBody.addStatement(varStmt); + + ForStatement forStmt = new ForStatement(); + forStmt.setInitializers(Arrays.asList(new PlainStatement("int j = 0"))); + forStmt.setCondition(new PlainStatement("j < 5")); + forStmt.setUpdaters(Arrays.asList(new PlainStatement("j++"))); + Block forBody = new Block(); + forBody.addStatement("sum += j;"); + forStmt.setBody(forBody); + methodBody.addStatement(forStmt); + + EnhancedForStatement enhancedFor = new EnhancedForStatement(); + enhancedFor.setParameter(new VariableDeclaration(DataConstraintModel.typeString, "s")); + enhancedFor.setExpression(new PlainStatement("list")); + Block eForBody = new Block(); + eForBody.addStatement("System.out.println(s);"); + enhancedFor.setBody(eForBody); + methodBody.addStatement(enhancedFor); + + WhileStatement whileStmt = new WhileStatement(); + whileStmt.setExpression(new PlainStatement("sum < 100")); + + Block whileBody = new Block(); + IfStatement ifStmt = new IfStatement(); + ifStmt.setExpression(new PlainStatement("sum % 2 == 0")); + + Block thenBlock = new Block(); + ExpressionStatement exprStmt = new ExpressionStatement(); + exprStmt.setExpression(new PlainStatement("sum += 10")); + thenBlock.addStatement(exprStmt); + + Block elseBlock = new Block(); + elseBlock.addStatement("sum += 5;"); + + ifStmt.setThenStatement(thenBlock); + ifStmt.setElseStatement(elseBlock); + + whileBody.addStatement(ifStmt); + whileStmt.setBody(whileBody); + methodBody.addStatement(whileStmt); + + ReturnStatement returnStmt = new ReturnStatement(); + returnStmt.setExpression(new PlainStatement("sum")); + methodBody.addStatement(returnStmt); + + method.setBody(methodBody); + + System.out.println("--- Generated Code ---"); + System.out.println(method.toString()); + } +} \ No newline at end of file