From 407b03620ea44cbb71dfebc475c1e0dfbb22c70a Mon Sep 17 00:00:00 2001 From: i22007 Date: Fri, 31 May 2024 10:46:23 +0200 Subject: [PATCH 01/16] Code for assignment --- pom.xml | 5 + src/main/java/ast/LiteralNode.java | 11 +- .../ast/expression/BinaryExpressionNode.java | 6 + .../expression/IdentifierExpressionNode.java | 9 +- .../ast/expression/UnaryExpressionNode.java | 6 + .../statement/AssignmentStatementNode.java | 7 ++ .../java/ast/statement/IfStatementNode.java | 9 +- .../ast/statement/ReturnStatementNode.java | 9 +- .../java/ast/statement/StatementNode.java | 1 + .../VariableDeclarationStatementNode.java | 9 +- .../ast/statement/WhileStatementNode.java | 9 +- src/main/java/bytecode/ByteCodeGenerator.java | 4 + src/main/java/bytecode/ClassCodeGen.java | 2 +- src/main/java/bytecode/MethodCodeGen.java | 118 +++++++++++++----- .../java/bytecode/visitor/MethodVisitor.java | 14 +++ src/main/java/parser/ASTBuilder.java | 2 +- src/test/java/semantic/SemanticTest.java | 10 +- 17 files changed, 186 insertions(+), 45 deletions(-) diff --git a/pom.xml b/pom.xml index 9ee63e3..19ffea1 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,11 @@ asm 9.7 + + org.ow2.asm + asm-util + 9.2 + diff --git a/src/main/java/ast/LiteralNode.java b/src/main/java/ast/LiteralNode.java index 3873465..a141c9a 100644 --- a/src/main/java/ast/LiteralNode.java +++ b/src/main/java/ast/LiteralNode.java @@ -1,12 +1,14 @@ package ast; import ast.expression.ExpressionNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; +import visitor.Visitable; -public class LiteralNode implements ExpressionNode { +public class LiteralNode implements ExpressionNode, Visitable { - int value; + public int value; private String type; public LiteralNode(int value) { @@ -26,4 +28,9 @@ public class LiteralNode implements ExpressionNode { public TypeCheckResult accept(SemanticVisitor visitor) { return null; } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } diff --git a/src/main/java/ast/expression/BinaryExpressionNode.java b/src/main/java/ast/expression/BinaryExpressionNode.java index e4a0e41..53245dd 100644 --- a/src/main/java/ast/expression/BinaryExpressionNode.java +++ b/src/main/java/ast/expression/BinaryExpressionNode.java @@ -1,5 +1,6 @@ package ast.expression; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; import visitor.Visitable; @@ -19,4 +20,9 @@ public class BinaryExpressionNode implements ExpressionNode, Visitable { public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } \ No newline at end of file diff --git a/src/main/java/ast/expression/IdentifierExpressionNode.java b/src/main/java/ast/expression/IdentifierExpressionNode.java index 1bb8d56..b000dc6 100644 --- a/src/main/java/ast/expression/IdentifierExpressionNode.java +++ b/src/main/java/ast/expression/IdentifierExpressionNode.java @@ -1,6 +1,7 @@ package ast.expression; import ast.type.TypeNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -11,12 +12,18 @@ public class IdentifierExpressionNode implements ExpressionNode, Visitable { public TypeNode type; - public IdentifierExpressionNode(String name) { + public IdentifierExpressionNode(String name, TypeNode type) { this.name = name; + this.type = type; } @Override public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } diff --git a/src/main/java/ast/expression/UnaryExpressionNode.java b/src/main/java/ast/expression/UnaryExpressionNode.java index be1a660..8ea193f 100644 --- a/src/main/java/ast/expression/UnaryExpressionNode.java +++ b/src/main/java/ast/expression/UnaryExpressionNode.java @@ -1,5 +1,6 @@ package ast.expression; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; import visitor.Visitable; @@ -17,6 +18,11 @@ public class UnaryExpressionNode implements ExpressionNode, Visitable { public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } diff --git a/src/main/java/ast/statement/AssignmentStatementNode.java b/src/main/java/ast/statement/AssignmentStatementNode.java index f9fd38e..74d1c58 100644 --- a/src/main/java/ast/statement/AssignmentStatementNode.java +++ b/src/main/java/ast/statement/AssignmentStatementNode.java @@ -1,6 +1,8 @@ package ast.statement; import ast.expression.BinaryExpressionNode; + +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; import visitor.Visitable; @@ -16,4 +18,9 @@ public class AssignmentStatementNode extends StatementNode implements Visitable public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } diff --git a/src/main/java/ast/statement/IfStatementNode.java b/src/main/java/ast/statement/IfStatementNode.java index 3f585dd..c284c84 100644 --- a/src/main/java/ast/statement/IfStatementNode.java +++ b/src/main/java/ast/statement/IfStatementNode.java @@ -1,10 +1,12 @@ package ast.statement; import ast.expression.ExpressionNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; +import visitor.Visitable; -public class IfStatementNode extends StatementNode { +public class IfStatementNode extends StatementNode implements Visitable { public ExpressionNode condition; public StatementNode thenStatement; public StatementNode elseStatement; @@ -19,4 +21,9 @@ public class IfStatementNode extends StatementNode { public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } \ No newline at end of file diff --git a/src/main/java/ast/statement/ReturnStatementNode.java b/src/main/java/ast/statement/ReturnStatementNode.java index c5e4d6b..df24416 100644 --- a/src/main/java/ast/statement/ReturnStatementNode.java +++ b/src/main/java/ast/statement/ReturnStatementNode.java @@ -1,10 +1,12 @@ package ast.statement; import ast.expression.ExpressionNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; +import visitor.Visitable; -public class ReturnStatementNode extends StatementNode { +public class ReturnStatementNode extends StatementNode implements Visitable { public ExpressionNode expression; public ReturnStatementNode(ExpressionNode expression) { @@ -15,4 +17,9 @@ public class ReturnStatementNode extends StatementNode { public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } \ No newline at end of file diff --git a/src/main/java/ast/statement/StatementNode.java b/src/main/java/ast/statement/StatementNode.java index eff1804..fb4edd8 100644 --- a/src/main/java/ast/statement/StatementNode.java +++ b/src/main/java/ast/statement/StatementNode.java @@ -1,6 +1,7 @@ package ast.statement; import ast.ASTNode; +import bytecode.visitor.MethodVisitor; import visitor.Visitable; public abstract class StatementNode implements ASTNode, Visitable { diff --git a/src/main/java/ast/statement/VariableDeclarationStatementNode.java b/src/main/java/ast/statement/VariableDeclarationStatementNode.java index 4302177..0f0dc1e 100644 --- a/src/main/java/ast/statement/VariableDeclarationStatementNode.java +++ b/src/main/java/ast/statement/VariableDeclarationStatementNode.java @@ -2,10 +2,12 @@ package ast.statement; import ast.expression.ExpressionNode; import ast.type.TypeNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; +import visitor.Visitable; -public class VariableDeclarationStatementNode extends StatementNode { +public class VariableDeclarationStatementNode extends StatementNode implements Visitable { public TypeNode type; public String identifier; public ExpressionNode expression; @@ -19,4 +21,9 @@ public class VariableDeclarationStatementNode extends StatementNode { public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } \ No newline at end of file diff --git a/src/main/java/ast/statement/WhileStatementNode.java b/src/main/java/ast/statement/WhileStatementNode.java index a3f4007..ec2cc3d 100644 --- a/src/main/java/ast/statement/WhileStatementNode.java +++ b/src/main/java/ast/statement/WhileStatementNode.java @@ -1,10 +1,12 @@ package ast.statement; import ast.expression.ExpressionNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; +import visitor.Visitable; -public class WhileStatementNode extends StatementNode { +public class WhileStatementNode extends StatementNode implements Visitable { public ExpressionNode condition; public StatementNode body; @@ -17,4 +19,9 @@ public class WhileStatementNode extends StatementNode { public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } diff --git a/src/main/java/bytecode/ByteCodeGenerator.java b/src/main/java/bytecode/ByteCodeGenerator.java index 5494255..bef6e79 100644 --- a/src/main/java/bytecode/ByteCodeGenerator.java +++ b/src/main/java/bytecode/ByteCodeGenerator.java @@ -8,9 +8,13 @@ public class ByteCodeGenerator implements ProgramVisitor { @Override public void visit(ProgramNode programNode) { + //ASMCodeGenerator asmCodeGenerator = new ASMCodeGenerator(); + //asmCodeGenerator.test(); + for (ClassNode classDeclarationNode : programNode.classes) { ClassCodeGen classCodeGen = new ClassCodeGen(); classDeclarationNode.accept(classCodeGen); } + } } diff --git a/src/main/java/bytecode/ClassCodeGen.java b/src/main/java/bytecode/ClassCodeGen.java index b0afa69..6bddd61 100644 --- a/src/main/java/bytecode/ClassCodeGen.java +++ b/src/main/java/bytecode/ClassCodeGen.java @@ -52,7 +52,7 @@ public class ClassCodeGen implements ClassVisitor { } private void printIntoClassFile(byte[] byteCode, String name) { - String directoryPath = "src/main/java/classFileOutput"; + String directoryPath = "src/main/resources/classFileOutput"; File directory = new File(directoryPath); if (!directory.exists()) { directory.mkdirs(); diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index a4249f1..51b093a 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -1,15 +1,18 @@ package bytecode; +import ast.LiteralNode; +import ast.expression.BinaryExpressionNode; +import ast.expression.IdentifierExpressionNode; +import ast.expression.UnaryExpressionNode; import ast.member.ConstructorNode; import ast.member.MethodNode; -import ast.parameter.ParameterListNode; import ast.parameter.ParameterNode; +import ast.statement.*; import ast.type.BaseTypeNode; -import ast.type.EnumTypeNode; +import ast.type.ReferenceTypeNode; +import ast.type.TypeNode; import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; import java.util.ArrayList; import java.util.List; @@ -50,7 +53,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(MethodNode methodNode) { if (methodNode.type instanceof BaseTypeNode baseTypeNode) { - methodVisitor = classWriter.visitMethod(mapper.mapAccessTypeToOpcode(methodNode.visibility), + methodVisitor = classWriter.visitMethod(mapper.mapAccessTypeToOpcode(methodNode.visibility) | ACC_STATIC, methodNode.identifier, mapper.generateMethodDescriptor(baseTypeNode, methodNode.parameters), null, @@ -58,43 +61,90 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { methodVisitor.visitCode(); localVaribales.add("this"); + // Add all method parameters to localVariables for (ParameterNode parameterNode : methodNode.parameters.parameters) { localVaribales.add(parameterNode.identifier); } - //test(); + // Visit all statements + for(StatementNode statementNode : methodNode.statements) { + statementNode.accept(this); + } + methodVisitor.visitMaxs(1, localVaribales.size()); methodVisitor.visitEnd(); } } - public void test() { - Label start = new Label(); - Label loop = new Label(); - Label end = new Label(); - methodVisitor.visitLabel(start); - //methodVisitor.visitVarInsn(Opcodes.ICONST_M1, 99); - //methodVisitor.visitInsn(Opcodes.ICONST_5); - methodVisitor.visitLdcInsn(99); - // methodVisitor.visitInsn(Opcodes.ICONST_0); - //methodVisitor.visitVarInsn(Opcodes.ILOAD, 2); - methodVisitor.visitVarInsn(Opcodes.ISTORE, 1); - methodVisitor.visitLabel(loop); - methodVisitor.visitVarInsn(Opcodes.ILOAD, 1); - methodVisitor.visitInsn(Opcodes.ICONST_5); - methodVisitor.visitJumpInsn(Opcodes.IF_ICMPGE, end); - methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, - "java/lang/System", "out", - "Ljava/io/PrintStream;"); - methodVisitor.visitLdcInsn("Bytecode"); - methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - "java/io/PrintStream", "println", - "(Ljava/lang/String;)V", false); - methodVisitor.visitIincInsn(1, 1); - methodVisitor.visitJumpInsn(Opcodes.GOTO, loop); - methodVisitor.visitLabel(end); - methodVisitor.visitVarInsn(Opcodes.ILOAD, 1); - methodVisitor.visitInsn(Opcodes.IRETURN); - methodVisitor.visitEnd(); + @Override + public void visit(AssignmentStatementNode assignmentStatementNode) { + BinaryExpressionNode expressionNode = assignmentStatementNode.expression; + + if(expressionNode.left instanceof IdentifierExpressionNode) { // Local var + expressionNode.right.accept(this); + localVarAssignment((IdentifierExpressionNode) expressionNode.left); + } else if(expressionNode.left instanceof BinaryExpressionNode) { // Global var + expressionNode.right.accept(this); + globalVarAssignment((BinaryExpressionNode) expressionNode.left); + } + + assignmentStatementNode.expression.accept(this); + methodVisitor.visitVarInsn(ISTORE, 1); + } + + private void localVarAssignment(IdentifierExpressionNode expressionNode) { + methodVisitor.visitVarInsn(ILOAD, localVaribales.indexOf(expressionNode.name)); + } + + private void globalVarAssignment(BinaryExpressionNode expressionNode) { + IdentifierExpressionNode identifierExpressionNode = (IdentifierExpressionNode) expressionNode.left; + IdentifierExpressionNode identifierExpressionNode1 = (IdentifierExpressionNode) expressionNode.right; + TypeNode type = identifierExpressionNode1.type; + if(type instanceof BaseTypeNode) { + methodVisitor.visitFieldInsn(PUTFIELD, identifierExpressionNode.name, identifierExpressionNode1.name, mapper.getTypeChar(((BaseTypeNode) type).enumType)); + } else if (type instanceof ReferenceTypeNode) { + + } + } + + @Override + public void visit(IfStatementNode ifStatementNode) { + + } + + @Override + public void visit(ReturnStatementNode returnStatementNode) { + returnStatementNode.expression.accept(this); + methodVisitor.visitInsn(IRETURN); + } + + @Override + public void visit(VariableDeclarationStatementNode variableDeclarationStatementNode) { + + } + + @Override + public void visit(WhileStatementNode whileStatementNode) { + + } + + @Override + public void visit(BinaryExpressionNode binaryExpressionNode) { + + } + + @Override + public void visit(IdentifierExpressionNode identifierExpressionNode) { + methodVisitor.visitVarInsn(ILOAD, localVaribales.indexOf(identifierExpressionNode.name)); + } + + @Override + public void visit(UnaryExpressionNode unaryExpressionNode) { + + } + + @Override + public void visit(LiteralNode literalNode) { + methodVisitor.visitVarInsn(BIPUSH, literalNode.value); } } diff --git a/src/main/java/bytecode/visitor/MethodVisitor.java b/src/main/java/bytecode/visitor/MethodVisitor.java index 70177ce..3185441 100644 --- a/src/main/java/bytecode/visitor/MethodVisitor.java +++ b/src/main/java/bytecode/visitor/MethodVisitor.java @@ -1,9 +1,23 @@ package bytecode.visitor; +import ast.LiteralNode; +import ast.expression.BinaryExpressionNode; +import ast.expression.IdentifierExpressionNode; +import ast.expression.UnaryExpressionNode; import ast.member.ConstructorNode; import ast.member.MethodNode; +import ast.statement.*; public interface MethodVisitor { void visit(ConstructorNode constructorNode); void visit(MethodNode methodNode); + void visit(AssignmentStatementNode assignmentStatementNode); + void visit(IfStatementNode ifStatementNode); + void visit(ReturnStatementNode returnStatementNode); + void visit(VariableDeclarationStatementNode variableDeclarationStatementNode); + void visit(WhileStatementNode whileStatementNode); + void visit(BinaryExpressionNode binaryExpressionNode); + void visit(IdentifierExpressionNode identifierExpressionNode); + void visit(UnaryExpressionNode unaryExpressionNode); + void visit(LiteralNode literalNode); } diff --git a/src/main/java/parser/ASTBuilder.java b/src/main/java/parser/ASTBuilder.java index 0f3b09c..7147abe 100644 --- a/src/main/java/parser/ASTBuilder.java +++ b/src/main/java/parser/ASTBuilder.java @@ -198,7 +198,7 @@ public class ASTBuilder extends SimpleJavaBaseVisitor { return visit(ctx.literal()); } else if (ctx.IDENTIFIER() != null) { - return new IdentifierExpressionNode(ctx.IDENTIFIER().getText()); + return new IdentifierExpressionNode(ctx.IDENTIFIER().getText(), null); } return null; // Return null or throw an exception if no valid expression found diff --git a/src/test/java/semantic/SemanticTest.java b/src/test/java/semantic/SemanticTest.java index 83287ca..a7b3f5a 100644 --- a/src/test/java/semantic/SemanticTest.java +++ b/src/test/java/semantic/SemanticTest.java @@ -17,6 +17,7 @@ import ast.type.AccessTypeNode; import ast.type.BaseTypeNode; import ast.type.EnumAccessTypeNode; import ast.type.EnumTypeNode; +import bytecode.ByteCodeGenerator; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import semantic.exeptions.AlreadyDeclearedException; @@ -79,8 +80,8 @@ public class SemanticTest { List statementNodeList = new ArrayList(); - ExpressionNode expressionNodeObjectVariableLeft = new IdentifierExpressionNode("this"); - ExpressionNode expressionNodeObjectVariableRight = new IdentifierExpressionNode("objectVar"); + ExpressionNode expressionNodeObjectVariableLeft = new IdentifierExpressionNode("Example", null); + ExpressionNode expressionNodeObjectVariableRight = new IdentifierExpressionNode("objectVar", new BaseTypeNode(EnumTypeNode.INT)); ExpressionNode expressionNodeLeft = new BinaryExpressionNode(expressionNodeObjectVariableLeft, expressionNodeObjectVariableRight, ExpresssionOperator.DOT); @@ -94,6 +95,8 @@ public class SemanticTest { MemberNode memberNode3 = new MethodNode(accessTypeNode, new BaseTypeNode(EnumTypeNode.INT), "testVar2",parameterListNode, statementNodeList ); classNode.members.add(memberNode3); + + classList.add(classNode); programNode.classes = classList; @@ -102,6 +105,9 @@ public class SemanticTest { assertEquals(0, SemanticAnalyzer.errors.size()); assertEquals(programNode, typedAst); + ByteCodeGenerator byteCodeGenerator = new ByteCodeGenerator(); + byteCodeGenerator.visit((ProgramNode) typedAst); + } } From de5c2a50026cb6d6c0b49755aa0bdba2a4767d7a Mon Sep 17 00:00:00 2001 From: Maximilian Stahl Date: Fri, 31 May 2024 11:16:25 +0200 Subject: [PATCH 02/16] Added Parser Visitors --- .idea/misc.xml | 4 +- src/main/java/ast/LiteralNode.java | 29 - .../java/ast/literal/BooleanLiteralNode.java | 11 + .../java/ast/literal/CharLiteralNode.java | 11 + src/main/java/ast/literal/LiteralNode.java | 30 + .../statement/AssignmentStatementNode.java | 11 +- .../ast/statement/BlockStatementNode.java | 9 + src/main/java/parser/ASTBuilder.java | 85 ++- src/main/java/parser/SimpleJava.g4 | 4 +- .../java/parser/generated/SimpleJava.interp | 3 +- .../generated/SimpleJavaBaseListener.java | 14 +- .../generated/SimpleJavaBaseVisitor.java | 9 +- .../parser/generated/SimpleJavaLexer.java | 2 +- .../parser/generated/SimpleJavaListener.java | 12 +- .../parser/generated/SimpleJavaParser.java | 567 ++++++++---------- .../parser/generated/SimpleJavaVisitor.java | 8 +- 16 files changed, 401 insertions(+), 408 deletions(-) delete mode 100644 src/main/java/ast/LiteralNode.java create mode 100644 src/main/java/ast/literal/BooleanLiteralNode.java create mode 100644 src/main/java/ast/literal/CharLiteralNode.java create mode 100644 src/main/java/ast/literal/LiteralNode.java create mode 100644 src/main/java/ast/statement/BlockStatementNode.java diff --git a/.idea/misc.xml b/.idea/misc.xml index bb14756..4e21abf 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -6,7 +6,7 @@ - + \ No newline at end of file diff --git a/src/main/java/ast/LiteralNode.java b/src/main/java/ast/LiteralNode.java deleted file mode 100644 index 3873465..0000000 --- a/src/main/java/ast/LiteralNode.java +++ /dev/null @@ -1,29 +0,0 @@ -package ast; - -import ast.expression.ExpressionNode; -import semantic.SemanticVisitor; -import typechecker.TypeCheckResult; - -public class LiteralNode implements ExpressionNode { - - int value; - private String type; - - public LiteralNode(int value) { - this.value = value; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - - @Override - public TypeCheckResult accept(SemanticVisitor visitor) { - return null; - } -} diff --git a/src/main/java/ast/literal/BooleanLiteralNode.java b/src/main/java/ast/literal/BooleanLiteralNode.java new file mode 100644 index 0000000..4657df7 --- /dev/null +++ b/src/main/java/ast/literal/BooleanLiteralNode.java @@ -0,0 +1,11 @@ +package ast.literal; + +public class BooleanLiteralNode { + private String value; + + public BooleanLiteralNode(String value) {this.value = value;} + + public String getValue() { + return value; + } +} diff --git a/src/main/java/ast/literal/CharLiteralNode.java b/src/main/java/ast/literal/CharLiteralNode.java new file mode 100644 index 0000000..c77c073 --- /dev/null +++ b/src/main/java/ast/literal/CharLiteralNode.java @@ -0,0 +1,11 @@ +package ast.literal; + +public class CharLiteralNode { + public String value; + + public CharLiteralNode(String value) {this.value = value;} + + public String getValue() { + return value; + } +} diff --git a/src/main/java/ast/literal/LiteralNode.java b/src/main/java/ast/literal/LiteralNode.java new file mode 100644 index 0000000..66dbc74 --- /dev/null +++ b/src/main/java/ast/literal/LiteralNode.java @@ -0,0 +1,30 @@ +package ast.literal; + +import ast.expression.ExpressionNode; +import semantic.SemanticVisitor; +import typechecker.TypeCheckResult; + +public class LiteralNode implements ExpressionNode { + + public String value; + private String type; + + public LiteralNode(String value, String type) { + this.value = value; + this.type = type; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + + @Override + public TypeCheckResult accept(SemanticVisitor visitor) { + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ast/statement/AssignmentStatementNode.java b/src/main/java/ast/statement/AssignmentStatementNode.java index f9fd38e..68140f7 100644 --- a/src/main/java/ast/statement/AssignmentStatementNode.java +++ b/src/main/java/ast/statement/AssignmentStatementNode.java @@ -1,14 +1,19 @@ package ast.statement; import ast.expression.BinaryExpressionNode; +import ast.expression.ExpressionNode; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; import visitor.Visitable; -public class AssignmentStatementNode extends StatementNode implements Visitable { - public BinaryExpressionNode expression; +import java.beans.Expression; - public AssignmentStatementNode(BinaryExpressionNode expression) { +public class AssignmentStatementNode extends StatementNode implements Visitable { + public String identifier; + public ExpressionNode expression; + + public AssignmentStatementNode(String identifier, ExpressionNode expression) { + this.identifier = identifier; this.expression = expression; } diff --git a/src/main/java/ast/statement/BlockStatementNode.java b/src/main/java/ast/statement/BlockStatementNode.java new file mode 100644 index 0000000..71516a8 --- /dev/null +++ b/src/main/java/ast/statement/BlockStatementNode.java @@ -0,0 +1,9 @@ +package ast.statement; + +import java.util.List; + +public class BlockStatementNode { + List statements; + + public BlockStatementNode(List statements) {this.statements = statements;} +} diff --git a/src/main/java/parser/ASTBuilder.java b/src/main/java/parser/ASTBuilder.java index 0f3b09c..446b7eb 100644 --- a/src/main/java/parser/ASTBuilder.java +++ b/src/main/java/parser/ASTBuilder.java @@ -6,6 +6,9 @@ import ast.expression.ExpressionNode; import ast.expression.ExpresssionOperator; import ast.expression.IdentifierExpressionNode; import ast.expression.UnaryExpressionNode; +import ast.literal.BooleanLiteralNode; +import ast.literal.CharLiteralNode; +import ast.literal.LiteralNode; import ast.member.FieldNode; import ast.member.MemberNode; import ast.member.MethodNode; @@ -42,6 +45,17 @@ public class ASTBuilder extends SimpleJavaBaseVisitor { return classNode; } + public ASTNode visitMemberDeclaration(SimpleJavaParser.MemberDeclarationContext ctx) { + if(ctx.fieldDeclaration() != null) { + return visitFieldDeclaration(ctx.fieldDeclaration()); + } else if(ctx.methodDeclaration() != null) { + return visitMethodDeclaration(ctx.methodDeclaration()); + } else if(ctx.constructorDeclaration() != null) { + return visitConstructorDeclaration(ctx.constructorDeclaration()); + } + return null; + } + @Override public ASTNode visitFieldDeclaration(SimpleJavaParser.FieldDeclarationContext ctx) { AccessTypeNode accessType = (AccessTypeNode) visit(ctx.accessType()); @@ -116,12 +130,19 @@ public class ASTBuilder extends SimpleJavaBaseVisitor { @Override public ASTNode visitStatement(SimpleJavaParser.StatementContext ctx) { - if (ctx.variableDeclarationStatement() != null) { + if(ctx.variableDeclarationStatement() != null) { return visitVariableDeclarationStatement(ctx.variableDeclarationStatement()); - } else if (ctx.assignmentStatement() != null) { + } else if(ctx.assignmentStatement() != null) { return visitAssignmentStatement(ctx.assignmentStatement()); + } else if(ctx.ifStatement() != null) { + return visitIfStatement(ctx.ifStatement()); + } else if(ctx.whileStatement() != null) { + return visitWhileStatement(ctx.whileStatement()); + } else if(ctx.returnStatement() != null) { + return visitReturnStatement(ctx.returnStatement()); + } else if(ctx.block() != null) { + return visitBlock(ctx.block()); } - return null; } @@ -130,7 +151,7 @@ public class ASTBuilder extends SimpleJavaBaseVisitor { TypeNode type = (TypeNode) visit(ctx.type()); String identifier = ctx.IDENTIFIER().getText(); ExpressionNode expression = null; - if (ctx.expression() != null) { + if(ctx.expression() != null) { expression = (ExpressionNode) visit(ctx.expression()); } return new VariableDeclarationStatementNode(type, identifier, expression); @@ -138,14 +159,8 @@ public class ASTBuilder extends SimpleJavaBaseVisitor { @Override public ASTNode visitAssignmentStatement(SimpleJavaParser.AssignmentStatementContext ctx) { - - BinaryExpressionNode expression = (BinaryExpressionNode) visit(ctx.expression()); - return new AssignmentStatementNode(expression); - } - - @Override - public ASTNode visitVar(SimpleJavaParser.VarContext ctx) { - return null; + ExpressionNode expression = (ExpressionNode) visit(ctx.expression()); + return new AssignmentStatementNode(ctx.IDENTIFIER().getText(), expression); } @Override @@ -175,6 +190,15 @@ public class ASTBuilder extends SimpleJavaBaseVisitor { return new ReturnStatementNode(expression); } + @Override + public ASTNode visitBlock(SimpleJavaParser.BlockContext ctx) { + List statements = new ArrayList<>(); + for(SimpleJavaParser.StatementContext stmtCtx : ctx.statement()) { + statements.add((StatementNode) visit(stmtCtx)); + } + return (ASTNode) new BlockStatementNode(statements); + } + @Override public ASTNode visitExpression(SimpleJavaParser.ExpressionContext ctx) { // Handle binary operations @@ -206,16 +230,33 @@ public class ASTBuilder extends SimpleJavaBaseVisitor { @Override public ASTNode visitLiteral(SimpleJavaParser.LiteralContext ctx) { - LiteralContext literalContext = (LiteralContext) ctx; - try { - int intValue = Integer.parseInt(literalContext.getText()); - LiteralNode literalNode = new LiteralNode(intValue); - - literalNode.setType("int"); - return literalNode; - } catch (NumberFormatException ignored) {} - - return null; // Return null or throw an exception if no valid expression found + String type; + String value; + if(ctx.INTEGERLITERAL() != null) { + type = "int"; + value = ctx.INTEGERLITERAL().getText(); + return new LiteralNode(type, value); + } else if(ctx.booleanLiteral() != null) { + type= "boolean"; + BooleanLiteralNode booleanNode = (BooleanLiteralNode) visitBooleanLiteral(ctx.booleanLiteral()); + value = booleanNode.getValue(); + return new LiteralNode(type, value); + } else if(ctx.charLiteral() != null) { + type= "char"; + CharLiteralNode charNode = (CharLiteralNode) visitCharLiteral(ctx.charLiteral()); + value = charNode.getValue(); + return new LiteralNode(type, value); + } + return null; } + @Override + public ASTNode visitBooleanLiteral(SimpleJavaParser.BooleanLiteralContext ctx) { + return super.visitBooleanLiteral(ctx); + } + + @Override + public ASTNode visitCharLiteral(SimpleJavaParser.CharLiteralContext ctx) { + return super.visitCharLiteral(ctx); + } } diff --git a/src/main/java/parser/SimpleJava.g4 b/src/main/java/parser/SimpleJava.g4 index 7d09aba..3de3979 100644 --- a/src/main/java/parser/SimpleJava.g4 +++ b/src/main/java/parser/SimpleJava.g4 @@ -29,9 +29,7 @@ statement variableDeclarationStatement : type IDENTIFIER ('=' expression)? ';' ; -assignmentStatement : var '=' expression ';' ; - -var: IDENTIFIER; +assignmentStatement : IDENTIFIER '=' expression ';' ; ifStatement : 'if' '(' expression ')' statement ('else' statement)? ; diff --git a/src/main/java/parser/generated/SimpleJava.interp b/src/main/java/parser/generated/SimpleJava.interp index c3cff60..00547cb 100644 --- a/src/main/java/parser/generated/SimpleJava.interp +++ b/src/main/java/parser/generated/SimpleJava.interp @@ -94,7 +94,6 @@ accessType statement variableDeclarationStatement assignmentStatement -var ifStatement whileStatement returnStatement @@ -106,4 +105,4 @@ charLiteral atn: -[4, 1, 38, 212, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 1, 0, 4, 0, 46, 8, 0, 11, 0, 12, 0, 47, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 55, 8, 1, 10, 1, 12, 1, 58, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 3, 2, 65, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 78, 8, 4, 1, 4, 1, 4, 1, 4, 5, 4, 83, 8, 4, 10, 4, 12, 4, 86, 9, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 94, 8, 5, 1, 5, 1, 5, 1, 5, 5, 5, 99, 8, 5, 10, 5, 12, 5, 102, 9, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 5, 6, 109, 8, 6, 10, 6, 12, 6, 112, 9, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 127, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 133, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 151, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 161, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 5, 17, 167, 8, 17, 10, 17, 12, 17, 170, 9, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 185, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 196, 8, 18, 10, 18, 12, 18, 199, 9, 18, 1, 19, 1, 19, 1, 19, 3, 19, 204, 8, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 0, 1, 36, 22, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 0, 6, 1, 0, 9, 11, 1, 0, 12, 13, 1, 0, 19, 20, 1, 0, 21, 26, 1, 0, 27, 31, 1, 0, 33, 34, 216, 0, 45, 1, 0, 0, 0, 2, 49, 1, 0, 0, 0, 4, 64, 1, 0, 0, 0, 6, 66, 1, 0, 0, 0, 8, 71, 1, 0, 0, 0, 10, 89, 1, 0, 0, 0, 12, 105, 1, 0, 0, 0, 14, 113, 1, 0, 0, 0, 16, 116, 1, 0, 0, 0, 18, 118, 1, 0, 0, 0, 20, 126, 1, 0, 0, 0, 22, 128, 1, 0, 0, 0, 24, 136, 1, 0, 0, 0, 26, 141, 1, 0, 0, 0, 28, 143, 1, 0, 0, 0, 30, 152, 1, 0, 0, 0, 32, 158, 1, 0, 0, 0, 34, 164, 1, 0, 0, 0, 36, 184, 1, 0, 0, 0, 38, 203, 1, 0, 0, 0, 40, 205, 1, 0, 0, 0, 42, 207, 1, 0, 0, 0, 44, 46, 3, 2, 1, 0, 45, 44, 1, 0, 0, 0, 46, 47, 1, 0, 0, 0, 47, 45, 1, 0, 0, 0, 47, 48, 1, 0, 0, 0, 48, 1, 1, 0, 0, 0, 49, 50, 3, 18, 9, 0, 50, 51, 5, 1, 0, 0, 51, 52, 5, 37, 0, 0, 52, 56, 5, 2, 0, 0, 53, 55, 3, 4, 2, 0, 54, 53, 1, 0, 0, 0, 55, 58, 1, 0, 0, 0, 56, 54, 1, 0, 0, 0, 56, 57, 1, 0, 0, 0, 57, 59, 1, 0, 0, 0, 58, 56, 1, 0, 0, 0, 59, 60, 5, 3, 0, 0, 60, 3, 1, 0, 0, 0, 61, 65, 3, 6, 3, 0, 62, 65, 3, 8, 4, 0, 63, 65, 3, 10, 5, 0, 64, 61, 1, 0, 0, 0, 64, 62, 1, 0, 0, 0, 64, 63, 1, 0, 0, 0, 65, 5, 1, 0, 0, 0, 66, 67, 3, 18, 9, 0, 67, 68, 3, 16, 8, 0, 68, 69, 5, 37, 0, 0, 69, 70, 5, 4, 0, 0, 70, 7, 1, 0, 0, 0, 71, 72, 3, 18, 9, 0, 72, 73, 5, 5, 0, 0, 73, 74, 3, 16, 8, 0, 74, 75, 5, 37, 0, 0, 75, 77, 5, 6, 0, 0, 76, 78, 3, 12, 6, 0, 77, 76, 1, 0, 0, 0, 77, 78, 1, 0, 0, 0, 78, 79, 1, 0, 0, 0, 79, 80, 5, 7, 0, 0, 80, 84, 5, 2, 0, 0, 81, 83, 3, 20, 10, 0, 82, 81, 1, 0, 0, 0, 83, 86, 1, 0, 0, 0, 84, 82, 1, 0, 0, 0, 84, 85, 1, 0, 0, 0, 85, 87, 1, 0, 0, 0, 86, 84, 1, 0, 0, 0, 87, 88, 5, 3, 0, 0, 88, 9, 1, 0, 0, 0, 89, 90, 3, 18, 9, 0, 90, 91, 5, 37, 0, 0, 91, 93, 5, 6, 0, 0, 92, 94, 3, 12, 6, 0, 93, 92, 1, 0, 0, 0, 93, 94, 1, 0, 0, 0, 94, 95, 1, 0, 0, 0, 95, 96, 5, 7, 0, 0, 96, 100, 5, 2, 0, 0, 97, 99, 3, 20, 10, 0, 98, 97, 1, 0, 0, 0, 99, 102, 1, 0, 0, 0, 100, 98, 1, 0, 0, 0, 100, 101, 1, 0, 0, 0, 101, 103, 1, 0, 0, 0, 102, 100, 1, 0, 0, 0, 103, 104, 5, 3, 0, 0, 104, 11, 1, 0, 0, 0, 105, 110, 3, 14, 7, 0, 106, 107, 5, 8, 0, 0, 107, 109, 3, 14, 7, 0, 108, 106, 1, 0, 0, 0, 109, 112, 1, 0, 0, 0, 110, 108, 1, 0, 0, 0, 110, 111, 1, 0, 0, 0, 111, 13, 1, 0, 0, 0, 112, 110, 1, 0, 0, 0, 113, 114, 3, 16, 8, 0, 114, 115, 5, 37, 0, 0, 115, 15, 1, 0, 0, 0, 116, 117, 7, 0, 0, 0, 117, 17, 1, 0, 0, 0, 118, 119, 7, 1, 0, 0, 119, 19, 1, 0, 0, 0, 120, 127, 3, 22, 11, 0, 121, 127, 3, 24, 12, 0, 122, 127, 3, 28, 14, 0, 123, 127, 3, 30, 15, 0, 124, 127, 3, 32, 16, 0, 125, 127, 3, 34, 17, 0, 126, 120, 1, 0, 0, 0, 126, 121, 1, 0, 0, 0, 126, 122, 1, 0, 0, 0, 126, 123, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 126, 125, 1, 0, 0, 0, 127, 21, 1, 0, 0, 0, 128, 129, 3, 16, 8, 0, 129, 132, 5, 37, 0, 0, 130, 131, 5, 14, 0, 0, 131, 133, 3, 36, 18, 0, 132, 130, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 134, 1, 0, 0, 0, 134, 135, 5, 4, 0, 0, 135, 23, 1, 0, 0, 0, 136, 137, 3, 26, 13, 0, 137, 138, 5, 14, 0, 0, 138, 139, 3, 36, 18, 0, 139, 140, 5, 4, 0, 0, 140, 25, 1, 0, 0, 0, 141, 142, 5, 37, 0, 0, 142, 27, 1, 0, 0, 0, 143, 144, 5, 15, 0, 0, 144, 145, 5, 6, 0, 0, 145, 146, 3, 36, 18, 0, 146, 147, 5, 7, 0, 0, 147, 150, 3, 20, 10, 0, 148, 149, 5, 16, 0, 0, 149, 151, 3, 20, 10, 0, 150, 148, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 29, 1, 0, 0, 0, 152, 153, 5, 17, 0, 0, 153, 154, 5, 6, 0, 0, 154, 155, 3, 36, 18, 0, 155, 156, 5, 7, 0, 0, 156, 157, 3, 20, 10, 0, 157, 31, 1, 0, 0, 0, 158, 160, 5, 18, 0, 0, 159, 161, 3, 36, 18, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 5, 4, 0, 0, 163, 33, 1, 0, 0, 0, 164, 168, 5, 2, 0, 0, 165, 167, 3, 20, 10, 0, 166, 165, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 171, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 172, 5, 3, 0, 0, 172, 35, 1, 0, 0, 0, 173, 174, 6, 18, -1, 0, 174, 175, 5, 28, 0, 0, 175, 185, 3, 36, 18, 5, 176, 177, 5, 32, 0, 0, 177, 185, 3, 36, 18, 4, 178, 179, 5, 6, 0, 0, 179, 180, 3, 36, 18, 0, 180, 181, 5, 7, 0, 0, 181, 185, 1, 0, 0, 0, 182, 185, 3, 38, 19, 0, 183, 185, 5, 37, 0, 0, 184, 173, 1, 0, 0, 0, 184, 176, 1, 0, 0, 0, 184, 178, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 197, 1, 0, 0, 0, 186, 187, 10, 8, 0, 0, 187, 188, 7, 2, 0, 0, 188, 196, 3, 36, 18, 9, 189, 190, 10, 7, 0, 0, 190, 191, 7, 3, 0, 0, 191, 196, 3, 36, 18, 8, 192, 193, 10, 6, 0, 0, 193, 194, 7, 4, 0, 0, 194, 196, 3, 36, 18, 7, 195, 186, 1, 0, 0, 0, 195, 189, 1, 0, 0, 0, 195, 192, 1, 0, 0, 0, 196, 199, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 37, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 200, 204, 5, 36, 0, 0, 201, 204, 3, 40, 20, 0, 202, 204, 3, 42, 21, 0, 203, 200, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 202, 1, 0, 0, 0, 204, 39, 1, 0, 0, 0, 205, 206, 7, 5, 0, 0, 206, 41, 1, 0, 0, 0, 207, 208, 5, 35, 0, 0, 208, 209, 9, 0, 0, 0, 209, 210, 5, 35, 0, 0, 210, 43, 1, 0, 0, 0, 17, 47, 56, 64, 77, 84, 93, 100, 110, 126, 132, 150, 160, 168, 184, 195, 197, 203] \ No newline at end of file +[4, 1, 38, 208, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 1, 0, 4, 0, 44, 8, 0, 11, 0, 12, 0, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 53, 8, 1, 10, 1, 12, 1, 56, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 3, 2, 63, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 76, 8, 4, 1, 4, 1, 4, 1, 4, 5, 4, 81, 8, 4, 10, 4, 12, 4, 84, 9, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 92, 8, 5, 1, 5, 1, 5, 1, 5, 5, 5, 97, 8, 5, 10, 5, 12, 5, 100, 9, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 5, 6, 107, 8, 6, 10, 6, 12, 6, 110, 9, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 125, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 131, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 147, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 3, 15, 157, 8, 15, 1, 15, 1, 15, 1, 16, 1, 16, 5, 16, 163, 8, 16, 10, 16, 12, 16, 166, 9, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 181, 8, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 192, 8, 17, 10, 17, 12, 17, 195, 9, 17, 1, 18, 1, 18, 1, 18, 3, 18, 200, 8, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 0, 1, 34, 21, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 0, 6, 1, 0, 9, 11, 1, 0, 12, 13, 1, 0, 19, 20, 1, 0, 21, 26, 1, 0, 27, 31, 1, 0, 33, 34, 213, 0, 43, 1, 0, 0, 0, 2, 47, 1, 0, 0, 0, 4, 62, 1, 0, 0, 0, 6, 64, 1, 0, 0, 0, 8, 69, 1, 0, 0, 0, 10, 87, 1, 0, 0, 0, 12, 103, 1, 0, 0, 0, 14, 111, 1, 0, 0, 0, 16, 114, 1, 0, 0, 0, 18, 116, 1, 0, 0, 0, 20, 124, 1, 0, 0, 0, 22, 126, 1, 0, 0, 0, 24, 134, 1, 0, 0, 0, 26, 139, 1, 0, 0, 0, 28, 148, 1, 0, 0, 0, 30, 154, 1, 0, 0, 0, 32, 160, 1, 0, 0, 0, 34, 180, 1, 0, 0, 0, 36, 199, 1, 0, 0, 0, 38, 201, 1, 0, 0, 0, 40, 203, 1, 0, 0, 0, 42, 44, 3, 2, 1, 0, 43, 42, 1, 0, 0, 0, 44, 45, 1, 0, 0, 0, 45, 43, 1, 0, 0, 0, 45, 46, 1, 0, 0, 0, 46, 1, 1, 0, 0, 0, 47, 48, 3, 18, 9, 0, 48, 49, 5, 1, 0, 0, 49, 50, 5, 37, 0, 0, 50, 54, 5, 2, 0, 0, 51, 53, 3, 4, 2, 0, 52, 51, 1, 0, 0, 0, 53, 56, 1, 0, 0, 0, 54, 52, 1, 0, 0, 0, 54, 55, 1, 0, 0, 0, 55, 57, 1, 0, 0, 0, 56, 54, 1, 0, 0, 0, 57, 58, 5, 3, 0, 0, 58, 3, 1, 0, 0, 0, 59, 63, 3, 6, 3, 0, 60, 63, 3, 8, 4, 0, 61, 63, 3, 10, 5, 0, 62, 59, 1, 0, 0, 0, 62, 60, 1, 0, 0, 0, 62, 61, 1, 0, 0, 0, 63, 5, 1, 0, 0, 0, 64, 65, 3, 18, 9, 0, 65, 66, 3, 16, 8, 0, 66, 67, 5, 37, 0, 0, 67, 68, 5, 4, 0, 0, 68, 7, 1, 0, 0, 0, 69, 70, 3, 18, 9, 0, 70, 71, 5, 5, 0, 0, 71, 72, 3, 16, 8, 0, 72, 73, 5, 37, 0, 0, 73, 75, 5, 6, 0, 0, 74, 76, 3, 12, 6, 0, 75, 74, 1, 0, 0, 0, 75, 76, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 78, 5, 7, 0, 0, 78, 82, 5, 2, 0, 0, 79, 81, 3, 20, 10, 0, 80, 79, 1, 0, 0, 0, 81, 84, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 83, 1, 0, 0, 0, 83, 85, 1, 0, 0, 0, 84, 82, 1, 0, 0, 0, 85, 86, 5, 3, 0, 0, 86, 9, 1, 0, 0, 0, 87, 88, 3, 18, 9, 0, 88, 89, 5, 37, 0, 0, 89, 91, 5, 6, 0, 0, 90, 92, 3, 12, 6, 0, 91, 90, 1, 0, 0, 0, 91, 92, 1, 0, 0, 0, 92, 93, 1, 0, 0, 0, 93, 94, 5, 7, 0, 0, 94, 98, 5, 2, 0, 0, 95, 97, 3, 20, 10, 0, 96, 95, 1, 0, 0, 0, 97, 100, 1, 0, 0, 0, 98, 96, 1, 0, 0, 0, 98, 99, 1, 0, 0, 0, 99, 101, 1, 0, 0, 0, 100, 98, 1, 0, 0, 0, 101, 102, 5, 3, 0, 0, 102, 11, 1, 0, 0, 0, 103, 108, 3, 14, 7, 0, 104, 105, 5, 8, 0, 0, 105, 107, 3, 14, 7, 0, 106, 104, 1, 0, 0, 0, 107, 110, 1, 0, 0, 0, 108, 106, 1, 0, 0, 0, 108, 109, 1, 0, 0, 0, 109, 13, 1, 0, 0, 0, 110, 108, 1, 0, 0, 0, 111, 112, 3, 16, 8, 0, 112, 113, 5, 37, 0, 0, 113, 15, 1, 0, 0, 0, 114, 115, 7, 0, 0, 0, 115, 17, 1, 0, 0, 0, 116, 117, 7, 1, 0, 0, 117, 19, 1, 0, 0, 0, 118, 125, 3, 22, 11, 0, 119, 125, 3, 24, 12, 0, 120, 125, 3, 26, 13, 0, 121, 125, 3, 28, 14, 0, 122, 125, 3, 30, 15, 0, 123, 125, 3, 32, 16, 0, 124, 118, 1, 0, 0, 0, 124, 119, 1, 0, 0, 0, 124, 120, 1, 0, 0, 0, 124, 121, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 123, 1, 0, 0, 0, 125, 21, 1, 0, 0, 0, 126, 127, 3, 16, 8, 0, 127, 130, 5, 37, 0, 0, 128, 129, 5, 14, 0, 0, 129, 131, 3, 34, 17, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 133, 5, 4, 0, 0, 133, 23, 1, 0, 0, 0, 134, 135, 5, 37, 0, 0, 135, 136, 5, 14, 0, 0, 136, 137, 3, 34, 17, 0, 137, 138, 5, 4, 0, 0, 138, 25, 1, 0, 0, 0, 139, 140, 5, 15, 0, 0, 140, 141, 5, 6, 0, 0, 141, 142, 3, 34, 17, 0, 142, 143, 5, 7, 0, 0, 143, 146, 3, 20, 10, 0, 144, 145, 5, 16, 0, 0, 145, 147, 3, 20, 10, 0, 146, 144, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 27, 1, 0, 0, 0, 148, 149, 5, 17, 0, 0, 149, 150, 5, 6, 0, 0, 150, 151, 3, 34, 17, 0, 151, 152, 5, 7, 0, 0, 152, 153, 3, 20, 10, 0, 153, 29, 1, 0, 0, 0, 154, 156, 5, 18, 0, 0, 155, 157, 3, 34, 17, 0, 156, 155, 1, 0, 0, 0, 156, 157, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 159, 5, 4, 0, 0, 159, 31, 1, 0, 0, 0, 160, 164, 5, 2, 0, 0, 161, 163, 3, 20, 10, 0, 162, 161, 1, 0, 0, 0, 163, 166, 1, 0, 0, 0, 164, 162, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 167, 1, 0, 0, 0, 166, 164, 1, 0, 0, 0, 167, 168, 5, 3, 0, 0, 168, 33, 1, 0, 0, 0, 169, 170, 6, 17, -1, 0, 170, 171, 5, 28, 0, 0, 171, 181, 3, 34, 17, 5, 172, 173, 5, 32, 0, 0, 173, 181, 3, 34, 17, 4, 174, 175, 5, 6, 0, 0, 175, 176, 3, 34, 17, 0, 176, 177, 5, 7, 0, 0, 177, 181, 1, 0, 0, 0, 178, 181, 3, 36, 18, 0, 179, 181, 5, 37, 0, 0, 180, 169, 1, 0, 0, 0, 180, 172, 1, 0, 0, 0, 180, 174, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 179, 1, 0, 0, 0, 181, 193, 1, 0, 0, 0, 182, 183, 10, 8, 0, 0, 183, 184, 7, 2, 0, 0, 184, 192, 3, 34, 17, 9, 185, 186, 10, 7, 0, 0, 186, 187, 7, 3, 0, 0, 187, 192, 3, 34, 17, 8, 188, 189, 10, 6, 0, 0, 189, 190, 7, 4, 0, 0, 190, 192, 3, 34, 17, 7, 191, 182, 1, 0, 0, 0, 191, 185, 1, 0, 0, 0, 191, 188, 1, 0, 0, 0, 192, 195, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 35, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 196, 200, 5, 36, 0, 0, 197, 200, 3, 38, 19, 0, 198, 200, 3, 40, 20, 0, 199, 196, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 198, 1, 0, 0, 0, 200, 37, 1, 0, 0, 0, 201, 202, 7, 5, 0, 0, 202, 39, 1, 0, 0, 0, 203, 204, 5, 35, 0, 0, 204, 205, 9, 0, 0, 0, 205, 206, 5, 35, 0, 0, 206, 41, 1, 0, 0, 0, 17, 45, 54, 62, 75, 82, 91, 98, 108, 124, 130, 146, 156, 164, 180, 191, 193, 199] \ No newline at end of file diff --git a/src/main/java/parser/generated/SimpleJavaBaseListener.java b/src/main/java/parser/generated/SimpleJavaBaseListener.java index 342f385..8b113f3 100644 --- a/src/main/java/parser/generated/SimpleJavaBaseListener.java +++ b/src/main/java/parser/generated/SimpleJavaBaseListener.java @@ -1,4 +1,4 @@ -// Generated from C:/Users/Johannes/Documents/Github/JavaCompiler/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 +// Generated from C:/Users/ARB00075/Documents/DH/Compilerbau/NichtHaskell2.0/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 package parser.generated; import org.antlr.v4.runtime.ParserRuleContext; @@ -168,18 +168,6 @@ public class SimpleJavaBaseListener implements SimpleJavaListener { *

The default implementation does nothing.

*/ @Override public void exitAssignmentStatement(SimpleJavaParser.AssignmentStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterVar(SimpleJavaParser.VarContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitVar(SimpleJavaParser.VarContext ctx) { } /** * {@inheritDoc} * diff --git a/src/main/java/parser/generated/SimpleJavaBaseVisitor.java b/src/main/java/parser/generated/SimpleJavaBaseVisitor.java index 4feb7ea..2bef07a 100644 --- a/src/main/java/parser/generated/SimpleJavaBaseVisitor.java +++ b/src/main/java/parser/generated/SimpleJavaBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from C:/Users/Johannes/Documents/Github/JavaCompiler/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 +// Generated from C:/Users/ARB00075/Documents/DH/Compilerbau/NichtHaskell2.0/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 package parser.generated; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -103,13 +103,6 @@ public class SimpleJavaBaseVisitor extends AbstractParseTreeVisitor implem * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitAssignmentStatement(SimpleJavaParser.AssignmentStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitVar(SimpleJavaParser.VarContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/parser/generated/SimpleJavaLexer.java b/src/main/java/parser/generated/SimpleJavaLexer.java index 979b0a4..2f799ca 100644 --- a/src/main/java/parser/generated/SimpleJavaLexer.java +++ b/src/main/java/parser/generated/SimpleJavaLexer.java @@ -1,4 +1,4 @@ -// Generated from C:/Users/Johannes/Documents/Github/JavaCompiler/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 +// Generated from C:/Users/ARB00075/Documents/DH/Compilerbau/NichtHaskell2.0/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 package parser.generated; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; diff --git a/src/main/java/parser/generated/SimpleJavaListener.java b/src/main/java/parser/generated/SimpleJavaListener.java index 6debbf6..24f42d4 100644 --- a/src/main/java/parser/generated/SimpleJavaListener.java +++ b/src/main/java/parser/generated/SimpleJavaListener.java @@ -1,4 +1,4 @@ -// Generated from C:/Users/Johannes/Documents/Github/JavaCompiler/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 +// Generated from C:/Users/ARB00075/Documents/DH/Compilerbau/NichtHaskell2.0/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 package parser.generated; import org.antlr.v4.runtime.tree.ParseTreeListener; @@ -137,16 +137,6 @@ public interface SimpleJavaListener extends ParseTreeListener { * @param ctx the parse tree */ void exitAssignmentStatement(SimpleJavaParser.AssignmentStatementContext ctx); - /** - * Enter a parse tree produced by {@link SimpleJavaParser#var}. - * @param ctx the parse tree - */ - void enterVar(SimpleJavaParser.VarContext ctx); - /** - * Exit a parse tree produced by {@link SimpleJavaParser#var}. - * @param ctx the parse tree - */ - void exitVar(SimpleJavaParser.VarContext ctx); /** * Enter a parse tree produced by {@link SimpleJavaParser#ifStatement}. * @param ctx the parse tree diff --git a/src/main/java/parser/generated/SimpleJavaParser.java b/src/main/java/parser/generated/SimpleJavaParser.java index 5b14132..7251179 100644 --- a/src/main/java/parser/generated/SimpleJavaParser.java +++ b/src/main/java/parser/generated/SimpleJavaParser.java @@ -1,4 +1,4 @@ -// Generated from C:/Users/Johannes/Documents/Github/JavaCompiler/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 +// Generated from C:/Users/ARB00075/Documents/DH/Compilerbau/NichtHaskell2.0/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 package parser.generated; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -28,15 +28,15 @@ public class SimpleJavaParser extends Parser { RULE_fieldDeclaration = 3, RULE_methodDeclaration = 4, RULE_constructorDeclaration = 5, RULE_parameterList = 6, RULE_parameter = 7, RULE_type = 8, RULE_accessType = 9, RULE_statement = 10, RULE_variableDeclarationStatement = 11, RULE_assignmentStatement = 12, - RULE_var = 13, RULE_ifStatement = 14, RULE_whileStatement = 15, RULE_returnStatement = 16, - RULE_block = 17, RULE_expression = 18, RULE_literal = 19, RULE_booleanLiteral = 20, - RULE_charLiteral = 21; + RULE_ifStatement = 13, RULE_whileStatement = 14, RULE_returnStatement = 15, + RULE_block = 16, RULE_expression = 17, RULE_literal = 18, RULE_booleanLiteral = 19, + RULE_charLiteral = 20; private static String[] makeRuleNames() { return new String[] { "program", "classDeclaration", "memberDeclaration", "fieldDeclaration", "methodDeclaration", "constructorDeclaration", "parameterList", "parameter", "type", "accessType", "statement", "variableDeclarationStatement", "assignmentStatement", - "var", "ifStatement", "whileStatement", "returnStatement", "block", "expression", + "ifStatement", "whileStatement", "returnStatement", "block", "expression", "literal", "booleanLiteral", "charLiteral" }; } @@ -145,17 +145,17 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(45); + setState(43); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(44); + setState(42); classDeclaration(); } } - setState(47); + setState(45); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==T__11 || _la==T__12 ); @@ -210,29 +210,29 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(49); + setState(47); accessType(); - setState(50); + setState(48); match(T__0); - setState(51); + setState(49); match(IDENTIFIER); - setState(52); + setState(50); match(T__1); - setState(56); + setState(54); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__11 || _la==T__12) { { { - setState(53); + setState(51); memberDeclaration(); } } - setState(58); + setState(56); _errHandler.sync(this); _la = _input.LA(1); } - setState(59); + setState(57); match(T__2); } } @@ -281,27 +281,27 @@ public class SimpleJavaParser extends Parser { MemberDeclarationContext _localctx = new MemberDeclarationContext(_ctx, getState()); enterRule(_localctx, 4, RULE_memberDeclaration); try { - setState(64); + setState(62); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(61); + setState(59); fieldDeclaration(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(62); + setState(60); methodDeclaration(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(63); + setState(61); constructorDeclaration(); } break; @@ -352,13 +352,13 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(66); + setState(64); accessType(); - setState(67); + setState(65); type(); - setState(68); + setState(66); match(IDENTIFIER); - setState(69); + setState(67); match(T__3); } } @@ -417,45 +417,45 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(71); + setState(69); accessType(); - setState(72); + setState(70); match(T__4); - setState(73); + setState(71); type(); - setState(74); + setState(72); match(IDENTIFIER); - setState(75); + setState(73); match(T__5); - setState(77); + setState(75); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3584L) != 0)) { { - setState(76); + setState(74); parameterList(); } } - setState(79); + setState(77); match(T__6); - setState(80); + setState(78); match(T__1); - setState(84); + setState(82); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 137439383044L) != 0)) { { { - setState(81); + setState(79); statement(); } } - setState(86); + setState(84); _errHandler.sync(this); _la = _input.LA(1); } - setState(87); + setState(85); match(T__2); } } @@ -511,41 +511,41 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(89); + setState(87); accessType(); - setState(90); + setState(88); match(IDENTIFIER); - setState(91); + setState(89); match(T__5); - setState(93); + setState(91); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3584L) != 0)) { { - setState(92); + setState(90); parameterList(); } } - setState(95); + setState(93); match(T__6); - setState(96); + setState(94); match(T__1); - setState(100); + setState(98); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 137439383044L) != 0)) { { { - setState(97); + setState(95); statement(); } } - setState(102); + setState(100); _errHandler.sync(this); _la = _input.LA(1); } - setState(103); + setState(101); match(T__2); } } @@ -594,21 +594,21 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(105); + setState(103); parameter(); - setState(110); + setState(108); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__7) { { { - setState(106); + setState(104); match(T__7); - setState(107); + setState(105); parameter(); } } - setState(112); + setState(110); _errHandler.sync(this); _la = _input.LA(1); } @@ -656,9 +656,9 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(113); + setState(111); type(); - setState(114); + setState(112); match(IDENTIFIER); } } @@ -701,7 +701,7 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(116); + setState(114); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 3584L) != 0)) ) { _errHandler.recoverInline(this); @@ -752,7 +752,7 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(118); + setState(116); _la = _input.LA(1); if ( !(_la==T__11 || _la==T__12) ) { _errHandler.recoverInline(this); @@ -818,7 +818,7 @@ public class SimpleJavaParser extends Parser { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 20, RULE_statement); try { - setState(126); + setState(124); _errHandler.sync(this); switch (_input.LA(1)) { case T__8: @@ -826,42 +826,42 @@ public class SimpleJavaParser extends Parser { case T__10: enterOuterAlt(_localctx, 1); { - setState(120); + setState(118); variableDeclarationStatement(); } break; case IDENTIFIER: enterOuterAlt(_localctx, 2); { - setState(121); + setState(119); assignmentStatement(); } break; case T__14: enterOuterAlt(_localctx, 3); { - setState(122); + setState(120); ifStatement(); } break; case T__16: enterOuterAlt(_localctx, 4); { - setState(123); + setState(121); whileStatement(); } break; case T__17: enterOuterAlt(_localctx, 5); { - setState(124); + setState(122); returnStatement(); } break; case T__1: enterOuterAlt(_localctx, 6); { - setState(125); + setState(123); block(); } break; @@ -915,23 +915,23 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(128); + setState(126); type(); - setState(129); + setState(127); match(IDENTIFIER); - setState(132); + setState(130); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__13) { { - setState(130); + setState(128); match(T__13); - setState(131); + setState(129); expression(0); } } - setState(134); + setState(132); match(T__3); } } @@ -948,9 +948,7 @@ public class SimpleJavaParser extends Parser { @SuppressWarnings("CheckReturnValue") public static class AssignmentStatementContext extends ParserRuleContext { - public VarContext var() { - return getRuleContext(VarContext.class,0); - } + public TerminalNode IDENTIFIER() { return getToken(SimpleJavaParser.IDENTIFIER, 0); } public ExpressionContext expression() { return getRuleContext(ExpressionContext.class,0); } @@ -979,57 +977,14 @@ public class SimpleJavaParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(136); - var(); - setState(137); - match(T__13); - setState(138); - expression(0); - setState(139); - match(T__3); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - @SuppressWarnings("CheckReturnValue") - public static class VarContext extends ParserRuleContext { - public TerminalNode IDENTIFIER() { return getToken(SimpleJavaParser.IDENTIFIER, 0); } - public VarContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_var; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof SimpleJavaListener ) ((SimpleJavaListener)listener).enterVar(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof SimpleJavaListener ) ((SimpleJavaListener)listener).exitVar(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof SimpleJavaVisitor ) return ((SimpleJavaVisitor)visitor).visitVar(this); - else return visitor.visitChildren(this); - } - } - - public final VarContext var() throws RecognitionException { - VarContext _localctx = new VarContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_var); - try { - enterOuterAlt(_localctx, 1); - { - setState(141); + setState(134); match(IDENTIFIER); + setState(135); + match(T__13); + setState(136); + expression(0); + setState(137); + match(T__3); } } catch (RecognitionException re) { @@ -1075,28 +1030,28 @@ public class SimpleJavaParser extends Parser { public final IfStatementContext ifStatement() throws RecognitionException { IfStatementContext _localctx = new IfStatementContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_ifStatement); + enterRule(_localctx, 26, RULE_ifStatement); try { enterOuterAlt(_localctx, 1); { - setState(143); + setState(139); match(T__14); - setState(144); + setState(140); match(T__5); - setState(145); + setState(141); expression(0); - setState(146); + setState(142); match(T__6); - setState(147); + setState(143); statement(); - setState(150); + setState(146); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(148); + setState(144); match(T__15); - setState(149); + setState(145); statement(); } break; @@ -1143,19 +1098,19 @@ public class SimpleJavaParser extends Parser { public final WhileStatementContext whileStatement() throws RecognitionException { WhileStatementContext _localctx = new WhileStatementContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_whileStatement); + enterRule(_localctx, 28, RULE_whileStatement); try { enterOuterAlt(_localctx, 1); { - setState(152); + setState(148); match(T__16); - setState(153); + setState(149); match(T__5); - setState(154); + setState(150); expression(0); - setState(155); + setState(151); match(T__6); - setState(156); + setState(152); statement(); } } @@ -1196,24 +1151,24 @@ public class SimpleJavaParser extends Parser { public final ReturnStatementContext returnStatement() throws RecognitionException { ReturnStatementContext _localctx = new ReturnStatementContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_returnStatement); + enterRule(_localctx, 30, RULE_returnStatement); int _la; try { enterOuterAlt(_localctx, 1); { - setState(158); + setState(154); match(T__17); - setState(160); + setState(156); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 270851375168L) != 0)) { { - setState(159); + setState(155); expression(0); } } - setState(162); + setState(158); match(T__3); } } @@ -1257,28 +1212,28 @@ public class SimpleJavaParser extends Parser { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_block); + enterRule(_localctx, 32, RULE_block); int _la; try { enterOuterAlt(_localctx, 1); { - setState(164); + setState(160); match(T__1); - setState(168); + setState(164); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 137439383044L) != 0)) { { { - setState(165); + setState(161); statement(); } } - setState(170); + setState(166); _errHandler.sync(this); _la = _input.LA(1); } - setState(171); + setState(167); match(T__2); } } @@ -1333,39 +1288,39 @@ public class SimpleJavaParser extends Parser { int _parentState = getState(); ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); ExpressionContext _prevctx = _localctx; - int _startState = 36; - enterRecursionRule(_localctx, 36, RULE_expression, _p); + int _startState = 34; + enterRecursionRule(_localctx, 34, RULE_expression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(184); + setState(180); _errHandler.sync(this); switch (_input.LA(1)) { case T__27: { - setState(174); + setState(170); match(T__27); - setState(175); + setState(171); expression(5); } break; case T__31: { - setState(176); + setState(172); match(T__31); - setState(177); + setState(173); expression(4); } break; case T__5: { - setState(178); + setState(174); match(T__5); - setState(179); + setState(175); expression(0); - setState(180); + setState(176); match(T__6); } break; @@ -1374,13 +1329,13 @@ public class SimpleJavaParser extends Parser { case T__34: case INTEGERLITERAL: { - setState(182); + setState(178); literal(); } break; case IDENTIFIER: { - setState(183); + setState(179); match(IDENTIFIER); } break; @@ -1388,7 +1343,7 @@ public class SimpleJavaParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(197); + setState(193); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1396,16 +1351,16 @@ public class SimpleJavaParser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(195); + setState(191); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: { _localctx = new ExpressionContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(186); + setState(182); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(187); + setState(183); _la = _input.LA(1); if ( !(_la==T__18 || _la==T__19) ) { _errHandler.recoverInline(this); @@ -1415,7 +1370,7 @@ public class SimpleJavaParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(188); + setState(184); expression(9); } break; @@ -1423,9 +1378,9 @@ public class SimpleJavaParser extends Parser { { _localctx = new ExpressionContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(189); + setState(185); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(190); + setState(186); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 132120576L) != 0)) ) { _errHandler.recoverInline(this); @@ -1435,7 +1390,7 @@ public class SimpleJavaParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(191); + setState(187); expression(8); } break; @@ -1443,9 +1398,9 @@ public class SimpleJavaParser extends Parser { { _localctx = new ExpressionContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(192); + setState(188); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(193); + setState(189); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 4160749568L) != 0)) ) { _errHandler.recoverInline(this); @@ -1455,14 +1410,14 @@ public class SimpleJavaParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(194); + setState(190); expression(7); } break; } } } - setState(199); + setState(195); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); } @@ -1509,15 +1464,15 @@ public class SimpleJavaParser extends Parser { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_literal); + enterRule(_localctx, 36, RULE_literal); try { - setState(203); + setState(199); _errHandler.sync(this); switch (_input.LA(1)) { case INTEGERLITERAL: enterOuterAlt(_localctx, 1); { - setState(200); + setState(196); match(INTEGERLITERAL); } break; @@ -1525,14 +1480,14 @@ public class SimpleJavaParser extends Parser { case T__33: enterOuterAlt(_localctx, 2); { - setState(201); + setState(197); booleanLiteral(); } break; case T__34: enterOuterAlt(_localctx, 3); { - setState(202); + setState(198); charLiteral(); } break; @@ -1574,12 +1529,12 @@ public class SimpleJavaParser extends Parser { public final BooleanLiteralContext booleanLiteral() throws RecognitionException { BooleanLiteralContext _localctx = new BooleanLiteralContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_booleanLiteral); + enterRule(_localctx, 38, RULE_booleanLiteral); int _la; try { enterOuterAlt(_localctx, 1); { - setState(205); + setState(201); _la = _input.LA(1); if ( !(_la==T__32 || _la==T__33) ) { _errHandler.recoverInline(this); @@ -1625,15 +1580,15 @@ public class SimpleJavaParser extends Parser { public final CharLiteralContext charLiteral() throws RecognitionException { CharLiteralContext _localctx = new CharLiteralContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_charLiteral); + enterRule(_localctx, 40, RULE_charLiteral); try { enterOuterAlt(_localctx, 1); { - setState(207); + setState(203); match(T__34); - setState(208); + setState(204); matchWildcard(); - setState(209); + setState(205); match(T__34); } } @@ -1650,7 +1605,7 @@ public class SimpleJavaParser extends Parser { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 18: + case 17: return expression_sempred((ExpressionContext)_localctx, predIndex); } return true; @@ -1668,134 +1623,132 @@ public class SimpleJavaParser extends Parser { } public static final String _serializedATN = - "\u0004\u0001&\u00d4\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001&\u00d0\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ - "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ - "\u0001\u0000\u0004\u0000.\b\u0000\u000b\u0000\f\u0000/\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u00017\b\u0001\n\u0001"+ - "\f\u0001:\t\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0003\u0002A\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0003\u0004N\b\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0005\u0004S\b\u0004\n\u0004\f\u0004V\t\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005^\b"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005c\b\u0005\n\u0005"+ - "\f\u0005f\t\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0005\u0006m\b\u0006\n\u0006\f\u0006p\t\u0006\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\b\u0001\b\u0001\t\u0001\t\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0003\n\u007f\b\n\u0001\u000b\u0001\u000b\u0001"+ - "\u000b\u0001\u000b\u0003\u000b\u0085\b\u000b\u0001\u000b\u0001\u000b\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0003\u000e"+ - "\u0097\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u0010\u0001\u0010\u0003\u0010\u00a1\b\u0010\u0001\u0010"+ - "\u0001\u0010\u0001\u0011\u0001\u0011\u0005\u0011\u00a7\b\u0011\n\u0011"+ - "\f\u0011\u00aa\t\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u00b9\b\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0005\u0012\u00c4\b\u0012\n\u0012\f\u0012\u00c7"+ - "\t\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0003\u0013\u00cc\b\u0013"+ - "\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ - "\u0001\u0015\u0000\u0001$\u0016\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ - "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*\u0000\u0006\u0001\u0000"+ + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0001\u0000\u0004\u0000"+ + ",\b\u0000\u000b\u0000\f\u0000-\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0005\u00015\b\u0001\n\u0001\f\u00018\t\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002?\b"+ + "\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003"+ + "\u0004L\b\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0005\u0004Q\b\u0004"+ + "\n\u0004\f\u0004T\t\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0003\u0005\\\b\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0005\u0005a\b\u0005\n\u0005\f\u0005d\t\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006k\b\u0006"+ + "\n\u0006\f\u0006n\t\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b"+ + "\u0001\b\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0003\n}\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003"+ + "\u000b\u0083\b\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003"+ + "\r\u0093\b\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000f\u0001\u000f\u0003\u000f\u009d\b\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u0010\u0001\u0010\u0005\u0010\u00a3\b\u0010\n\u0010"+ + "\f\u0010\u00a6\t\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u00b5\b\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0005\u0011\u00c0\b\u0011\n\u0011\f\u0011\u00c3"+ + "\t\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u00c8\b\u0012"+ + "\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0000\u0001\"\u0015\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ + "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(\u0000\u0006\u0001\u0000"+ "\t\u000b\u0001\u0000\f\r\u0001\u0000\u0013\u0014\u0001\u0000\u0015\u001a"+ - "\u0001\u0000\u001b\u001f\u0001\u0000!\"\u00d8\u0000-\u0001\u0000\u0000"+ - "\u0000\u00021\u0001\u0000\u0000\u0000\u0004@\u0001\u0000\u0000\u0000\u0006"+ - "B\u0001\u0000\u0000\u0000\bG\u0001\u0000\u0000\u0000\nY\u0001\u0000\u0000"+ - "\u0000\fi\u0001\u0000\u0000\u0000\u000eq\u0001\u0000\u0000\u0000\u0010"+ - "t\u0001\u0000\u0000\u0000\u0012v\u0001\u0000\u0000\u0000\u0014~\u0001"+ - "\u0000\u0000\u0000\u0016\u0080\u0001\u0000\u0000\u0000\u0018\u0088\u0001"+ - "\u0000\u0000\u0000\u001a\u008d\u0001\u0000\u0000\u0000\u001c\u008f\u0001"+ - "\u0000\u0000\u0000\u001e\u0098\u0001\u0000\u0000\u0000 \u009e\u0001\u0000"+ - "\u0000\u0000\"\u00a4\u0001\u0000\u0000\u0000$\u00b8\u0001\u0000\u0000"+ - "\u0000&\u00cb\u0001\u0000\u0000\u0000(\u00cd\u0001\u0000\u0000\u0000*"+ - "\u00cf\u0001\u0000\u0000\u0000,.\u0003\u0002\u0001\u0000-,\u0001\u0000"+ - "\u0000\u0000./\u0001\u0000\u0000\u0000/-\u0001\u0000\u0000\u0000/0\u0001"+ - "\u0000\u0000\u00000\u0001\u0001\u0000\u0000\u000012\u0003\u0012\t\u0000"+ - "23\u0005\u0001\u0000\u000034\u0005%\u0000\u000048\u0005\u0002\u0000\u0000"+ - "57\u0003\u0004\u0002\u000065\u0001\u0000\u0000\u00007:\u0001\u0000\u0000"+ - "\u000086\u0001\u0000\u0000\u000089\u0001\u0000\u0000\u00009;\u0001\u0000"+ - "\u0000\u0000:8\u0001\u0000\u0000\u0000;<\u0005\u0003\u0000\u0000<\u0003"+ - "\u0001\u0000\u0000\u0000=A\u0003\u0006\u0003\u0000>A\u0003\b\u0004\u0000"+ - "?A\u0003\n\u0005\u0000@=\u0001\u0000\u0000\u0000@>\u0001\u0000\u0000\u0000"+ - "@?\u0001\u0000\u0000\u0000A\u0005\u0001\u0000\u0000\u0000BC\u0003\u0012"+ - "\t\u0000CD\u0003\u0010\b\u0000DE\u0005%\u0000\u0000EF\u0005\u0004\u0000"+ - "\u0000F\u0007\u0001\u0000\u0000\u0000GH\u0003\u0012\t\u0000HI\u0005\u0005"+ - "\u0000\u0000IJ\u0003\u0010\b\u0000JK\u0005%\u0000\u0000KM\u0005\u0006"+ - "\u0000\u0000LN\u0003\f\u0006\u0000ML\u0001\u0000\u0000\u0000MN\u0001\u0000"+ - "\u0000\u0000NO\u0001\u0000\u0000\u0000OP\u0005\u0007\u0000\u0000PT\u0005"+ - "\u0002\u0000\u0000QS\u0003\u0014\n\u0000RQ\u0001\u0000\u0000\u0000SV\u0001"+ - "\u0000\u0000\u0000TR\u0001\u0000\u0000\u0000TU\u0001\u0000\u0000\u0000"+ - "UW\u0001\u0000\u0000\u0000VT\u0001\u0000\u0000\u0000WX\u0005\u0003\u0000"+ - "\u0000X\t\u0001\u0000\u0000\u0000YZ\u0003\u0012\t\u0000Z[\u0005%\u0000"+ - "\u0000[]\u0005\u0006\u0000\u0000\\^\u0003\f\u0006\u0000]\\\u0001\u0000"+ - "\u0000\u0000]^\u0001\u0000\u0000\u0000^_\u0001\u0000\u0000\u0000_`\u0005"+ - "\u0007\u0000\u0000`d\u0005\u0002\u0000\u0000ac\u0003\u0014\n\u0000ba\u0001"+ - "\u0000\u0000\u0000cf\u0001\u0000\u0000\u0000db\u0001\u0000\u0000\u0000"+ - "de\u0001\u0000\u0000\u0000eg\u0001\u0000\u0000\u0000fd\u0001\u0000\u0000"+ - "\u0000gh\u0005\u0003\u0000\u0000h\u000b\u0001\u0000\u0000\u0000in\u0003"+ - "\u000e\u0007\u0000jk\u0005\b\u0000\u0000km\u0003\u000e\u0007\u0000lj\u0001"+ - "\u0000\u0000\u0000mp\u0001\u0000\u0000\u0000nl\u0001\u0000\u0000\u0000"+ - "no\u0001\u0000\u0000\u0000o\r\u0001\u0000\u0000\u0000pn\u0001\u0000\u0000"+ - "\u0000qr\u0003\u0010\b\u0000rs\u0005%\u0000\u0000s\u000f\u0001\u0000\u0000"+ - "\u0000tu\u0007\u0000\u0000\u0000u\u0011\u0001\u0000\u0000\u0000vw\u0007"+ - "\u0001\u0000\u0000w\u0013\u0001\u0000\u0000\u0000x\u007f\u0003\u0016\u000b"+ - "\u0000y\u007f\u0003\u0018\f\u0000z\u007f\u0003\u001c\u000e\u0000{\u007f"+ - "\u0003\u001e\u000f\u0000|\u007f\u0003 \u0010\u0000}\u007f\u0003\"\u0011"+ - "\u0000~x\u0001\u0000\u0000\u0000~y\u0001\u0000\u0000\u0000~z\u0001\u0000"+ - "\u0000\u0000~{\u0001\u0000\u0000\u0000~|\u0001\u0000\u0000\u0000~}\u0001"+ - "\u0000\u0000\u0000\u007f\u0015\u0001\u0000\u0000\u0000\u0080\u0081\u0003"+ - "\u0010\b\u0000\u0081\u0084\u0005%\u0000\u0000\u0082\u0083\u0005\u000e"+ - "\u0000\u0000\u0083\u0085\u0003$\u0012\u0000\u0084\u0082\u0001\u0000\u0000"+ - "\u0000\u0084\u0085\u0001\u0000\u0000\u0000\u0085\u0086\u0001\u0000\u0000"+ - "\u0000\u0086\u0087\u0005\u0004\u0000\u0000\u0087\u0017\u0001\u0000\u0000"+ - "\u0000\u0088\u0089\u0003\u001a\r\u0000\u0089\u008a\u0005\u000e\u0000\u0000"+ - "\u008a\u008b\u0003$\u0012\u0000\u008b\u008c\u0005\u0004\u0000\u0000\u008c"+ - "\u0019\u0001\u0000\u0000\u0000\u008d\u008e\u0005%\u0000\u0000\u008e\u001b"+ - "\u0001\u0000\u0000\u0000\u008f\u0090\u0005\u000f\u0000\u0000\u0090\u0091"+ - "\u0005\u0006\u0000\u0000\u0091\u0092\u0003$\u0012\u0000\u0092\u0093\u0005"+ - "\u0007\u0000\u0000\u0093\u0096\u0003\u0014\n\u0000\u0094\u0095\u0005\u0010"+ - "\u0000\u0000\u0095\u0097\u0003\u0014\n\u0000\u0096\u0094\u0001\u0000\u0000"+ - "\u0000\u0096\u0097\u0001\u0000\u0000\u0000\u0097\u001d\u0001\u0000\u0000"+ - "\u0000\u0098\u0099\u0005\u0011\u0000\u0000\u0099\u009a\u0005\u0006\u0000"+ - "\u0000\u009a\u009b\u0003$\u0012\u0000\u009b\u009c\u0005\u0007\u0000\u0000"+ - "\u009c\u009d\u0003\u0014\n\u0000\u009d\u001f\u0001\u0000\u0000\u0000\u009e"+ - "\u00a0\u0005\u0012\u0000\u0000\u009f\u00a1\u0003$\u0012\u0000\u00a0\u009f"+ - "\u0001\u0000\u0000\u0000\u00a0\u00a1\u0001\u0000\u0000\u0000\u00a1\u00a2"+ - "\u0001\u0000\u0000\u0000\u00a2\u00a3\u0005\u0004\u0000\u0000\u00a3!\u0001"+ - "\u0000\u0000\u0000\u00a4\u00a8\u0005\u0002\u0000\u0000\u00a5\u00a7\u0003"+ - "\u0014\n\u0000\u00a6\u00a5\u0001\u0000\u0000\u0000\u00a7\u00aa\u0001\u0000"+ - "\u0000\u0000\u00a8\u00a6\u0001\u0000\u0000\u0000\u00a8\u00a9\u0001\u0000"+ - "\u0000\u0000\u00a9\u00ab\u0001\u0000\u0000\u0000\u00aa\u00a8\u0001\u0000"+ - "\u0000\u0000\u00ab\u00ac\u0005\u0003\u0000\u0000\u00ac#\u0001\u0000\u0000"+ - "\u0000\u00ad\u00ae\u0006\u0012\uffff\uffff\u0000\u00ae\u00af\u0005\u001c"+ - "\u0000\u0000\u00af\u00b9\u0003$\u0012\u0005\u00b0\u00b1\u0005 \u0000\u0000"+ - "\u00b1\u00b9\u0003$\u0012\u0004\u00b2\u00b3\u0005\u0006\u0000\u0000\u00b3"+ - "\u00b4\u0003$\u0012\u0000\u00b4\u00b5\u0005\u0007\u0000\u0000\u00b5\u00b9"+ - "\u0001\u0000\u0000\u0000\u00b6\u00b9\u0003&\u0013\u0000\u00b7\u00b9\u0005"+ - "%\u0000\u0000\u00b8\u00ad\u0001\u0000\u0000\u0000\u00b8\u00b0\u0001\u0000"+ - "\u0000\u0000\u00b8\u00b2\u0001\u0000\u0000\u0000\u00b8\u00b6\u0001\u0000"+ - "\u0000\u0000\u00b8\u00b7\u0001\u0000\u0000\u0000\u00b9\u00c5\u0001\u0000"+ - "\u0000\u0000\u00ba\u00bb\n\b\u0000\u0000\u00bb\u00bc\u0007\u0002\u0000"+ - "\u0000\u00bc\u00c4\u0003$\u0012\t\u00bd\u00be\n\u0007\u0000\u0000\u00be"+ - "\u00bf\u0007\u0003\u0000\u0000\u00bf\u00c4\u0003$\u0012\b\u00c0\u00c1"+ - "\n\u0006\u0000\u0000\u00c1\u00c2\u0007\u0004\u0000\u0000\u00c2\u00c4\u0003"+ - "$\u0012\u0007\u00c3\u00ba\u0001\u0000\u0000\u0000\u00c3\u00bd\u0001\u0000"+ - "\u0000\u0000\u00c3\u00c0\u0001\u0000\u0000\u0000\u00c4\u00c7\u0001\u0000"+ - "\u0000\u0000\u00c5\u00c3\u0001\u0000\u0000\u0000\u00c5\u00c6\u0001\u0000"+ - "\u0000\u0000\u00c6%\u0001\u0000\u0000\u0000\u00c7\u00c5\u0001\u0000\u0000"+ - "\u0000\u00c8\u00cc\u0005$\u0000\u0000\u00c9\u00cc\u0003(\u0014\u0000\u00ca"+ - "\u00cc\u0003*\u0015\u0000\u00cb\u00c8\u0001\u0000\u0000\u0000\u00cb\u00c9"+ - "\u0001\u0000\u0000\u0000\u00cb\u00ca\u0001\u0000\u0000\u0000\u00cc\'\u0001"+ - "\u0000\u0000\u0000\u00cd\u00ce\u0007\u0005\u0000\u0000\u00ce)\u0001\u0000"+ - "\u0000\u0000\u00cf\u00d0\u0005#\u0000\u0000\u00d0\u00d1\t\u0000\u0000"+ - "\u0000\u00d1\u00d2\u0005#\u0000\u0000\u00d2+\u0001\u0000\u0000\u0000\u0011"+ - "/8@MT]dn~\u0084\u0096\u00a0\u00a8\u00b8\u00c3\u00c5\u00cb"; + "\u0001\u0000\u001b\u001f\u0001\u0000!\"\u00d5\u0000+\u0001\u0000\u0000"+ + "\u0000\u0002/\u0001\u0000\u0000\u0000\u0004>\u0001\u0000\u0000\u0000\u0006"+ + "@\u0001\u0000\u0000\u0000\bE\u0001\u0000\u0000\u0000\nW\u0001\u0000\u0000"+ + "\u0000\fg\u0001\u0000\u0000\u0000\u000eo\u0001\u0000\u0000\u0000\u0010"+ + "r\u0001\u0000\u0000\u0000\u0012t\u0001\u0000\u0000\u0000\u0014|\u0001"+ + "\u0000\u0000\u0000\u0016~\u0001\u0000\u0000\u0000\u0018\u0086\u0001\u0000"+ + "\u0000\u0000\u001a\u008b\u0001\u0000\u0000\u0000\u001c\u0094\u0001\u0000"+ + "\u0000\u0000\u001e\u009a\u0001\u0000\u0000\u0000 \u00a0\u0001\u0000\u0000"+ + "\u0000\"\u00b4\u0001\u0000\u0000\u0000$\u00c7\u0001\u0000\u0000\u0000"+ + "&\u00c9\u0001\u0000\u0000\u0000(\u00cb\u0001\u0000\u0000\u0000*,\u0003"+ + "\u0002\u0001\u0000+*\u0001\u0000\u0000\u0000,-\u0001\u0000\u0000\u0000"+ + "-+\u0001\u0000\u0000\u0000-.\u0001\u0000\u0000\u0000.\u0001\u0001\u0000"+ + "\u0000\u0000/0\u0003\u0012\t\u000001\u0005\u0001\u0000\u000012\u0005%"+ + "\u0000\u000026\u0005\u0002\u0000\u000035\u0003\u0004\u0002\u000043\u0001"+ + "\u0000\u0000\u000058\u0001\u0000\u0000\u000064\u0001\u0000\u0000\u0000"+ + "67\u0001\u0000\u0000\u000079\u0001\u0000\u0000\u000086\u0001\u0000\u0000"+ + "\u00009:\u0005\u0003\u0000\u0000:\u0003\u0001\u0000\u0000\u0000;?\u0003"+ + "\u0006\u0003\u0000;\u0001"+ + "\u0000\u0000\u0000><\u0001\u0000\u0000\u0000>=\u0001\u0000\u0000\u0000"+ + "?\u0005\u0001\u0000\u0000\u0000@A\u0003\u0012\t\u0000AB\u0003\u0010\b"+ + "\u0000BC\u0005%\u0000\u0000CD\u0005\u0004\u0000\u0000D\u0007\u0001\u0000"+ + "\u0000\u0000EF\u0003\u0012\t\u0000FG\u0005\u0005\u0000\u0000GH\u0003\u0010"+ + "\b\u0000HI\u0005%\u0000\u0000IK\u0005\u0006\u0000\u0000JL\u0003\f\u0006"+ + "\u0000KJ\u0001\u0000\u0000\u0000KL\u0001\u0000\u0000\u0000LM\u0001\u0000"+ + "\u0000\u0000MN\u0005\u0007\u0000\u0000NR\u0005\u0002\u0000\u0000OQ\u0003"+ + "\u0014\n\u0000PO\u0001\u0000\u0000\u0000QT\u0001\u0000\u0000\u0000RP\u0001"+ + "\u0000\u0000\u0000RS\u0001\u0000\u0000\u0000SU\u0001\u0000\u0000\u0000"+ + "TR\u0001\u0000\u0000\u0000UV\u0005\u0003\u0000\u0000V\t\u0001\u0000\u0000"+ + "\u0000WX\u0003\u0012\t\u0000XY\u0005%\u0000\u0000Y[\u0005\u0006\u0000"+ + "\u0000Z\\\u0003\f\u0006\u0000[Z\u0001\u0000\u0000\u0000[\\\u0001\u0000"+ + "\u0000\u0000\\]\u0001\u0000\u0000\u0000]^\u0005\u0007\u0000\u0000^b\u0005"+ + "\u0002\u0000\u0000_a\u0003\u0014\n\u0000`_\u0001\u0000\u0000\u0000ad\u0001"+ + "\u0000\u0000\u0000b`\u0001\u0000\u0000\u0000bc\u0001\u0000\u0000\u0000"+ + "ce\u0001\u0000\u0000\u0000db\u0001\u0000\u0000\u0000ef\u0005\u0003\u0000"+ + "\u0000f\u000b\u0001\u0000\u0000\u0000gl\u0003\u000e\u0007\u0000hi\u0005"+ + "\b\u0000\u0000ik\u0003\u000e\u0007\u0000jh\u0001\u0000\u0000\u0000kn\u0001"+ + "\u0000\u0000\u0000lj\u0001\u0000\u0000\u0000lm\u0001\u0000\u0000\u0000"+ + "m\r\u0001\u0000\u0000\u0000nl\u0001\u0000\u0000\u0000op\u0003\u0010\b"+ + "\u0000pq\u0005%\u0000\u0000q\u000f\u0001\u0000\u0000\u0000rs\u0007\u0000"+ + "\u0000\u0000s\u0011\u0001\u0000\u0000\u0000tu\u0007\u0001\u0000\u0000"+ + "u\u0013\u0001\u0000\u0000\u0000v}\u0003\u0016\u000b\u0000w}\u0003\u0018"+ + "\f\u0000x}\u0003\u001a\r\u0000y}\u0003\u001c\u000e\u0000z}\u0003\u001e"+ + "\u000f\u0000{}\u0003 \u0010\u0000|v\u0001\u0000\u0000\u0000|w\u0001\u0000"+ + "\u0000\u0000|x\u0001\u0000\u0000\u0000|y\u0001\u0000\u0000\u0000|z\u0001"+ + "\u0000\u0000\u0000|{\u0001\u0000\u0000\u0000}\u0015\u0001\u0000\u0000"+ + "\u0000~\u007f\u0003\u0010\b\u0000\u007f\u0082\u0005%\u0000\u0000\u0080"+ + "\u0081\u0005\u000e\u0000\u0000\u0081\u0083\u0003\"\u0011\u0000\u0082\u0080"+ + "\u0001\u0000\u0000\u0000\u0082\u0083\u0001\u0000\u0000\u0000\u0083\u0084"+ + "\u0001\u0000\u0000\u0000\u0084\u0085\u0005\u0004\u0000\u0000\u0085\u0017"+ + "\u0001\u0000\u0000\u0000\u0086\u0087\u0005%\u0000\u0000\u0087\u0088\u0005"+ + "\u000e\u0000\u0000\u0088\u0089\u0003\"\u0011\u0000\u0089\u008a\u0005\u0004"+ + "\u0000\u0000\u008a\u0019\u0001\u0000\u0000\u0000\u008b\u008c\u0005\u000f"+ + "\u0000\u0000\u008c\u008d\u0005\u0006\u0000\u0000\u008d\u008e\u0003\"\u0011"+ + "\u0000\u008e\u008f\u0005\u0007\u0000\u0000\u008f\u0092\u0003\u0014\n\u0000"+ + "\u0090\u0091\u0005\u0010\u0000\u0000\u0091\u0093\u0003\u0014\n\u0000\u0092"+ + "\u0090\u0001\u0000\u0000\u0000\u0092\u0093\u0001\u0000\u0000\u0000\u0093"+ + "\u001b\u0001\u0000\u0000\u0000\u0094\u0095\u0005\u0011\u0000\u0000\u0095"+ + "\u0096\u0005\u0006\u0000\u0000\u0096\u0097\u0003\"\u0011\u0000\u0097\u0098"+ + "\u0005\u0007\u0000\u0000\u0098\u0099\u0003\u0014\n\u0000\u0099\u001d\u0001"+ + "\u0000\u0000\u0000\u009a\u009c\u0005\u0012\u0000\u0000\u009b\u009d\u0003"+ + "\"\u0011\u0000\u009c\u009b\u0001\u0000\u0000\u0000\u009c\u009d\u0001\u0000"+ + "\u0000\u0000\u009d\u009e\u0001\u0000\u0000\u0000\u009e\u009f\u0005\u0004"+ + "\u0000\u0000\u009f\u001f\u0001\u0000\u0000\u0000\u00a0\u00a4\u0005\u0002"+ + "\u0000\u0000\u00a1\u00a3\u0003\u0014\n\u0000\u00a2\u00a1\u0001\u0000\u0000"+ + "\u0000\u00a3\u00a6\u0001\u0000\u0000\u0000\u00a4\u00a2\u0001\u0000\u0000"+ + "\u0000\u00a4\u00a5\u0001\u0000\u0000\u0000\u00a5\u00a7\u0001\u0000\u0000"+ + "\u0000\u00a6\u00a4\u0001\u0000\u0000\u0000\u00a7\u00a8\u0005\u0003\u0000"+ + "\u0000\u00a8!\u0001\u0000\u0000\u0000\u00a9\u00aa\u0006\u0011\uffff\uffff"+ + "\u0000\u00aa\u00ab\u0005\u001c\u0000\u0000\u00ab\u00b5\u0003\"\u0011\u0005"+ + "\u00ac\u00ad\u0005 \u0000\u0000\u00ad\u00b5\u0003\"\u0011\u0004\u00ae"+ + "\u00af\u0005\u0006\u0000\u0000\u00af\u00b0\u0003\"\u0011\u0000\u00b0\u00b1"+ + "\u0005\u0007\u0000\u0000\u00b1\u00b5\u0001\u0000\u0000\u0000\u00b2\u00b5"+ + "\u0003$\u0012\u0000\u00b3\u00b5\u0005%\u0000\u0000\u00b4\u00a9\u0001\u0000"+ + "\u0000\u0000\u00b4\u00ac\u0001\u0000\u0000\u0000\u00b4\u00ae\u0001\u0000"+ + "\u0000\u0000\u00b4\u00b2\u0001\u0000\u0000\u0000\u00b4\u00b3\u0001\u0000"+ + "\u0000\u0000\u00b5\u00c1\u0001\u0000\u0000\u0000\u00b6\u00b7\n\b\u0000"+ + "\u0000\u00b7\u00b8\u0007\u0002\u0000\u0000\u00b8\u00c0\u0003\"\u0011\t"+ + "\u00b9\u00ba\n\u0007\u0000\u0000\u00ba\u00bb\u0007\u0003\u0000\u0000\u00bb"+ + "\u00c0\u0003\"\u0011\b\u00bc\u00bd\n\u0006\u0000\u0000\u00bd\u00be\u0007"+ + "\u0004\u0000\u0000\u00be\u00c0\u0003\"\u0011\u0007\u00bf\u00b6\u0001\u0000"+ + "\u0000\u0000\u00bf\u00b9\u0001\u0000\u0000\u0000\u00bf\u00bc\u0001\u0000"+ + "\u0000\u0000\u00c0\u00c3\u0001\u0000\u0000\u0000\u00c1\u00bf\u0001\u0000"+ + "\u0000\u0000\u00c1\u00c2\u0001\u0000\u0000\u0000\u00c2#\u0001\u0000\u0000"+ + "\u0000\u00c3\u00c1\u0001\u0000\u0000\u0000\u00c4\u00c8\u0005$\u0000\u0000"+ + "\u00c5\u00c8\u0003&\u0013\u0000\u00c6\u00c8\u0003(\u0014\u0000\u00c7\u00c4"+ + "\u0001\u0000\u0000\u0000\u00c7\u00c5\u0001\u0000\u0000\u0000\u00c7\u00c6"+ + "\u0001\u0000\u0000\u0000\u00c8%\u0001\u0000\u0000\u0000\u00c9\u00ca\u0007"+ + "\u0005\u0000\u0000\u00ca\'\u0001\u0000\u0000\u0000\u00cb\u00cc\u0005#"+ + "\u0000\u0000\u00cc\u00cd\t\u0000\u0000\u0000\u00cd\u00ce\u0005#\u0000"+ + "\u0000\u00ce)\u0001\u0000\u0000\u0000\u0011-6>KR[bl|\u0082\u0092\u009c"+ + "\u00a4\u00b4\u00bf\u00c1\u00c7"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/parser/generated/SimpleJavaVisitor.java b/src/main/java/parser/generated/SimpleJavaVisitor.java index dd4ca0f..8a1f7fe 100644 --- a/src/main/java/parser/generated/SimpleJavaVisitor.java +++ b/src/main/java/parser/generated/SimpleJavaVisitor.java @@ -1,4 +1,4 @@ -// Generated from C:/Users/Johannes/Documents/Github/JavaCompiler/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 +// Generated from C:/Users/ARB00075/Documents/DH/Compilerbau/NichtHaskell2.0/src/main/java/parser/SimpleJava.g4 by ANTLR 4.13.1 package parser.generated; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -88,12 +88,6 @@ public interface SimpleJavaVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitAssignmentStatement(SimpleJavaParser.AssignmentStatementContext ctx); - /** - * Visit a parse tree produced by {@link SimpleJavaParser#var}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitVar(SimpleJavaParser.VarContext ctx); /** * Visit a parse tree produced by {@link SimpleJavaParser#ifStatement}. * @param ctx the parse tree From 8a5f307947dd18fdf219507be46b31da518c6cec Mon Sep 17 00:00:00 2001 From: Bruder John Date: Fri, 31 May 2024 11:27:02 +0200 Subject: [PATCH 03/16] Fix Type --- .idea/misc.xml | 2 +- src/main/java/ast/literal/LiteralNode.java | 9 +++++---- src/main/java/classFileOutput/Example.class | Bin 167 -> 166 bytes src/main/java/classFileOutput/Test.class | Bin 97 -> 148 bytes src/main/java/parser/ASTBuilder.java | 14 +++++++------- src/main/java/semantic/SemanticAnalyzer.java | 3 --- src/main/resources/CompilerInput.java | 4 ++++ 7 files changed, 17 insertions(+), 15 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 4e21abf..459a2c6 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -40,7 +40,7 @@
- + \ No newline at end of file diff --git a/src/main/java/ast/literal/LiteralNode.java b/src/main/java/ast/literal/LiteralNode.java index 66dbc74..b3cb896 100644 --- a/src/main/java/ast/literal/LiteralNode.java +++ b/src/main/java/ast/literal/LiteralNode.java @@ -1,24 +1,25 @@ package ast.literal; import ast.expression.ExpressionNode; +import ast.type.TypeNode; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; public class LiteralNode implements ExpressionNode { public String value; - private String type; + private TypeNode type; - public LiteralNode(String value, String type) { + public LiteralNode(String value, TypeNode type) { this.value = value; this.type = type; } - public String getType() { + public TypeNode getType() { return type; } - public void setType(String type) { + public void setType(TypeNode type) { this.type = type; } diff --git a/src/main/java/classFileOutput/Example.class b/src/main/java/classFileOutput/Example.class index 522ae9edd25429b756d2dd98d755bdedb11f81c3..e34760ad5214618f0188bdd98631358127ac36ce 100644 GIT binary patch delta 12 TcmZ3^xQuZ^EE9{y!~}N$81)0A delta 13 UcmZ3+xSVl9EHkTy=frq-033}2?EnA( diff --git a/src/main/java/classFileOutput/Test.class b/src/main/java/classFileOutput/Test.class index 8ba4c23343d79136e322bf6f22591360f6985b92..98f27991c1557e7e05c706e183ff37e4f9036fe4 100644 GIT binary patch delta 109 zcmYeC!pL>%->!WO3=D=0JQKO}qj?xu8Q8cOSQywD8MsPPi%Wb{OEU6P7#UbKJUul% w85vld^HWk87#Wy=YCwPq$OdWwlH5R^AdqGR(yUtB88|kA!WO3=Ad=oD;e9H5eIKN>YnU7=a>;3``6xV49JEoq+?&Vr5_hvKRna CG6!1# diff --git a/src/main/java/parser/ASTBuilder.java b/src/main/java/parser/ASTBuilder.java index 446b7eb..7e7422d 100644 --- a/src/main/java/parser/ASTBuilder.java +++ b/src/main/java/parser/ASTBuilder.java @@ -230,22 +230,22 @@ public class ASTBuilder extends SimpleJavaBaseVisitor { @Override public ASTNode visitLiteral(SimpleJavaParser.LiteralContext ctx) { - String type; + TypeNode type; String value; if(ctx.INTEGERLITERAL() != null) { - type = "int"; + type = new BaseTypeNode(EnumTypeNode.INT); value = ctx.INTEGERLITERAL().getText(); - return new LiteralNode(type, value); + return new LiteralNode(value, type); } else if(ctx.booleanLiteral() != null) { - type= "boolean"; + type= new BaseTypeNode(EnumTypeNode.BOOLEAN); BooleanLiteralNode booleanNode = (BooleanLiteralNode) visitBooleanLiteral(ctx.booleanLiteral()); value = booleanNode.getValue(); - return new LiteralNode(type, value); + return new LiteralNode(value, type); } else if(ctx.charLiteral() != null) { - type= "char"; + type= new BaseTypeNode(EnumTypeNode.CHAR); CharLiteralNode charNode = (CharLiteralNode) visitCharLiteral(ctx.charLiteral()); value = charNode.getValue(); - return new LiteralNode(type, value); + return new LiteralNode(value, type); } return null; } diff --git a/src/main/java/semantic/SemanticAnalyzer.java b/src/main/java/semantic/SemanticAnalyzer.java index 9ccfe98..253a7b7 100644 --- a/src/main/java/semantic/SemanticAnalyzer.java +++ b/src/main/java/semantic/SemanticAnalyzer.java @@ -146,9 +146,6 @@ public class SemanticAnalyzer implements SemanticVisitor { @Override public TypeCheckResult analyze(AssignmentStatementNode assignmentStatementNode) { boolean valid = true; - BinaryExpressionNode binaryExpressionNode = assignmentStatementNode.expression; - var result = binaryExpressionNode.accept(this); - valid = valid && result.isValid(); return new TypeCheckResult(valid, null); } diff --git a/src/main/resources/CompilerInput.java b/src/main/resources/CompilerInput.java index 1cbe5ca..0f8297b 100644 --- a/src/main/resources/CompilerInput.java +++ b/src/main/resources/CompilerInput.java @@ -4,6 +4,10 @@ public class Example { public static int testMethod(char x){ + a = 12; + + a = x; + } } From e395c4d96b1c2680b4f703acf26b4b916838235c Mon Sep 17 00:00:00 2001 From: Maximilian Stahl Date: Fri, 31 May 2024 11:32:11 +0200 Subject: [PATCH 04/16] Fixed Boolean and Char Literal --- src/main/java/parser/ASTBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/parser/ASTBuilder.java b/src/main/java/parser/ASTBuilder.java index 7e7422d..9d16758 100644 --- a/src/main/java/parser/ASTBuilder.java +++ b/src/main/java/parser/ASTBuilder.java @@ -252,11 +252,11 @@ public class ASTBuilder extends SimpleJavaBaseVisitor { @Override public ASTNode visitBooleanLiteral(SimpleJavaParser.BooleanLiteralContext ctx) { - return super.visitBooleanLiteral(ctx); + return (ASTNode) new BooleanLiteralNode(ctx.getText()); } @Override public ASTNode visitCharLiteral(SimpleJavaParser.CharLiteralContext ctx) { - return super.visitCharLiteral(ctx); + return (ASTNode) new CharLiteralNode(ctx.getText()); } } From 837e751094e93f4c33c477d875829eb0a407a7b2 Mon Sep 17 00:00:00 2001 From: i22007 Date: Wed, 19 Jun 2024 12:53:14 -0400 Subject: [PATCH 05/16] Generate jar with first class as main --- .../java/ast/type/AccessModifierNode.java | 2 +- src/main/java/ast/type/TypeNode.java | 2 +- src/main/java/bytecode/ByteCodeGenerator.java | 56 ++++++++++++++++--- src/main/java/bytecode/ClassCodeGen.java | 25 +++++++-- src/main/java/bytecode/Mapper.java | 15 +++-- src/main/java/bytecode/MethodCodeGen.java | 2 +- 6 files changed, 80 insertions(+), 22 deletions(-) diff --git a/src/main/java/ast/type/AccessModifierNode.java b/src/main/java/ast/type/AccessModifierNode.java index 14081db..45f9172 100644 --- a/src/main/java/ast/type/AccessModifierNode.java +++ b/src/main/java/ast/type/AccessModifierNode.java @@ -1,7 +1,7 @@ package ast.type; public class AccessModifierNode { - EnumAccessModifierNode accessType; + public EnumAccessModifierNode accessType; public AccessModifierNode(String accessModifier) { setModifier(accessModifier); diff --git a/src/main/java/ast/type/TypeNode.java b/src/main/java/ast/type/TypeNode.java index 6336208..8a831cc 100644 --- a/src/main/java/ast/type/TypeNode.java +++ b/src/main/java/ast/type/TypeNode.java @@ -1,7 +1,7 @@ package ast.type; public class TypeNode { - EnumTypeNode type; + public EnumTypeNode type; public TypeNode(String type) { setType(type); diff --git a/src/main/java/bytecode/ByteCodeGenerator.java b/src/main/java/bytecode/ByteCodeGenerator.java index bef6e79..3782a09 100644 --- a/src/main/java/bytecode/ByteCodeGenerator.java +++ b/src/main/java/bytecode/ByteCodeGenerator.java @@ -4,17 +4,57 @@ import ast.ProgramNode; import ast.ClassNode; import bytecode.visitor.ProgramVisitor; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; + public class ByteCodeGenerator implements ProgramVisitor { - @Override - public void visit(ProgramNode programNode) { - //ASMCodeGenerator asmCodeGenerator = new ASMCodeGenerator(); - //asmCodeGenerator.test(); + private JarOutputStream jarOutputStream; + private ByteArrayOutputStream byteArrayOutputStream; - for (ClassNode classDeclarationNode : programNode.classes) { - ClassCodeGen classCodeGen = new ClassCodeGen(); - classDeclarationNode.accept(classCodeGen); + + @Override + public void visit(ProgramNode programNode) { + byteArrayOutputStream = new ByteArrayOutputStream(); + try { + Manifest manifest = new Manifest(); + manifest.getMainAttributes().putValue("Manifest-Version", "1.0"); + manifest.getMainAttributes().putValue("Main-Class", programNode.classes.get(0).identifier); + + jarOutputStream = new JarOutputStream(byteArrayOutputStream, manifest); + } catch (IOException e) { + throw new RuntimeException(e); + } + + for (ClassNode classDeclarationNode : programNode.classes) { + ClassCodeGen classCodeGen = new ClassCodeGen(jarOutputStream); + classDeclarationNode.accept(classCodeGen); + } + + try { + jarOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + saveJarFile(byteArrayOutputStream.toByteArray(), "output.jar"); } - } + private void saveJarFile(byte[] jarBytes, String jarFileName) { + File directory = new File("src/main/resources/classFileOutput"); + if (!directory.exists()) { + directory.mkdirs(); + } + + File jarFile = new File(directory, jarFileName); + try (FileOutputStream fos = new FileOutputStream(jarFile)) { + fos.write(jarBytes); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/bytecode/ClassCodeGen.java b/src/main/java/bytecode/ClassCodeGen.java index 6bddd61..79011b8 100644 --- a/src/main/java/bytecode/ClassCodeGen.java +++ b/src/main/java/bytecode/ClassCodeGen.java @@ -4,22 +4,27 @@ import ast.ClassNode; import ast.member.FieldNode; import ast.member.MemberNode; import ast.member.MethodNode; -import ast.type.BaseTypeNode; import bytecode.visitor.ClassVisitor; + import java.io.File; + import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import java.io.FileOutputStream; import java.io.IOException; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; public class ClassCodeGen implements ClassVisitor { private Mapper mapper; private ClassWriter classWriter; + private JarOutputStream jarOutputStream; - public ClassCodeGen() { + public ClassCodeGen(JarOutputStream jarOutputStream) { mapper = new Mapper(); + this.jarOutputStream = jarOutputStream; } @Override @@ -38,6 +43,7 @@ public class ClassCodeGen implements ClassVisitor { } classWriter.visitEnd(); + writeToJar(classWriter.toByteArray(), classNode.identifier); printIntoClassFile(classWriter.toByteArray(), classNode.identifier); classWriter.visitEnd(); @@ -45,9 +51,7 @@ public class ClassCodeGen implements ClassVisitor { @Override public void visit(FieldNode fieldNode) { - if(fieldNode.type instanceof BaseTypeNode baseTypeNode){ - classWriter.visitField(mapper.mapAccessTypeToOpcode(fieldNode.accessTypeNode), fieldNode.identifier, mapper.getTypeChar(baseTypeNode.enumType), null, null ); - } + classWriter.visitField(mapper.mapAccessTypeToOpcode(fieldNode.accessTypeNode), fieldNode.identifier, mapper.getTypeChar(fieldNode.type.type), null, null); classWriter.visitEnd(); } @@ -67,4 +71,15 @@ public class ClassCodeGen implements ClassVisitor { e.printStackTrace(); } } + + private void writeToJar(byte[] byteCode, String className) { + try { + JarEntry jarEntry = new JarEntry(className + ".class"); + jarOutputStream.putNextEntry(jarEntry); + jarOutputStream.write(byteCode); + jarOutputStream.closeEntry(); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/bytecode/Mapper.java b/src/main/java/bytecode/Mapper.java index faa4a67..7421708 100644 --- a/src/main/java/bytecode/Mapper.java +++ b/src/main/java/bytecode/Mapper.java @@ -3,20 +3,23 @@ package bytecode; import ast.parameter.ParameterNode; import ast.type.*; import org.objectweb.asm.Opcodes; -import ast.type.BaseTypeNode; public class Mapper { - public int mapAccessTypeToOpcode(AccessTypeNode type) { - switch (type.enumAccessTypeNode) { - case EnumAccessTypeNode.PUBLIC: + public int mapAccessTypeToOpcode(AccessModifierNode accessModifierNode) { + switch (accessModifierNode.accessType) { + case EnumAccessModifierNode.PUBLIC: return Opcodes.ACC_PUBLIC; - case EnumAccessTypeNode.PRIVATE: + case EnumAccessModifierNode.PRIVATE: return Opcodes.ACC_PRIVATE; + case EnumAccessModifierNode.PUBLIC_STATIC: + return Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC; + case EnumAccessModifierNode.PRIVATE_STATIC: + return Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC; } return 0; } - public String generateMethodDescriptor(BaseTypeNode baseTypeNode, ParameterListNode parameterListNode) { + public String generateMethodDescriptor(TypeNode typeNode, ParameterListNode parameterListNode) { String descriptor = "("; for(ParameterNode parameterNode : parameterListNode.parameters) { descriptor += getTypeChar(EnumTypeNode.INT); diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index 6e9c247..37b8d7a 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -35,7 +35,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(ConstructorNode constructorNode) { methodVisitor = - classWriter.visitMethod(mapper.mapAccessTypeToOpcode(constructorNode.visibility), + classWriter.visitMethod(mapper.mapAccessTypeToOpcode(constructorNode.accessType), "", "()V", null, From b9f6014f59b53082165449e33ae00a9d8851d71d Mon Sep 17 00:00:00 2001 From: i22007 Date: Thu, 20 Jun 2024 18:12:04 -0400 Subject: [PATCH 06/16] Assignments --- .../java/ast/expression/ExpressionNode.java | 4 +- .../unaryexpression/MemberAccessNode.java | 4 +- src/main/java/ast/member/ConstructorNode.java | 5 +- src/main/java/ast/member/MethodNode.java | 26 ++-- .../java/ast/parameter/ParameterNode.java | 4 +- .../LocalVariableDeclarationNode.java | 8 +- .../ast/statement/ReturnStatementNode.java | 16 ++- .../java/ast/statement/StatementNode.java | 6 +- .../AssignStatementExpressionNode.java | 4 +- .../AssignableExpressionNode.java | 4 +- src/main/java/bytecode/Mapper.java | 12 +- src/main/java/bytecode/MethodCodeGen.java | 130 ++++++++---------- .../java/bytecode/visitor/MethodVisitor.java | 22 +-- 13 files changed, 125 insertions(+), 120 deletions(-) diff --git a/src/main/java/ast/expression/ExpressionNode.java b/src/main/java/ast/expression/ExpressionNode.java index 1566f3b..db3e742 100644 --- a/src/main/java/ast/expression/ExpressionNode.java +++ b/src/main/java/ast/expression/ExpressionNode.java @@ -1,4 +1,6 @@ package ast.expression; -public class ExpressionNode { +import visitor.Visitable; + +public abstract class ExpressionNode implements Visitable { } diff --git a/src/main/java/ast/expression/unaryexpression/MemberAccessNode.java b/src/main/java/ast/expression/unaryexpression/MemberAccessNode.java index fb33d6e..1a50aa9 100644 --- a/src/main/java/ast/expression/unaryexpression/MemberAccessNode.java +++ b/src/main/java/ast/expression/unaryexpression/MemberAccessNode.java @@ -6,8 +6,8 @@ import java.util.ArrayList; import java.util.List; public class MemberAccessNode implements ASTNode { - Boolean thisExpr; - List identifiers = new ArrayList<>(); + public Boolean thisExpr; + public List identifiers = new ArrayList<>(); public MemberAccessNode(Boolean thisExpr) { this.thisExpr = thisExpr; diff --git a/src/main/java/ast/member/ConstructorNode.java b/src/main/java/ast/member/ConstructorNode.java index c78f8d4..ad46335 100644 --- a/src/main/java/ast/member/ConstructorNode.java +++ b/src/main/java/ast/member/ConstructorNode.java @@ -9,7 +9,7 @@ import visitor.Visitable; import java.util.ArrayList; import java.util.List; -public class ConstructorNode extends MethodNode { +public class ConstructorNode extends MethodNode implements Visitable { public AccessModifierNode accessType; public String identifier; public List parameters = new ArrayList<>(); @@ -30,10 +30,9 @@ public class ConstructorNode extends MethodNode { parameters.add(parameterNode); } - /* @Override public void accept(MethodVisitor methodVisitor) { methodVisitor.visit(this); } - */ + } diff --git a/src/main/java/ast/member/MethodNode.java b/src/main/java/ast/member/MethodNode.java index e508629..b660907 100644 --- a/src/main/java/ast/member/MethodNode.java +++ b/src/main/java/ast/member/MethodNode.java @@ -9,24 +9,24 @@ import semantic.SemanticVisitor; import typechecker.TypeCheckResult; import visitor.Visitable; -import java.util.ArrayList; import java.util.List; -public class MethodNode implements MemberNode { - AccessModifierNode accesModifier; - TypeNode type; - Boolean voidType; - String identifier; - List parameters; - BlockNode block; +public class MethodNode implements MemberNode, Visitable { + public AccessModifierNode accesModifier; + public TypeNode type; + public Boolean voidType; + public String identifier; + public List parameters; + public BlockNode block; - public MethodNode() {} + public MethodNode() { + } - public MethodNode(BlockNode block){ + public MethodNode(BlockNode block) { this.block = block; } - public MethodNode(AccessModifierNode accessModifier, TypeNode type, Boolean voidType, String identifier, BlockNode block){ + public MethodNode(AccessModifierNode accessModifier, TypeNode type, Boolean voidType, String identifier, BlockNode block) { this.accesModifier = accessModifier; this.type = type; this.voidType = voidType; @@ -54,7 +54,7 @@ public class MethodNode implements MemberNode { } return isSame; } - +*/ @Override public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); @@ -64,6 +64,6 @@ public class MethodNode implements MemberNode { public void accept(MethodVisitor methodVisitor) { methodVisitor.visit(this); } - */ + } diff --git a/src/main/java/ast/parameter/ParameterNode.java b/src/main/java/ast/parameter/ParameterNode.java index 3a6b5ec..1969e85 100644 --- a/src/main/java/ast/parameter/ParameterNode.java +++ b/src/main/java/ast/parameter/ParameterNode.java @@ -4,8 +4,8 @@ import ast.ASTNode; import ast.type.TypeNode; public class ParameterNode implements ASTNode { - TypeNode type; - String identifier; + public TypeNode type; + public String identifier; public ParameterNode(TypeNode type, String identifier) { this.type = type; diff --git a/src/main/java/ast/statement/LocalVariableDeclarationNode.java b/src/main/java/ast/statement/LocalVariableDeclarationNode.java index 5b3900f..7c0ddaf 100644 --- a/src/main/java/ast/statement/LocalVariableDeclarationNode.java +++ b/src/main/java/ast/statement/LocalVariableDeclarationNode.java @@ -5,10 +5,10 @@ import ast.expression.ExpressionNode; import ast.type.TypeNode; public class LocalVariableDeclarationNode implements ASTNode { - TypeNode type; - String identifier; - String assign; - ExpressionNode expression; + public TypeNode type; + public String identifier; + public String assign; + public ExpressionNode expression; public LocalVariableDeclarationNode(TypeNode type, String identifier, String assign, ExpressionNode expression) { this.type = type; diff --git a/src/main/java/ast/statement/ReturnStatementNode.java b/src/main/java/ast/statement/ReturnStatementNode.java index ab111c5..16fa05f 100644 --- a/src/main/java/ast/statement/ReturnStatementNode.java +++ b/src/main/java/ast/statement/ReturnStatementNode.java @@ -3,14 +3,28 @@ package ast.statement; import ast.ASTNode; import ast.expression.ExpressionNode; import ast.type.TypeNode; +import bytecode.visitor.MethodVisitor; +import semantic.SemanticVisitor; +import typechecker.TypeCheckResult; +import visitor.Visitable; import java.util.ArrayList; import java.util.List; -public class ReturnStatementNode implements ASTNode { +public class ReturnStatementNode implements ASTNode, Visitable { public ExpressionNode expression; public ReturnStatementNode(ExpressionNode expression) { this.expression = expression; } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + + @Override + public TypeCheckResult accept(SemanticVisitor visitor) { + return null; + } } diff --git a/src/main/java/ast/statement/StatementNode.java b/src/main/java/ast/statement/StatementNode.java index c47d30c..118ff01 100644 --- a/src/main/java/ast/statement/StatementNode.java +++ b/src/main/java/ast/statement/StatementNode.java @@ -1,2 +1,6 @@ -package ast.statement;public class StatementNode { +package ast.statement; + +import visitor.Visitable; + +public abstract class StatementNode implements Visitable { } diff --git a/src/main/java/ast/statement/statementexpression/AssignStatementExpressionNode.java b/src/main/java/ast/statement/statementexpression/AssignStatementExpressionNode.java index d993f48..8dbad08 100644 --- a/src/main/java/ast/statement/statementexpression/AssignStatementExpressionNode.java +++ b/src/main/java/ast/statement/statementexpression/AssignStatementExpressionNode.java @@ -4,8 +4,8 @@ import ast.ASTNode; import ast.expression.ExpressionNode; public class AssignStatementExpressionNode implements ASTNode { - AssignableExpressionNode assignable; - ExpressionNode expression; + public AssignableExpressionNode assignable; + public ExpressionNode expression; public AssignStatementExpressionNode(AssignableExpressionNode assignable, ExpressionNode expression) { this.assignable = assignable; diff --git a/src/main/java/ast/statement/statementexpression/AssignableExpressionNode.java b/src/main/java/ast/statement/statementexpression/AssignableExpressionNode.java index cf9b96e..e9d0d30 100644 --- a/src/main/java/ast/statement/statementexpression/AssignableExpressionNode.java +++ b/src/main/java/ast/statement/statementexpression/AssignableExpressionNode.java @@ -4,8 +4,8 @@ import ast.ASTNode; import ast.expression.unaryexpression.MemberAccessNode; public class AssignableExpressionNode implements ASTNode { - String identifier; - MemberAccessNode memberAccess; + public String identifier; + public MemberAccessNode memberAccess; public AssignableExpressionNode(String identifier) { this.identifier = identifier; diff --git a/src/main/java/bytecode/Mapper.java b/src/main/java/bytecode/Mapper.java index 7421708..aff0c5e 100644 --- a/src/main/java/bytecode/Mapper.java +++ b/src/main/java/bytecode/Mapper.java @@ -4,6 +4,8 @@ import ast.parameter.ParameterNode; import ast.type.*; import org.objectweb.asm.Opcodes; +import java.util.List; + public class Mapper { public int mapAccessTypeToOpcode(AccessModifierNode accessModifierNode) { switch (accessModifierNode.accessType) { @@ -14,18 +16,18 @@ public class Mapper { case EnumAccessModifierNode.PUBLIC_STATIC: return Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC; case EnumAccessModifierNode.PRIVATE_STATIC: - return Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC; + return Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC; } return 0; } - public String generateMethodDescriptor(TypeNode typeNode, ParameterListNode parameterListNode) { + public String generateMethodDescriptor(TypeNode typeNode, List parameters) { String descriptor = "("; - for(ParameterNode parameterNode : parameterListNode.parameters) { - descriptor += getTypeChar(EnumTypeNode.INT); + for (ParameterNode parameterNode : parameters) { + descriptor += getTypeChar(parameterNode.type.type); } descriptor += ")"; - descriptor += getTypeChar(baseTypeNode.enumType); + descriptor += getTypeChar(typeNode.type); return descriptor; } diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index 37b8d7a..9d0ac35 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -1,14 +1,14 @@ package bytecode; -import ast.LiteralNode; -import ast.expression.BinaryExpressionNode; -import ast.expression.IdentifierExpressionNode; -import ast.expression.UnaryExpressionNode; import ast.member.ConstructorNode; import ast.member.MethodNode; import ast.parameter.ParameterNode; import ast.statement.*; -import ast.type.BaseTypeNode; +import ast.statement.ifstatement.ElseStatementNode; +import ast.statement.ifstatement.IfElseStatementNode; +import ast.statement.ifstatement.IfStatementNode; + +import ast.statement.statementexpression.AssignStatementExpressionNode; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; @@ -50,59 +50,36 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(MethodNode methodNode) { - if (methodNode.type instanceof BaseTypeNode baseTypeNode) { - methodVisitor = classWriter.visitMethod(mapper.mapAccessTypeToOpcode(methodNode.visibility) | ACC_STATIC, - methodNode.identifier, - mapper.generateMethodDescriptor(baseTypeNode, methodNode.parameters), - null, - null); + methodVisitor = classWriter.visitMethod(mapper.mapAccessTypeToOpcode(methodNode.accesModifier), + methodNode.identifier, + mapper.generateMethodDescriptor(methodNode.type, methodNode.parameters), + null, + null); - methodVisitor.visitCode(); - localVaribales.add("this"); - // Add all method parameters to localVariables - for (ParameterNode parameterNode : methodNode.parameters.parameters) { - localVaribales.add(parameterNode.identifier); - } - - // Visit all statements - for(StatementNode statementNode : methodNode.statements) { - statementNode.accept(this); - } - - methodVisitor.visitMaxs(1, localVaribales.size()); - methodVisitor.visitEnd(); + methodVisitor.visitCode(); + localVaribales.add("this"); + // Add all method parameters to localVariables + for (ParameterNode parameterNode : methodNode.parameters) { + localVaribales.add(parameterNode.identifier); } + + // Visit all statements + for (StatementNode statementNode : methodNode.block.statements) { + statementNode.accept(this); + } + + methodVisitor.visitMaxs(1, localVaribales.size()); + methodVisitor.visitEnd(); } @Override - public void visit(AssignmentStatementNode assignmentStatementNode) { - BinaryExpressionNode expressionNode = assignmentStatementNode.expression; + public void visit(ElseStatementNode elseStatementNode) { - if(expressionNode.left instanceof IdentifierExpressionNode) { // Local var - expressionNode.right.accept(this); - localVarAssignment((IdentifierExpressionNode) expressionNode.left); - } else if(expressionNode.left instanceof BinaryExpressionNode) { // Global var - expressionNode.right.accept(this); - globalVarAssignment((BinaryExpressionNode) expressionNode.left); - } - - assignmentStatementNode.expression.accept(this); - methodVisitor.visitVarInsn(ISTORE, 1); } - private void localVarAssignment(IdentifierExpressionNode expressionNode) { - methodVisitor.visitVarInsn(ILOAD, localVaribales.indexOf(expressionNode.name)); - } + @Override + public void visit(IfElseStatementNode ifElseStatementNode) { - private void globalVarAssignment(BinaryExpressionNode expressionNode) { - IdentifierExpressionNode identifierExpressionNode = (IdentifierExpressionNode) expressionNode.left; - IdentifierExpressionNode identifierExpressionNode1 = (IdentifierExpressionNode) expressionNode.right; - TypeNode type = identifierExpressionNode1.type; - if(type instanceof BaseTypeNode) { - methodVisitor.visitFieldInsn(PUTFIELD, identifierExpressionNode.name, identifierExpressionNode1.name, mapper.getTypeChar(((BaseTypeNode) type).enumType)); - } else if (type instanceof ReferenceTypeNode) { - - } } @Override @@ -111,38 +88,43 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } @Override - public void visit(ReturnStatementNode returnStatementNode) { - returnStatementNode.expression.accept(this); - methodVisitor.visitInsn(IRETURN); + public void visit(ForStatementNode forStatementNode) { + } @Override - public void visit(VariableDeclarationStatementNode variableDeclarationStatementNode) { - + public void visit(LocalVariableDeclarationNode localVariableDeclarationNode) { + // Process expression + localVariableDeclarationNode.expression.accept(this); + // Store result of expression in variable + methodVisitor.visitVarInsn(ISTORE, localVaribales.indexOf(localVariableDeclarationNode.identifier)); } + @Override + public void visit(AssignStatementExpressionNode assignStatementExpressionNode) { + // Process expression + assignStatementExpressionNode.expression.accept(this); + // Store result of expression in variable + if(assignStatementExpressionNode.assignable.memberAccess.thisExpr) { + // Global var + //methodVisitor.visitFieldInsn(PUTFIELD, identifierExpressionNode.name, identifierExpressionNode1.name, mapper.getTypeChar(((BaseTypeNode) type).enumType)); + } else { + // Local var + methodVisitor.visitVarInsn(ISTORE, localVaribales.indexOf(assignStatementExpressionNode.assignable.identifier)); + } + } + + @Override + public void visit(ReturnStatementNode returnStatementNode) { + // Process expression + returnStatementNode.expression.accept(this); + // Return result of expression + methodVisitor.visitInsn(IRETURN); + } + + @Override public void visit(WhileStatementNode whileStatementNode) { } - - @Override - public void visit(BinaryExpressionNode binaryExpressionNode) { - - } - - @Override - public void visit(IdentifierExpressionNode identifierExpressionNode) { - methodVisitor.visitVarInsn(ILOAD, localVaribales.indexOf(identifierExpressionNode.name)); - } - - @Override - public void visit(UnaryExpressionNode unaryExpressionNode) { - - } - - @Override - public void visit(LiteralNode literalNode) { - methodVisitor.visitVarInsn(BIPUSH, literalNode.value); - } } diff --git a/src/main/java/bytecode/visitor/MethodVisitor.java b/src/main/java/bytecode/visitor/MethodVisitor.java index 3185441..15113f2 100644 --- a/src/main/java/bytecode/visitor/MethodVisitor.java +++ b/src/main/java/bytecode/visitor/MethodVisitor.java @@ -1,23 +1,25 @@ package bytecode.visitor; -import ast.LiteralNode; -import ast.expression.BinaryExpressionNode; -import ast.expression.IdentifierExpressionNode; -import ast.expression.UnaryExpressionNode; import ast.member.ConstructorNode; import ast.member.MethodNode; import ast.statement.*; +import ast.statement.ifstatement.ElseStatementNode; +import ast.statement.ifstatement.IfElseStatementNode; +import ast.statement.ifstatement.IfStatementNode; +import ast.statement.statementexpression.AssignStatementExpressionNode; public interface MethodVisitor { void visit(ConstructorNode constructorNode); void visit(MethodNode methodNode); - void visit(AssignmentStatementNode assignmentStatementNode); + + void visit(ElseStatementNode elseStatementNode); + void visit(IfElseStatementNode ifElseStatementNode); void visit(IfStatementNode ifStatementNode); + + void visit(AssignStatementExpressionNode assignStatementExpressionNode); + + void visit(ForStatementNode forStatementNode); + void visit(LocalVariableDeclarationNode localVariableDeclarationNode); void visit(ReturnStatementNode returnStatementNode); - void visit(VariableDeclarationStatementNode variableDeclarationStatementNode); void visit(WhileStatementNode whileStatementNode); - void visit(BinaryExpressionNode binaryExpressionNode); - void visit(IdentifierExpressionNode identifierExpressionNode); - void visit(UnaryExpressionNode unaryExpressionNode); - void visit(LiteralNode literalNode); } From a15f684c04a37a2bae19b700ac9c31ecb02de20c Mon Sep 17 00:00:00 2001 From: i22007 Date: Sun, 23 Jun 2024 11:10:06 -0400 Subject: [PATCH 07/16] Add visitors and code for binary expressions --- .../BinaryExpressionNode.java | 9 +- .../CalculationExpressionNode.java | 6 + .../binaryexpression/DotExpressionNode.java | 6 + .../DotSubstractionExpressionNode.java | 5 + .../NonCalculationExpressionNode.java | 6 + .../unaryexpression/MemberAccessNode.java | 16 +- .../unaryexpression/NotExpressionNode.java | 16 +- .../unaryexpression/UnaryExpressionNode.java | 6 + src/main/java/ast/member/ConstructorNode.java | 3 +- src/main/java/ast/member/MainMethodNode.java | 9 +- src/main/java/ast/member/MethodNode.java | 1 + .../java/ast/parameter/ParameterNode.java | 4 +- .../ast/statement/BlockStatementNode.java | 4 +- .../IncrementExpressionNode.java | 1 - src/main/java/bytecode/ByteCodeGenerator.java | 6 +- src/main/java/bytecode/ClassCodeGen.java | 12 +- src/main/java/bytecode/Mapper.java | 48 +++-- src/main/java/bytecode/MethodCodeGen.java | 178 +++++++++++++++++- .../java/bytecode/visitor/MethodVisitor.java | 16 ++ 19 files changed, 308 insertions(+), 44 deletions(-) diff --git a/src/main/java/ast/expression/binaryexpression/BinaryExpressionNode.java b/src/main/java/ast/expression/binaryexpression/BinaryExpressionNode.java index 655a3f5..84aa495 100644 --- a/src/main/java/ast/expression/binaryexpression/BinaryExpressionNode.java +++ b/src/main/java/ast/expression/binaryexpression/BinaryExpressionNode.java @@ -2,10 +2,12 @@ package ast.expression.binaryexpression; import ast.expression.IExpressionNode; import ast.type.type.*; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; +import visitor.Visitable; -public class BinaryExpressionNode implements IExpressionNode { +public class BinaryExpressionNode implements IExpressionNode, Visitable { @Override public TypeCheckResult accept(SemanticVisitor visitor) { @@ -16,4 +18,9 @@ public class BinaryExpressionNode implements IExpressionNode { public ITypeNode getType() { return null; } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } diff --git a/src/main/java/ast/expression/binaryexpression/CalculationExpressionNode.java b/src/main/java/ast/expression/binaryexpression/CalculationExpressionNode.java index b594502..791d359 100644 --- a/src/main/java/ast/expression/binaryexpression/CalculationExpressionNode.java +++ b/src/main/java/ast/expression/binaryexpression/CalculationExpressionNode.java @@ -1,6 +1,7 @@ package ast.expression.binaryexpression; import ast.type.type.*; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -37,4 +38,9 @@ public class CalculationExpressionNode extends BinaryExpressionNode { return null; } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/expression/binaryexpression/DotExpressionNode.java b/src/main/java/ast/expression/binaryexpression/DotExpressionNode.java index 2d56221..0bc26c1 100644 --- a/src/main/java/ast/expression/binaryexpression/DotExpressionNode.java +++ b/src/main/java/ast/expression/binaryexpression/DotExpressionNode.java @@ -1,6 +1,7 @@ package ast.expression.binaryexpression; import ast.type.type.*; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -39,4 +40,9 @@ public class DotExpressionNode extends BinaryExpressionNode { return null; } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/expression/binaryexpression/DotSubstractionExpressionNode.java b/src/main/java/ast/expression/binaryexpression/DotSubstractionExpressionNode.java index 1b43a9f..d2727b6 100644 --- a/src/main/java/ast/expression/binaryexpression/DotSubstractionExpressionNode.java +++ b/src/main/java/ast/expression/binaryexpression/DotSubstractionExpressionNode.java @@ -4,6 +4,7 @@ import ast.expression.unaryexpression.MemberAccessNode; import ast.statement.statementexpression.methodcallstatementnexpression.MethodCallStatementExpressionNode; import ast.type.type.*; import ast.type.ValueNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -41,4 +42,8 @@ public class DotSubstractionExpressionNode extends BinaryExpressionNode { return null; } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } diff --git a/src/main/java/ast/expression/binaryexpression/NonCalculationExpressionNode.java b/src/main/java/ast/expression/binaryexpression/NonCalculationExpressionNode.java index f89fdf8..bda7b75 100644 --- a/src/main/java/ast/expression/binaryexpression/NonCalculationExpressionNode.java +++ b/src/main/java/ast/expression/binaryexpression/NonCalculationExpressionNode.java @@ -3,6 +3,7 @@ package ast.expression.binaryexpression; import ast.expression.IExpressionNode; import ast.expression.unaryexpression.UnaryExpressionNode; import ast.type.type.*; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -47,4 +48,9 @@ public class NonCalculationExpressionNode extends BinaryExpressionNode { return null; } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/expression/unaryexpression/MemberAccessNode.java b/src/main/java/ast/expression/unaryexpression/MemberAccessNode.java index f5f7090..cd42c3a 100644 --- a/src/main/java/ast/expression/unaryexpression/MemberAccessNode.java +++ b/src/main/java/ast/expression/unaryexpression/MemberAccessNode.java @@ -1,11 +1,15 @@ package ast.expression.unaryexpression; import ast.ASTNode; +import bytecode.visitor.MethodVisitor; +import semantic.SemanticVisitor; +import typechecker.TypeCheckResult; +import visitor.Visitable; import java.util.ArrayList; import java.util.List; -public class MemberAccessNode implements ASTNode { +public class MemberAccessNode implements ASTNode, Visitable { public Boolean thisExpr; public List identifiers = new ArrayList<>(); @@ -17,4 +21,14 @@ public class MemberAccessNode implements ASTNode { identifiers.add(identifier); } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + + @Override + public TypeCheckResult accept(SemanticVisitor visitor) { + return null; + } + } diff --git a/src/main/java/ast/expression/unaryexpression/NotExpressionNode.java b/src/main/java/ast/expression/unaryexpression/NotExpressionNode.java index f225f39..5e7410f 100644 --- a/src/main/java/ast/expression/unaryexpression/NotExpressionNode.java +++ b/src/main/java/ast/expression/unaryexpression/NotExpressionNode.java @@ -2,12 +2,26 @@ package ast.expression.unaryexpression; import ast.ASTNode; import ast.expression.IExpressionNode; +import bytecode.visitor.MethodVisitor; +import semantic.SemanticVisitor; +import typechecker.TypeCheckResult; +import visitor.Visitable; -public class NotExpressionNode implements ASTNode { +public class NotExpressionNode implements ASTNode, Visitable { public IExpressionNode expression; public NotExpressionNode(IExpressionNode expression) { this.expression = expression; } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + + @Override + public TypeCheckResult accept(SemanticVisitor visitor) { + return null; + } + } diff --git a/src/main/java/ast/expression/unaryexpression/UnaryExpressionNode.java b/src/main/java/ast/expression/unaryexpression/UnaryExpressionNode.java index 4393e84..3b23613 100644 --- a/src/main/java/ast/expression/unaryexpression/UnaryExpressionNode.java +++ b/src/main/java/ast/expression/unaryexpression/UnaryExpressionNode.java @@ -4,6 +4,7 @@ import ast.expression.IExpressionNode; import ast.statement.IStatementNode; import ast.type.type.*; import ast.type.ValueNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -61,4 +62,9 @@ public class UnaryExpressionNode implements IExpressionNode { this.type = type; } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/member/ConstructorNode.java b/src/main/java/ast/member/ConstructorNode.java index 3956086..b7887d7 100644 --- a/src/main/java/ast/member/ConstructorNode.java +++ b/src/main/java/ast/member/ConstructorNode.java @@ -3,8 +3,7 @@ package ast.member; import ast.block.BlockNode; import ast.parameter.ParameterNode; import ast.type.AccessModifierNode; -import semantic.SemanticVisitor; -import typechecker.TypeCheckResult; +import bytecode.visitor.MethodVisitor; import visitor.Visitable; import java.util.ArrayList; diff --git a/src/main/java/ast/member/MainMethodNode.java b/src/main/java/ast/member/MainMethodNode.java index e50cc4f..68863dd 100644 --- a/src/main/java/ast/member/MainMethodNode.java +++ b/src/main/java/ast/member/MainMethodNode.java @@ -1,11 +1,18 @@ package ast.member; import ast.block.BlockNode; +import bytecode.visitor.MethodVisitor; +import visitor.Visitable; -public class MainMethodNode extends MethodNode { +public class MainMethodNode extends MethodNode implements Visitable { public BlockNode block; public MainMethodNode(BlockNode block) { this.block = block; } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } } diff --git a/src/main/java/ast/member/MethodNode.java b/src/main/java/ast/member/MethodNode.java index ec414c3..3bbdecc 100644 --- a/src/main/java/ast/member/MethodNode.java +++ b/src/main/java/ast/member/MethodNode.java @@ -9,6 +9,7 @@ import semantic.SemanticVisitor; import typechecker.TypeCheckResult; import visitor.Visitable; +import java.util.ArrayList; import java.util.List; import java.util.Objects; diff --git a/src/main/java/ast/parameter/ParameterNode.java b/src/main/java/ast/parameter/ParameterNode.java index caa3976..257eb68 100644 --- a/src/main/java/ast/parameter/ParameterNode.java +++ b/src/main/java/ast/parameter/ParameterNode.java @@ -6,8 +6,8 @@ import semantic.SemanticVisitor; import typechecker.TypeCheckResult; import visitor.Visitable; -public class ParameterNode implements ASTNode { - public TypeNode type; +public class ParameterNode implements ASTNode, Visitable { + public ITypeNode type; public String identifier; public ParameterNode(ITypeNode type, String identifier) { diff --git a/src/main/java/ast/statement/BlockStatementNode.java b/src/main/java/ast/statement/BlockStatementNode.java index 71516a8..524e004 100644 --- a/src/main/java/ast/statement/BlockStatementNode.java +++ b/src/main/java/ast/statement/BlockStatementNode.java @@ -3,7 +3,7 @@ package ast.statement; import java.util.List; public class BlockStatementNode { - List statements; + List statements; - public BlockStatementNode(List statements) {this.statements = statements;} + public BlockStatementNode(List statements) {this.statements = statements;} } diff --git a/src/main/java/ast/statement/statementexpression/crementExpression/IncrementExpressionNode.java b/src/main/java/ast/statement/statementexpression/crementExpression/IncrementExpressionNode.java index a87934d..cc4dea6 100644 --- a/src/main/java/ast/statement/statementexpression/crementExpression/IncrementExpressionNode.java +++ b/src/main/java/ast/statement/statementexpression/crementExpression/IncrementExpressionNode.java @@ -1,6 +1,5 @@ package ast.statement.statementexpression.crementExpression; -import ast.ASTNode; import ast.statement.statementexpression.AssignableExpressionNode; import ast.statement.statementexpression.IStatementExpressionNode; import semantic.SemanticVisitor; diff --git a/src/main/java/bytecode/ByteCodeGenerator.java b/src/main/java/bytecode/ByteCodeGenerator.java index 3782a09..1fb4ec4 100644 --- a/src/main/java/bytecode/ByteCodeGenerator.java +++ b/src/main/java/bytecode/ByteCodeGenerator.java @@ -15,7 +15,11 @@ public class ByteCodeGenerator implements ProgramVisitor { private JarOutputStream jarOutputStream; private ByteArrayOutputStream byteArrayOutputStream; + private String outputDirectory; + public ByteCodeGenerator(String outputDirectory) { + this.outputDirectory = outputDirectory; + } @Override public void visit(ProgramNode programNode) { @@ -45,7 +49,7 @@ public class ByteCodeGenerator implements ProgramVisitor { } private void saveJarFile(byte[] jarBytes, String jarFileName) { - File directory = new File("src/main/resources/classFileOutput"); + File directory = new File(outputDirectory); if (!directory.exists()) { directory.mkdirs(); } diff --git a/src/main/java/bytecode/ClassCodeGen.java b/src/main/java/bytecode/ClassCodeGen.java index 7f544d9..e974151 100644 --- a/src/main/java/bytecode/ClassCodeGen.java +++ b/src/main/java/bytecode/ClassCodeGen.java @@ -4,11 +4,13 @@ import ast.ClassNode; import ast.member.FieldNode; import ast.member.MemberNode; import ast.member.MethodNode; +import ast.type.type.BaseType; import bytecode.visitor.ClassVisitor; import java.io.File; import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; import java.io.FileOutputStream; import java.io.IOException; @@ -29,8 +31,8 @@ public class ClassCodeGen implements ClassVisitor { @Override public void visit(ClassNode classNode) { classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); -// classWriter.visit(Opcodes.V1_5, mapper.mapAccessTypeToOpcode(classNode.accessType), classNode.identifier, null, -// "java/lang/Object", null); + classWriter.visit(Opcodes.V1_5, mapper.mapAccessTypeToOpcode(classNode.accessType), classNode.identifier, null, + "java/lang/Object", null); for (MemberNode memberNode : classNode.members) { if (memberNode instanceof FieldNode) { @@ -50,7 +52,9 @@ public class ClassCodeGen implements ClassVisitor { @Override public void visit(FieldNode fieldNode) { - classWriter.visitField(mapper.mapAccessTypeToOpcode(fieldNode.accessTypeNode), fieldNode.identifier, mapper.getTypeChar(fieldNode.type.type), null, null); + if (fieldNode.type instanceof BaseType) { + classWriter.visitField(mapper.mapAccessTypeToOpcode(fieldNode.accessTypeNode), fieldNode.identifier, mapper.getTypeChar((BaseType) fieldNode.type), null, null); + } classWriter.visitEnd(); } @@ -61,7 +65,7 @@ public class ClassCodeGen implements ClassVisitor { directory.mkdirs(); } - String filePath = outputDirectoryPath + "/" + name + ".class"; + String filePath = directoryPath + "/" + name + ".class"; try { FileOutputStream fileOutputStream = new FileOutputStream(filePath); fileOutputStream.write(byteCode); diff --git a/src/main/java/bytecode/Mapper.java b/src/main/java/bytecode/Mapper.java index 49ad62b..33c877a 100644 --- a/src/main/java/bytecode/Mapper.java +++ b/src/main/java/bytecode/Mapper.java @@ -1,6 +1,10 @@ package bytecode; +import ast.parameter.ParameterNode; import ast.type.*; +import ast.type.type.BaseType; +import ast.type.type.ReferenceType; +import ast.type.type.TypeEnum; import org.objectweb.asm.Opcodes; import java.util.List; @@ -20,29 +24,37 @@ public class Mapper { return 0; } - public String generateMethodDescriptor(TypeNode typeNode, List parameters) { + public String generateMethodDescriptor(BaseType type, List parameters) { String descriptor = "("; for (ParameterNode parameterNode : parameters) { - descriptor += getTypeChar(parameterNode.type.type); + descriptor += getTypeChar((BaseType) parameterNode.type); } descriptor += ")"; - descriptor += getTypeChar(typeNode.type); + descriptor += getTypeChar(type); return descriptor; } -// public String getTypeChar(TypeEnum enumTypeNode) { -// String typeChar = ""; -// switch (enumTypeNode) { -// case TypeEnum.INT: -// typeChar = "I"; -// break; -// case TypeEnum.CHAR: -// typeChar = "C"; -// break; -// case TypeEnum.BOOLEAN: -// typeChar = "Z"; -// break; -// } -// return typeChar; -// } + public String generateMethodDescriptor(ReferenceType type, List parameters) { + String descriptor = "()V"; + return descriptor; + } + + public String getTypeChar(BaseType type) { + String typeChar = ""; + switch (type.getTypeEnum()) { + case TypeEnum.INT: + typeChar = "I"; + break; + case TypeEnum.CHAR: + typeChar = "C"; + break; + case TypeEnum.BOOL: + typeChar = "Z"; + break; + case TypeEnum.VOID: + typeChar = "V"; + break; + } + return typeChar; + } } diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index 9d0ac35..5a8469a 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -1,6 +1,11 @@ package bytecode; +import ast.expression.binaryexpression.*; +import ast.expression.unaryexpression.MemberAccessNode; +import ast.expression.unaryexpression.NotExpressionNode; +import ast.expression.unaryexpression.UnaryExpressionNode; import ast.member.ConstructorNode; +import ast.member.MainMethodNode; import ast.member.MethodNode; import ast.parameter.ParameterNode; import ast.statement.*; @@ -9,7 +14,9 @@ import ast.statement.ifstatement.IfElseStatementNode; import ast.statement.ifstatement.IfStatementNode; import ast.statement.statementexpression.AssignStatementExpressionNode; +import ast.type.type.BaseType; import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import java.util.ArrayList; @@ -32,6 +39,9 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { localVaribales = new ArrayList<>(); } + + // Method nodes + @Override public void visit(ConstructorNode constructorNode) { methodVisitor = @@ -48,11 +58,32 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { methodVisitor.visitEnd(); } + @Override + public void visit(MainMethodNode mainMethodNode) { + methodVisitor = classWriter.visitMethod(mapper.mapAccessTypeToOpcode(mainMethodNode.accesModifier), + mainMethodNode.getIdentifier(), + "([Ljava/lang/String;)V", + null, + null); + + methodVisitor.visitCode(); + localVaribales.add("this"); + localVaribales.add("args"); + + // Visit all statements + for (IStatementNode statementNode : mainMethodNode.block.statements) { + statementNode.accept(this); + } + + methodVisitor.visitMaxs(1, localVaribales.size()); + methodVisitor.visitEnd(); + } + @Override public void visit(MethodNode methodNode) { methodVisitor = classWriter.visitMethod(mapper.mapAccessTypeToOpcode(methodNode.accesModifier), - methodNode.identifier, - mapper.generateMethodDescriptor(methodNode.type, methodNode.parameters), + methodNode.getIdentifier(), + mapper.generateMethodDescriptor((BaseType) methodNode.getType(), methodNode.parameters), null, null); @@ -64,7 +95,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } // Visit all statements - for (StatementNode statementNode : methodNode.block.statements) { + for (IStatementNode statementNode : methodNode.block.statements) { statementNode.accept(this); } @@ -72,6 +103,119 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { methodVisitor.visitEnd(); } + + // Binary expressions + + @Override + public void visit(BinaryExpressionNode binaryExpressionNode) { + binaryExpressionNode.accept(this); + } + + @Override + public void visit(CalculationExpressionNode calculationExpressionNode) { + calculationExpressionNode.dotExpression.accept(this); + calculationExpressionNode.calculationExpression.accept(this); + switch (calculationExpressionNode.operator) { + case PLUS: + methodVisitor.visitInsn(IADD); + break; + case MINUS: + methodVisitor.visitInsn(ISUB); + break; + } + } + + @Override + public void visit(DotExpressionNode dotExpressionNode) { + dotExpressionNode.dotExpression.accept(this); + dotExpressionNode.dotSubstractionExpression.accept(this); + switch (dotExpressionNode.operator) { + case DIV: + methodVisitor.visitInsn(IDIV); + break; + case MULT: + methodVisitor.visitInsn(IMUL); + break; + case MOD: + methodVisitor.visitInsn(IREM); + break; + } + } + + @Override + public void visit(DotSubstractionExpressionNode dotSubstractionExpressionNode) { + + } + + @Override + public void visit(NonCalculationExpressionNode nonCalculationExpressionNode) { + Label labelFalse = new Label(); + Label labelTrue = new Label(); + switch (nonCalculationExpressionNode.operator) { + case AND: + nonCalculationExpressionNode.unaryExpression.accept(this); + methodVisitor.visitJumpInsn(IFEQ, labelFalse); + nonCalculationExpressionNode.expression.accept(this); + methodVisitor.visitJumpInsn(IFEQ, labelFalse); + break; + case OR: + nonCalculationExpressionNode.unaryExpression.accept(this); + methodVisitor.visitJumpInsn(IFNE, labelTrue); + nonCalculationExpressionNode.expression.accept(this); + methodVisitor.visitJumpInsn(IFEQ, labelFalse); + break; + case GREATER: + nonCalculationExpressionNode.unaryExpression.accept(this); + nonCalculationExpressionNode.expression.accept(this); + methodVisitor.visitJumpInsn(IF_ICMPLE, labelFalse); + break; + case LESS: + nonCalculationExpressionNode.unaryExpression.accept(this); + nonCalculationExpressionNode.expression.accept(this); + methodVisitor.visitJumpInsn(IF_ICMPGE, labelFalse); + break; + case GREATER_EQUAL: + nonCalculationExpressionNode.unaryExpression.accept(this); + nonCalculationExpressionNode.expression.accept(this); + methodVisitor.visitJumpInsn(IF_ICMPLT, labelFalse); + break; + case LESS_EQUAL: + nonCalculationExpressionNode.unaryExpression.accept(this); + nonCalculationExpressionNode.expression.accept(this); + methodVisitor.visitJumpInsn(IF_ICMPGT, labelFalse); + break; + case EQUAL: + nonCalculationExpressionNode.unaryExpression.accept(this); + nonCalculationExpressionNode.expression.accept(this); + + break; + case NOT_EQUAL: + break; + } + + } + + + // Unary expressions + + @Override + public void visit(MemberAccessNode memberAccessNode) { + + } + + @Override + public void visit(NotExpressionNode notExpressionNode) { + + } + + @Override + public void visit(UnaryExpressionNode unaryExpressionNode) { + + } + + + // Statements + @Override public void visit(ElseStatementNode elseStatementNode) { @@ -84,7 +228,17 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(IfStatementNode ifStatementNode) { + // Process condition + Label elseLabel = new Label(); + ifStatementNode.expression.accept(this); + + methodVisitor.visitJumpInsn(IFLE, elseLabel); + + // Process block + for (IStatementNode statementNode : ifStatementNode.block.statements) { + statementNode.accept(this); + } } @Override @@ -102,12 +256,12 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(AssignStatementExpressionNode assignStatementExpressionNode) { - // Process expression + // Process expression assignStatementExpressionNode.expression.accept(this); // Store result of expression in variable - if(assignStatementExpressionNode.assignable.memberAccess.thisExpr) { + if (assignStatementExpressionNode.assignable.memberAccess.thisExpr) { // Global var - //methodVisitor.visitFieldInsn(PUTFIELD, identifierExpressionNode.name, identifierExpressionNode1.name, mapper.getTypeChar(((BaseTypeNode) type).enumType)); + // /methodVisitor.visitFieldInsn(PUTFIELD, identifierExpressionNode.name, identifierExpressionNode1.name, mapper.getTypeChar(((BaseTypeNode) type).enumType)); } else { // Local var methodVisitor.visitVarInsn(ISTORE, localVaribales.indexOf(assignStatementExpressionNode.assignable.identifier)); @@ -116,10 +270,14 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(ReturnStatementNode returnStatementNode) { - // Process expression - returnStatementNode.expression.accept(this); - // Return result of expression - methodVisitor.visitInsn(IRETURN); + if (returnStatementNode.voidReturn) { // Return nothing + methodVisitor.visitInsn(RETURN); + } else { // Return something + // Process expression + returnStatementNode.expression.accept(this); + // Return result of expression + methodVisitor.visitInsn(IRETURN); + } } diff --git a/src/main/java/bytecode/visitor/MethodVisitor.java b/src/main/java/bytecode/visitor/MethodVisitor.java index 15113f2..d1d5055 100644 --- a/src/main/java/bytecode/visitor/MethodVisitor.java +++ b/src/main/java/bytecode/visitor/MethodVisitor.java @@ -1,6 +1,11 @@ package bytecode.visitor; +import ast.expression.binaryexpression.*; +import ast.expression.unaryexpression.MemberAccessNode; +import ast.expression.unaryexpression.NotExpressionNode; +import ast.expression.unaryexpression.UnaryExpressionNode; import ast.member.ConstructorNode; +import ast.member.MainMethodNode; import ast.member.MethodNode; import ast.statement.*; import ast.statement.ifstatement.ElseStatementNode; @@ -11,6 +16,17 @@ import ast.statement.statementexpression.AssignStatementExpressionNode; public interface MethodVisitor { void visit(ConstructorNode constructorNode); void visit(MethodNode methodNode); + void visit(MainMethodNode mainMethodNode); + + void visit(BinaryExpressionNode binaryExpressionNode); + void visit(CalculationExpressionNode calculationExpressionNode); + void visit(DotExpressionNode dotExpressionNode); + void visit(DotSubstractionExpressionNode dotSubstractionExpressionNode); + void visit(NonCalculationExpressionNode nonCalculationExpressionNode); + + void visit(MemberAccessNode memberAccessNode); + void visit(NotExpressionNode notExpressionNode); + void visit(UnaryExpressionNode unaryExpressionNode); void visit(ElseStatementNode elseStatementNode); void visit(IfElseStatementNode ifElseStatementNode); From fd8d451ba7d90668cc23305103575ceb4c684ac8 Mon Sep 17 00:00:00 2001 From: i22007 Date: Sun, 23 Jun 2024 11:33:33 -0400 Subject: [PATCH 08/16] Renaming again --- src/main/java/ast/members/MainMethodNode.java | 2 + src/main/java/ast/statements/IfNode.java | 4 +- src/main/java/bytecode/Mapper.java | 2 +- src/main/java/bytecode/MethodCodeGen.java | 98 ++++++++++--------- .../java/bytecode/visitor/MethodVisitor.java | 34 ++++--- 5 files changed, 76 insertions(+), 64 deletions(-) diff --git a/src/main/java/ast/members/MainMethodNode.java b/src/main/java/ast/members/MainMethodNode.java index b51fe0e..314a6d0 100644 --- a/src/main/java/ast/members/MainMethodNode.java +++ b/src/main/java/ast/members/MainMethodNode.java @@ -1,6 +1,8 @@ package ast.members; import ast.statements.BlockNode; +import bytecode.visitor.MethodVisitor; +import visitor.Visitable; public class MainMethodNode extends MethodNode implements Visitable { public BlockNode block; diff --git a/src/main/java/ast/statements/IfNode.java b/src/main/java/ast/statements/IfNode.java index 3292a10..583f019 100644 --- a/src/main/java/ast/statements/IfNode.java +++ b/src/main/java/ast/statements/IfNode.java @@ -4,8 +4,8 @@ import ast.ASTNode; import ast.expressions.IExpressionNode; public class IfNode implements ASTNode { - IExpressionNode expression; - BlockNode block; + public IExpressionNode expression; + public BlockNode block; public IfNode(IExpressionNode expression, BlockNode block) { this.expression = expression; diff --git a/src/main/java/bytecode/Mapper.java b/src/main/java/bytecode/Mapper.java index 33c877a..b8170d2 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 ast.type.type.BaseType; import ast.type.type.ReferenceType; diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index 7080fc0..52fc698 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -1,7 +1,16 @@ package bytecode; +import ast.expressions.binaryexpressions.*; +import ast.expressions.unaryexpressions.MemberAccessNode; +import ast.expressions.unaryexpressions.NotNode; +import ast.expressions.unaryexpressions.UnaryNode; import ast.members.ConstructorNode; +import ast.members.MainMethodNode; import ast.members.MethodNode; +import ast.parameters.ParameterNode; +import ast.statementexpressions.AssignNode; +import ast.statements.*; +import ast.type.type.BaseType; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; @@ -94,15 +103,15 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { // Binary expressions @Override - public void visit(BinaryExpressionNode binaryExpressionNode) { - binaryExpressionNode.accept(this); + public void visit(BinaryNode binaryNode) { + binaryNode.accept(this); } @Override - public void visit(CalculationExpressionNode calculationExpressionNode) { - calculationExpressionNode.dotExpression.accept(this); - calculationExpressionNode.calculationExpression.accept(this); - switch (calculationExpressionNode.operator) { + public void visit(CalculationNode calculat) { + calculat.dotExpression.accept(this); + calculat.calculationExpression.accept(this); + switch (calculat.operator) { case PLUS: methodVisitor.visitInsn(IADD); break; @@ -113,10 +122,10 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } @Override - public void visit(DotExpressionNode dotExpressionNode) { - dotExpressionNode.dotExpression.accept(this); - dotExpressionNode.dotSubstractionExpression.accept(this); - switch (dotExpressionNode.operator) { + public void visit(DotNode dotNode) { + dotNode.dotExpression.accept(this); + dotNode.dotSubstractionExpression.accept(this); + switch (dotNode.operator) { case DIV: methodVisitor.visitInsn(IDIV); break; @@ -130,50 +139,50 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } @Override - public void visit(DotSubstractionExpressionNode dotSubstractionExpressionNode) { + public void visit(DotSubstractionNode dotSubstractionNode) { } @Override - public void visit(NonCalculationExpressionNode nonCalculationExpressionNode) { + public void visit(NonCalculationNode nonCalculationNode) { Label labelFalse = new Label(); Label labelTrue = new Label(); - switch (nonCalculationExpressionNode.operator) { + switch (nonCalculationNode.operator) { case AND: - nonCalculationExpressionNode.unaryExpression.accept(this); + nonCalculationNode.unaryExpression.accept(this); methodVisitor.visitJumpInsn(IFEQ, labelFalse); - nonCalculationExpressionNode.expression.accept(this); + nonCalculationNode.expression.accept(this); methodVisitor.visitJumpInsn(IFEQ, labelFalse); break; case OR: - nonCalculationExpressionNode.unaryExpression.accept(this); + nonCalculationNode.unaryExpression.accept(this); methodVisitor.visitJumpInsn(IFNE, labelTrue); - nonCalculationExpressionNode.expression.accept(this); + nonCalculationNode.expression.accept(this); methodVisitor.visitJumpInsn(IFEQ, labelFalse); break; case GREATER: - nonCalculationExpressionNode.unaryExpression.accept(this); - nonCalculationExpressionNode.expression.accept(this); + nonCalculationNode.unaryExpression.accept(this); + nonCalculationNode.expression.accept(this); methodVisitor.visitJumpInsn(IF_ICMPLE, labelFalse); break; case LESS: - nonCalculationExpressionNode.unaryExpression.accept(this); - nonCalculationExpressionNode.expression.accept(this); + nonCalculationNode.unaryExpression.accept(this); + nonCalculationNode.expression.accept(this); methodVisitor.visitJumpInsn(IF_ICMPGE, labelFalse); break; case GREATER_EQUAL: - nonCalculationExpressionNode.unaryExpression.accept(this); - nonCalculationExpressionNode.expression.accept(this); + nonCalculationNode.unaryExpression.accept(this); + nonCalculationNode.expression.accept(this); methodVisitor.visitJumpInsn(IF_ICMPLT, labelFalse); break; case LESS_EQUAL: - nonCalculationExpressionNode.unaryExpression.accept(this); - nonCalculationExpressionNode.expression.accept(this); + nonCalculationNode.unaryExpression.accept(this); + nonCalculationNode.expression.accept(this); methodVisitor.visitJumpInsn(IF_ICMPGT, labelFalse); break; case EQUAL: - nonCalculationExpressionNode.unaryExpression.accept(this); - nonCalculationExpressionNode.expression.accept(this); + nonCalculationNode.unaryExpression.accept(this); + nonCalculationNode.expression.accept(this); break; case NOT_EQUAL: @@ -191,12 +200,12 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } @Override - public void visit(NotExpressionNode notExpressionNode) { + public void visit(NotNode notNode) { } @Override - public void visit(UnaryExpressionNode unaryExpressionNode) { + public void visit(UnaryNode unaryNode) { } @@ -204,35 +213,30 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { // Statements @Override - public void visit(ElseStatementNode elseStatementNode) { + public void visit(ElseNode elseNode) { } @Override - public void visit(IfElseStatementNode ifElseStatementNode) { + public void visit(IfElseNode ifElseNode) { } @Override - public void visit(IfStatementNode ifStatementNode) { + public void visit(IfNode ifNode) { // Process condition Label elseLabel = new Label(); - ifStatementNode.expression.accept(this); + ifNode.expression.accept(this); methodVisitor.visitJumpInsn(IFLE, elseLabel); // Process block - for (IStatementNode statementNode : ifStatementNode.block.statements) { + for (IStatementNode statementNode : ifNode.block.statements) { statementNode.accept(this); } } - @Override - public void visit(ForStatementNode forStatementNode) { - - } - @Override public void visit(LocalVariableDeclarationNode localVariableDeclarationNode) { // Process expression @@ -242,26 +246,26 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } @Override - public void visit(AssignStatementExpressionNode assignStatementExpressionNode) { + public void visit(AssignNode assignNode) { // Process expression - assignStatementExpressionNode.expression.accept(this); + assignNode.expression.accept(this); // Store result of expression in variable - if (assignStatementExpressionNode.assignable.memberAccess.thisExpr) { + if (assignNode.assignable.memberAccess.thisExpr) { // Global var // /methodVisitor.visitFieldInsn(PUTFIELD, identifierExpressionNode.name, identifierExpressionNode1.name, mapper.getTypeChar(((BaseTypeNode) type).enumType)); } else { // Local var - methodVisitor.visitVarInsn(ISTORE, localVaribales.indexOf(assignStatementExpressionNode.assignable.identifier)); + methodVisitor.visitVarInsn(ISTORE, localVaribales.indexOf(assignNode.assignable.identifier)); } } @Override - public void visit(ReturnStatementNode returnStatementNode) { - if (returnStatementNode.voidReturn) { // Return nothing + public void visit(ReturnNode returnNode) { + if (returnNode.voidReturn) { // Return nothing methodVisitor.visitInsn(RETURN); } else { // Return something // Process expression - returnStatementNode.expression.accept(this); + returnNode.expression.accept(this); // Return result of expression methodVisitor.visitInsn(IRETURN); } @@ -269,7 +273,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override - public void visit(WhileStatementNode whileStatementNode) { + public void visit(WhileNode whileNode) { } } diff --git a/src/main/java/bytecode/visitor/MethodVisitor.java b/src/main/java/bytecode/visitor/MethodVisitor.java index e836185..8900815 100644 --- a/src/main/java/bytecode/visitor/MethodVisitor.java +++ b/src/main/java/bytecode/visitor/MethodVisitor.java @@ -1,31 +1,37 @@ package bytecode.visitor; +import ast.expressions.binaryexpressions.*; +import ast.expressions.unaryexpressions.MemberAccessNode; +import ast.expressions.unaryexpressions.NotNode; +import ast.expressions.unaryexpressions.UnaryNode; import ast.members.ConstructorNode; +import ast.members.MainMethodNode; import ast.members.MethodNode; +import ast.statementexpressions.AssignNode; +import ast.statements.*; public interface MethodVisitor { void visit(ConstructorNode constructorNode); void visit(MethodNode methodNode); void visit(MainMethodNode mainMethodNode); - void visit(BinaryExpressionNode binaryExpressionNode); - void visit(CalculationExpressionNode calculationExpressionNode); - void visit(DotExpressionNode dotExpressionNode); - void visit(DotSubstractionExpressionNode dotSubstractionExpressionNode); - void visit(NonCalculationExpressionNode nonCalculationExpressionNode); + void visit(BinaryNode binaryNode); + void visit(CalculationNode calculationNode); + void visit(DotNode dotNode); + void visit(DotSubstractionNode dotSubstractionNode); + void visit(NonCalculationNode nonCalculationNode); void visit(MemberAccessNode memberAccessNode); - void visit(NotExpressionNode notExpressionNode); - void visit(UnaryExpressionNode unaryExpressionNode); + void visit(NotNode notExpressionNode); + void visit(UnaryNode unaryExpressionNode); - void visit(ElseStatementNode elseStatementNode); - void visit(IfElseStatementNode ifElseStatementNode); - void visit(IfStatementNode ifStatementNode); + void visit(ElseNode elseNode); + void visit(IfElseNode ifElseNode); + void visit(IfNode ifNode); - void visit(AssignStatementExpressionNode assignStatementExpressionNode); + void visit(AssignNode assignNode); - void visit(ForStatementNode forStatementNode); void visit(LocalVariableDeclarationNode localVariableDeclarationNode); - void visit(ReturnStatementNode returnStatementNode); - void visit(WhileStatementNode whileStatementNode); + void visit(ReturnNode returnNode); + void visit(WhileNode whileNode); } From 66c9481b3ee8bc15492472d7cee7d6d900303845 Mon Sep 17 00:00:00 2001 From: i22007 Date: Sun, 23 Jun 2024 13:43:42 -0400 Subject: [PATCH 09/16] Add all accept methods --- src/main/java/ast/ProgramNode.java | 7 ++ .../DotSubstractionNode.java | 6 ++ .../expressions/unaryexpressions/NotNode.java | 16 +++- src/main/java/ast/members/FieldNode.java | 7 ++ .../ast/statement/BlockStatementNode.java | 2 + .../ast/statementexpressions/AssignNode.java | 6 ++ .../statementexpressions/AssignableNode.java | 6 ++ .../NewDeclarationNode.java | 6 ++ .../crementexpressions/DecrementNode.java | 7 ++ .../crementexpressions/IncrementNode.java | 6 ++ .../ChainedMethodNode.java | 16 +++- .../MethodCallNode.java | 6 ++ .../TargetNode.java | 16 +++- .../LocalVariableDeclarationNode.java | 6 ++ src/main/java/ast/statements/ReturnNode.java | 6 ++ .../java/ast/statements/StatementNode.java | 4 +- src/main/java/ast/statements/WhileNode.java | 20 ++++- src/main/java/bytecode/MethodCodeGen.java | 75 +++++++++++++++++-- .../java/bytecode/visitor/MethodVisitor.java | 26 ++++++- 19 files changed, 230 insertions(+), 14 deletions(-) diff --git a/src/main/java/ast/ProgramNode.java b/src/main/java/ast/ProgramNode.java index 7fbe3e0..b13d78e 100644 --- a/src/main/java/ast/ProgramNode.java +++ b/src/main/java/ast/ProgramNode.java @@ -1,5 +1,7 @@ package ast; +import bytecode.visitor.MethodVisitor; +import bytecode.visitor.ProgramVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; import visitor.Visitable; @@ -18,4 +20,9 @@ public class ProgramNode implements ASTNode, Visitable { public TypeCheckResult accept(SemanticVisitor visitor) { return visitor.analyze(this); } + + @Override + public void accept(ProgramVisitor programVisitor) { + programVisitor.visit(this); + } } diff --git a/src/main/java/ast/expressions/binaryexpressions/DotSubstractionNode.java b/src/main/java/ast/expressions/binaryexpressions/DotSubstractionNode.java index 9537e15..c5fa214 100644 --- a/src/main/java/ast/expressions/binaryexpressions/DotSubstractionNode.java +++ b/src/main/java/ast/expressions/binaryexpressions/DotSubstractionNode.java @@ -4,6 +4,7 @@ import ast.expressions.unaryexpressions.MemberAccessNode; import ast.statementexpressions.methodcallstatementnexpressions.MethodCallNode; import ast.type.type.*; import ast.type.ValueNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -41,4 +42,9 @@ public class DotSubstractionNode extends BinaryNode { return null; } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/expressions/unaryexpressions/NotNode.java b/src/main/java/ast/expressions/unaryexpressions/NotNode.java index 017dfe1..e0c31a3 100644 --- a/src/main/java/ast/expressions/unaryexpressions/NotNode.java +++ b/src/main/java/ast/expressions/unaryexpressions/NotNode.java @@ -2,12 +2,26 @@ package ast.expressions.unaryexpressions; import ast.ASTNode; import ast.expressions.IExpressionNode; +import bytecode.visitor.MethodVisitor; +import semantic.SemanticVisitor; +import typechecker.TypeCheckResult; +import visitor.Visitable; -public class NotNode implements ASTNode { +public class NotNode implements ASTNode, Visitable { public IExpressionNode expression; public NotNode(IExpressionNode expression) { this.expression = expression; } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + + @Override + public TypeCheckResult accept(SemanticVisitor visitor) { + return null; + } + } diff --git a/src/main/java/ast/members/FieldNode.java b/src/main/java/ast/members/FieldNode.java index 86d2f59..edf434c 100644 --- a/src/main/java/ast/members/FieldNode.java +++ b/src/main/java/ast/members/FieldNode.java @@ -2,6 +2,8 @@ package ast.members; import ast.type.AccessModifierNode; import ast.type.type.ITypeNode; +import bytecode.visitor.ClassVisitor; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; import visitor.Visitable; @@ -22,4 +24,9 @@ public class FieldNode implements MemberNode, Visitable { return visitor.analyze(this); } + @Override + public void accept(ClassVisitor classVisitor) { + classVisitor.visit(this); + } + } diff --git a/src/main/java/ast/statement/BlockStatementNode.java b/src/main/java/ast/statement/BlockStatementNode.java index 524e004..6005d1a 100644 --- a/src/main/java/ast/statement/BlockStatementNode.java +++ b/src/main/java/ast/statement/BlockStatementNode.java @@ -1,5 +1,7 @@ package ast.statement; +import ast.statements.IStatementNode; + import java.util.List; public class BlockStatementNode { diff --git a/src/main/java/ast/statementexpressions/AssignNode.java b/src/main/java/ast/statementexpressions/AssignNode.java index 4a5022f..c620abd 100644 --- a/src/main/java/ast/statementexpressions/AssignNode.java +++ b/src/main/java/ast/statementexpressions/AssignNode.java @@ -1,6 +1,7 @@ package ast.statementexpressions; import ast.expressions.IExpressionNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -18,4 +19,9 @@ public class AssignNode implements IStatementExpressionNode { return visitor.analyze(this); } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/statementexpressions/AssignableNode.java b/src/main/java/ast/statementexpressions/AssignableNode.java index d3a1677..8f527e0 100644 --- a/src/main/java/ast/statementexpressions/AssignableNode.java +++ b/src/main/java/ast/statementexpressions/AssignableNode.java @@ -1,6 +1,7 @@ package ast.statementexpressions; import ast.expressions.unaryexpressions.MemberAccessNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -22,4 +23,9 @@ public class AssignableNode implements IStatementExpressionNode { return visitor.analyze(this); } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/statementexpressions/NewDeclarationNode.java b/src/main/java/ast/statementexpressions/NewDeclarationNode.java index d7a37bc..0964a6c 100644 --- a/src/main/java/ast/statementexpressions/NewDeclarationNode.java +++ b/src/main/java/ast/statementexpressions/NewDeclarationNode.java @@ -1,6 +1,7 @@ package ast.statementexpressions; import ast.expressions.IExpressionNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -24,4 +25,9 @@ public class NewDeclarationNode implements IStatementExpressionNode { return visitor.analyze(this); } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/statementexpressions/crementexpressions/DecrementNode.java b/src/main/java/ast/statementexpressions/crementexpressions/DecrementNode.java index 48cb82c..b9801c3 100644 --- a/src/main/java/ast/statementexpressions/crementexpressions/DecrementNode.java +++ b/src/main/java/ast/statementexpressions/crementexpressions/DecrementNode.java @@ -2,8 +2,10 @@ package ast.statementexpressions.crementexpressions; import ast.statementexpressions.AssignableNode; import ast.statementexpressions.IStatementExpressionNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; +import visitor.Visitable; public class DecrementNode implements IStatementExpressionNode { public CrementType crementType; @@ -18,4 +20,9 @@ public class DecrementNode implements IStatementExpressionNode { return visitor.analyze(this); } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/statementexpressions/crementexpressions/IncrementNode.java b/src/main/java/ast/statementexpressions/crementexpressions/IncrementNode.java index f283db4..f2c8828 100644 --- a/src/main/java/ast/statementexpressions/crementexpressions/IncrementNode.java +++ b/src/main/java/ast/statementexpressions/crementexpressions/IncrementNode.java @@ -2,6 +2,7 @@ package ast.statementexpressions.crementexpressions; import ast.statementexpressions.AssignableNode; import ast.statementexpressions.IStatementExpressionNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -18,4 +19,9 @@ public class IncrementNode implements IStatementExpressionNode { return visitor.analyze(this); } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/ChainedMethodNode.java b/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/ChainedMethodNode.java index b9fa8e4..ae01b85 100644 --- a/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/ChainedMethodNode.java +++ b/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/ChainedMethodNode.java @@ -2,11 +2,15 @@ package ast.statementexpressions.methodcallstatementnexpressions; import ast.ASTNode; import ast.expressions.IExpressionNode; +import bytecode.visitor.MethodVisitor; +import semantic.SemanticVisitor; +import typechecker.TypeCheckResult; +import visitor.Visitable; import java.util.ArrayList; import java.util.List; -public class ChainedMethodNode implements ASTNode { +public class ChainedMethodNode implements ASTNode, Visitable { public String identifier; public List expressions = new ArrayList<>(); @@ -17,4 +21,14 @@ public class ChainedMethodNode implements ASTNode { public void addExpression(IExpressionNode expression) { expressions.add(expression); } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + + @Override + public TypeCheckResult accept(SemanticVisitor visitor) { + return null; + } } diff --git a/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/MethodCallNode.java b/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/MethodCallNode.java index 5228ed2..88d9ac5 100644 --- a/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/MethodCallNode.java +++ b/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/MethodCallNode.java @@ -2,6 +2,7 @@ package ast.statementexpressions.methodcallstatementnexpressions; import ast.expressions.IExpressionNode; import ast.statements.IStatementNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -32,4 +33,9 @@ public class MethodCallNode implements IStatementNode { return visitor.analyze(this); } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/TargetNode.java b/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/TargetNode.java index 01e2344..c3fec66 100644 --- a/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/TargetNode.java +++ b/src/main/java/ast/statementexpressions/methodcallstatementnexpressions/TargetNode.java @@ -3,8 +3,12 @@ package ast.statementexpressions.methodcallstatementnexpressions; import ast.ASTNode; import ast.expressions.unaryexpressions.MemberAccessNode; import ast.statementexpressions.NewDeclarationNode; +import bytecode.visitor.MethodVisitor; +import semantic.SemanticVisitor; +import typechecker.TypeCheckResult; +import visitor.Visitable; -public class TargetNode implements ASTNode { +public class TargetNode implements ASTNode, Visitable { public Boolean thisTar; public MemberAccessNode memberAccess; public NewDeclarationNode newDeclaration; @@ -25,4 +29,14 @@ public class TargetNode implements ASTNode { public TargetNode(String identifier) { this.identifier = identifier; } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + + @Override + public TypeCheckResult accept(SemanticVisitor visitor) { + return null; + } } \ No newline at end of file diff --git a/src/main/java/ast/statements/LocalVariableDeclarationNode.java b/src/main/java/ast/statements/LocalVariableDeclarationNode.java index 881c437..726ea24 100644 --- a/src/main/java/ast/statements/LocalVariableDeclarationNode.java +++ b/src/main/java/ast/statements/LocalVariableDeclarationNode.java @@ -2,6 +2,7 @@ package ast.statements; import ast.expressions.IExpressionNode; import ast.type.type.*; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -23,4 +24,9 @@ public class LocalVariableDeclarationNode implements IStatementNode { return visitor.analyze(this); } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/statements/ReturnNode.java b/src/main/java/ast/statements/ReturnNode.java index e25cf6f..fed9c44 100644 --- a/src/main/java/ast/statements/ReturnNode.java +++ b/src/main/java/ast/statements/ReturnNode.java @@ -1,6 +1,7 @@ package ast.statements; import ast.expressions.IExpressionNode; +import bytecode.visitor.MethodVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -21,4 +22,9 @@ public class ReturnNode implements IStatementNode { return visitor.analyze(this); } + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + } diff --git a/src/main/java/ast/statements/StatementNode.java b/src/main/java/ast/statements/StatementNode.java index 24985c1..dccc841 100644 --- a/src/main/java/ast/statements/StatementNode.java +++ b/src/main/java/ast/statements/StatementNode.java @@ -1,2 +1,4 @@ -package ast.statements;public class StatementNode { +package ast.statements; + +public class StatementNode { } diff --git a/src/main/java/ast/statements/WhileNode.java b/src/main/java/ast/statements/WhileNode.java index fe9bfd2..8a881a8 100644 --- a/src/main/java/ast/statements/WhileNode.java +++ b/src/main/java/ast/statements/WhileNode.java @@ -2,13 +2,27 @@ package ast.statements; import ast.ASTNode; import ast.expressions.IExpressionNode; +import bytecode.visitor.MethodVisitor; +import semantic.SemanticVisitor; +import typechecker.TypeCheckResult; +import visitor.Visitable; -public class WhileNode extends StatementNode implements ASTNode { - IExpressionNode expression; - BlockNode block; +public class WhileNode extends StatementNode implements ASTNode, Visitable { + public IExpressionNode expression; + public BlockNode block; public WhileNode(IExpressionNode expression, BlockNode block) { this.expression = expression; this.block = block; } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + + @Override + public TypeCheckResult accept(SemanticVisitor visitor) { + return null; + } } diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index 52fc698..aea940d 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -9,6 +9,13 @@ import ast.members.MainMethodNode; import ast.members.MethodNode; import ast.parameters.ParameterNode; import ast.statementexpressions.AssignNode; +import ast.statementexpressions.AssignableNode; +import ast.statementexpressions.NewDeclarationNode; +import ast.statementexpressions.crementexpressions.DecrementNode; +import ast.statementexpressions.crementexpressions.IncrementNode; +import ast.statementexpressions.methodcallstatementnexpressions.ChainedMethodNode; +import ast.statementexpressions.methodcallstatementnexpressions.MethodCallNode; +import ast.statementexpressions.methodcallstatementnexpressions.TargetNode; import ast.statements.*; import ast.type.type.BaseType; import org.objectweb.asm.ClassWriter; @@ -108,10 +115,10 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } @Override - public void visit(CalculationNode calculat) { - calculat.dotExpression.accept(this); - calculat.calculationExpression.accept(this); - switch (calculat.operator) { + public void visit(CalculationNode calculationNode) { + calculationNode.dotExpression.accept(this); + calculationNode.calculationExpression.accept(this); + switch (calculationNode.operator) { case PLUS: methodVisitor.visitInsn(IADD); break; @@ -140,7 +147,9 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(DotSubstractionNode dotSubstractionNode) { + if(dotSubstractionNode.memberAccess == null) { // local var + } } @Override @@ -183,12 +192,33 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { case EQUAL: nonCalculationNode.unaryExpression.accept(this); nonCalculationNode.expression.accept(this); - + if (nonCalculationNode.unaryExpression.getType() instanceof BaseType && nonCalculationNode.expression.getType() instanceof BaseType) { + methodVisitor.visitJumpInsn(IF_ICMPNE, labelFalse); + } else { + methodVisitor.visitJumpInsn(IF_ACMPNE, labelFalse); + } break; case NOT_EQUAL: + nonCalculationNode.unaryExpression.accept(this); + nonCalculationNode.expression.accept(this); + if (nonCalculationNode.unaryExpression.getType() instanceof BaseType && nonCalculationNode.expression.getType() instanceof BaseType) { + methodVisitor.visitJumpInsn(IF_ACMPEQ, labelFalse); + } else { + methodVisitor.visitJumpInsn(IF_ACMPEQ, labelFalse); + } break; } + Label labelEndLogicalExpression = new Label(); + + methodVisitor.visitLabel(labelTrue); + methodVisitor.visitInsn(ICONST_1); // true + methodVisitor.visitJumpInsn(GOTO, labelEndLogicalExpression); + + methodVisitor.visitLabel(labelFalse); + methodVisitor.visitInsn(ICONST_0); // false + + methodVisitor.visitLabel(labelEndLogicalExpression); } @@ -259,6 +289,11 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } } + @Override + public void visit(NewDeclarationNode newDeclarationNode) { + + } + @Override public void visit(ReturnNode returnNode) { if (returnNode.voidReturn) { // Return nothing @@ -276,4 +311,34 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { public void visit(WhileNode whileNode) { } + + @Override + public void visit(DecrementNode decrementNode) { + + } + + @Override + public void visit(IncrementNode incrementNode) { + + } + + @Override + public void visit(ChainedMethodNode chainedMethodNode) { + + } + + @Override + public void visit(MethodCallNode methodCallNode) { + + } + + @Override + public void visit(TargetNode targetNode) { + + } + + @Override + public void visit(AssignableNode assignableNode) { + + } } diff --git a/src/main/java/bytecode/visitor/MethodVisitor.java b/src/main/java/bytecode/visitor/MethodVisitor.java index 8900815..3426646 100644 --- a/src/main/java/bytecode/visitor/MethodVisitor.java +++ b/src/main/java/bytecode/visitor/MethodVisitor.java @@ -8,30 +8,52 @@ import ast.members.ConstructorNode; import ast.members.MainMethodNode; import ast.members.MethodNode; import ast.statementexpressions.AssignNode; +import ast.statementexpressions.AssignableNode; +import ast.statementexpressions.NewDeclarationNode; +import ast.statementexpressions.crementexpressions.DecrementNode; +import ast.statementexpressions.crementexpressions.IncrementNode; +import ast.statementexpressions.methodcallstatementnexpressions.ChainedMethodNode; +import ast.statementexpressions.methodcallstatementnexpressions.MethodCallNode; +import ast.statementexpressions.methodcallstatementnexpressions.TargetNode; import ast.statements.*; public interface MethodVisitor { + // members void visit(ConstructorNode constructorNode); void visit(MethodNode methodNode); void visit(MainMethodNode mainMethodNode); + // Binary expressions void visit(BinaryNode binaryNode); void visit(CalculationNode calculationNode); void visit(DotNode dotNode); void visit(DotSubstractionNode dotSubstractionNode); void visit(NonCalculationNode nonCalculationNode); + // Unary expressions void visit(MemberAccessNode memberAccessNode); void visit(NotNode notExpressionNode); void visit(UnaryNode unaryExpressionNode); + // statements void visit(ElseNode elseNode); void visit(IfElseNode ifElseNode); void visit(IfNode ifNode); - void visit(AssignNode assignNode); - void visit(LocalVariableDeclarationNode localVariableDeclarationNode); void visit(ReturnNode returnNode); void visit(WhileNode whileNode); + + // statement expression + void visit(DecrementNode decrementNode); + void visit(IncrementNode incrementNode); + + void visit(ChainedMethodNode chainedMethodNode); + void visit(MethodCallNode methodCallNode); + void visit(TargetNode targetNode); + + void visit(AssignableNode assignableNode); + void visit(AssignNode assignNode); + void visit(NewDeclarationNode newDeclarationNode); + } From 99948fef07323d813ce210aa7c3cc73b664913d7 Mon Sep 17 00:00:00 2001 From: i22007 Date: Sun, 23 Jun 2024 14:35:57 -0400 Subject: [PATCH 10/16] Bytecode for ValueNode --- .../java/ast/members/ConstructorNode.java | 2 + src/main/java/ast/type/ValueNode.java | 16 +++++++- src/main/java/bytecode/MethodCodeGen.java | 41 ++++++++++++++++++- .../java/bytecode/visitor/MethodVisitor.java | 4 ++ 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/main/java/ast/members/ConstructorNode.java b/src/main/java/ast/members/ConstructorNode.java index 2b421fd..3f9b019 100644 --- a/src/main/java/ast/members/ConstructorNode.java +++ b/src/main/java/ast/members/ConstructorNode.java @@ -3,6 +3,8 @@ package ast.members; import ast.parameters.ParameterNode; import ast.statements.BlockNode; import ast.type.AccessModifierNode; +import bytecode.visitor.MethodVisitor; +import visitor.Visitable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/ast/type/ValueNode.java b/src/main/java/ast/type/ValueNode.java index b51f799..600361b 100644 --- a/src/main/java/ast/type/ValueNode.java +++ b/src/main/java/ast/type/ValueNode.java @@ -1,8 +1,12 @@ package ast.type; import ast.ASTNode; +import bytecode.visitor.MethodVisitor; +import semantic.SemanticVisitor; +import typechecker.TypeCheckResult; +import visitor.Visitable; -public class ValueNode implements ASTNode { +public class ValueNode implements ASTNode, Visitable { public EnumValueNode valueType; public String value; @@ -10,4 +14,14 @@ public class ValueNode implements ASTNode { this.valueType = valueType; this.value = value; } + + @Override + public void accept(MethodVisitor methodVisitor) { + methodVisitor.visit(this); + } + + @Override + public TypeCheckResult accept(SemanticVisitor visitor) { + return null; + } } diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index aea940d..95b5c40 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -17,6 +17,7 @@ import ast.statementexpressions.methodcallstatementnexpressions.ChainedMethodNod import ast.statementexpressions.methodcallstatementnexpressions.MethodCallNode; import ast.statementexpressions.methodcallstatementnexpressions.TargetNode; import ast.statements.*; +import ast.type.ValueNode; import ast.type.type.BaseType; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Label; @@ -147,8 +148,8 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(DotSubstractionNode dotSubstractionNode) { - if(dotSubstractionNode.memberAccess == null) { // local var - + if (dotSubstractionNode.value != null) { // local var + dotSubstractionNode.value.accept(this); } } @@ -294,6 +295,42 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } + @Override + public void visit(ValueNode valueNode) { + switch (valueNode.valueType) { + case INT_VALUE: + int intValue = Integer.parseInt(valueNode.value); + if(intValue >= Byte.MIN_VALUE && intValue <= Byte.MAX_VALUE ) { // load int as byte + methodVisitor.visitIntInsn(BIPUSH, intValue); + } else if (intValue >= Short.MIN_VALUE && intValue <= Short.MAX_VALUE ) { // load int as short + methodVisitor.visitIntInsn(SIPUSH, intValue); + } else { // load int as const + methodVisitor.visitLdcInsn(intValue); + } + break; + case BOOLEAN_VALUE: + if(valueNode.value.equals("true")) { + methodVisitor.visitInsn(ICONST_1); + } else { + methodVisitor.visitInsn(ICONST_0); + } + break; + case CHAR_VALUE: + char charValue = valueNode.value.charAt(0); + if(charValue <= Byte.MAX_VALUE ) { // load char as byte + methodVisitor.visitIntInsn(BIPUSH, charValue); + } else if (charValue <= Short.MAX_VALUE) { // load char as short + methodVisitor.visitIntInsn(SIPUSH, charValue); + } else { // load char as const + methodVisitor.visitLdcInsn(charValue); + } + break; + case NULL_VALUE: + methodVisitor.visitInsn(ACONST_NULL); + break; + } + } + @Override public void visit(ReturnNode returnNode) { if (returnNode.voidReturn) { // Return nothing diff --git a/src/main/java/bytecode/visitor/MethodVisitor.java b/src/main/java/bytecode/visitor/MethodVisitor.java index 3426646..1108a86 100644 --- a/src/main/java/bytecode/visitor/MethodVisitor.java +++ b/src/main/java/bytecode/visitor/MethodVisitor.java @@ -16,6 +16,7 @@ import ast.statementexpressions.methodcallstatementnexpressions.ChainedMethodNod import ast.statementexpressions.methodcallstatementnexpressions.MethodCallNode; import ast.statementexpressions.methodcallstatementnexpressions.TargetNode; import ast.statements.*; +import ast.type.ValueNode; public interface MethodVisitor { // members @@ -56,4 +57,7 @@ public interface MethodVisitor { void visit(AssignNode assignNode); void visit(NewDeclarationNode newDeclarationNode); + // type + void visit(ValueNode valueNode); + } From ef0bc99bbf2202ff010c688008602197995becca Mon Sep 17 00:00:00 2001 From: i22007 Date: Sun, 23 Jun 2024 14:54:53 -0400 Subject: [PATCH 11/16] Bytecode for dotSubstractionNode --- src/main/java/bytecode/MethodCodeGen.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index 95b5c40..563027e 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -148,8 +148,16 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(DotSubstractionNode dotSubstractionNode) { - if (dotSubstractionNode.value != null) { // local var + if (dotSubstractionNode.value != null) { dotSubstractionNode.value.accept(this); + } else if(dotSubstractionNode.identifier != null) { + methodVisitor.visitVarInsn(ILOAD, localVaribales.indexOf(dotSubstractionNode.identifier)); + } else if(dotSubstractionNode.memberAccess != null) { + dotSubstractionNode.memberAccess.accept(this); + } else if(dotSubstractionNode.methodCall != null) { + dotSubstractionNode.methodCall.accept(this); + } else if(dotSubstractionNode.calculationExpression != null) { + dotSubstractionNode.calculationExpression.accept(this); } } From d631b01c8276d508a96d1df3f828b00b0dc5101b Mon Sep 17 00:00:00 2001 From: i22007 Date: Sun, 23 Jun 2024 16:06:07 -0400 Subject: [PATCH 12/16] ConstructorNode and NotNode --- src/main/java/bytecode/MethodCodeGen.java | 36 +++++++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index 563027e..9b799ab 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -19,9 +19,11 @@ import ast.statementexpressions.methodcallstatementnexpressions.TargetNode; import ast.statements.*; import ast.type.ValueNode; import ast.type.type.BaseType; +import ast.type.type.TypeEnum; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; import java.util.ArrayList; import java.util.List; @@ -51,14 +53,27 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { methodVisitor = classWriter.visitMethod(mapper.mapAccessTypeToOpcode(constructorNode.accessType), "", - "()V", + mapper.generateMethodDescriptor(new BaseType(TypeEnum.VOID), constructorNode.parameters), null, null); + methodVisitor.visitCode(); + localVaribales.add("this"); + // Add all method parameters to localVariables + for (ParameterNode parameterNode : constructorNode.parameters) { + localVaribales.add(parameterNode.identifier); + } + methodVisitor.visitVarInsn(ALOAD, 0); methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); + + // Visit all statements + for (IStatementNode statementNode : constructorNode.block.statements) { + statementNode.accept(this); + } + methodVisitor.visitInsn(RETURN); - methodVisitor.visitMaxs(1, 1); + methodVisitor.visitMaxs(1, localVaribales.size()); methodVisitor.visitEnd(); } @@ -168,7 +183,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { switch (nonCalculationNode.operator) { case AND: nonCalculationNode.unaryExpression.accept(this); - methodVisitor.visitJumpInsn(IFEQ, labelFalse); + methodVisitor.visitJumpInsn(IFEQ, labelFalse); // Value compared to 0 (false) nonCalculationNode.expression.accept(this); methodVisitor.visitJumpInsn(IFEQ, labelFalse); break; @@ -240,7 +255,22 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(NotNode notNode) { + Label labelFalse = new Label(); + Label labelTrue = new Label(); + notNode.expression.accept(this); + methodVisitor.visitJumpInsn(Opcodes.IFNE, labelFalse); // false if value is true (value != 0) + + Label labelEndLogicalExpression = new Label(); + + methodVisitor.visitLabel(labelTrue); + methodVisitor.visitInsn(ICONST_1); // true + methodVisitor.visitJumpInsn(GOTO, labelEndLogicalExpression); + + methodVisitor.visitLabel(labelFalse); + methodVisitor.visitInsn(ICONST_0); // false + + methodVisitor.visitLabel(labelEndLogicalExpression); } @Override From 4c5473827ea312e4bf3706f2d0747e072db6ffc0 Mon Sep 17 00:00:00 2001 From: i22007 Date: Mon, 24 Jun 2024 18:52:55 -0400 Subject: [PATCH 13/16] Small change --- src/main/java/bytecode/MethodCodeGen.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index 9b799ab..e50ed3f 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -73,7 +73,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } methodVisitor.visitInsn(RETURN); - methodVisitor.visitMaxs(1, localVaribales.size()); + methodVisitor.visitMaxs(0, 0); methodVisitor.visitEnd(); } @@ -94,7 +94,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { statementNode.accept(this); } - methodVisitor.visitMaxs(1, localVaribales.size()); + methodVisitor.visitMaxs(0, 0); methodVisitor.visitEnd(); } @@ -118,7 +118,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { statementNode.accept(this); } - methodVisitor.visitMaxs(1, localVaribales.size()); + methodVisitor.visitMaxs(0, 0); methodVisitor.visitEnd(); } @@ -250,7 +250,9 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(MemberAccessNode memberAccessNode) { - + if(memberAccessNode.thisExpr) { + //methodVisitor.visitFieldInsn(PUTFIELD); + } } @Override From c5fc378eed99941adc4854c7aa6092276b95e467 Mon Sep 17 00:00:00 2001 From: i22007 Date: Thu, 27 Jun 2024 17:32:50 -0400 Subject: [PATCH 14/16] Bytecode for loops --- .../statementexpressions/AssignableNode.java | 5 -- src/main/java/bytecode/MethodCodeGen.java | 70 ++++++++++++++----- .../java/bytecode/visitor/MethodVisitor.java | 1 - 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/src/main/java/ast/statementexpressions/AssignableNode.java b/src/main/java/ast/statementexpressions/AssignableNode.java index 8f527e0..18b6a45 100644 --- a/src/main/java/ast/statementexpressions/AssignableNode.java +++ b/src/main/java/ast/statementexpressions/AssignableNode.java @@ -23,9 +23,4 @@ public class AssignableNode implements IStatementExpressionNode { return visitor.analyze(this); } - @Override - public void accept(MethodVisitor methodVisitor) { - methodVisitor.visit(this); - } - } diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index e50ed3f..b94aa57 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -72,7 +72,6 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { statementNode.accept(this); } - methodVisitor.visitInsn(RETURN); methodVisitor.visitMaxs(0, 0); methodVisitor.visitEnd(); } @@ -165,13 +164,13 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { public void visit(DotSubstractionNode dotSubstractionNode) { if (dotSubstractionNode.value != null) { dotSubstractionNode.value.accept(this); - } else if(dotSubstractionNode.identifier != null) { + } else if (dotSubstractionNode.identifier != null) { methodVisitor.visitVarInsn(ILOAD, localVaribales.indexOf(dotSubstractionNode.identifier)); - } else if(dotSubstractionNode.memberAccess != null) { + } else if (dotSubstractionNode.memberAccess != null) { dotSubstractionNode.memberAccess.accept(this); - } else if(dotSubstractionNode.methodCall != null) { + } else if (dotSubstractionNode.methodCall != null) { dotSubstractionNode.methodCall.accept(this); - } else if(dotSubstractionNode.calculationExpression != null) { + } else if (dotSubstractionNode.calculationExpression != null) { dotSubstractionNode.calculationExpression.accept(this); } } @@ -250,7 +249,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(MemberAccessNode memberAccessNode) { - if(memberAccessNode.thisExpr) { + if (memberAccessNode.thisExpr) { //methodVisitor.visitFieldInsn(PUTFIELD); } } @@ -339,17 +338,17 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { public void visit(ValueNode valueNode) { switch (valueNode.valueType) { case INT_VALUE: - int intValue = Integer.parseInt(valueNode.value); - if(intValue >= Byte.MIN_VALUE && intValue <= Byte.MAX_VALUE ) { // load int as byte + int intValue = Integer.parseInt(valueNode.value); + if (intValue >= Byte.MIN_VALUE && intValue <= Byte.MAX_VALUE) { // load int as byte methodVisitor.visitIntInsn(BIPUSH, intValue); - } else if (intValue >= Short.MIN_VALUE && intValue <= Short.MAX_VALUE ) { // load int as short + } else if (intValue >= Short.MIN_VALUE && intValue <= Short.MAX_VALUE) { // load int as short methodVisitor.visitIntInsn(SIPUSH, intValue); } else { // load int as const methodVisitor.visitLdcInsn(intValue); } break; case BOOLEAN_VALUE: - if(valueNode.value.equals("true")) { + if (valueNode.value.equals("true")) { methodVisitor.visitInsn(ICONST_1); } else { methodVisitor.visitInsn(ICONST_0); @@ -357,7 +356,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { break; case CHAR_VALUE: char charValue = valueNode.value.charAt(0); - if(charValue <= Byte.MAX_VALUE ) { // load char as byte + if (charValue <= Byte.MAX_VALUE) { // load char as byte methodVisitor.visitIntInsn(BIPUSH, charValue); } else if (charValue <= Short.MAX_VALUE) { // load char as short methodVisitor.visitIntInsn(SIPUSH, charValue); @@ -386,17 +385,61 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { @Override public void visit(WhileNode whileNode) { + Label loopLabel = new Label(); + Label endOfLoopLabel = new Label(); + methodVisitor.visitLabel(loopLabel); + // while loop + whileNode.expression.accept(this); + methodVisitor.visitJumpInsn(IFEQ, endOfLoopLabel); // if condition is false, jump out of loop + + whileNode.block.accept(this); + methodVisitor.visitJumpInsn(GOTO, loopLabel); + + methodVisitor.visitLabel(endOfLoopLabel); } @Override public void visit(DecrementNode decrementNode) { + switch (decrementNode.crementType) { + case PREFIX: // --i + if(decrementNode.assignableExpression.memberAccess == null) { // local Var + methodVisitor.visitIincInsn(localVaribales.indexOf(decrementNode.assignableExpression.identifier), -1); + } else { // Field or var from other object + } + break; + case SUFFIX: // i-- + if(decrementNode.assignableExpression.memberAccess == null) { // local Var + methodVisitor.visitIincInsn(localVaribales.indexOf(decrementNode.assignableExpression.identifier), -1); + } else { // Field or var from other object + + } + break; + } } @Override public void visit(IncrementNode incrementNode) { + switch (incrementNode.crementType) { + case PREFIX: // ++i + if(incrementNode.assignableExpression.memberAccess == null) { // local Var + methodVisitor.visitIincInsn(localVaribales.indexOf(incrementNode.assignableExpression.identifier), 1); + methodVisitor.visitVarInsn(ISTORE, localVaribales.indexOf(incrementNode.assignableExpression.identifier)); + } else { // Field or var from other object + + } + break; + case SUFFIX: // i++ + if(incrementNode.assignableExpression.memberAccess == null) { // local Var + methodVisitor.visitVarInsn(ISTORE, localVaribales.indexOf(incrementNode.assignableExpression.identifier)); + methodVisitor.visitIincInsn(localVaribales.indexOf(incrementNode.assignableExpression.identifier), 1); + } else { // Field or var from other object + + } + break; + } } @Override @@ -413,9 +456,4 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { public void visit(TargetNode targetNode) { } - - @Override - public void visit(AssignableNode assignableNode) { - - } } diff --git a/src/main/java/bytecode/visitor/MethodVisitor.java b/src/main/java/bytecode/visitor/MethodVisitor.java index 1108a86..b1d3957 100644 --- a/src/main/java/bytecode/visitor/MethodVisitor.java +++ b/src/main/java/bytecode/visitor/MethodVisitor.java @@ -53,7 +53,6 @@ public interface MethodVisitor { void visit(MethodCallNode methodCallNode); void visit(TargetNode targetNode); - void visit(AssignableNode assignableNode); void visit(AssignNode assignNode); void visit(NewDeclarationNode newDeclarationNode); From 612c9670231e5e8fc081b3f58ca058c55439830b Mon Sep 17 00:00:00 2001 From: i22007 Date: Thu, 27 Jun 2024 19:56:31 -0400 Subject: [PATCH 15/16] Bytecode for if/elseif/else --- src/main/java/ast/statements/ElseNode.java | 3 +- src/main/java/ast/statements/IfElseNode.java | 7 +-- src/main/java/ast/statements/IfNode.java | 5 +- src/main/java/bytecode/MethodCodeGen.java | 63 ++++++++++++------- .../java/bytecode/visitor/MethodVisitor.java | 2 - 5 files changed, 46 insertions(+), 34 deletions(-) diff --git a/src/main/java/ast/statements/ElseNode.java b/src/main/java/ast/statements/ElseNode.java index 78b62f1..48c70cd 100644 --- a/src/main/java/ast/statements/ElseNode.java +++ b/src/main/java/ast/statements/ElseNode.java @@ -1,11 +1,10 @@ package ast.statements; -import ast.ASTNode; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; public class ElseNode implements IStatementNode { - BlockNode block; + public BlockNode block; public ElseNode(BlockNode block) { this.block = block; diff --git a/src/main/java/ast/statements/IfElseNode.java b/src/main/java/ast/statements/IfElseNode.java index 34d40f3..50af9be 100644 --- a/src/main/java/ast/statements/IfElseNode.java +++ b/src/main/java/ast/statements/IfElseNode.java @@ -1,6 +1,5 @@ package ast.statements; -import ast.ASTNode; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; @@ -8,9 +7,9 @@ import java.util.ArrayList; import java.util.List; public class IfElseNode implements IStatementNode { - IfNode ifStatement; - List elseIfStatements = new ArrayList<>(); - ElseNode elseStatement; + public IfNode ifStatement; + public List elseIfStatements = new ArrayList<>(); + public ElseNode elseStatement; public IfElseNode(IfNode ifStatement, ElseNode elseNode) { this.ifStatement = ifStatement; diff --git a/src/main/java/ast/statements/IfNode.java b/src/main/java/ast/statements/IfNode.java index 2f30788..6fdb65a 100644 --- a/src/main/java/ast/statements/IfNode.java +++ b/src/main/java/ast/statements/IfNode.java @@ -1,13 +1,12 @@ package ast.statements; -import ast.ASTNode; import ast.expressions.IExpressionNode; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; public class IfNode implements IStatementNode { - IExpressionNode expression; - BlockNode block; + public IExpressionNode expression; + public BlockNode block; public IfNode(IExpressionNode expression, BlockNode block) { this.expression = expression; diff --git a/src/main/java/bytecode/MethodCodeGen.java b/src/main/java/bytecode/MethodCodeGen.java index b94aa57..a1776c6 100644 --- a/src/main/java/bytecode/MethodCodeGen.java +++ b/src/main/java/bytecode/MethodCodeGen.java @@ -9,7 +9,6 @@ import ast.members.MainMethodNode; import ast.members.MethodNode; import ast.parameters.ParameterNode; import ast.statementexpressions.AssignNode; -import ast.statementexpressions.AssignableNode; import ast.statementexpressions.NewDeclarationNode; import ast.statementexpressions.crementexpressions.DecrementNode; import ast.statementexpressions.crementexpressions.IncrementNode; @@ -282,29 +281,47 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { // Statements - @Override - public void visit(ElseNode elseNode) { - - } - @Override public void visit(IfElseNode ifElseNode) { - - } - - @Override - public void visit(IfNode ifNode) { - // Process condition Label elseLabel = new Label(); - ifNode.expression.accept(this); - - methodVisitor.visitJumpInsn(IFLE, elseLabel); - - // Process block - for (IStatementNode statementNode : ifNode.block.statements) { - statementNode.accept(this); + Label[] elseIfLabels = new Label[ifElseNode.elseIfStatements.size()]; + for(int i = 0; i < ifElseNode.elseIfStatements.size(); i++) { + elseIfLabels[i] = new Label(); } + + ifElseNode.ifStatement.expression.accept(this); + if (ifElseNode.elseIfStatements.isEmpty()) { + // No else if + methodVisitor.visitJumpInsn(IFEQ, elseLabel); + } else { + // else if statements + methodVisitor.visitJumpInsn(IFEQ, elseIfLabels[0]); + } + ifElseNode.ifStatement.block.accept(this); // accept if block + + Label endLabel = new Label(); + methodVisitor.visitJumpInsn(GOTO, endLabel); + + for(int i = 0; i < ifElseNode.elseIfStatements.size(); i++) { + methodVisitor.visitLabel(elseIfLabels[i]); + ifElseNode.elseIfStatements.get(i).expression.accept(this); + if(i + 1 < elseIfLabels.length) { + // at least one more else if + methodVisitor.visitJumpInsn(IFEQ, elseIfLabels[i+1]); + } else { + methodVisitor.visitJumpInsn(IFEQ, elseLabel); + } + ifElseNode.elseIfStatements.get(i).block.accept(this); + methodVisitor.visitJumpInsn(GOTO, endLabel); + } + + if(ifElseNode.elseStatement != null) { + methodVisitor.visitLabel(elseLabel); + ifElseNode.elseStatement.block.accept(this); + } + + methodVisitor.visitLabel(endLabel); } @Override @@ -403,14 +420,14 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { public void visit(DecrementNode decrementNode) { switch (decrementNode.crementType) { case PREFIX: // --i - if(decrementNode.assignableExpression.memberAccess == null) { // local Var + if (decrementNode.assignableExpression.memberAccess == null) { // local Var methodVisitor.visitIincInsn(localVaribales.indexOf(decrementNode.assignableExpression.identifier), -1); } else { // Field or var from other object } break; case SUFFIX: // i-- - if(decrementNode.assignableExpression.memberAccess == null) { // local Var + if (decrementNode.assignableExpression.memberAccess == null) { // local Var methodVisitor.visitIincInsn(localVaribales.indexOf(decrementNode.assignableExpression.identifier), -1); } else { // Field or var from other object @@ -423,7 +440,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { public void visit(IncrementNode incrementNode) { switch (incrementNode.crementType) { case PREFIX: // ++i - if(incrementNode.assignableExpression.memberAccess == null) { // local Var + if (incrementNode.assignableExpression.memberAccess == null) { // local Var methodVisitor.visitIincInsn(localVaribales.indexOf(incrementNode.assignableExpression.identifier), 1); methodVisitor.visitVarInsn(ISTORE, localVaribales.indexOf(incrementNode.assignableExpression.identifier)); @@ -432,7 +449,7 @@ public class MethodCodeGen implements bytecode.visitor.MethodVisitor { } break; case SUFFIX: // i++ - if(incrementNode.assignableExpression.memberAccess == null) { // local Var + if (incrementNode.assignableExpression.memberAccess == null) { // local Var methodVisitor.visitVarInsn(ISTORE, localVaribales.indexOf(incrementNode.assignableExpression.identifier)); methodVisitor.visitIincInsn(localVaribales.indexOf(incrementNode.assignableExpression.identifier), 1); } else { // Field or var from other object diff --git a/src/main/java/bytecode/visitor/MethodVisitor.java b/src/main/java/bytecode/visitor/MethodVisitor.java index b1d3957..8baf220 100644 --- a/src/main/java/bytecode/visitor/MethodVisitor.java +++ b/src/main/java/bytecode/visitor/MethodVisitor.java @@ -37,9 +37,7 @@ public interface MethodVisitor { void visit(UnaryNode unaryExpressionNode); // statements - void visit(ElseNode elseNode); void visit(IfElseNode ifElseNode); - void visit(IfNode ifNode); void visit(LocalVariableDeclarationNode localVariableDeclarationNode); void visit(ReturnNode returnNode); From 90f91d58d1ad2618f66fcf89bb2c064f715f57ea Mon Sep 17 00:00:00 2001 From: i22007 Date: Thu, 27 Jun 2024 19:56:54 -0400 Subject: [PATCH 16/16] OutputDirectory --- src/main/java/ast/ProgramNode.java | 1 - src/main/java/ast/statements/WhileNode.java | 5 ++--- src/main/java/bytecode/ByteCodeGenerator.java | 19 +++++++++++++++++-- src/main/java/bytecode/ClassCodeGen.java | 13 +++++++------ 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/main/java/ast/ProgramNode.java b/src/main/java/ast/ProgramNode.java index b13d78e..f8ad19a 100644 --- a/src/main/java/ast/ProgramNode.java +++ b/src/main/java/ast/ProgramNode.java @@ -1,6 +1,5 @@ package ast; -import bytecode.visitor.MethodVisitor; import bytecode.visitor.ProgramVisitor; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; diff --git a/src/main/java/ast/statements/WhileNode.java b/src/main/java/ast/statements/WhileNode.java index 01c1160..35a7590 100644 --- a/src/main/java/ast/statements/WhileNode.java +++ b/src/main/java/ast/statements/WhileNode.java @@ -1,13 +1,12 @@ package ast.statements; -import ast.ASTNode; import ast.expressions.IExpressionNode; import semantic.SemanticVisitor; import typechecker.TypeCheckResult; public class WhileNode implements IStatementNode { - IExpressionNode expression; - BlockNode block; + public IExpressionNode expression; + public BlockNode block; public WhileNode(IExpressionNode expression, BlockNode block) { this.expression = expression; diff --git a/src/main/java/bytecode/ByteCodeGenerator.java b/src/main/java/bytecode/ByteCodeGenerator.java index 1fb4ec4..280bda1 100644 --- a/src/main/java/bytecode/ByteCodeGenerator.java +++ b/src/main/java/bytecode/ByteCodeGenerator.java @@ -2,6 +2,8 @@ package bytecode; import ast.ProgramNode; import ast.ClassNode; +import ast.members.MainMethodNode; +import ast.members.MemberNode; import bytecode.visitor.ProgramVisitor; import java.io.ByteArrayOutputStream; @@ -27,7 +29,20 @@ public class ByteCodeGenerator implements ProgramVisitor { try { Manifest manifest = new Manifest(); manifest.getMainAttributes().putValue("Manifest-Version", "1.0"); - manifest.getMainAttributes().putValue("Main-Class", programNode.classes.get(0).identifier); + boolean foundMainClass = false; + for (ClassNode classNode : programNode.classes) { + if (foundMainClass) { + break; + } + for (MemberNode memberNode : classNode.members) { + if (memberNode instanceof MainMethodNode) { + manifest.getMainAttributes().putValue("Main-Class", classNode.identifier); + foundMainClass = true; + break; + } + } + } + jarOutputStream = new JarOutputStream(byteArrayOutputStream, manifest); } catch (IOException e) { @@ -35,7 +50,7 @@ public class ByteCodeGenerator implements ProgramVisitor { } for (ClassNode classDeclarationNode : programNode.classes) { - ClassCodeGen classCodeGen = new ClassCodeGen(jarOutputStream); + ClassCodeGen classCodeGen = new ClassCodeGen(jarOutputStream, outputDirectory); classDeclarationNode.accept(classCodeGen); } diff --git a/src/main/java/bytecode/ClassCodeGen.java b/src/main/java/bytecode/ClassCodeGen.java index f58608c..3fec11a 100644 --- a/src/main/java/bytecode/ClassCodeGen.java +++ b/src/main/java/bytecode/ClassCodeGen.java @@ -22,10 +22,12 @@ public class ClassCodeGen implements ClassVisitor { private Mapper mapper; private ClassWriter classWriter; private JarOutputStream jarOutputStream; + private String outputDirectory; - public ClassCodeGen(JarOutputStream jarOutputStream) { + public ClassCodeGen(JarOutputStream jarOutputStream, String outputDirectory) { mapper = new Mapper(); this.jarOutputStream = jarOutputStream; + this.outputDirectory = outputDirectory; } @Override @@ -45,7 +47,7 @@ public class ClassCodeGen implements ClassVisitor { classWriter.visitEnd(); writeToJar(classWriter.toByteArray(), classNode.identifier); - printIntoClassFile(classWriter.toByteArray(), classNode.identifier); + printIntoClassFile(classWriter.toByteArray(), classNode.identifier, outputDirectory); classWriter.visitEnd(); } @@ -58,14 +60,13 @@ public class ClassCodeGen implements ClassVisitor { classWriter.visitEnd(); } - private void printIntoClassFile(byte[] byteCode, String name) { - String directoryPath = "src/main/resources/classFileOutput"; - File directory = new File(directoryPath); + private void printIntoClassFile(byte[] byteCode, String name, String outputDirectory) { + File directory = new File(outputDirectory); if (!directory.exists()) { directory.mkdirs(); } - String filePath = directoryPath + "/" + name + ".class"; + String filePath = outputDirectory + "/" + name + ".class"; try { FileOutputStream fileOutputStream = new FileOutputStream(filePath); fileOutputStream.write(byteCode);