diff --git a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/ApplicationRuntime.java b/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/ApplicationRuntime.java deleted file mode 100644 index d879dc9..0000000 --- a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/ApplicationRuntime.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.nittalab.rdl.applicationruntime; - -public class ApplicationRuntime { - private ApplicationState applicationState = new ApplicationState(); - - public UIState getUIState() { - return applicationState.getUIState(); - } - - public TableState getTableState() { - return applicationState.getTableState(); - } - - public String getCurTableKey(String tableId) { - return null; - } -} diff --git a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/ApplicationState.java b/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/ApplicationState.java deleted file mode 100644 index ea5279a..0000000 --- a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/ApplicationState.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.nittalab.rdl.applicationruntime; - -public class ApplicationState { - private UIState uiState = new UIState(); - private TableState tableState = new TableState(); - - public UIState getUIState() { - return uiState; - } - - public TableState getTableState() { - return tableState; - } -} diff --git a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/ConstraintHandler.java b/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/ConstraintHandler.java deleted file mode 100644 index 33927b8..0000000 --- a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/ConstraintHandler.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.nittalab.rdl.applicationruntime; - -public interface ConstraintHandler { - public void beforeEvent(); - public void afterEvent(); -} diff --git a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/TableState.java b/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/TableState.java deleted file mode 100644 index d05b048..0000000 --- a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/TableState.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.nittalab.rdl.applicationruntime; - -public class TableState { - public String getValue(String tableId, String key, int columnNo) { - return null; - } - - public void updateValue(String tableId, String key, int columnNo, String value) { - - } -} diff --git a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/UIState.java b/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/UIState.java deleted file mode 100644 index 857e135..0000000 --- a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/UIState.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.nittalab.rdl.applicationruntime; - -public class UIState { - public void changeScreen(String nextScreenId) { - - } - - public String getWidgetText(String screenId, String widgetId) { - return null; - } - - public void setWidgetText(String screenId, String widgetId, String text) { - - } - - public String getCurWidgetText(String widgetId) { - return null; - } - - public String getCurWidgetState(String widgetId) { - return null; - } -} diff --git a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/WidgetEventReceiver.java b/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/WidgetEventReceiver.java deleted file mode 100644 index bd14adc..0000000 --- a/RDLApplicationRuntime/src/main/java/org/nittalab/rdl/applicationruntime/WidgetEventReceiver.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.nittalab.rdl.applicationruntime; - -public interface WidgetEventReceiver { - public void onWidgetStateChanged(); -} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationConstraintHandler.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationConstraintHandler.java new file mode 100644 index 0000000..cf2c955 --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationConstraintHandler.java @@ -0,0 +1,6 @@ +package org.ntlab.rdl.applicationruntime; + +public interface ApplicationConstraintHandler { + public void beforeEvent(); + public void afterEvent(); +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationEventReceiver.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationEventReceiver.java new file mode 100644 index 0000000..44c422f --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationEventReceiver.java @@ -0,0 +1,5 @@ +package org.ntlab.rdl.applicationruntime; + +public interface ApplicationEventReceiver { + public void onWidgetStateChanged(String screenId, String widgetId, String state); +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationPropertyUpdater.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationPropertyUpdater.java new file mode 100644 index 0000000..6aef9a8 --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationPropertyUpdater.java @@ -0,0 +1,7 @@ +package org.ntlab.rdl.applicationruntime; + +public interface ApplicationPropertyUpdater { + public void setWidgetText(String screenId, String widgetId, String text); + public void setWidgetVisibility(String screenId, String widgetId, boolean visibility); + public void setWidgetEnabled(String screenId, String widgetId, boolean enabled); +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationRuntime.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationRuntime.java new file mode 100644 index 0000000..88736ab --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationRuntime.java @@ -0,0 +1,34 @@ +package org.ntlab.rdl.applicationruntime; + +public class ApplicationRuntime { + private ApplicationState applicationState = new ApplicationState(); + private ApplicationConstraintHandler constraintHandler; + + public void setConstraintHandler(ApplicationConstraintHandler constraintHandler) { + this.constraintHandler = constraintHandler; + } + + public void setWidgetEventReceiver(ApplicationEventReceiver widgetEventReceiver) { + this.getUIState().setApplicationEventReceiver(widgetEventReceiver); + } + + public void setScreenConfigurationSender(ScreenConfigurationSender screenConfigurationSender) { + this.getUIState().setScreenConfigurationSender(screenConfigurationSender); + } + + public void setWidgetPropertySender(WidgetPropertySender widgetPropertySender) { + this.getUIState().setWidgetPropertySender(widgetPropertySender); + } + + public UIState getUIState() { + return applicationState.getUIState(); + } + + public TableState getTableState() { + return applicationState.getTableState(); + } + + public String getCurTableKey(String tableId) { + return null; + } +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationState.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationState.java new file mode 100644 index 0000000..c70228a --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ApplicationState.java @@ -0,0 +1,14 @@ +package org.ntlab.rdl.applicationruntime; + +public class ApplicationState { + private UIState uiState = new UIState(); + private TableState tableState = new TableState(); + + public UIState getUIState() { + return uiState; + } + + public TableState getTableState() { + return tableState; + } +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ScreenConfiguration.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ScreenConfiguration.java new file mode 100644 index 0000000..554efa3 --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ScreenConfiguration.java @@ -0,0 +1,4 @@ +package org.ntlab.rdl.applicationruntime; + +public class ScreenConfiguration { +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ScreenConfigurationSender.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ScreenConfigurationSender.java new file mode 100644 index 0000000..12a90b4 --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/ScreenConfigurationSender.java @@ -0,0 +1,5 @@ +package org.ntlab.rdl.applicationruntime; + +public interface ScreenConfigurationSender { + public void createScreen(String screenId, ScreenConfiguration configuration); +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/TableState.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/TableState.java new file mode 100644 index 0000000..e79b0e2 --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/TableState.java @@ -0,0 +1,11 @@ +package org.ntlab.rdl.applicationruntime; + +public class TableState { + public String getValue(String tableId, String key, int columnNo) { + return null; + } + + public void updateValue(String tableId, String key, int columnNo, String value) { + + } +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/UIState.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/UIState.java new file mode 100644 index 0000000..a7dd869 --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/UIState.java @@ -0,0 +1,75 @@ +package org.ntlab.rdl.applicationruntime; + +public class UIState implements ApplicationPropertyUpdater, WidgetEventReceiver { + private String curScreenId; + private ScreenConfigurationSender screenConfigurationSender; + private WidgetPropertySender widgetPropertySender; + private ApplicationEventReceiver applicationEventReceiver; + + public void setScreenConfigurationSender(ScreenConfigurationSender screenConfigurationSender) { + this.screenConfigurationSender = screenConfigurationSender; + } + + public void setWidgetPropertySender(WidgetPropertySender widgetPropertySender) { + this.widgetPropertySender = widgetPropertySender; + } + + public void setApplicationEventReceiver(ApplicationEventReceiver applicationEventReceiver) { + this.applicationEventReceiver = applicationEventReceiver; + } + + public void changeScreen(String nextScreenId) { + this.curScreenId = nextScreenId; + + } + + public String getWidgetText(String screenId, String widgetId) { + return null; + } + + @Override + public void setWidgetText(String screenId, String widgetId, String text) { + if (screenId.equals(this.curScreenId)) { + this.widgetPropertySender.sendWidgetText(widgetId, text); + } + } + + @Override + public void setWidgetVisibility(String screenId, String widgetId, boolean visibility) { + if (screenId.equals(this.curScreenId)) { + this.widgetPropertySender.sendWidgetVisibility(widgetId, visibility); + } + } + + @Override + public void setWidgetEnabled(String screenId, String widgetId, boolean enabled) { + if (screenId.equals(this.curScreenId)) { + this.widgetPropertySender.sendWidgetEnabled(widgetId, enabled); + } + } + + @Override + public void onWidgetStateChanged(String widgetId, String state) { + applicationEventReceiver.onWidgetStateChanged(curScreenId, widgetId, state); + } + + public void setCurWidgetText(String widgetId, String text) { + this.widgetPropertySender.sendWidgetText(widgetId, text); + } + + public void setCurWidgetVisibility(String widgetId, boolean visibility) { + this.widgetPropertySender.sendWidgetVisibility(widgetId, visibility); + } + + public void setCurWidgetEnabled(String widgetId, boolean enabled) { + this.widgetPropertySender.sendWidgetEnabled(widgetId, enabled); + } + + public String getCurWidgetText(String widgetId) { + return null; + } + + public String getCurWidgetState(String widgetId) { + return null; + } +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/WidgetEventReceiver.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/WidgetEventReceiver.java new file mode 100644 index 0000000..76fbaa8 --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/WidgetEventReceiver.java @@ -0,0 +1,5 @@ +package org.ntlab.rdl.applicationruntime; + +public interface WidgetEventReceiver { + public void onWidgetStateChanged(String widgetId, String state); +} diff --git a/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/WidgetPropertySender.java b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/WidgetPropertySender.java new file mode 100644 index 0000000..d7b1fa7 --- /dev/null +++ b/RDLApplicationRuntime/src/main/java/org/ntlab/rdl/applicationruntime/WidgetPropertySender.java @@ -0,0 +1,7 @@ +package org.ntlab.rdl.applicationruntime; + +public interface WidgetPropertySender { + public void sendWidgetText(String widgetId, String text); + public void sendWidgetEnabled(String widgetId, boolean enabled); + public void sendWidgetVisibility(String widgetId, boolean visibility); +} diff --git a/build.gradle b/build.gradle index d82bd4e..ee781ab 100644 --- a/build.gradle +++ b/build.gradle @@ -4,10 +4,10 @@ } application { - mainClass = 'org.nittalab.rdlworkbench.Main' + mainClass = 'org.ntlab.rdlworkbench.Main' } -group = 'org.nittalab' +group = 'org.ntlab' version = '1.0-SNAPSHOT' repositories { diff --git a/src/main/java/org/nittalab/rdlworkbench/Main.java b/src/main/java/org/nittalab/rdlworkbench/Main.java deleted file mode 100644 index ec045d0..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.nittalab.rdlworkbench; - -public class Main { - public static void main(String[] args) { - - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/ASTNode.java b/src/main/java/org/nittalab/rdlworkbench/ast/ASTNode.java deleted file mode 100644 index e871fc4..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/ASTNode.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public abstract class ASTNode { - private ASTNode parent; - - public ASTNode getParent() { - return parent; - } - - public void setParent(ASTNode parent) { - this.parent = parent; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/AbstractTypeDeclaration.java b/src/main/java/org/nittalab/rdlworkbench/ast/AbstractTypeDeclaration.java deleted file mode 100644 index 6f1e6e7..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/AbstractTypeDeclaration.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class AbstractTypeDeclaration extends BodyDeclaration { - protected String typeName = null; - - public String getTypeName() { - return typeName; - } - - public void setTypeName(String typeName) { - this.typeName = typeName; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/AnnotatableType.java b/src/main/java/org/nittalab/rdlworkbench/ast/AnnotatableType.java deleted file mode 100644 index bc16a58..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/AnnotatableType.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents an abstract base class for AST types that can have annotations. - * This class extends the functionality of {@link Type} by introducing support - * for attaching annotations to the type. - *

- * Subclasses of this class represent specific kinds of types in the AST that - * allow annotations, such as primitive types or other specialized types. - * - * @author s-yamagiwa - */ -public abstract class AnnotatableType extends Type { - private final List annotations = new ArrayList<>(); - - public void addAnnotation(Annotation annotation) { - annotations.add(annotation); - } - - public List getAnnotations() { - return annotations; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Annotation.java b/src/main/java/org/nittalab/rdlworkbench/ast/Annotation.java deleted file mode 100644 index ab4fb9c..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Annotation.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -public class Annotation extends ASTNode { - private String name = null; - private Map keyValueMap = null; - - public Annotation(String name) { - this.name = name; - keyValueMap = new HashMap<>(); - } - - public Annotation(String name, String value) { - this.name = name; - keyValueMap = new HashMap<>(); - keyValueMap.put("value", value); - } - - public String getElementName() { - return name; - } - - public Map getParams() { - return keyValueMap; - } - - public Object getValue(String key) { - return keyValueMap.get(key); - } - - public void addParam(String key, Object value) { - keyValueMap.put(key, value); - } - - public String toString() { - String code = "@" + name; - Set keySet = keyValueMap.keySet(); - if (keySet.size() == 0) { - return code; - } else if (keySet.size() == 1 && keySet.iterator().next().equals("value")) { - code += "(" + keyValueMap.get("value").toString() + ")"; - } else { - code += "("; - String delimitar = ""; - for (String key: keySet) { - Object value = keyValueMap.get(key); - code += delimitar + key + " = \"" + value.toString() + "\""; - delimitar = ", "; - } - code += ")"; - } - return code; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Assignment.java b/src/main/java/org/nittalab/rdlworkbench/ast/Assignment.java deleted file mode 100644 index 9285fad..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Assignment.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents an assignment expression node in AST (Abstract Syntax Tree) - * - * @author s-yamagiwa - */ -public class Assignment extends Expression { - private Expression left; - private Expression right; - - public Assignment(Expression left, Expression right) { - this.left = left; - this.right = right; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - return new Assignment(left.replace(variable, expression), right.replace(variable, expression)); - } - - public Expression getLeft() { - return left; - } - - public void setLeft(Expression left) { - this.left = left; - } - - public Expression getRight() { - return right; - } - - public void setRight(Expression right) { - this.right = right; - } - - @Override - public String toString() { - return left.toString() + " " + "=" + " " + right.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Block.java b/src/main/java/org/nittalab/rdlworkbench/ast/Block.java deleted file mode 100644 index 45fa80c..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Block.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.ArrayList; -import java.util.List; - -public class Block extends Statement { - private List statements = new ArrayList<>(); - - public List getStatements2() { - return statements; - } - - public void setStatements(List statements) { - this.statements = statements; - } - - public void addFirstStatement(Statement statement) { - statements.add(0, statement); - } - - public void addStatement(Statement statement) { - statements.add(statement); - } - - public void addFirstStatements(List statements) { - this.statements.addAll(0, statements); - } - - public void addStatements(List statements) { - this.statements.addAll(statements); - } - - public boolean contains(List statements) { - if (statements.size() == 0) return true; - for (int i = 0; i < this.statements.size(); i++) { - Statement st = this.statements.get(i); - if (st.equals(statements.get(0))) { - if (statements.size() == 1) return true; - int j = 1; - for (int k = i + 1; k < this.statements.size(); k++) { - Statement st2 = this.statements.get(k); - if (st2.equals(statements.get(j))) { - j++; - if (j == statements.size()) return true; - } - } - } - } - return false; - } - - //==================================================== - //TODO: CodeGenerator修正後削除 - - public List getStatements() { - List strings = new ArrayList<>(); - for (Statement stmt : statements) { - if (stmt != null) { - strings.add(stmt.toString()); - } - } - return strings; - } - - public void addFirstStatement(String statement) { - if (statement != null) { - this.addFirstStatement(new Statement() { - @Override - public String toString() { - return statement; - } - }); - } - } - - public void addStatement(String statement) { - if (statement != null) { - this.addStatement(new PlainStatement(statement)); - } - } - - //==================================================== - - - @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/src/main/java/org/nittalab/rdlworkbench/ast/BodyDeclaration.java b/src/main/java/org/nittalab/rdlworkbench/ast/BodyDeclaration.java deleted file mode 100644 index 078a1e3..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/BodyDeclaration.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public abstract class BodyDeclaration extends ASTNode { - private int modifiers = 0; - - public int getModifiers() { - return modifiers; - } - - public void setModifiers(int modifiers) { - this.modifiers = modifiers; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/ClassInstanceCreation.java b/src/main/java/org/nittalab/rdlworkbench/ast/ClassInstanceCreation.java deleted file mode 100644 index 6dc8ff0..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/ClassInstanceCreation.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.ArrayList; -import java.util.List; - -public class ClassInstanceCreation extends Expression { - private Type type; - - private List arguments; - - public ClassInstanceCreation(Type type) { - this(type, List.of()); - } - - public ClassInstanceCreation(Type type, List arguments) { - this.type = type; - this.arguments = arguments; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - List replacedExpressions = new ArrayList<>(); - - for (Expression argument : arguments) { - replacedExpressions.add(argument.replace(variable, expression)); - } - - return new ClassInstanceCreation(type, replacedExpressions); - } - - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - - public List getArguments() { - return arguments; - } - - public void setArguments(List arguments) { - this.arguments = arguments; - } - - public void addArgument(Expression expression) { - arguments.add(expression); - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - - builder.append("new "); - builder.append(type.toString()); - builder.append("("); - for (int i = 0; i < arguments.size(); i++) { - Expression argument = arguments.get(i); - - builder.append(argument.toString()); - - if (i < arguments.size() - 1) { - builder.append(", "); - } - } - builder.append(")"); - - return builder.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/CodeUtil.java b/src/main/java/org/nittalab/rdlworkbench/ast/CodeUtil.java deleted file mode 100644 index 0960970..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/CodeUtil.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class CodeUtil { - - public static String insertTab(String code) { - String newString = ""; - String[] lines = code.split("\n"); - for (String line: lines) { - newString = newString + "\t" + line + "\n"; - } - return newString; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/CompilationUnit.java b/src/main/java/org/nittalab/rdlworkbench/ast/CompilationUnit.java deleted file mode 100644 index 9cdfe74..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/CompilationUnit.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.ArrayList; -import java.util.List; - -public class CompilationUnit extends ASTNode { - private String fileName = null; - private List imports = new ArrayList<>(); - private List types = new ArrayList<>(); - private List interfaces = new ArrayList<>(); - - public CompilationUnit(TypeDeclaration type) { - types.add(type); - if(type.getTypeName().contains("<")) - fileName = type.getTypeName().split("<")[0] + ".java"; - else - fileName = type.getTypeName() + ".java"; - } - - public CompilationUnit(InterfaceDeclaration interfaceDeclaration) { - interfaces.add(interfaceDeclaration); - fileName = interfaceDeclaration.getTypeName() + ".java"; - } - - public List imports() { - return imports; - } - - public List types() { - return types; - } - - public void addImport(ImportDeclaration imp) { - imports.add(imp); - } - - public void addType(TypeDeclaration type) { - types.add(type); - } - - public List interfaces() { - return interfaces; - } - - public void addInterface(InterfaceDeclaration interfaceDeclaration) { - interfaces.add(interfaceDeclaration); - } - - public String getFileName() { - return fileName; - } - - public String toString() { - String result = ""; - for (ImportDeclaration imp: imports) { - result += imp.toString(); - } - result +="\n"; - for (TypeDeclaration type: types) { - result += type.toString(); - } - for (InterfaceDeclaration iDec: interfaces) { - result += iDec.toString(); - } - return result; - } -} \ No newline at end of file diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Constant.java b/src/main/java/org/nittalab/rdlworkbench/ast/Constant.java deleted file mode 100644 index d441be0..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Constant.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents a constant in the AST (Abstract Syntax Tree) - * - * @author s-yamagiwa - */ -public class Constant extends Expression { - private String value; - - public Constant(String value) { - this.value = value; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - return this; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - @Override - public String toString() { - return value; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/EnhancedForStatement.java b/src/main/java/org/nittalab/rdlworkbench/ast/EnhancedForStatement.java deleted file mode 100644 index e4da98f..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/EnhancedForStatement.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class EnhancedForStatement extends Statement { - - private VariableDeclaration singleVariableDeclaration; - private Expression expression; - private Statement body; - - public VariableDeclaration getParameter() { return singleVariableDeclaration; } - public void setParameter(VariableDeclaration parameter) { this.singleVariableDeclaration = parameter; } - - public Expression getExpression() { return expression; } - public void setExpression(Expression expression) { this.expression = expression; } - - public Statement getBody() { return body; } - public void setBody(Statement body) { this.body = body; } - - @Override - public String toString() { - String typeName = singleVariableDeclaration.getType().getImplementationTypeName(); - return "for (" + typeName + " " + singleVariableDeclaration.getName() + " : " + expression + ") " + body; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Expression.java b/src/main/java/org/nittalab/rdlworkbench/ast/Expression.java deleted file mode 100644 index 5fbb9ec..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Expression.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Abstract base class for all expression nodes in the abstract syntax tree (AST). - * - * @author s-yamagiwa - */ -public abstract class Expression extends ASTNode { - /** - * Replace {@code variable} with {@code expression} in AST. - * - * @param variable The variable to be replaced - * @param expression The expression that {@code variable} is replaced to - * @return A duplicated expression that is replaced with a given {@code expression} - * @implNote The instance of any member must be immutable - * @apiNote All variables match to the given one will be replaced with the given {@code expression} - */ - public abstract Expression replace(Variable variable, Expression expression); -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/ExpressionStatement.java b/src/main/java/org/nittalab/rdlworkbench/ast/ExpressionStatement.java deleted file mode 100644 index a0e65fe..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/ExpressionStatement.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class ExpressionStatement extends Statement{ - private Expression expression; - - public ExpressionStatement(Expression expression) { - this.expression = expression; - } - - public Expression getExpression() { return expression; } - public void setExpression(Expression expression) { this.expression = expression; } - - @Override - public String toString() { - return expression + ";"; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/FieldAccess.java b/src/main/java/org/nittalab/rdlworkbench/ast/FieldAccess.java deleted file mode 100644 index 187af27..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/FieldAccess.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents field accesses in AST (Abstract Syntax Tree) - * - * @author s-yamagiwa - */ -public class FieldAccess extends Expression { - private Expression expression; - - private String fieldName; - - public FieldAccess(String fieldName) { - this(null, fieldName); - } - - public FieldAccess(Expression expression, String fieldName) { - this.expression = expression; - this.fieldName = fieldName; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - return new FieldAccess(expression.replace(variable, expression), fieldName); - } - - public Expression getExpression() { - return expression; - } - - public void setExpression(Expression expression) { - this.expression = expression; - } - - public String getFieldName() { - return fieldName; - } - - public void setFieldName(String fieldName) { - this.fieldName = fieldName; - } - - @Override - public String toString() { - if (expression == null) { - return fieldName; - } - return expression + "." + fieldName; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/FieldDeclaration.java b/src/main/java/org/nittalab/rdlworkbench/ast/FieldDeclaration.java deleted file mode 100644 index b38af0d..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/FieldDeclaration.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import models.algebra.Type; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -public class FieldDeclaration extends BodyDeclaration implements IAnnotatable { - private Type type; - private String fieldName; - private String initializer = null; - private String initializationBlock = null; - private Map annotations = new HashMap<>(); - - public FieldDeclaration(Type type, String fieldName) { - this.type = type; - this.fieldName = fieldName; - } - - public FieldDeclaration(Type type, String fieldName, String initializer) { - this.type = type; - this.fieldName = fieldName; - this.initializer = initializer; - } - - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - - public String getName() { - return fieldName; - } - - public void setName(String fieldName) { - this.fieldName = fieldName; - } - - public String getInitializer() { - return initializer; - } - - public void setInitializer(String initializer) { - this.initializer = initializer; - } - - public String getInitializationBlock() { - return initializationBlock; - } - - public void setInitializationBlock(String initializationBlock) { - this.initializationBlock = initializationBlock; - } - - @Override - public Annotation getAnnotation(String name) { - return annotations.get(name); - } - - @Override - public Collection getAnnotations() { - return annotations.values(); - } - - @Override - public void addAnnotation(Annotation annotation) { - annotations.put(annotation.getElementName(), annotation); - } - - public String toString() { - String code = ""; - for (Annotation annotation: getAnnotations()) { - code += annotation.toString() + "\n"; - } - if (initializationBlock != null) { - code += "private " + type.getInterfaceTypeName() + " " + fieldName + ";\n" + initializationBlock + "\n"; - } else { - if (initializer == null) { - code += "private " + type.getInterfaceTypeName() + " " + fieldName + ";\n"; - } else { - code += "private " + type.getInterfaceTypeName() + " " + fieldName + " = " + initializer + ";\n"; - } - } - return code; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/ForStatement.java b/src/main/java/org/nittalab/rdlworkbench/ast/ForStatement.java deleted file mode 100644 index f7defd5..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/ForStatement.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.ArrayList; -import java.util.List; - -public class ForStatement extends Statement { - - private List initializers = new ArrayList<>(); - private Expression optionalConditionExpression; - private List updaters = new ArrayList<>(); - private Statement body; - - public List getInitializers() { - return initializers; - } - - public void setInitializers(List initializers) { - this.initializers = initializers; - } - - public Expression getExpression() { - return optionalConditionExpression; - } - - public void setExpression(Expression expression) { - this.optionalConditionExpression = expression; - } - - 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++) { - 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("; "); - - if (optionalConditionExpression != null) sb.append(optionalConditionExpression); - sb.append("; "); - - for (int i = 0; i < updaters.size(); 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/src/main/java/org/nittalab/rdlworkbench/ast/IAnnotatable.java b/src/main/java/org/nittalab/rdlworkbench/ast/IAnnotatable.java deleted file mode 100644 index 5a2c86a..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/IAnnotatable.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.Collection; - -public interface IAnnotatable { - Annotation getAnnotation(String name); - Collection getAnnotations(); - void addAnnotation(Annotation annotation); -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/IfStatement.java b/src/main/java/org/nittalab/rdlworkbench/ast/IfStatement.java deleted file mode 100644 index 1239698..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/IfStatement.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class IfStatement extends Statement { - - private Expression expression; - private Statement thenStatement; - private Statement elseStatement; - - public Expression getExpression() { - return expression; - } - - public void setExpression(Expression 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); - sb.append(thenStatement); - if (elseStatement != null) { - sb.append(" else ").append(elseStatement); - } - return sb.toString(); - } -} \ No newline at end of file diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/ImportDeclaration.java b/src/main/java/org/nittalab/rdlworkbench/ast/ImportDeclaration.java deleted file mode 100644 index 8d65586..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/ImportDeclaration.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class ImportDeclaration { - private String name; - - public ImportDeclaration(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String toString() { - return "import " + name + ";\n"; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/InfixExpression.java b/src/main/java/org/nittalab/rdlworkbench/ast/InfixExpression.java deleted file mode 100644 index a05f753..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/InfixExpression.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import models.algebra.Symbol; - -/** - * Represents an infix expression in AST (Abstract Syntax Tree) - * - * @author s-yamagiwa - */ -public class InfixExpression extends Expression { - private Symbol operator; - - private Expression leftOperand; - private Expression rightOperand; - - public InfixExpression(Symbol operator, Expression leftOperand, Expression rightOperand) { - this.operator = operator; - this.leftOperand = leftOperand; - this.rightOperand = rightOperand; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - return new InfixExpression(operator, leftOperand.replace(variable, expression), rightOperand.replace(variable, expression)); - } - - public Symbol getOperator() { - return this.operator; - } - - public void setOperator(Symbol operator) { - this.operator = operator; - } - - public Expression getLeftOperand() { - return leftOperand; - } - - public void setLeftOperand(Expression expression) { - this.leftOperand = expression; - } - - public Expression getRightOperand() { - return rightOperand; - } - - public void setRightOperand(Expression expression) { - this.rightOperand = expression; - } - - @Override - public String toString() { - return leftOperand.toString() + " " + operator.toString() + " " + rightOperand.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/InterfaceDeclaration.java b/src/main/java/org/nittalab/rdlworkbench/ast/InterfaceDeclaration.java deleted file mode 100644 index 377699d..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/InterfaceDeclaration.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.*; - - -public class InterfaceDeclaration extends AbstractTypeDeclaration implements IAnnotatable { - private List methods = new ArrayList<>(); - private Map annotations = new HashMap<>(); - - public InterfaceDeclaration(String typeName) { - this.typeName = typeName; - } - - public void addMethod(MethodDeclaration method) { - methods.add(method); - } - - public void removeMethod(MethodDeclaration method) { - methods.remove(method); - } - - public List getMethods() { - return methods; - } - - @Override - public Annotation getAnnotation(String name) { - return annotations.get(name); - } - - @Override - public Collection getAnnotations() { - return annotations.values(); - } - - @Override - public void addAnnotation(Annotation annotation) { - annotations.put(annotation.getElementName(), annotation); - } - - public String toString() { - String code = ""; - for (Annotation annotation : getAnnotations()) { - code += annotation.toString() + "\n"; - } - code += "public interface " + typeName + " {\n"; - for (MethodDeclaration m : methods) { - String signature = "\t"; - if (m.getReturnType() == null) { - signature += "void "; - } else { - signature += m.getReturnType().getInterfaceTypeName() + " "; - } - signature += m.getName() + "("; - if (m.getParameters() != null) { - for (int i = 0; i < m.getParameters().size(); i++) { - signature += m.getParameters().get(i).toString(); - if (i < m.getParameters().size() - 1) signature += ", "; - } - } - signature += ");\n"; - code += signature; - } - code += "}"; - return code; - } -} \ No newline at end of file diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Lexer.java b/src/main/java/org/nittalab/rdlworkbench/ast/Lexer.java deleted file mode 100644 index ed3510e..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Lexer.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * The Lexer class provides functionalities for parsing and iterating through - * a source string of text character by character. - * - * @author s-yamagiwa; - */ -public class Lexer { - private final String source; - private int position; - - public Lexer(String source) { - this.source = source; - this.position = 0; - } - - /** - * Retrieves the next character without advancing the position. - * - * @return The next character. - */ - public char peek() { - if (position >= source.length()) { - return '\0'; // End of line - } - - return source.charAt(position); - } - - /** - * Retrieves the next character after advancing the position. - * - * @return The next character. - */ - public char peekNext() { - if (position + 1 >= source.length()) { - return '\0'; // End of line - } - - return source.charAt(position + 1); - } - - /** - * Advances the position by one character. - * - * @return The character that was previously at the current position. - */ - public char advance() { - char current = peek(); - position++; - - return current; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/MethodDeclaration.java b/src/main/java/org/nittalab/rdlworkbench/ast/MethodDeclaration.java deleted file mode 100644 index 47e7ec8..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/MethodDeclaration.java +++ /dev/null @@ -1,190 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.*; - -public class MethodDeclaration extends BodyDeclaration implements IAnnotatable { - private String name = null; - private boolean isConstructor = false; - private Type returnType = null; - private List parameters = null; - private Block body = null; - private Map annotations = new HashMap<>(); - private Throws thrws = null; - - public MethodDeclaration(String methodName) { - this(methodName, false); - } - - public MethodDeclaration(String methodName, Type returnType) { - this(methodName, false); - this.returnType = returnType; - } - - public MethodDeclaration(String methodName, boolean isConstructor) { - this.name = methodName; - this.isConstructor = isConstructor; - } - - public MethodDeclaration(String methodName, boolean isConstructor, Type returnType, List parameters) { - this(methodName, isConstructor, returnType, parameters, null); - } - - public MethodDeclaration(String methodName, boolean isConstructor, Type returnType, List parameters, Block body) { - this(methodName, isConstructor); - this.returnType = returnType; - this.parameters = parameters; - this.body = body; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public boolean isConstructor() { - return isConstructor; - } - - public void setConstructor(boolean isConstructor) { - this.isConstructor = isConstructor; - } - - public Type getReturnType() { - return returnType; - } - - public void setReturnType(Type returnType) { - this.returnType = returnType; - } - - public List getParameters() { - return parameters; - } - - public void setParameters(List parameters) { - this.parameters = parameters; - } - - public void addParameter(VariableDeclaration parameter) { - if (parameters == null) { - parameters = new ArrayList<>(); - } - parameters.add(parameter); - } - - public Block getBody() { - if (body == null) { - body = new Block(); - } - return body; - } - - public void setBody(Block body) { - this.body = body; - } - - public void addUniqueStatement(Statement statement) { - if (body == null) { - body = new Block(); - body.addStatement(statement); - return; - } - if (body.contains(List.of(statement))) return; - body.addStatement(statement); - } - - public void addStatement(Statement statement) { - if (body == null) { - body = new Block(); - } - body.addStatement(statement); - } - - public void addUniqueStatement(String statement) { - if (body == null) { - body = new Block(); - body.addStatement(statement); - return; - } - if (body.contains(List.of(new PlainStatement(statement)))) return; - body.addStatement(statement); - } - - public void addStatement(String statement) { - if (body == null) { - body = new Block(); - } - body.addStatement(statement); - } - - public void addFirstStatement(Statement statement) { - if (body == null) { - body = new Block(); - } - body.addFirstStatement(statement); - } - - public void addFirstStatement(String statement) { - if (body == null) { - body = new Block(); - } - body.addFirstStatement(statement); - } - - public void addThrow(String exception) { - if (thrws == null) { - thrws = new Throws(); - } - thrws.addException(exception); - } - - public Throws getThrows() { - return thrws; - } - - @Override - public Annotation getAnnotation(String name) { - return annotations.get(name); - } - - @Override - public Collection getAnnotations() { - return annotations.values(); - } - - @Override - public void addAnnotation(Annotation annotation) { - annotations.put(annotation.getElementName(), annotation); - } - - public String toString() { - String code = ""; - for (Annotation annotation: getAnnotations()) { - code += annotation.toString() + "\n"; - } - code += "public "; - if (returnType == null) { - if(!isConstructor) code += "void "; - }else { - code += returnType.toString() + " "; - } - code += (name + "("); - if (parameters != null) { - for (int i = 0; i < parameters.size(); i++) { - code += parameters.get(i).toString(); - if (i < parameters.size() - 1) code += ", "; - } - } - code += ") "; - - if (body != null) { - code += body.toString(); - } else { - code += ";"; - } - return code; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/MethodInvocation.java b/src/main/java/org/nittalab/rdlworkbench/ast/MethodInvocation.java deleted file mode 100644 index 6058303..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/MethodInvocation.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents a method invocation in AST (Abstract Syntax Tree) - * - * @author s-yamagiwa - * @apiNote Type arguments aren't supported because it isn't necessary in DTRAM code generator. - */ -public class MethodInvocation extends Expression { - /** - * The receiver expression of the invocation - * defaults to {@code null} - */ - private Expression receiver; - - /** - * The method name to be called by this invocation - */ - private String methodName; - - /** - * All arguments used in the called method - */ - private List arguments; - - public MethodInvocation(String methodName) { - this(null, methodName); - } - - public MethodInvocation(Expression receiver, String methodName) { - this(receiver, methodName, List.of()); - } - - public MethodInvocation(Expression receiver, String methodName, List arguments) { - this.receiver = receiver; - this.methodName = methodName; - this.arguments = arguments; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - List replacedExpressions = new ArrayList<>(); - - for (Expression argument : arguments) { - replacedExpressions.add(argument.replace(variable, expression)); - } - - if (receiver == null) { - return new MethodInvocation(null, methodName, replacedExpressions); - } - - return new MethodInvocation(receiver.replace(variable, expression), methodName, replacedExpressions); - } - - public Expression getReceiver() { - return receiver; - } - - public void setReceiver(Expression receiver) { - this.receiver = receiver; - } - - public String getMethodName() { - return methodName; - } - - public void setMethodName(String methodName) { - this.methodName = methodName; - } - - public List getArguments() { - return arguments; - } - - public void setArguments(List arguments) { - this.arguments = arguments; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - if (receiver != null) { - builder.append(receiver.toString()).append("."); - } - - builder.append(methodName).append("("); - - if (arguments != null && !arguments.isEmpty()) { - for (int i = 0; i < arguments.size(); i++) { - Expression argument = arguments.get(i); - - builder.append(argument.toString()); - - if (i < arguments.size() - 1) { - builder.append(", "); - } - } - } - - builder.append(")"); - - return builder.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Modifier.java b/src/main/java/org/nittalab/rdlworkbench/ast/Modifier.java deleted file mode 100644 index 6d47367..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Modifier.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class Modifier extends ASTNode { - public static final int ABSTRACT = 0x0400; - public static final int PRIVATE = 0x0002; - public static final int PROTECTED = 0x0004; - public static final int PUBLIC = 0x0001; - public static final int STATIC = 0x0008; - - public static boolean isAbstract(int flags) { - return (flags & ABSTRACT) != 0; - } - - public static boolean isPrivate(int flags) { - return (flags & PRIVATE) != 0; - } - - public static boolean isProtected(int flags) { - return (flags & PROTECTED) != 0; - } - - public static boolean isPublic(int flags) { - return (flags & PUBLIC) != 0; - } - - public static boolean isStatic(int flags) { - return (flags & STATIC) != 0; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/ParameterizedType.java b/src/main/java/org/nittalab/rdlworkbench/ast/ParameterizedType.java deleted file mode 100644 index 93a1c28..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/ParameterizedType.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.List; - -/** - * Represents a parameterized type in an abstract syntax tree (AST). - * A parameterized type consists of a base type and a set of type arguments. - *

- * For example, List<String> is a parameterized type where - * List is the base type and String is the type argument. - * - * @author s-yamagiwa - */ -public class ParameterizedType extends Type { - /** - * The base type of the parameterized type. - *

- * For example, List in List<String> is a base type. - */ - private Type type; - - /** - * The type arguments of the parameterized type. - * Defaults to an empty list. - *

- * For example, String in List<String> is a type argument. - */ - private List typeArguments; - - public ParameterizedType(Type type, List typeArguments) { - this.type = type; - this.typeArguments = typeArguments; - } - - public ParameterizedType(Type type) { - this(type, List.of()); - } - - /** - * Adds a type argument to the parameterized type. - * - * @param type The type argument to add. Only {@link SimpleType}s are allowed for now. - */ - public void addTypeArgument(Type type) { - typeArguments.add(type); - } - - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - - /** - * Returns the type arguments of the parameterized type. - * Only {@link SimpleType}s are allowed for now. - *

- * It can be empty if it is the type of created instances like in the following example. - * new List<>() or new HashMap<>() - * - * @return The type arguments of the parameterized type. - */ - public List getTypeArguments() { - return typeArguments; - } - - public void setTypeArguments(List typeArguments) { - this.typeArguments = typeArguments; - } - - - /** - * Replace all type arguments and their descendant types that match the replacedType with the replacingType. - * @param replacedType the type to be replaced - * @param replacingType the type to replace with - */ - public void replaceSubTypes(Type replacedType, Type replacingType) { - for (int i = 0; i < typeArguments.size(); i++) { - Type typeArgment = typeArguments.get(i); - if (typeArgment.equals(replacedType)) { - typeArguments.set(i, replacingType); - } else if (typeArgment instanceof ParameterizedType) { - ((ParameterizedType) typeArgment).replaceSubTypes(replacedType, replacingType); - } - } - } - - @Override - public String toString() { - if (typeArguments.isEmpty()) { - return type.toString(); - } - - StringBuilder builder = new StringBuilder(); - builder.append(type.toString()); - builder.append("<"); - for (int i = 0; i < typeArguments.size(); i++) { - builder.append(typeArguments.get(i).toString()); - if (i < typeArguments.size() - 1) { - builder.append(", "); - } - } - builder.append(">"); - - return builder.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/ParenthesizedExpression.java b/src/main/java/org/nittalab/rdlworkbench/ast/ParenthesizedExpression.java deleted file mode 100644 index 3a18824..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/ParenthesizedExpression.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents a parenthesized expression in AST (Abstract Syntax Tree) - * This class is used to save the priority of each expression - * - * @author s-yamagiwa - */ -public class ParenthesizedExpression extends Expression { - private Expression expression; - - public ParenthesizedExpression(Expression expression) { - this.expression = expression; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - return new ParenthesizedExpression(this.expression.replace(variable, expression)); - } - - public Expression getExpression() { - return expression; - } - - public void setExpression(Expression expression) { - this.expression = expression; - } - - @Override - public String toString() { - return "(" + expression.toString() + ")"; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/PlainExpression.java b/src/main/java/org/nittalab/rdlworkbench/ast/PlainExpression.java deleted file mode 100644 index 2215e98..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/PlainExpression.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -//==================================================== -//TODO: CodeGenerator修正後削除 -//==================================================== - -public class PlainExpression extends Expression { - private String expression; - - public PlainExpression(String expression) { - this.expression = expression; - } - - @Override - public Expression replace(Variable variable, Expression newExpression) { - return new PlainExpression(expression.replace(variable.toString(), newExpression.toString())); - } - - @Override - public String toString() { - return expression; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/PlainStatement.java b/src/main/java/org/nittalab/rdlworkbench/ast/PlainStatement.java deleted file mode 100644 index c197353..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/PlainStatement.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.nittalab.rdlworkbench.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/src/main/java/org/nittalab/rdlworkbench/ast/PostfixExpression.java b/src/main/java/org/nittalab/rdlworkbench/ast/PostfixExpression.java deleted file mode 100644 index ff86184..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/PostfixExpression.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents a postfix expression in AST (Abstract Syntax Tree) - * - * @author s-yamagiwa - */ -public class PostfixExpression extends Expression { - public enum Operator { - INCREMENT("++"), DECREMENT("--"); - - Operator(String symbol) { - this.symbol = symbol; - } - - private final String symbol; - - @Override - public String toString() { - return symbol; - } - } - - private Expression operand; - - private Operator operator; - - public PostfixExpression(Expression operand, Operator operator) { - this.operand = operand; - this.operator = operator; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - return new PostfixExpression(operand.replace(variable, expression), operator); - } - - public Expression getOperand() { - return operand; - } - - public void setOperand(Expression operand) { - this.operand = operand; - } - - public Operator getOperator() { - return operator; - } - - public void setOperator(Operator operator) { - this.operator = operator; - } - - @Override - public String toString() { - return operand.toString() + operator.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/PrefixExpression.java b/src/main/java/org/nittalab/rdlworkbench/ast/PrefixExpression.java deleted file mode 100644 index 16b3adf..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/PrefixExpression.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents a prefix expression in AST (Abstract Syntax Tree) - * - * @author s-yamagiwa - */ -public class PrefixExpression extends Expression { - public enum Operator { - INCREMENT("++"), DECREMENT("--"), PLUS("+"), MINUS("-"), NOT("!"); - - Operator(String symbol) { - this.symbol = symbol; - } - - private final String symbol; - - @Override - public String toString() { - return symbol; - } - } - - private Expression operand; - - private Operator operator; - - public PrefixExpression(Expression operand, Operator operator) { - this.operand = operand; - this.operator = operator; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - return new PrefixExpression(operand.replace(variable, expression), operator); - } - - public Expression getOperand() { - return operand; - } - - public void setOperand(Expression operand) { - this.operand = operand; - } - - public Operator getOperator() { - return operator; - } - - public void setOperator(Operator operator) { - this.operator = operator; - } - - @Override - public String toString() { - return operator.toString() + operand.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/PrimitiveType.java b/src/main/java/org/nittalab/rdlworkbench/ast/PrimitiveType.java deleted file mode 100644 index 00fbb23..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/PrimitiveType.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents a primitive type in the abstract syntax tree (AST). - * This class extends the {@code AnnotatableType}, allowing annotations - * to be attached to primitive types. - *

- * Primitive types are: {@code boolean}, {@code byte}, {@code char}, {@code short}, {@code int}, {@code long}, {@code float}, {@code double} and {@code void} - * - * @author s-yamagiwa - */ -public class PrimitiveType extends AnnotatableType { - private String typeName; - - public PrimitiveType(String typeName) { - this.typeName = typeName; - } - - @Override - public String toString() { - if (getAnnotations().isEmpty()) { - return typeName; - } - - StringBuilder builder = new StringBuilder(); - for (Annotation annotation : getAnnotations()) { - builder.append(annotation.toString()); - builder.append(" "); - } - builder.append(typeName); - - return builder.toString(); - } -} \ No newline at end of file diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/ReturnStatement.java b/src/main/java/org/nittalab/rdlworkbench/ast/ReturnStatement.java deleted file mode 100644 index 964900e..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/ReturnStatement.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class ReturnStatement extends Statement{ - private Expression expression; - - public Expression getExpression() { - return expression; - } - - public void setExpression(Expression expression) { - this.expression = expression; - } - - @Override - public String toString() { - if (expression != null) { - return "return " + expression + ";"; - } - return "return;"; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/SimpleType.java b/src/main/java/org/nittalab/rdlworkbench/ast/SimpleType.java deleted file mode 100644 index c3f3d76..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/SimpleType.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents a simple type in the AST, which is a type with a single identifier. - * For example, String, List, Map or MyClass. - * - * @author s-yamagiwa - */ -public class SimpleType extends AnnotatableType { - private String name; - - public SimpleType(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - if (getAnnotations().isEmpty()) { - return name; - } - - StringBuilder builder = new StringBuilder(); - for (Annotation annotation : getAnnotations()) { - builder.append(annotation.toString()); - builder.append(" "); - } - builder.append(name); - - return builder.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Statement.java b/src/main/java/org/nittalab/rdlworkbench/ast/Statement.java deleted file mode 100644 index 8b18777..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Statement.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public abstract class Statement extends ASTNode { - - @Override - public abstract String toString(); - - @Override - public boolean equals(Object another) { - if (!(another instanceof Statement)) { - return false; - } - return toString().equals(another.toString()); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/SuperMethodInvocation.java b/src/main/java/org/nittalab/rdlworkbench/ast/SuperMethodInvocation.java deleted file mode 100644 index b030d0c..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/SuperMethodInvocation.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents a super method invocation in AST (Abstract Syntax Tree) - * - * @author s-yamagiwa - * @apiNote Type arguments aren't supported because it isn't necessary in DTRAM code generator. - */ -public class SuperMethodInvocation extends Expression { - private String methodName; - private List arguments; - - public SuperMethodInvocation(String methodName) { - this(methodName, List.of()); - } - - public SuperMethodInvocation(String methodName, List arguments) { - this.methodName = methodName; - this.arguments = arguments; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - List replacedExpressions = new ArrayList<>(); - - for (Expression argument : arguments) { - replacedExpressions.add(argument.replace(variable, expression)); - } - - return new SuperMethodInvocation(methodName, replacedExpressions); - } - - public String getMethodName() { - return methodName; - } - - public void setMethodName(String methodName) { - this.methodName = methodName; - } - - public List getArguments() { - return arguments; - } - - public void setArguments(List arguments) { - this.arguments = arguments; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - - builder.append("super.").append(methodName).append("("); - - if (!arguments.isEmpty()) { - for (int i = 0; i < arguments.size(); i++) { - Expression argument = arguments.get(i); - - builder.append(argument.toString()); - - if (i < arguments.size() - 1) { - builder.append(", "); - } - } - } - - builder.append(");"); - - return builder.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/ThisExpression.java b/src/main/java/org/nittalab/rdlworkbench/ast/ThisExpression.java deleted file mode 100644 index 5de7ebf..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/ThisExpression.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class ThisExpression extends Expression { - @Override - public Expression replace(Variable variable, Expression expression) { - return this; - } - - @Override - public String toString() { - return "this"; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Throws.java b/src/main/java/org/nittalab/rdlworkbench/ast/Throws.java deleted file mode 100644 index 2246851..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Throws.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.HashSet; -import java.util.Set; - -public class Throws extends ASTNode { - private Set exceptions = new HashSet<>(); - - public Throws() { - } - - public void addException(String exception) { - exceptions.add(exception); - } - - public Set getExceptions() { - return exceptions; - } - - public String toString() { - String code = "throws "; - String delimiter = ""; - for (String exception: exceptions) { - code += delimiter + exception; - delimiter = ", "; - } - return code; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Type.java b/src/main/java/org/nittalab/rdlworkbench/ast/Type.java deleted file mode 100644 index 5545c68..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Type.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents an abstract base class for all types in an abstract syntax tree (AST). - * A type can represent various forms such as primitive types, simple types, - * parameterized types, or others as defined by subclasses. - * - * @author s-yamagiwa - */ -public abstract class Type extends ASTNode implements models.algebra.Type.ITypeImpl { - /** - * Returns whether this type is a primitive type or not. - * - * @return true if this type is a primitive type, false otherwise. - */ - public final boolean isPrimitiveType() { - return (this instanceof PrimitiveType); - } - - /** - * Returns whether this type is a simple type or not. - * - * @return true if this type is a simple type, false otherwise. - */ - public final boolean isSimpleType() { - return (this instanceof SimpleType); - } - - /** - * Returns whether this type is a parameterized type or not. - * - * @return true if this type is a parameterized type, false otherwise. - */ - public final boolean isParameterizedType() { - return (this instanceof ParameterizedType); - } -} \ No newline at end of file diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/TypeDeclaration.java b/src/main/java/org/nittalab/rdlworkbench/ast/TypeDeclaration.java deleted file mode 100644 index 2e4a5ea..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/TypeDeclaration.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import java.util.*; - -public class TypeDeclaration extends AbstractTypeDeclaration implements IAnnotatable { - private List fields = new ArrayList<>(); - private List methods = new ArrayList<>(); - private Map annotations = new HashMap<>(); - private List implementsInterfaces = new ArrayList<>(); - - public TypeDeclaration(String typeName) { - this.typeName = typeName; - } - - public TypeDeclaration(String typeName, List fields) { - this.typeName = typeName; - this.fields = fields; - } - - public TypeDeclaration(String typeName, List fields, List methods) { - this.typeName = typeName; - this.fields = fields; - this.methods = methods; - } - - public void addImplementsInterface(String interfaceName) { - implementsInterfaces.add(interfaceName); - } - - public List getImplementsInterfaces() { - return implementsInterfaces; - } - - public void addField(FieldDeclaration field) { - fields.add(field); - } - - public void addMethod(MethodDeclaration method) { - methods.add(method); - } - - public void removeMethod(MethodDeclaration method) { - methods.remove(method); - } - - public void removeField(FieldDeclaration field) { - fields.remove(field); - } - - public List getFields() { - return fields; - } - - public List getMethods() { - return methods; - } - - public MethodDeclaration createConstructor() { - MethodDeclaration constructor = new MethodDeclaration(typeName, true); - addMethod(constructor); - return constructor; - } - - @Override - public Annotation getAnnotation(String name) { - return annotations.get(name); - } - - @Override - public Collection getAnnotations() { - return annotations.values(); - } - - @Override - public void addAnnotation(Annotation annotation) { - annotations.put(annotation.getElementName(), annotation); - } - - public String toString() { - String code = ""; - for (Annotation annotation: getAnnotations()) { - code += annotation.toString() + "\n"; - } - code += "public class " + typeName; - if (!implementsInterfaces.isEmpty()) { - code += " implements " + String.join(", ", implementsInterfaces); - } - code += " {\n"; - for (FieldDeclaration f: fields) { - code += "\t" + f.toString(); - } - for (MethodDeclaration m: methods) { - code += CodeUtil.insertTab(m.toString()); - } - code += "}"; - return code; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/TypeLiteral.java b/src/main/java/org/nittalab/rdlworkbench/ast/TypeLiteral.java deleted file mode 100644 index 5e3c59e..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/TypeLiteral.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents a type literal expression in the AST. - * - * @author s-yamagiwa - */ -public class TypeLiteral extends Expression { - private Type type; - - public TypeLiteral(Type type) { - this.type = type; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - return this; - } - - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - - @Override - public String toString() { - return type.toString(); - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/Variable.java b/src/main/java/org/nittalab/rdlworkbench/ast/Variable.java deleted file mode 100644 index 24767cb..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/Variable.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -/** - * Represents a variable in the AST (Abstract Syntax Tree) - * - * @author s-yamagiwa - */ -public class Variable extends Expression { - private String name; - - public Variable(String name) { - this.name = name; - } - - @Override - public Expression replace(Variable variable, Expression expression) { - if (this == variable) { - return expression; - } - return this; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return name; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/VariableDeclaration.java b/src/main/java/org/nittalab/rdlworkbench/ast/VariableDeclaration.java deleted file mode 100644 index 6aae27b..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/VariableDeclaration.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import models.algebra.Type; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -public class VariableDeclaration extends ASTNode implements IAnnotatable { - private Type type; - private String variableName; - private Expression optionalInitializer; - private Map annotations = new HashMap<>(); - - public VariableDeclaration(Type type, String variableName) { - this.type = type; - this.variableName = variableName; - } - - public VariableDeclaration(Type type, String variableName, Expression initializer) { - this(type, variableName); - this.optionalInitializer = initializer; - } - - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - - public String getName() { - return variableName; - } - - public void setName(String variableName) { - this.variableName = variableName; - } - - public Expression getInitializer() { return optionalInitializer; } - - public void setInitializer(Expression initializer) { this.optionalInitializer = initializer; } - - @Override - public Annotation getAnnotation(String name) { - return annotations.get(name); - } - - @Override - public Collection getAnnotations() { - return annotations.values(); - } - - @Override - public void addAnnotation(Annotation annotation) { - annotations.put(annotation.getElementName(), annotation); - } - - public String toString() { - String code = ""; - code += type.getInterfaceTypeName() + " " + variableName; - if (optionalInitializer != null) { - code += " = " + optionalInitializer; - } - return code; - } -} diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/VariableDeclarationStatement.java b/src/main/java/org/nittalab/rdlworkbench/ast/VariableDeclarationStatement.java deleted file mode 100644 index cd1fb61..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/VariableDeclarationStatement.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -import models.algebra.Type; - -import java.util.ArrayList; -import java.util.List; - -public class VariableDeclarationStatement extends Statement { - - private List modifiers = new ArrayList<>(); - private Type type = null; - 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 addFragment(VariableDeclaration 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 - public String toString() { - StringBuilder sb = new StringBuilder(); - - for (Integer mod : modifiers) { - 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 (this.type != null) { - sb.append(this.type.getInterfaceTypeName()).append(" "); - } - - for (int i = 0; i < fragments.size(); i++) { - sb.append(fragments.get(i).toString()); - if (i < fragments.size() - 1) sb.append(", "); - } - - sb.append(";"); - return sb.toString(); - } -} \ No newline at end of file diff --git a/src/main/java/org/nittalab/rdlworkbench/ast/WhileStatement.java b/src/main/java/org/nittalab/rdlworkbench/ast/WhileStatement.java deleted file mode 100644 index b16c5a5..0000000 --- a/src/main/java/org/nittalab/rdlworkbench/ast/WhileStatement.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.nittalab.rdlworkbench.ast; - -public class WhileStatement extends Statement { - - private Expression expression; - private Statement body; - - public Expression getExpression() { - return expression; - } - - public void setExpression(Expression 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/src/main/java/org/ntlab/rdlworkbench/Main.java b/src/main/java/org/ntlab/rdlworkbench/Main.java new file mode 100644 index 0000000..56afc33 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/Main.java @@ -0,0 +1,7 @@ +package org.ntlab.rdlworkbench; + +public class Main { + public static void main(String[] args) { + + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/ASTNode.java b/src/main/java/org/ntlab/rdlworkbench/ast/ASTNode.java new file mode 100644 index 0000000..633cdee --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/ASTNode.java @@ -0,0 +1,13 @@ +package org.ntlab.rdlworkbench.ast; + +public abstract class ASTNode { + private ASTNode parent; + + public ASTNode getParent() { + return parent; + } + + public void setParent(ASTNode parent) { + this.parent = parent; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/AbstractTypeDeclaration.java b/src/main/java/org/ntlab/rdlworkbench/ast/AbstractTypeDeclaration.java new file mode 100644 index 0000000..c0a6a6d --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/AbstractTypeDeclaration.java @@ -0,0 +1,13 @@ +package org.ntlab.rdlworkbench.ast; + +public class AbstractTypeDeclaration extends BodyDeclaration { + protected String typeName = null; + + public String getTypeName() { + return typeName; + } + + public void setTypeName(String typeName) { + this.typeName = typeName; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/AnnotatableType.java b/src/main/java/org/ntlab/rdlworkbench/ast/AnnotatableType.java new file mode 100644 index 0000000..df3410f --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/AnnotatableType.java @@ -0,0 +1,26 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents an abstract base class for AST types that can have annotations. + * This class extends the functionality of {@link Type} by introducing support + * for attaching annotations to the type. + *

+ * Subclasses of this class represent specific kinds of types in the AST that + * allow annotations, such as primitive types or other specialized types. + * + * @author s-yamagiwa + */ +public abstract class AnnotatableType extends Type { + private final List annotations = new ArrayList<>(); + + public void addAnnotation(Annotation annotation) { + annotations.add(annotation); + } + + public List getAnnotations() { + return annotations; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Annotation.java b/src/main/java/org/ntlab/rdlworkbench/ast/Annotation.java new file mode 100644 index 0000000..25c0ab2 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Annotation.java @@ -0,0 +1,57 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class Annotation extends ASTNode { + private String name = null; + private Map keyValueMap = null; + + public Annotation(String name) { + this.name = name; + keyValueMap = new HashMap<>(); + } + + public Annotation(String name, String value) { + this.name = name; + keyValueMap = new HashMap<>(); + keyValueMap.put("value", value); + } + + public String getElementName() { + return name; + } + + public Map getParams() { + return keyValueMap; + } + + public Object getValue(String key) { + return keyValueMap.get(key); + } + + public void addParam(String key, Object value) { + keyValueMap.put(key, value); + } + + public String toString() { + String code = "@" + name; + Set keySet = keyValueMap.keySet(); + if (keySet.size() == 0) { + return code; + } else if (keySet.size() == 1 && keySet.iterator().next().equals("value")) { + code += "(" + keyValueMap.get("value").toString() + ")"; + } else { + code += "("; + String delimitar = ""; + for (String key: keySet) { + Object value = keyValueMap.get(key); + code += delimitar + key + " = \"" + value.toString() + "\""; + delimitar = ", "; + } + code += ")"; + } + return code; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Assignment.java b/src/main/java/org/ntlab/rdlworkbench/ast/Assignment.java new file mode 100644 index 0000000..c1aa36f --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Assignment.java @@ -0,0 +1,42 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents an assignment expression node in AST (Abstract Syntax Tree) + * + * @author s-yamagiwa + */ +public class Assignment extends Expression { + private Expression left; + private Expression right; + + public Assignment(Expression left, Expression right) { + this.left = left; + this.right = right; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + return new Assignment(left.replace(variable, expression), right.replace(variable, expression)); + } + + public Expression getLeft() { + return left; + } + + public void setLeft(Expression left) { + this.left = left; + } + + public Expression getRight() { + return right; + } + + public void setRight(Expression right) { + this.right = right; + } + + @Override + public String toString() { + return left.toString() + " " + "=" + " " + right.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Block.java b/src/main/java/org/ntlab/rdlworkbench/ast/Block.java new file mode 100644 index 0000000..06bc15c --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Block.java @@ -0,0 +1,107 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.ArrayList; +import java.util.List; + +public class Block extends Statement { + private List statements = new ArrayList<>(); + + public List getStatements2() { + return statements; + } + + public void setStatements(List statements) { + this.statements = statements; + } + + public void addFirstStatement(Statement statement) { + statements.add(0, statement); + } + + public void addStatement(Statement statement) { + statements.add(statement); + } + + public void addFirstStatements(List statements) { + this.statements.addAll(0, statements); + } + + public void addStatements(List statements) { + this.statements.addAll(statements); + } + + public boolean contains(List statements) { + if (statements.size() == 0) return true; + for (int i = 0; i < this.statements.size(); i++) { + Statement st = this.statements.get(i); + if (st.equals(statements.get(0))) { + if (statements.size() == 1) return true; + int j = 1; + for (int k = i + 1; k < this.statements.size(); k++) { + Statement st2 = this.statements.get(k); + if (st2.equals(statements.get(j))) { + j++; + if (j == statements.size()) return true; + } + } + } + } + return false; + } + + //==================================================== + //TODO: CodeGenerator修正後削除 + + public List getStatements() { + List strings = new ArrayList<>(); + for (Statement stmt : statements) { + if (stmt != null) { + strings.add(stmt.toString()); + } + } + return strings; + } + + public void addFirstStatement(String statement) { + if (statement != null) { + this.addFirstStatement(new Statement() { + @Override + public String toString() { + return statement; + } + }); + } + } + + public void addStatement(String statement) { + if (statement != null) { + this.addStatement(new PlainStatement(statement)); + } + } + + //==================================================== + + + @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/src/main/java/org/ntlab/rdlworkbench/ast/BodyDeclaration.java b/src/main/java/org/ntlab/rdlworkbench/ast/BodyDeclaration.java new file mode 100644 index 0000000..b7951af --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/BodyDeclaration.java @@ -0,0 +1,13 @@ +package org.ntlab.rdlworkbench.ast; + +public abstract class BodyDeclaration extends ASTNode { + private int modifiers = 0; + + public int getModifiers() { + return modifiers; + } + + public void setModifiers(int modifiers) { + this.modifiers = modifiers; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/ClassInstanceCreation.java b/src/main/java/org/ntlab/rdlworkbench/ast/ClassInstanceCreation.java new file mode 100644 index 0000000..c11d307 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/ClassInstanceCreation.java @@ -0,0 +1,71 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.ArrayList; +import java.util.List; + +public class ClassInstanceCreation extends Expression { + private Type type; + + private List arguments; + + public ClassInstanceCreation(Type type) { + this(type, List.of()); + } + + public ClassInstanceCreation(Type type, List arguments) { + this.type = type; + this.arguments = arguments; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + List replacedExpressions = new ArrayList<>(); + + for (Expression argument : arguments) { + replacedExpressions.add(argument.replace(variable, expression)); + } + + return new ClassInstanceCreation(type, replacedExpressions); + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public List getArguments() { + return arguments; + } + + public void setArguments(List arguments) { + this.arguments = arguments; + } + + public void addArgument(Expression expression) { + arguments.add(expression); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + + builder.append("new "); + builder.append(type.toString()); + builder.append("("); + for (int i = 0; i < arguments.size(); i++) { + Expression argument = arguments.get(i); + + builder.append(argument.toString()); + + if (i < arguments.size() - 1) { + builder.append(", "); + } + } + builder.append(")"); + + return builder.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/CodeUtil.java b/src/main/java/org/ntlab/rdlworkbench/ast/CodeUtil.java new file mode 100644 index 0000000..80f12ee --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/CodeUtil.java @@ -0,0 +1,13 @@ +package org.ntlab.rdlworkbench.ast; + +public class CodeUtil { + + public static String insertTab(String code) { + String newString = ""; + String[] lines = code.split("\n"); + for (String line: lines) { + newString = newString + "\t" + line + "\n"; + } + return newString; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/CompilationUnit.java b/src/main/java/org/ntlab/rdlworkbench/ast/CompilationUnit.java new file mode 100644 index 0000000..696a5c0 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/CompilationUnit.java @@ -0,0 +1,67 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.ArrayList; +import java.util.List; + +public class CompilationUnit extends ASTNode { + private String fileName = null; + private List imports = new ArrayList<>(); + private List types = new ArrayList<>(); + private List interfaces = new ArrayList<>(); + + public CompilationUnit(TypeDeclaration type) { + types.add(type); + if(type.getTypeName().contains("<")) + fileName = type.getTypeName().split("<")[0] + ".java"; + else + fileName = type.getTypeName() + ".java"; + } + + public CompilationUnit(InterfaceDeclaration interfaceDeclaration) { + interfaces.add(interfaceDeclaration); + fileName = interfaceDeclaration.getTypeName() + ".java"; + } + + public List imports() { + return imports; + } + + public List types() { + return types; + } + + public void addImport(ImportDeclaration imp) { + imports.add(imp); + } + + public void addType(TypeDeclaration type) { + types.add(type); + } + + public List interfaces() { + return interfaces; + } + + public void addInterface(InterfaceDeclaration interfaceDeclaration) { + interfaces.add(interfaceDeclaration); + } + + public String getFileName() { + return fileName; + } + + public String toString() { + String result = ""; + for (ImportDeclaration imp: imports) { + result += imp.toString(); + } + result +="\n"; + for (TypeDeclaration type: types) { + result += type.toString(); + } + for (InterfaceDeclaration iDec: interfaces) { + result += iDec.toString(); + } + return result; + } +} \ No newline at end of file diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Constant.java b/src/main/java/org/ntlab/rdlworkbench/ast/Constant.java new file mode 100644 index 0000000..a8be051 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Constant.java @@ -0,0 +1,32 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents a constant in the AST (Abstract Syntax Tree) + * + * @author s-yamagiwa + */ +public class Constant extends Expression { + private String value; + + public Constant(String value) { + this.value = value; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + return this; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/EnhancedForStatement.java b/src/main/java/org/ntlab/rdlworkbench/ast/EnhancedForStatement.java new file mode 100644 index 0000000..bad5636 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/EnhancedForStatement.java @@ -0,0 +1,23 @@ +package org.ntlab.rdlworkbench.ast; + +public class EnhancedForStatement extends Statement { + + private VariableDeclaration singleVariableDeclaration; + private Expression expression; + private Statement body; + + public VariableDeclaration getParameter() { return singleVariableDeclaration; } + public void setParameter(VariableDeclaration parameter) { this.singleVariableDeclaration = parameter; } + + public Expression getExpression() { return expression; } + public void setExpression(Expression expression) { this.expression = expression; } + + public Statement getBody() { return body; } + public void setBody(Statement body) { this.body = body; } + + @Override + public String toString() { + String typeName = singleVariableDeclaration.getType().getImplementationTypeName(); + return "for (" + typeName + " " + singleVariableDeclaration.getName() + " : " + expression + ") " + body; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Expression.java b/src/main/java/org/ntlab/rdlworkbench/ast/Expression.java new file mode 100644 index 0000000..6ad4e7c --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Expression.java @@ -0,0 +1,19 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Abstract base class for all expression nodes in the abstract syntax tree (AST). + * + * @author s-yamagiwa + */ +public abstract class Expression extends ASTNode { + /** + * Replace {@code variable} with {@code expression} in AST. + * + * @param variable The variable to be replaced + * @param expression The expression that {@code variable} is replaced to + * @return A duplicated expression that is replaced with a given {@code expression} + * @implNote The instance of any member must be immutable + * @apiNote All variables match to the given one will be replaced with the given {@code expression} + */ + public abstract Expression replace(Variable variable, Expression expression); +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/ExpressionStatement.java b/src/main/java/org/ntlab/rdlworkbench/ast/ExpressionStatement.java new file mode 100644 index 0000000..34c7e6d --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/ExpressionStatement.java @@ -0,0 +1,17 @@ +package org.ntlab.rdlworkbench.ast; + +public class ExpressionStatement extends Statement{ + private Expression expression; + + public ExpressionStatement(Expression expression) { + this.expression = expression; + } + + public Expression getExpression() { return expression; } + public void setExpression(Expression expression) { this.expression = expression; } + + @Override + public String toString() { + return expression + ";"; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/FieldAccess.java b/src/main/java/org/ntlab/rdlworkbench/ast/FieldAccess.java new file mode 100644 index 0000000..9fc549d --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/FieldAccess.java @@ -0,0 +1,50 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents field accesses in AST (Abstract Syntax Tree) + * + * @author s-yamagiwa + */ +public class FieldAccess extends Expression { + private Expression expression; + + private String fieldName; + + public FieldAccess(String fieldName) { + this(null, fieldName); + } + + public FieldAccess(Expression expression, String fieldName) { + this.expression = expression; + this.fieldName = fieldName; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + return new FieldAccess(expression.replace(variable, expression), fieldName); + } + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression expression) { + this.expression = expression; + } + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + @Override + public String toString() { + if (expression == null) { + return fieldName; + } + return expression + "." + fieldName; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/FieldDeclaration.java b/src/main/java/org/ntlab/rdlworkbench/ast/FieldDeclaration.java new file mode 100644 index 0000000..54c1b6d --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/FieldDeclaration.java @@ -0,0 +1,90 @@ +package org.ntlab.rdlworkbench.ast; + +import models.algebra.Type; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class FieldDeclaration extends BodyDeclaration implements IAnnotatable { + private Type type; + private String fieldName; + private String initializer = null; + private String initializationBlock = null; + private Map annotations = new HashMap<>(); + + public FieldDeclaration(Type type, String fieldName) { + this.type = type; + this.fieldName = fieldName; + } + + public FieldDeclaration(Type type, String fieldName, String initializer) { + this.type = type; + this.fieldName = fieldName; + this.initializer = initializer; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public String getName() { + return fieldName; + } + + public void setName(String fieldName) { + this.fieldName = fieldName; + } + + public String getInitializer() { + return initializer; + } + + public void setInitializer(String initializer) { + this.initializer = initializer; + } + + public String getInitializationBlock() { + return initializationBlock; + } + + public void setInitializationBlock(String initializationBlock) { + this.initializationBlock = initializationBlock; + } + + @Override + public Annotation getAnnotation(String name) { + return annotations.get(name); + } + + @Override + public Collection getAnnotations() { + return annotations.values(); + } + + @Override + public void addAnnotation(Annotation annotation) { + annotations.put(annotation.getElementName(), annotation); + } + + public String toString() { + String code = ""; + for (Annotation annotation: getAnnotations()) { + code += annotation.toString() + "\n"; + } + if (initializationBlock != null) { + code += "private " + type.getInterfaceTypeName() + " " + fieldName + ";\n" + initializationBlock + "\n"; + } else { + if (initializer == null) { + code += "private " + type.getInterfaceTypeName() + " " + fieldName + ";\n"; + } else { + code += "private " + type.getInterfaceTypeName() + " " + fieldName + " = " + initializer + ";\n"; + } + } + return code; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/ForStatement.java b/src/main/java/org/ntlab/rdlworkbench/ast/ForStatement.java new file mode 100644 index 0000000..0ee68b3 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/ForStatement.java @@ -0,0 +1,70 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.ArrayList; +import java.util.List; + +public class ForStatement extends Statement { + + private List initializers = new ArrayList<>(); + private Expression optionalConditionExpression; + private List updaters = new ArrayList<>(); + private Statement body; + + public List getInitializers() { + return initializers; + } + + public void setInitializers(List initializers) { + this.initializers = initializers; + } + + public Expression getExpression() { + return optionalConditionExpression; + } + + public void setExpression(Expression expression) { + this.optionalConditionExpression = expression; + } + + 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++) { + 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("; "); + + if (optionalConditionExpression != null) sb.append(optionalConditionExpression); + sb.append("; "); + + for (int i = 0; i < updaters.size(); 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/src/main/java/org/ntlab/rdlworkbench/ast/IAnnotatable.java b/src/main/java/org/ntlab/rdlworkbench/ast/IAnnotatable.java new file mode 100644 index 0000000..8432efb --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/IAnnotatable.java @@ -0,0 +1,9 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.Collection; + +public interface IAnnotatable { + Annotation getAnnotation(String name); + Collection getAnnotations(); + void addAnnotation(Annotation annotation); +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/IfStatement.java b/src/main/java/org/ntlab/rdlworkbench/ast/IfStatement.java new file mode 100644 index 0000000..9e8c846 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/IfStatement.java @@ -0,0 +1,43 @@ +package org.ntlab.rdlworkbench.ast; + +public class IfStatement extends Statement { + + private Expression expression; + private Statement thenStatement; + private Statement elseStatement; + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression 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); + sb.append(thenStatement); + if (elseStatement != null) { + sb.append(" else ").append(elseStatement); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/ImportDeclaration.java b/src/main/java/org/ntlab/rdlworkbench/ast/ImportDeclaration.java new file mode 100644 index 0000000..db79516 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/ImportDeclaration.java @@ -0,0 +1,21 @@ +package org.ntlab.rdlworkbench.ast; + +public class ImportDeclaration { + private String name; + + public ImportDeclaration(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String toString() { + return "import " + name + ";\n"; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/InfixExpression.java b/src/main/java/org/ntlab/rdlworkbench/ast/InfixExpression.java new file mode 100644 index 0000000..b47f949 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/InfixExpression.java @@ -0,0 +1,55 @@ +package org.ntlab.rdlworkbench.ast; + +import models.algebra.Symbol; + +/** + * Represents an infix expression in AST (Abstract Syntax Tree) + * + * @author s-yamagiwa + */ +public class InfixExpression extends Expression { + private Symbol operator; + + private Expression leftOperand; + private Expression rightOperand; + + public InfixExpression(Symbol operator, Expression leftOperand, Expression rightOperand) { + this.operator = operator; + this.leftOperand = leftOperand; + this.rightOperand = rightOperand; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + return new InfixExpression(operator, leftOperand.replace(variable, expression), rightOperand.replace(variable, expression)); + } + + public Symbol getOperator() { + return this.operator; + } + + public void setOperator(Symbol operator) { + this.operator = operator; + } + + public Expression getLeftOperand() { + return leftOperand; + } + + public void setLeftOperand(Expression expression) { + this.leftOperand = expression; + } + + public Expression getRightOperand() { + return rightOperand; + } + + public void setRightOperand(Expression expression) { + this.rightOperand = expression; + } + + @Override + public String toString() { + return leftOperand.toString() + " " + operator.toString() + " " + rightOperand.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/InterfaceDeclaration.java b/src/main/java/org/ntlab/rdlworkbench/ast/InterfaceDeclaration.java new file mode 100644 index 0000000..b2968e1 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/InterfaceDeclaration.java @@ -0,0 +1,67 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.*; + + +public class InterfaceDeclaration extends AbstractTypeDeclaration implements IAnnotatable { + private List methods = new ArrayList<>(); + private Map annotations = new HashMap<>(); + + public InterfaceDeclaration(String typeName) { + this.typeName = typeName; + } + + public void addMethod(MethodDeclaration method) { + methods.add(method); + } + + public void removeMethod(MethodDeclaration method) { + methods.remove(method); + } + + public List getMethods() { + return methods; + } + + @Override + public Annotation getAnnotation(String name) { + return annotations.get(name); + } + + @Override + public Collection getAnnotations() { + return annotations.values(); + } + + @Override + public void addAnnotation(Annotation annotation) { + annotations.put(annotation.getElementName(), annotation); + } + + public String toString() { + String code = ""; + for (Annotation annotation : getAnnotations()) { + code += annotation.toString() + "\n"; + } + code += "public interface " + typeName + " {\n"; + for (MethodDeclaration m : methods) { + String signature = "\t"; + if (m.getReturnType() == null) { + signature += "void "; + } else { + signature += m.getReturnType().getInterfaceTypeName() + " "; + } + signature += m.getName() + "("; + if (m.getParameters() != null) { + for (int i = 0; i < m.getParameters().size(); i++) { + signature += m.getParameters().get(i).toString(); + if (i < m.getParameters().size() - 1) signature += ", "; + } + } + signature += ");\n"; + code += signature; + } + code += "}"; + return code; + } +} \ No newline at end of file diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Lexer.java b/src/main/java/org/ntlab/rdlworkbench/ast/Lexer.java new file mode 100644 index 0000000..d4b9b7a --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Lexer.java @@ -0,0 +1,55 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * The Lexer class provides functionalities for parsing and iterating through + * a source string of text character by character. + * + * @author s-yamagiwa; + */ +public class Lexer { + private final String source; + private int position; + + public Lexer(String source) { + this.source = source; + this.position = 0; + } + + /** + * Retrieves the next character without advancing the position. + * + * @return The next character. + */ + public char peek() { + if (position >= source.length()) { + return '\0'; // End of line + } + + return source.charAt(position); + } + + /** + * Retrieves the next character after advancing the position. + * + * @return The next character. + */ + public char peekNext() { + if (position + 1 >= source.length()) { + return '\0'; // End of line + } + + return source.charAt(position + 1); + } + + /** + * Advances the position by one character. + * + * @return The character that was previously at the current position. + */ + public char advance() { + char current = peek(); + position++; + + return current; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/MethodDeclaration.java b/src/main/java/org/ntlab/rdlworkbench/ast/MethodDeclaration.java new file mode 100644 index 0000000..00768d3 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/MethodDeclaration.java @@ -0,0 +1,190 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.*; + +public class MethodDeclaration extends BodyDeclaration implements IAnnotatable { + private String name = null; + private boolean isConstructor = false; + private Type returnType = null; + private List parameters = null; + private Block body = null; + private Map annotations = new HashMap<>(); + private Throws thrws = null; + + public MethodDeclaration(String methodName) { + this(methodName, false); + } + + public MethodDeclaration(String methodName, Type returnType) { + this(methodName, false); + this.returnType = returnType; + } + + public MethodDeclaration(String methodName, boolean isConstructor) { + this.name = methodName; + this.isConstructor = isConstructor; + } + + public MethodDeclaration(String methodName, boolean isConstructor, Type returnType, List parameters) { + this(methodName, isConstructor, returnType, parameters, null); + } + + public MethodDeclaration(String methodName, boolean isConstructor, Type returnType, List parameters, Block body) { + this(methodName, isConstructor); + this.returnType = returnType; + this.parameters = parameters; + this.body = body; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isConstructor() { + return isConstructor; + } + + public void setConstructor(boolean isConstructor) { + this.isConstructor = isConstructor; + } + + public Type getReturnType() { + return returnType; + } + + public void setReturnType(Type returnType) { + this.returnType = returnType; + } + + public List getParameters() { + return parameters; + } + + public void setParameters(List parameters) { + this.parameters = parameters; + } + + public void addParameter(VariableDeclaration parameter) { + if (parameters == null) { + parameters = new ArrayList<>(); + } + parameters.add(parameter); + } + + public Block getBody() { + if (body == null) { + body = new Block(); + } + return body; + } + + public void setBody(Block body) { + this.body = body; + } + + public void addUniqueStatement(Statement statement) { + if (body == null) { + body = new Block(); + body.addStatement(statement); + return; + } + if (body.contains(List.of(statement))) return; + body.addStatement(statement); + } + + public void addStatement(Statement statement) { + if (body == null) { + body = new Block(); + } + body.addStatement(statement); + } + + public void addUniqueStatement(String statement) { + if (body == null) { + body = new Block(); + body.addStatement(statement); + return; + } + if (body.contains(List.of(new PlainStatement(statement)))) return; + body.addStatement(statement); + } + + public void addStatement(String statement) { + if (body == null) { + body = new Block(); + } + body.addStatement(statement); + } + + public void addFirstStatement(Statement statement) { + if (body == null) { + body = new Block(); + } + body.addFirstStatement(statement); + } + + public void addFirstStatement(String statement) { + if (body == null) { + body = new Block(); + } + body.addFirstStatement(statement); + } + + public void addThrow(String exception) { + if (thrws == null) { + thrws = new Throws(); + } + thrws.addException(exception); + } + + public Throws getThrows() { + return thrws; + } + + @Override + public Annotation getAnnotation(String name) { + return annotations.get(name); + } + + @Override + public Collection getAnnotations() { + return annotations.values(); + } + + @Override + public void addAnnotation(Annotation annotation) { + annotations.put(annotation.getElementName(), annotation); + } + + public String toString() { + String code = ""; + for (Annotation annotation: getAnnotations()) { + code += annotation.toString() + "\n"; + } + code += "public "; + if (returnType == null) { + if(!isConstructor) code += "void "; + }else { + code += returnType.toString() + " "; + } + code += (name + "("); + if (parameters != null) { + for (int i = 0; i < parameters.size(); i++) { + code += parameters.get(i).toString(); + if (i < parameters.size() - 1) code += ", "; + } + } + code += ") "; + + if (body != null) { + code += body.toString(); + } else { + code += ";"; + } + return code; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/MethodInvocation.java b/src/main/java/org/ntlab/rdlworkbench/ast/MethodInvocation.java new file mode 100644 index 0000000..e7a7b01 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/MethodInvocation.java @@ -0,0 +1,107 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a method invocation in AST (Abstract Syntax Tree) + * + * @author s-yamagiwa + * @apiNote Type arguments aren't supported because it isn't necessary in DTRAM code generator. + */ +public class MethodInvocation extends Expression { + /** + * The receiver expression of the invocation + * defaults to {@code null} + */ + private Expression receiver; + + /** + * The method name to be called by this invocation + */ + private String methodName; + + /** + * All arguments used in the called method + */ + private List arguments; + + public MethodInvocation(String methodName) { + this(null, methodName); + } + + public MethodInvocation(Expression receiver, String methodName) { + this(receiver, methodName, List.of()); + } + + public MethodInvocation(Expression receiver, String methodName, List arguments) { + this.receiver = receiver; + this.methodName = methodName; + this.arguments = arguments; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + List replacedExpressions = new ArrayList<>(); + + for (Expression argument : arguments) { + replacedExpressions.add(argument.replace(variable, expression)); + } + + if (receiver == null) { + return new MethodInvocation(null, methodName, replacedExpressions); + } + + return new MethodInvocation(receiver.replace(variable, expression), methodName, replacedExpressions); + } + + public Expression getReceiver() { + return receiver; + } + + public void setReceiver(Expression receiver) { + this.receiver = receiver; + } + + public String getMethodName() { + return methodName; + } + + public void setMethodName(String methodName) { + this.methodName = methodName; + } + + public List getArguments() { + return arguments; + } + + public void setArguments(List arguments) { + this.arguments = arguments; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + if (receiver != null) { + builder.append(receiver.toString()).append("."); + } + + builder.append(methodName).append("("); + + if (arguments != null && !arguments.isEmpty()) { + for (int i = 0; i < arguments.size(); i++) { + Expression argument = arguments.get(i); + + builder.append(argument.toString()); + + if (i < arguments.size() - 1) { + builder.append(", "); + } + } + } + + builder.append(")"); + + return builder.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Modifier.java b/src/main/java/org/ntlab/rdlworkbench/ast/Modifier.java new file mode 100644 index 0000000..f50e9f1 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Modifier.java @@ -0,0 +1,29 @@ +package org.ntlab.rdlworkbench.ast; + +public class Modifier extends ASTNode { + public static final int ABSTRACT = 0x0400; + public static final int PRIVATE = 0x0002; + public static final int PROTECTED = 0x0004; + public static final int PUBLIC = 0x0001; + public static final int STATIC = 0x0008; + + public static boolean isAbstract(int flags) { + return (flags & ABSTRACT) != 0; + } + + public static boolean isPrivate(int flags) { + return (flags & PRIVATE) != 0; + } + + public static boolean isProtected(int flags) { + return (flags & PROTECTED) != 0; + } + + public static boolean isPublic(int flags) { + return (flags & PUBLIC) != 0; + } + + public static boolean isStatic(int flags) { + return (flags & STATIC) != 0; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/ParameterizedType.java b/src/main/java/org/ntlab/rdlworkbench/ast/ParameterizedType.java new file mode 100644 index 0000000..e38cc3c --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/ParameterizedType.java @@ -0,0 +1,109 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.List; + +/** + * Represents a parameterized type in an abstract syntax tree (AST). + * A parameterized type consists of a base type and a set of type arguments. + *

+ * For example, List<String> is a parameterized type where + * List is the base type and String is the type argument. + * + * @author s-yamagiwa + */ +public class ParameterizedType extends Type { + /** + * The base type of the parameterized type. + *

+ * For example, List in List<String> is a base type. + */ + private Type type; + + /** + * The type arguments of the parameterized type. + * Defaults to an empty list. + *

+ * For example, String in List<String> is a type argument. + */ + private List typeArguments; + + public ParameterizedType(Type type, List typeArguments) { + this.type = type; + this.typeArguments = typeArguments; + } + + public ParameterizedType(Type type) { + this(type, List.of()); + } + + /** + * Adds a type argument to the parameterized type. + * + * @param type The type argument to add. Only {@link SimpleType}s are allowed for now. + */ + public void addTypeArgument(Type type) { + typeArguments.add(type); + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + /** + * Returns the type arguments of the parameterized type. + * Only {@link SimpleType}s are allowed for now. + *

+ * It can be empty if it is the type of created instances like in the following example. + * new List<>() or new HashMap<>() + * + * @return The type arguments of the parameterized type. + */ + public List getTypeArguments() { + return typeArguments; + } + + public void setTypeArguments(List typeArguments) { + this.typeArguments = typeArguments; + } + + + /** + * Replace all type arguments and their descendant types that match the replacedType with the replacingType. + * @param replacedType the type to be replaced + * @param replacingType the type to replace with + */ + public void replaceSubTypes(Type replacedType, Type replacingType) { + for (int i = 0; i < typeArguments.size(); i++) { + Type typeArgment = typeArguments.get(i); + if (typeArgment.equals(replacedType)) { + typeArguments.set(i, replacingType); + } else if (typeArgment instanceof ParameterizedType) { + ((ParameterizedType) typeArgment).replaceSubTypes(replacedType, replacingType); + } + } + } + + @Override + public String toString() { + if (typeArguments.isEmpty()) { + return type.toString(); + } + + StringBuilder builder = new StringBuilder(); + builder.append(type.toString()); + builder.append("<"); + for (int i = 0; i < typeArguments.size(); i++) { + builder.append(typeArguments.get(i).toString()); + if (i < typeArguments.size() - 1) { + builder.append(", "); + } + } + builder.append(">"); + + return builder.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/ParenthesizedExpression.java b/src/main/java/org/ntlab/rdlworkbench/ast/ParenthesizedExpression.java new file mode 100644 index 0000000..929ce40 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/ParenthesizedExpression.java @@ -0,0 +1,33 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents a parenthesized expression in AST (Abstract Syntax Tree) + * This class is used to save the priority of each expression + * + * @author s-yamagiwa + */ +public class ParenthesizedExpression extends Expression { + private Expression expression; + + public ParenthesizedExpression(Expression expression) { + this.expression = expression; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + return new ParenthesizedExpression(this.expression.replace(variable, expression)); + } + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression expression) { + this.expression = expression; + } + + @Override + public String toString() { + return "(" + expression.toString() + ")"; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/PlainExpression.java b/src/main/java/org/ntlab/rdlworkbench/ast/PlainExpression.java new file mode 100644 index 0000000..9ed91da --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/PlainExpression.java @@ -0,0 +1,23 @@ +package org.ntlab.rdlworkbench.ast; + +//==================================================== +//TODO: CodeGenerator修正後削除 +//==================================================== + +public class PlainExpression extends Expression { + private String expression; + + public PlainExpression(String expression) { + this.expression = expression; + } + + @Override + public Expression replace(Variable variable, Expression newExpression) { + return new PlainExpression(expression.replace(variable.toString(), newExpression.toString())); + } + + @Override + public String toString() { + return expression; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/PlainStatement.java b/src/main/java/org/ntlab/rdlworkbench/ast/PlainStatement.java new file mode 100644 index 0000000..b8f6b31 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/PlainStatement.java @@ -0,0 +1,18 @@ +package org.ntlab.rdlworkbench.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/src/main/java/org/ntlab/rdlworkbench/ast/PostfixExpression.java b/src/main/java/org/ntlab/rdlworkbench/ast/PostfixExpression.java new file mode 100644 index 0000000..52b39d4 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/PostfixExpression.java @@ -0,0 +1,58 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents a postfix expression in AST (Abstract Syntax Tree) + * + * @author s-yamagiwa + */ +public class PostfixExpression extends Expression { + public enum Operator { + INCREMENT("++"), DECREMENT("--"); + + Operator(String symbol) { + this.symbol = symbol; + } + + private final String symbol; + + @Override + public String toString() { + return symbol; + } + } + + private Expression operand; + + private Operator operator; + + public PostfixExpression(Expression operand, Operator operator) { + this.operand = operand; + this.operator = operator; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + return new PostfixExpression(operand.replace(variable, expression), operator); + } + + public Expression getOperand() { + return operand; + } + + public void setOperand(Expression operand) { + this.operand = operand; + } + + public Operator getOperator() { + return operator; + } + + public void setOperator(Operator operator) { + this.operator = operator; + } + + @Override + public String toString() { + return operand.toString() + operator.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/PrefixExpression.java b/src/main/java/org/ntlab/rdlworkbench/ast/PrefixExpression.java new file mode 100644 index 0000000..d6278b1 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/PrefixExpression.java @@ -0,0 +1,58 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents a prefix expression in AST (Abstract Syntax Tree) + * + * @author s-yamagiwa + */ +public class PrefixExpression extends Expression { + public enum Operator { + INCREMENT("++"), DECREMENT("--"), PLUS("+"), MINUS("-"), NOT("!"); + + Operator(String symbol) { + this.symbol = symbol; + } + + private final String symbol; + + @Override + public String toString() { + return symbol; + } + } + + private Expression operand; + + private Operator operator; + + public PrefixExpression(Expression operand, Operator operator) { + this.operand = operand; + this.operator = operator; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + return new PrefixExpression(operand.replace(variable, expression), operator); + } + + public Expression getOperand() { + return operand; + } + + public void setOperand(Expression operand) { + this.operand = operand; + } + + public Operator getOperator() { + return operator; + } + + public void setOperator(Operator operator) { + this.operator = operator; + } + + @Override + public String toString() { + return operator.toString() + operand.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/PrimitiveType.java b/src/main/java/org/ntlab/rdlworkbench/ast/PrimitiveType.java new file mode 100644 index 0000000..5531817 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/PrimitiveType.java @@ -0,0 +1,34 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents a primitive type in the abstract syntax tree (AST). + * This class extends the {@code AnnotatableType}, allowing annotations + * to be attached to primitive types. + *

+ * Primitive types are: {@code boolean}, {@code byte}, {@code char}, {@code short}, {@code int}, {@code long}, {@code float}, {@code double} and {@code void} + * + * @author s-yamagiwa + */ +public class PrimitiveType extends AnnotatableType { + private String typeName; + + public PrimitiveType(String typeName) { + this.typeName = typeName; + } + + @Override + public String toString() { + if (getAnnotations().isEmpty()) { + return typeName; + } + + StringBuilder builder = new StringBuilder(); + for (Annotation annotation : getAnnotations()) { + builder.append(annotation.toString()); + builder.append(" "); + } + builder.append(typeName); + + return builder.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/ReturnStatement.java b/src/main/java/org/ntlab/rdlworkbench/ast/ReturnStatement.java new file mode 100644 index 0000000..10d7312 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/ReturnStatement.java @@ -0,0 +1,21 @@ +package org.ntlab.rdlworkbench.ast; + +public class ReturnStatement extends Statement{ + private Expression expression; + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression expression) { + this.expression = expression; + } + + @Override + public String toString() { + if (expression != null) { + return "return " + expression + ";"; + } + return "return;"; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/SimpleType.java b/src/main/java/org/ntlab/rdlworkbench/ast/SimpleType.java new file mode 100644 index 0000000..ef589bc --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/SimpleType.java @@ -0,0 +1,39 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents a simple type in the AST, which is a type with a single identifier. + * For example, String, List, Map or MyClass. + * + * @author s-yamagiwa + */ +public class SimpleType extends AnnotatableType { + private String name; + + public SimpleType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + if (getAnnotations().isEmpty()) { + return name; + } + + StringBuilder builder = new StringBuilder(); + for (Annotation annotation : getAnnotations()) { + builder.append(annotation.toString()); + builder.append(" "); + } + builder.append(name); + + return builder.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Statement.java b/src/main/java/org/ntlab/rdlworkbench/ast/Statement.java new file mode 100644 index 0000000..f2e4284 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Statement.java @@ -0,0 +1,15 @@ +package org.ntlab.rdlworkbench.ast; + +public abstract class Statement extends ASTNode { + + @Override + public abstract String toString(); + + @Override + public boolean equals(Object another) { + if (!(another instanceof Statement)) { + return false; + } + return toString().equals(another.toString()); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/SuperMethodInvocation.java b/src/main/java/org/ntlab/rdlworkbench/ast/SuperMethodInvocation.java new file mode 100644 index 0000000..7caa386 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/SuperMethodInvocation.java @@ -0,0 +1,74 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.ArrayList; +import java.util.List; + +/** + * Represents a super method invocation in AST (Abstract Syntax Tree) + * + * @author s-yamagiwa + * @apiNote Type arguments aren't supported because it isn't necessary in DTRAM code generator. + */ +public class SuperMethodInvocation extends Expression { + private String methodName; + private List arguments; + + public SuperMethodInvocation(String methodName) { + this(methodName, List.of()); + } + + public SuperMethodInvocation(String methodName, List arguments) { + this.methodName = methodName; + this.arguments = arguments; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + List replacedExpressions = new ArrayList<>(); + + for (Expression argument : arguments) { + replacedExpressions.add(argument.replace(variable, expression)); + } + + return new SuperMethodInvocation(methodName, replacedExpressions); + } + + public String getMethodName() { + return methodName; + } + + public void setMethodName(String methodName) { + this.methodName = methodName; + } + + public List getArguments() { + return arguments; + } + + public void setArguments(List arguments) { + this.arguments = arguments; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + + builder.append("super.").append(methodName).append("("); + + if (!arguments.isEmpty()) { + for (int i = 0; i < arguments.size(); i++) { + Expression argument = arguments.get(i); + + builder.append(argument.toString()); + + if (i < arguments.size() - 1) { + builder.append(", "); + } + } + } + + builder.append(");"); + + return builder.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/ThisExpression.java b/src/main/java/org/ntlab/rdlworkbench/ast/ThisExpression.java new file mode 100644 index 0000000..378d2cd --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/ThisExpression.java @@ -0,0 +1,13 @@ +package org.ntlab.rdlworkbench.ast; + +public class ThisExpression extends Expression { + @Override + public Expression replace(Variable variable, Expression expression) { + return this; + } + + @Override + public String toString() { + return "this"; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Throws.java b/src/main/java/org/ntlab/rdlworkbench/ast/Throws.java new file mode 100644 index 0000000..31af3cf --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Throws.java @@ -0,0 +1,29 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.HashSet; +import java.util.Set; + +public class Throws extends ASTNode { + private Set exceptions = new HashSet<>(); + + public Throws() { + } + + public void addException(String exception) { + exceptions.add(exception); + } + + public Set getExceptions() { + return exceptions; + } + + public String toString() { + String code = "throws "; + String delimiter = ""; + for (String exception: exceptions) { + code += delimiter + exception; + delimiter = ", "; + } + return code; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Type.java b/src/main/java/org/ntlab/rdlworkbench/ast/Type.java new file mode 100644 index 0000000..b7a3c0f --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Type.java @@ -0,0 +1,37 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents an abstract base class for all types in an abstract syntax tree (AST). + * A type can represent various forms such as primitive types, simple types, + * parameterized types, or others as defined by subclasses. + * + * @author s-yamagiwa + */ +public abstract class Type extends ASTNode implements models.algebra.Type.ITypeImpl { + /** + * Returns whether this type is a primitive type or not. + * + * @return true if this type is a primitive type, false otherwise. + */ + public final boolean isPrimitiveType() { + return (this instanceof PrimitiveType); + } + + /** + * Returns whether this type is a simple type or not. + * + * @return true if this type is a simple type, false otherwise. + */ + public final boolean isSimpleType() { + return (this instanceof SimpleType); + } + + /** + * Returns whether this type is a parameterized type or not. + * + * @return true if this type is a parameterized type, false otherwise. + */ + public final boolean isParameterizedType() { + return (this instanceof ParameterizedType); + } +} \ No newline at end of file diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/TypeDeclaration.java b/src/main/java/org/ntlab/rdlworkbench/ast/TypeDeclaration.java new file mode 100644 index 0000000..1285c54 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/TypeDeclaration.java @@ -0,0 +1,98 @@ +package org.ntlab.rdlworkbench.ast; + +import java.util.*; + +public class TypeDeclaration extends AbstractTypeDeclaration implements IAnnotatable { + private List fields = new ArrayList<>(); + private List methods = new ArrayList<>(); + private Map annotations = new HashMap<>(); + private List implementsInterfaces = new ArrayList<>(); + + public TypeDeclaration(String typeName) { + this.typeName = typeName; + } + + public TypeDeclaration(String typeName, List fields) { + this.typeName = typeName; + this.fields = fields; + } + + public TypeDeclaration(String typeName, List fields, List methods) { + this.typeName = typeName; + this.fields = fields; + this.methods = methods; + } + + public void addImplementsInterface(String interfaceName) { + implementsInterfaces.add(interfaceName); + } + + public List getImplementsInterfaces() { + return implementsInterfaces; + } + + public void addField(FieldDeclaration field) { + fields.add(field); + } + + public void addMethod(MethodDeclaration method) { + methods.add(method); + } + + public void removeMethod(MethodDeclaration method) { + methods.remove(method); + } + + public void removeField(FieldDeclaration field) { + fields.remove(field); + } + + public List getFields() { + return fields; + } + + public List getMethods() { + return methods; + } + + public MethodDeclaration createConstructor() { + MethodDeclaration constructor = new MethodDeclaration(typeName, true); + addMethod(constructor); + return constructor; + } + + @Override + public Annotation getAnnotation(String name) { + return annotations.get(name); + } + + @Override + public Collection getAnnotations() { + return annotations.values(); + } + + @Override + public void addAnnotation(Annotation annotation) { + annotations.put(annotation.getElementName(), annotation); + } + + public String toString() { + String code = ""; + for (Annotation annotation: getAnnotations()) { + code += annotation.toString() + "\n"; + } + code += "public class " + typeName; + if (!implementsInterfaces.isEmpty()) { + code += " implements " + String.join(", ", implementsInterfaces); + } + code += " {\n"; + for (FieldDeclaration f: fields) { + code += "\t" + f.toString(); + } + for (MethodDeclaration m: methods) { + code += CodeUtil.insertTab(m.toString()); + } + code += "}"; + return code; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/TypeLiteral.java b/src/main/java/org/ntlab/rdlworkbench/ast/TypeLiteral.java new file mode 100644 index 0000000..c46e3cd --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/TypeLiteral.java @@ -0,0 +1,32 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents a type literal expression in the AST. + * + * @author s-yamagiwa + */ +public class TypeLiteral extends Expression { + private Type type; + + public TypeLiteral(Type type) { + this.type = type; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + return this; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + @Override + public String toString() { + return type.toString(); + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/Variable.java b/src/main/java/org/ntlab/rdlworkbench/ast/Variable.java new file mode 100644 index 0000000..7826b75 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/Variable.java @@ -0,0 +1,35 @@ +package org.ntlab.rdlworkbench.ast; + +/** + * Represents a variable in the AST (Abstract Syntax Tree) + * + * @author s-yamagiwa + */ +public class Variable extends Expression { + private String name; + + public Variable(String name) { + this.name = name; + } + + @Override + public Expression replace(Variable variable, Expression expression) { + if (this == variable) { + return expression; + } + return this; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/VariableDeclaration.java b/src/main/java/org/ntlab/rdlworkbench/ast/VariableDeclaration.java new file mode 100644 index 0000000..0ccc1de --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/VariableDeclaration.java @@ -0,0 +1,68 @@ +package org.ntlab.rdlworkbench.ast; + +import models.algebra.Type; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class VariableDeclaration extends ASTNode implements IAnnotatable { + private Type type; + private String variableName; + private Expression optionalInitializer; + private Map annotations = new HashMap<>(); + + public VariableDeclaration(Type type, String variableName) { + this.type = type; + this.variableName = variableName; + } + + public VariableDeclaration(Type type, String variableName, Expression initializer) { + this(type, variableName); + this.optionalInitializer = initializer; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + public String getName() { + return variableName; + } + + public void setName(String variableName) { + this.variableName = variableName; + } + + public Expression getInitializer() { return optionalInitializer; } + + public void setInitializer(Expression initializer) { this.optionalInitializer = initializer; } + + @Override + public Annotation getAnnotation(String name) { + return annotations.get(name); + } + + @Override + public Collection getAnnotations() { + return annotations.values(); + } + + @Override + public void addAnnotation(Annotation annotation) { + annotations.put(annotation.getElementName(), annotation); + } + + public String toString() { + String code = ""; + code += type.getInterfaceTypeName() + " " + variableName; + if (optionalInitializer != null) { + code += " = " + optionalInitializer; + } + return code; + } +} diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/VariableDeclarationStatement.java b/src/main/java/org/ntlab/rdlworkbench/ast/VariableDeclarationStatement.java new file mode 100644 index 0000000..9acb400 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/VariableDeclarationStatement.java @@ -0,0 +1,82 @@ +package org.ntlab.rdlworkbench.ast; + +import models.algebra.Type; + +import java.util.ArrayList; +import java.util.List; + +public class VariableDeclarationStatement extends Statement { + + private List modifiers = new ArrayList<>(); + private Type type = null; + 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 addFragment(VariableDeclaration 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 + public String toString() { + StringBuilder sb = new StringBuilder(); + + for (Integer mod : modifiers) { + 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 (this.type != null) { + sb.append(this.type.getInterfaceTypeName()).append(" "); + } + + for (int i = 0; i < fragments.size(); i++) { + sb.append(fragments.get(i).toString()); + if (i < fragments.size() - 1) sb.append(", "); + } + + sb.append(";"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/org/ntlab/rdlworkbench/ast/WhileStatement.java b/src/main/java/org/ntlab/rdlworkbench/ast/WhileStatement.java new file mode 100644 index 0000000..78e2912 --- /dev/null +++ b/src/main/java/org/ntlab/rdlworkbench/ast/WhileStatement.java @@ -0,0 +1,33 @@ +package org.ntlab.rdlworkbench.ast; + +public class WhileStatement extends Statement { + + private Expression expression; + private Statement body; + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression 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