diff --git a/.idea/ANTLRv4ToolGrammarProperties.xml b/.idea/ANTLRv4ToolGrammarProperties.xml
new file mode 100644
index 0000000..1acd0a2
--- /dev/null
+++ b/.idea/ANTLRv4ToolGrammarProperties.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/ast/ASTNode.java b/src/main/java/ast/ASTNode.java
index b899ea2..1b666e2 100644
--- a/src/main/java/ast/ASTNode.java
+++ b/src/main/java/ast/ASTNode.java
@@ -1,5 +1,20 @@
package ast;
-public interface ASTNode { }
+import bytecode.visitor.ClassVisitor;
+import semantic.SemanticVisitor;
+import typechecker.TypeCheckResult;
+
+public interface ASTNode {
+
+ //Todo: @BruderJohn & @i22007 Interface anwenden + geeignetetn Methodename.
+
+ /*
+ Typecheck:
+ public TypeCheckResult acceptType(SemanticVisitor visitor);
+
+ Bytecode:
+ public void accepByteCode(ClassVisitor classVisitor);
+ */
+}
diff --git a/src/main/java/ast/ClassNode.java b/src/main/java/ast/ClassNode.java
index 5914d4b..573aef8 100644
--- a/src/main/java/ast/ClassNode.java
+++ b/src/main/java/ast/ClassNode.java
@@ -1,11 +1,10 @@
package ast;
import ast.type.AccessModifierNode;
-import ast.type.EnumAccessModifierNode;
import bytecode.visitor.ClassVisitor;
-import ast.member.ConstructorNode;
-import ast.member.MemberNode;
-import ast.member.MethodNode;
+import ast.members.ConstructorNode;
+import ast.members.MemberNode;
+import ast.members.MethodNode;
import semantic.SemanticVisitor;
import typechecker.TypeCheckResult;
import visitor.Visitable;
diff --git a/src/main/java/ast/expression/AssignableExpressionNode.java b/src/main/java/ast/expressions/AssignableExpressionNode.java
similarity index 63%
rename from src/main/java/ast/expression/AssignableExpressionNode.java
rename to src/main/java/ast/expressions/AssignableExpressionNode.java
index 6a65d10..bc702cc 100644
--- a/src/main/java/ast/expression/AssignableExpressionNode.java
+++ b/src/main/java/ast/expressions/AssignableExpressionNode.java
@@ -1,4 +1,4 @@
-package ast.expression;
+package ast.expressions;
public class AssignableExpressionNode {
}
diff --git a/src/main/java/ast/expression/ExpressionNode.java b/src/main/java/ast/expressions/ExpressionNode.java
similarity index 56%
rename from src/main/java/ast/expression/ExpressionNode.java
rename to src/main/java/ast/expressions/ExpressionNode.java
index 1566f3b..2d2e86c 100644
--- a/src/main/java/ast/expression/ExpressionNode.java
+++ b/src/main/java/ast/expressions/ExpressionNode.java
@@ -1,4 +1,4 @@
-package ast.expression;
+package ast.expressions;
public class ExpressionNode {
}
diff --git a/src/main/java/ast/member/ConstructorNode.java b/src/main/java/ast/members/ConstructorNode.java
similarity index 82%
rename from src/main/java/ast/member/ConstructorNode.java
rename to src/main/java/ast/members/ConstructorNode.java
index 7a7472f..9df3dba 100644
--- a/src/main/java/ast/member/ConstructorNode.java
+++ b/src/main/java/ast/members/ConstructorNode.java
@@ -1,7 +1,7 @@
-package ast.member;
+package ast.members;
-import ast.block.BlockNode;
-import ast.parameter.ParameterNode;
+import ast.statements.BlockStatementNode;
+import ast.parameters.ParameterNode;
import ast.type.AccessModifierNode;
import bytecode.visitor.MethodVisitor;
import visitor.Visitable;
@@ -13,9 +13,9 @@ public class ConstructorNode extends MethodNode implements Visitable {
public AccessModifierNode accessType;
public String identifier;
public List parameters = new ArrayList<>();
- public BlockNode body;
+ public BlockStatementNode body;
- public ConstructorNode(String accessType, String identifier, BlockNode body) {
+ public ConstructorNode(String accessType, String identifier, BlockStatementNode body) {
this.accessType = new AccessModifierNode(accessType);
this.identifier = identifier;
this.body = body;
diff --git a/src/main/java/ast/member/FieldNode.java b/src/main/java/ast/members/FieldNode.java
similarity index 97%
rename from src/main/java/ast/member/FieldNode.java
rename to src/main/java/ast/members/FieldNode.java
index 3ffd751..f04e3f5 100644
--- a/src/main/java/ast/member/FieldNode.java
+++ b/src/main/java/ast/members/FieldNode.java
@@ -1,4 +1,4 @@
-package ast.member;
+package ast.members;
import ast.type.AccessModifierNode;
import ast.type.TypeNode;
diff --git a/src/main/java/ast/member/MemberNode.java b/src/main/java/ast/members/MemberNode.java
similarity index 96%
rename from src/main/java/ast/member/MemberNode.java
rename to src/main/java/ast/members/MemberNode.java
index dd02551..1319c03 100644
--- a/src/main/java/ast/member/MemberNode.java
+++ b/src/main/java/ast/members/MemberNode.java
@@ -1,4 +1,4 @@
-package ast.member;
+package ast.members;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
diff --git a/src/main/java/ast/member/MethodNode.java b/src/main/java/ast/members/MethodNode.java
similarity index 98%
rename from src/main/java/ast/member/MethodNode.java
rename to src/main/java/ast/members/MethodNode.java
index df50365..3983f28 100644
--- a/src/main/java/ast/member/MethodNode.java
+++ b/src/main/java/ast/members/MethodNode.java
@@ -1,4 +1,4 @@
-package ast.member;
+package ast.members;
import bytecode.visitor.MethodVisitor;
import semantic.SemanticVisitor;
diff --git a/src/main/java/ast/parameter/ParameterNode.java b/src/main/java/ast/parameters/ParameterNode.java
similarity index 91%
rename from src/main/java/ast/parameter/ParameterNode.java
rename to src/main/java/ast/parameters/ParameterNode.java
index 3a6b5ec..ba12aab 100644
--- a/src/main/java/ast/parameter/ParameterNode.java
+++ b/src/main/java/ast/parameters/ParameterNode.java
@@ -1,4 +1,4 @@
-package ast.parameter;
+package ast.parameters;
import ast.ASTNode;
import ast.type.TypeNode;
diff --git a/src/main/java/ast/statement/ForStatementNode.java b/src/main/java/ast/statement/ForStatementNode.java
deleted file mode 100644
index 5a4b442..0000000
--- a/src/main/java/ast/statement/ForStatementNode.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package ast.statement;
-
-import ast.ASTNode;
-import ast.expression.ExpressionNode;
-
-public class ForStatementNode implements ASTNode {
- ExpressionNode statementExpressionInit;
- StatementNode localVariableDeclarationInit;
- ExpressionNode expression;
- ExpressionNode statementExpression;
-
- public ForStatementNode(ExpressionNode statementExpressionInit, ExpressionNode expression, ExpressionNode statementExpression) {
- this.statementExpressionInit = statementExpressionInit;
- this.expression = expression;
- this.statementExpression = statementExpression;
- }
-
- public ForStatementNode(StatementNode localVariableDeclarationInit, ExpressionNode expression, ExpressionNode statementExpression) {
- this.localVariableDeclarationInit = localVariableDeclarationInit;
- this.expression = expression;
- this.statementExpression = statementExpression;
- }
-}
diff --git a/src/main/java/ast/statement/StatementNode.java b/src/main/java/ast/statement/StatementNode.java
deleted file mode 100644
index c47d30c..0000000
--- a/src/main/java/ast/statement/StatementNode.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package ast.statement;public class StatementNode {
-}
diff --git a/src/main/java/ast/statement/WhileStatementNode.java b/src/main/java/ast/statement/WhileStatementNode.java
deleted file mode 100644
index 72d017d..0000000
--- a/src/main/java/ast/statement/WhileStatementNode.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package ast.statement;
-
-import ast.ASTNode;
-import ast.block.BlockNode;
-import ast.expression.ExpressionNode;
-
-public class WhileStatementNode implements ASTNode {
- ExpressionNode expression;
- BlockNode block;
-
- public WhileStatementNode(ExpressionNode expression, BlockNode block) {
- this.expression = expression;
- this.block = block;
- }
-}
diff --git a/src/main/java/ast/statement/ifstatement/ElseStatementNode.java b/src/main/java/ast/statement/ifstatement/ElseStatementNode.java
deleted file mode 100644
index cedfefc..0000000
--- a/src/main/java/ast/statement/ifstatement/ElseStatementNode.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package ast.statement.ifstatement;
-
-import ast.ASTNode;
-import ast.block.BlockNode;
-
-public class ElseStatementNode implements ASTNode {
- BlockNode block;
-
- public ElseStatementNode(BlockNode block) {
- this.block = block;
- }
-}
diff --git a/src/main/java/ast/statement/ifstatement/IfElseStatementNode.java b/src/main/java/ast/statement/ifstatement/IfElseStatementNode.java
deleted file mode 100644
index dcdc6ca..0000000
--- a/src/main/java/ast/statement/ifstatement/IfElseStatementNode.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package ast.statement.ifstatement;
-
-import ast.ASTNode;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class IfElseStatementNode implements ASTNode {
- IfStatementNode ifStatement;
- List elseStatements = new ArrayList<>();
-
- public IfElseStatementNode(IfStatementNode ifStatement) {
- this.ifStatement = ifStatement;
- }
-
- public void addElseStatement(ElseStatementNode elseStatement) {
- elseStatements.add(elseStatement);
- }
-
-}
diff --git a/src/main/java/ast/statement/ifstatement/IfStatementNode.java b/src/main/java/ast/statement/ifstatement/IfStatementNode.java
deleted file mode 100644
index 4731758..0000000
--- a/src/main/java/ast/statement/ifstatement/IfStatementNode.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package ast.statement.ifstatement;
-
-import ast.ASTNode;
-import ast.block.BlockNode;
-import ast.expression.ExpressionNode;
-
-public class IfStatementNode implements ASTNode {
- ExpressionNode expression;
- BlockNode block;
-
- public IfStatementNode(ExpressionNode expression, BlockNode block) {
- this.expression = expression;
- this.block = block;
- }
-}
diff --git a/src/main/java/ast/statement/statementexpression/methodcallstatementnexpression/TargetNode.java b/src/main/java/ast/statement/statementexpression/methodcallstatementnexpression/TargetNode.java
deleted file mode 100644
index 68f4526..0000000
--- a/src/main/java/ast/statement/statementexpression/methodcallstatementnexpression/TargetNode.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package ast.statement.statementexpression.methodcallstatementnexpression;
-
-public class TargetNode {
- String thisTarget;
-
-
-}
diff --git a/src/main/java/ast/statement/statementexpression/AssignStatementExpressionNode.java b/src/main/java/ast/statementexpressions/AssignStatementExpressionNode.java
similarity index 73%
rename from src/main/java/ast/statement/statementexpression/AssignStatementExpressionNode.java
rename to src/main/java/ast/statementexpressions/AssignStatementExpressionNode.java
index 007f240..3c63e81 100644
--- a/src/main/java/ast/statement/statementexpression/AssignStatementExpressionNode.java
+++ b/src/main/java/ast/statementexpressions/AssignStatementExpressionNode.java
@@ -1,8 +1,8 @@
-package ast.statement.statementexpression;
+package ast.statementexpressions;
import ast.ASTNode;
-import ast.expression.AssignableExpressionNode;
-import ast.expression.ExpressionNode;
+import ast.expressions.AssignableExpressionNode;
+import ast.expressions.ExpressionNode;
public class AssignStatementExpressionNode implements ASTNode {
AssignableExpressionNode assignable;
diff --git a/src/main/java/ast/statement/statementexpression/CrementExpressionStatementExpressionNode.java b/src/main/java/ast/statementexpressions/CrementExpressionStatementExpressionNode.java
similarity index 84%
rename from src/main/java/ast/statement/statementexpression/CrementExpressionStatementExpressionNode.java
rename to src/main/java/ast/statementexpressions/CrementExpressionStatementExpressionNode.java
index de68102..e3292d5 100644
--- a/src/main/java/ast/statement/statementexpression/CrementExpressionStatementExpressionNode.java
+++ b/src/main/java/ast/statementexpressions/CrementExpressionStatementExpressionNode.java
@@ -1,7 +1,7 @@
-package ast.statement.statementexpression;
+package ast.statementexpressions;
import ast.ASTNode;
-import ast.expression.ExpressionNode;
+import ast.expressions.ExpressionNode;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/ast/statement/statementexpression/NewDeclarationStatementExpressionNode.java b/src/main/java/ast/statementexpressions/NewDeclarationStatementExpressionNode.java
similarity index 84%
rename from src/main/java/ast/statement/statementexpression/NewDeclarationStatementExpressionNode.java
rename to src/main/java/ast/statementexpressions/NewDeclarationStatementExpressionNode.java
index 6683b46..0ea4a35 100644
--- a/src/main/java/ast/statement/statementexpression/NewDeclarationStatementExpressionNode.java
+++ b/src/main/java/ast/statementexpressions/NewDeclarationStatementExpressionNode.java
@@ -1,7 +1,7 @@
-package ast.statement.statementexpression;
+package ast.statementexpressions;
import ast.ASTNode;
-import ast.expression.ExpressionNode;
+import ast.expressions.ExpressionNode;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/ast/statement/statementexpression/methodcallstatementnexpression/ChainedMethodNode.java b/src/main/java/ast/statementexpressions/methodcallstatementnexpression/ChainedMethodNode.java
similarity index 78%
rename from src/main/java/ast/statement/statementexpression/methodcallstatementnexpression/ChainedMethodNode.java
rename to src/main/java/ast/statementexpressions/methodcallstatementnexpression/ChainedMethodNode.java
index 759f197..9f6919d 100644
--- a/src/main/java/ast/statement/statementexpression/methodcallstatementnexpression/ChainedMethodNode.java
+++ b/src/main/java/ast/statementexpressions/methodcallstatementnexpression/ChainedMethodNode.java
@@ -1,7 +1,7 @@
-package ast.statement.statementexpression.methodcallstatementnexpression;
+package ast.statementexpressions.methodcallstatementnexpression;
import ast.ASTNode;
-import ast.expression.ExpressionNode;
+import ast.expressions.ExpressionNode;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/ast/statement/statementexpression/methodcallstatementnexpression/MethodCallStatementExpressionNode.java b/src/main/java/ast/statementexpressions/methodcallstatementnexpression/MethodCallStatementExpressionNode.java
similarity index 86%
rename from src/main/java/ast/statement/statementexpression/methodcallstatementnexpression/MethodCallStatementExpressionNode.java
rename to src/main/java/ast/statementexpressions/methodcallstatementnexpression/MethodCallStatementExpressionNode.java
index 5fcaba1..e92ad1c 100644
--- a/src/main/java/ast/statement/statementexpression/methodcallstatementnexpression/MethodCallStatementExpressionNode.java
+++ b/src/main/java/ast/statementexpressions/methodcallstatementnexpression/MethodCallStatementExpressionNode.java
@@ -1,7 +1,7 @@
-package ast.statement.statementexpression.methodcallstatementnexpression;
+package ast.statementexpressions.methodcallstatementnexpression;
import ast.ASTNode;
-import ast.expression.ExpressionNode;
+import ast.expressions.ExpressionNode;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/ast/statementexpressions/methodcallstatementnexpression/TargetNode.java b/src/main/java/ast/statementexpressions/methodcallstatementnexpression/TargetNode.java
new file mode 100644
index 0000000..3621f3d
--- /dev/null
+++ b/src/main/java/ast/statementexpressions/methodcallstatementnexpression/TargetNode.java
@@ -0,0 +1,7 @@
+package ast.statementexpressions.methodcallstatementnexpression;
+
+public class TargetNode {
+ String thisTarget;
+
+
+}
diff --git a/src/main/java/ast/block/BlockNode.java b/src/main/java/ast/statements/BlockStatementNode.java
similarity index 65%
rename from src/main/java/ast/block/BlockNode.java
rename to src/main/java/ast/statements/BlockStatementNode.java
index a5ff3f7..49b2b86 100644
--- a/src/main/java/ast/block/BlockNode.java
+++ b/src/main/java/ast/statements/BlockStatementNode.java
@@ -1,16 +1,13 @@
-package ast.block;
+package ast.statements;
import ast.ASTNode;
-import ast.statement.StatementNode;
import java.util.ArrayList;
import java.util.List;
-public class BlockNode implements ASTNode {
+public class BlockStatementNode extends StatementNode implements ASTNode {
public List statements = new ArrayList<>();
- public BlockNode() {}
-
public void addStatement(StatementNode statement) {
statements.add(statement);
}
diff --git a/src/main/java/ast/statements/ElseStatementNode.java b/src/main/java/ast/statements/ElseStatementNode.java
new file mode 100644
index 0000000..70d0243
--- /dev/null
+++ b/src/main/java/ast/statements/ElseStatementNode.java
@@ -0,0 +1,13 @@
+package ast.statements;
+
+import ast.ASTNode;
+
+public class ElseStatementNode implements ASTNode {
+ BlockStatementNode block;
+
+ public ElseStatementNode(BlockStatementNode block) {
+ this.block = block;
+ }
+
+
+}
diff --git a/src/main/java/ast/statements/IfElseStatementNode.java b/src/main/java/ast/statements/IfElseStatementNode.java
new file mode 100644
index 0000000..8b24274
--- /dev/null
+++ b/src/main/java/ast/statements/IfElseStatementNode.java
@@ -0,0 +1,22 @@
+package ast.statements;
+
+import ast.ASTNode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class IfElseStatementNode implements ASTNode {
+ IfStatementNode ifStatement;
+ List elseIfStatements = new ArrayList<>();
+ ElseStatementNode elseStatement;
+
+ public IfElseStatementNode(IfStatementNode ifStatement, ElseStatementNode elseStatementNode) {
+ this.ifStatement = ifStatement;
+ this.elseStatement = elseStatementNode;
+ }
+
+ public void addElseIfStatement(IfStatementNode elseIfStament) {
+ elseIfStatements.add(elseIfStament);
+ }
+
+}
diff --git a/src/main/java/ast/statements/IfStatementNode.java b/src/main/java/ast/statements/IfStatementNode.java
new file mode 100644
index 0000000..bf09272
--- /dev/null
+++ b/src/main/java/ast/statements/IfStatementNode.java
@@ -0,0 +1,14 @@
+package ast.statements;
+
+import ast.ASTNode;
+import ast.expressions.ExpressionNode;
+
+public class IfStatementNode implements ASTNode {
+ ExpressionNode expression;
+ BlockStatementNode block;
+
+ public IfStatementNode(ExpressionNode expression, BlockStatementNode block) {
+ this.expression = expression;
+ this.block = block;
+ }
+}
diff --git a/src/main/java/ast/statement/LocalVariableDeclarationNode.java b/src/main/java/ast/statements/LocalVariableDeclarationNode.java
similarity index 88%
rename from src/main/java/ast/statement/LocalVariableDeclarationNode.java
rename to src/main/java/ast/statements/LocalVariableDeclarationNode.java
index 5b3900f..0e46684 100644
--- a/src/main/java/ast/statement/LocalVariableDeclarationNode.java
+++ b/src/main/java/ast/statements/LocalVariableDeclarationNode.java
@@ -1,7 +1,7 @@
-package ast.statement;
+package ast.statements;
import ast.ASTNode;
-import ast.expression.ExpressionNode;
+import ast.expressions.ExpressionNode;
import ast.type.TypeNode;
public class LocalVariableDeclarationNode implements ASTNode {
diff --git a/src/main/java/ast/statement/ReturnStatementNode.java b/src/main/java/ast/statements/ReturnStatementNode.java
similarity index 61%
rename from src/main/java/ast/statement/ReturnStatementNode.java
rename to src/main/java/ast/statements/ReturnStatementNode.java
index ab111c5..25a0e01 100644
--- a/src/main/java/ast/statement/ReturnStatementNode.java
+++ b/src/main/java/ast/statements/ReturnStatementNode.java
@@ -1,11 +1,7 @@
-package ast.statement;
+package ast.statements;
import ast.ASTNode;
-import ast.expression.ExpressionNode;
-import ast.type.TypeNode;
-
-import java.util.ArrayList;
-import java.util.List;
+import ast.expressions.ExpressionNode;
public class ReturnStatementNode implements ASTNode {
public ExpressionNode expression;
diff --git a/src/main/java/ast/statements/StatementNode.java b/src/main/java/ast/statements/StatementNode.java
new file mode 100644
index 0000000..24985c1
--- /dev/null
+++ b/src/main/java/ast/statements/StatementNode.java
@@ -0,0 +1,2 @@
+package ast.statements;public class StatementNode {
+}
diff --git a/src/main/java/ast/statements/WhileStatementNode.java b/src/main/java/ast/statements/WhileStatementNode.java
new file mode 100644
index 0000000..e5fadfd
--- /dev/null
+++ b/src/main/java/ast/statements/WhileStatementNode.java
@@ -0,0 +1,14 @@
+package ast.statements;
+
+import ast.ASTNode;
+import ast.expressions.ExpressionNode;
+
+public class WhileStatementNode extends StatementNode implements ASTNode {
+ ExpressionNode expression;
+ BlockStatementNode block;
+
+ public WhileStatementNode(ExpressionNode expression, BlockStatementNode block) {
+ this.expression = expression;
+ this.block = block;
+ }
+}
diff --git a/src/main/java/bytecode/ClassCodeGen.java b/src/main/java/bytecode/ClassCodeGen.java
index b0afa69..a11034c 100644
--- a/src/main/java/bytecode/ClassCodeGen.java
+++ b/src/main/java/bytecode/ClassCodeGen.java
@@ -1,9 +1,9 @@
package bytecode;
import ast.ClassNode;
-import ast.member.FieldNode;
-import ast.member.MemberNode;
-import ast.member.MethodNode;
+import ast.members.FieldNode;
+import ast.members.MemberNode;
+import ast.members.MethodNode;
import ast.type.BaseTypeNode;
import bytecode.visitor.ClassVisitor;
import java.io.File;
diff --git a/src/main/java/bytecode/Mapper.java b/src/main/java/bytecode/Mapper.java
index faa4a67..54e9daa 100644
--- a/src/main/java/bytecode/Mapper.java
+++ b/src/main/java/bytecode/Mapper.java
@@ -1,6 +1,6 @@
package bytecode;
-import ast.parameter.ParameterNode;
+import ast.parameters.ParameterNode;
import ast.type.*;
import org.objectweb.asm.Opcodes;
import ast.type.BaseTypeNode;
diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java
index 1cdf1e2..40bb745 100644
--- a/src/main/java/bytecode/MethodCodeGen.java
+++ b/src/main/java/bytecode/MethodCodeGen.java
@@ -1,8 +1,8 @@
package bytecode;
-import ast.member.ConstructorNode;
-import ast.member.MethodNode;
-import ast.parameter.ParameterNode;
+import ast.members.ConstructorNode;
+import ast.members.MethodNode;
+import ast.parameters.ParameterNode;
import ast.type.BaseTypeNode;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Label;
diff --git a/src/main/java/bytecode/visitor/ClassVisitor.java b/src/main/java/bytecode/visitor/ClassVisitor.java
index 903775a..a6167dd 100644
--- a/src/main/java/bytecode/visitor/ClassVisitor.java
+++ b/src/main/java/bytecode/visitor/ClassVisitor.java
@@ -1,7 +1,7 @@
package bytecode.visitor;
import ast.ClassNode;
-import ast.member.FieldNode;
+import ast.members.FieldNode;
public interface ClassVisitor {
void visit(ClassNode classNode);
diff --git a/src/main/java/bytecode/visitor/MethodVisitor.java b/src/main/java/bytecode/visitor/MethodVisitor.java
index 70177ce..150a13d 100644
--- a/src/main/java/bytecode/visitor/MethodVisitor.java
+++ b/src/main/java/bytecode/visitor/MethodVisitor.java
@@ -1,7 +1,7 @@
package bytecode.visitor;
-import ast.member.ConstructorNode;
-import ast.member.MethodNode;
+import ast.members.ConstructorNode;
+import ast.members.MethodNode;
public interface MethodVisitor {
void visit(ConstructorNode constructorNode);
diff --git a/src/main/java/parser/astBuilder/ASTBuilder.java b/src/main/java/parser/astBuilder/ASTBuilder.java
index cc54059..3a7eb43 100644
--- a/src/main/java/parser/astBuilder/ASTBuilder.java
+++ b/src/main/java/parser/astBuilder/ASTBuilder.java
@@ -1,24 +1,27 @@
package parser.astBuilder;
import ast.*;
-import ast.block.BlockNode;
-import ast.expression.AssignableExpressionNode;
-import ast.expression.ExpressionNode;
-import ast.statement.ifstatement.ElseStatementNode;
-import ast.statement.ifstatement.IfElseStatementNode;
-import ast.member.ConstructorNode;
-import ast.member.MemberNode;
-import ast.parameter.ParameterNode;
-import ast.statement.*;
-import ast.statement.ifstatement.IfStatementNode;
-import ast.statement.statementexpression.AssignStatementExpressionNode;
-import ast.statement.statementexpression.CrementExpressionStatementExpressionNode;
-import ast.statement.statementexpression.methodcallstatementnexpression.ChainedMethodNode;
-import ast.statement.statementexpression.methodcallstatementnexpression.MethodCallStatementExpressionNode;
-import ast.statement.statementexpression.methodcallstatementnexpression.TargetNode;
+import ast.statements.BlockStatementNode;
+import ast.expressions.AssignableExpressionNode;
+import ast.expressions.ExpressionNode;
+import ast.statements.ElseStatementNode;
+import ast.statements.IfElseStatementNode;
+import ast.members.ConstructorNode;
+import ast.members.MemberNode;
+import ast.parameters.ParameterNode;
+import ast.statements.*;
+import ast.statements.IfStatementNode;
+import ast.statementexpressions.AssignStatementExpressionNode;
+import ast.statementexpressions.CrementExpressionStatementExpressionNode;
+import ast.statementexpressions.methodcallstatementnexpression.ChainedMethodNode;
+import ast.statementexpressions.methodcallstatementnexpression.MethodCallStatementExpressionNode;
+import ast.statementexpressions.methodcallstatementnexpression.TargetNode;
import ast.type.*;
import parser.generated.*;
+import java.util.ArrayList;
+import java.util.List;
+
public class ASTBuilder extends SimpleJavaBaseVisitor {
@Override
public ASTNode visitProgram(SimpleJavaParser.ProgramContext ctx) {
@@ -41,7 +44,7 @@ public class ASTBuilder extends SimpleJavaBaseVisitor {
@Override
public ASTNode visitConstructorDeclaration(SimpleJavaParser.ConstructorDeclarationContext ctx) {
- ConstructorNode constructorNode = new ConstructorNode(ctx.AccessModifier().getText(), ctx.Identifier().getText(), (BlockNode) visit(ctx.block()));
+ ConstructorNode constructorNode = new ConstructorNode(ctx.AccessModifier().getText(), ctx.Identifier().getText(), (BlockStatementNode) visit(ctx.block()));
for(SimpleJavaParser.ParameterContext parameter : ctx.parameterList().parameter()) {
constructorNode.addParameter((ParameterNode) visit(parameter));
}
@@ -59,8 +62,8 @@ public class ASTBuilder extends SimpleJavaBaseVisitor {
return visitReturnStatement(ctx.returnStatement());
} else if(ctx.localVariableDeclaration() != null) {
return visitLocalVariableDeclaration(ctx.localVariableDeclaration());
- } else if(ctx.block() != null) {
- return visitBlock(ctx.block());
+ } else if(ctx.blockStatement() != null) {
+ return visitBlockStatement(ctx.blockStatement());
} else if(ctx.whileStatement() != null) {
return visitWhileStatement(ctx.whileStatement());
} else if(ctx.forStatement() != null) {
@@ -84,8 +87,8 @@ public class ASTBuilder extends SimpleJavaBaseVisitor {
}
@Override
- public ASTNode visitBlock(SimpleJavaParser.BlockContext ctx) {
- BlockNode blockNode = new BlockNode();
+ public ASTNode visitBlockStatement(SimpleJavaParser.BlockStatementContext ctx) {
+ BlockStatementNode blockNode = new BlockStatementNode();
for(SimpleJavaParser.StatementContext statement : ctx.statement()) {
blockNode.addStatement((StatementNode) visit(statement));
}
@@ -94,36 +97,86 @@ public class ASTBuilder extends SimpleJavaBaseVisitor {
@Override
public ASTNode visitWhileStatement(SimpleJavaParser.WhileStatementContext ctx) {
- return new WhileStatementNode((ExpressionNode) visit(ctx.expression()), (BlockNode) visit(ctx.block()));
+ return new WhileStatementNode((ExpressionNode) visit(ctx.expression()), (BlockStatementNode) visit(ctx.blockStatement()));
+ }
+
+ @Override
+ public ASTNode visitDoWhileStatement(SimpleJavaParser.DoWhileStatementContext ctx) {
+ ExpressionNode condition = (ExpressionNode) visit(ctx.expression());
+ BlockStatementNode doBlock = (BlockStatementNode) visit(ctx.blockStatement());
+
+ WhileStatementNode whileStatement = new WhileStatementNode(condition, doBlock);
+ BlockStatementNode resultBlock = new BlockStatementNode();
+ resultBlock.addStatement(doBlock);
+ resultBlock.addStatement(whileStatement);
+
+ return resultBlock;
}
@Override
public ASTNode visitForStatement(SimpleJavaParser.ForStatementContext ctx) {
- if(ctx.statementExpression(0) != null) {
- return new ForStatementNode((ExpressionNode) visit(ctx.statementExpression(0)), (ExpressionNode) visit(ctx.expression()), (ExpressionNode) visit(ctx.statementExpression(1)));
- } else if(ctx.localVariableDeclaration() != null) {
- return new ForStatementNode((StatementNode) visit(ctx.localVariableDeclaration()), (ExpressionNode) visit(ctx.expression()), (ExpressionNode) visit(ctx.statementExpression(1)));
+
+ List statements = new ArrayList<>();
+
+ //init
+ if(ctx.statementExpression(0) != null){
+ statements.add((StatementNode) visit(ctx.statementExpression(0)));
+ } else if (ctx.localVariableDeclaration() != null) {
+ statements.add((StatementNode) visit(ctx.localVariableDeclaration()));
}
- return null;
+
+ //condition
+ ExpressionNode condition = (ExpressionNode) visit(ctx.expression());
+
+ //ink
+ StatementNode increment = null;
+ if(ctx.statementExpression(1) != null){
+ increment = (StatementNode) visit(ctx.statementExpression(1));
+ }
+
+ BlockStatementNode forBlock = (BlockStatementNode) visit(ctx.blockStatement());
+
+ if(increment != null){
+ forBlock.addStatement((increment));
+ }
+
+ WhileStatementNode whileStatement = new WhileStatementNode(condition, forBlock);
+
+ statements.add(whileStatement);
+
+ BlockStatementNode resultBlock = new BlockStatementNode();
+ for(StatementNode statement : statements) {
+ resultBlock.addStatement(statement);
+ }
+
+ return resultBlock;
}
@Override
public ASTNode visitIfElseStatement(SimpleJavaParser.IfElseStatementContext ctx) {
- IfElseStatementNode ifElseStatementNode = new IfElseStatementNode((IfStatementNode) visit(ctx.ifStatement()));
- for(SimpleJavaParser.ElseStatementContext elseStatement : ctx.elseStatement()) {
- ifElseStatementNode.addElseStatement((ElseStatementNode) visit(elseStatement));
+ IfElseStatementNode ifElseStatementNode = new IfElseStatementNode((IfStatementNode) visit(ctx.ifStatement()),
+ (ElseStatementNode) visit(ctx.elseStatement()));
+
+ for (SimpleJavaParser.ElseIfStatementContext elseIfStatement : ctx.elseIfStatement()){
+ ifElseStatementNode.addElseIfStatement(((IfStatementNode) visit(elseIfStatement)));
}
+
return ifElseStatementNode;
}
@Override
public ASTNode visitIfStatement(SimpleJavaParser.IfStatementContext ctx) {
- return new IfStatementNode((ExpressionNode) visit(ctx.expression()), (BlockNode) visit(ctx.block()));
+ return new IfStatementNode((ExpressionNode) visit(ctx.expression()), (BlockStatementNode) visit(ctx.blockStatement()));
+ }
+
+ @Override
+ public ASTNode visitElseIfStatement(SimpleJavaParser.ElseIfStatementContext ctx) {
+ return new IfStatementNode((ExpressionNode) visit(ctx.expression()), (BlockStatementNode) visit(ctx.blockStatement()));
}
@Override
public ASTNode visitElseStatement(SimpleJavaParser.ElseStatementContext ctx) {
- return new ElseStatementNode((BlockNode) visit(ctx.block()));
+ return new ElseStatementNode((BlockStatementNode) visit(ctx.blockStatement()));
}
@Override
diff --git a/src/main/java/parser/grammar/SimpleJava.g4 b/src/main/java/parser/grammar/SimpleJava.g4
index 333142f..51b7bc1 100644
--- a/src/main/java/parser/grammar/SimpleJava.g4
+++ b/src/main/java/parser/grammar/SimpleJava.g4
@@ -6,9 +6,9 @@ program: classDeclaration+;
classDeclaration: AccessModifier? 'class' Identifier OpenCurlyBracket memberDeclaration* ClosedCurlyBracket;
memberDeclaration: constructorDeclaration | fieldDeclaration | methodDeclaration;
-constructorDeclaration: AccessModifier? Identifier OpenRoundBracket parameterList? ClosedRoundBracket block;
+constructorDeclaration: AccessModifier? Identifier OpenRoundBracket parameterList? ClosedRoundBracket blockStatement;
fieldDeclaration: AccessModifier? type Identifier Semicolon;
-methodDeclaration: MainMethodDeclaration block | AccessModifier? (type | Void) Identifier OpenRoundBracket parameterList? ClosedRoundBracket block;
+methodDeclaration: MainMethodDeclaration blockStatement | AccessModifier? (type | Void) Identifier OpenRoundBracket parameterList? ClosedRoundBracket blockStatement;
parameterList: parameter (Comma parameter)*;
parameter: type Identifier;
@@ -17,23 +17,26 @@ argumentList: (expression (Comma expression)*)?;
// Anweisungen
statement: returnStatement Semicolon
| localVariableDeclaration Semicolon
- | block
+ | blockStatement
| whileStatement
+ | doWhileStatement
| forStatement
| ifElseStatement
| statementExpression Semicolon;
-block: OpenCurlyBracket statement* ClosedCurlyBracket;
+blockStatement: OpenCurlyBracket statement* ClosedCurlyBracket;
returnStatement: Return (expression)?;
localVariableDeclaration: type Identifier (Assign expression)?;
-whileStatement: While OpenRoundBracket expression ClosedRoundBracket block;
-forStatement: For OpenRoundBracket (statementExpression | localVariableDeclaration) Semicolon (expression)? Semicolon (statementExpression)? ClosedRoundBracket block;
+whileStatement: While OpenRoundBracket expression ClosedRoundBracket blockStatement;
+doWhileStatement: Do blockStatement While OpenRoundBracket expression ClosedRoundBracket Semicolon;
+forStatement: For OpenRoundBracket (statementExpression | localVariableDeclaration) Semicolon (expression)? Semicolon (statementExpression)? ClosedRoundBracket blockStatement;
-ifElseStatement: ifStatement elseStatement*;
-ifStatement: If OpenRoundBracket expression ClosedRoundBracket block;
-elseStatement: Else block;
+ifElseStatement: ifStatement elseIfStatement* elseStatement?;
+ifStatement: If OpenRoundBracket expression ClosedRoundBracket blockStatement;
+elseIfStatement: Else If OpenRoundBracket expression ClosedRoundBracket blockStatement;
+elseStatement: Else blockStatement;
statementExpression: assign | newDeclaration | methodCall | crementExpression;
assign: assignableExpression Assign expression;
@@ -144,6 +147,7 @@ Comma: ',';
Class: 'class';
This: 'this';
While: 'while';
+Do: 'do';
If: 'if';
Else: 'else';
For: 'for';
diff --git a/src/main/java/semantic/SemanticVisitor.java b/src/main/java/semantic/SemanticVisitor.java
index 8878777..bdb6538 100644
--- a/src/main/java/semantic/SemanticVisitor.java
+++ b/src/main/java/semantic/SemanticVisitor.java
@@ -2,17 +2,17 @@ package semantic;
import ast.ClassNode;
-import ast.expression.LiteralNode;
+import ast.expressions.LiteralNode;
import ast.ProgramNode;
-import ast.expression.BinaryExpressionNode;
-import ast.expression.IdentifierExpressionNode;
-import ast.expression.InstVar;
-import ast.expression.UnaryExpressionNode;
-import ast.member.FieldNode;
-import ast.member.MethodNode;
-import ast.statement.*;
-import ast.expression.This;
-import ast.statement.ifstatement.IfStatementNode;
+import ast.expressions.BinaryExpressionNode;
+import ast.expressions.IdentifierExpressionNode;
+import ast.expressions.InstVar;
+import ast.expressions.UnaryExpressionNode;
+import ast.members.FieldNode;
+import ast.members.MethodNode;
+import ast.statements.*;
+import ast.expressions.This;
+import ast.statements.IfStatementNode;
import typechecker.TypeCheckResult;
public interface SemanticVisitor {