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 {