From 1fbec0d754e62b33ec51a718562885e6469f360b Mon Sep 17 00:00:00 2001 From: i22007 Date: Mon, 13 May 2024 20:15:17 +0200 Subject: [PATCH] First try with visitors --- src/main/java/Main.java | 2 +- src/main/java/ast/ClassNode.java | 9 ++++++++- src/main/java/ast/ProgramNode.java | 9 ++++++++- src/main/java/bytecode/ByteCodeGenerator.java | 10 ++++++---- src/main/java/bytecode/ClassCodeGen.java | 11 ++++++++--- src/main/java/bytecode/visitor/ClassVisitor.java | 7 +++++++ src/main/java/bytecode/visitor/ProgramVisitor.java | 7 +++++++ src/main/java/bytecode/visitor/Visitable.java | 11 +++++++++++ 8 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 src/main/java/bytecode/visitor/ClassVisitor.java create mode 100644 src/main/java/bytecode/visitor/ProgramVisitor.java create mode 100644 src/main/java/bytecode/visitor/Visitable.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java index bcb48c5..fd3f22a 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -48,6 +48,6 @@ public class Main { semanticAnalyzer.analyze(ast); ByteCodeGenerator byteCodeGenerator = new ByteCodeGenerator(); - byteCodeGenerator.generateByteCode(ast); + byteCodeGenerator.visit(ast); } } \ No newline at end of file diff --git a/src/main/java/ast/ClassNode.java b/src/main/java/ast/ClassNode.java index 2f27d08..a8e5516 100644 --- a/src/main/java/ast/ClassNode.java +++ b/src/main/java/ast/ClassNode.java @@ -5,10 +5,12 @@ import ast.member.MemberNode; import ast.type.AccessTypeNode; import ast.type.EnumAccessTypeNode; +import bytecode.visitor.ClassVisitor; +import bytecode.visitor.Visitable; import java.util.ArrayList; import java.util.List; -public class ClassNode extends ASTNode{ +public class ClassNode extends ASTNode implements Visitable { public IdentifierNode identifier; public AccessTypeNode accessType; public String name; @@ -33,4 +35,9 @@ public class ClassNode extends ASTNode{ members.add(0,constructor); } } + + @Override + public void accept(ClassVisitor classVisitor) { + classVisitor.visit(this); + } } diff --git a/src/main/java/ast/ProgramNode.java b/src/main/java/ast/ProgramNode.java index 1fcc193..85c0682 100644 --- a/src/main/java/ast/ProgramNode.java +++ b/src/main/java/ast/ProgramNode.java @@ -1,12 +1,19 @@ package ast; +import bytecode.visitor.ProgramVisitor; +import bytecode.visitor.Visitable; import java.util.ArrayList; import java.util.List; -public class ProgramNode extends ASTNode { +public class ProgramNode extends ASTNode implements Visitable { public List classes = new ArrayList<>(); public void addClass(ClassNode classNode) { classes.add(classNode); } + + @Override + public void accept(ProgramVisitor programVisitor) { + programVisitor.visit(this); + } } \ No newline at end of file diff --git a/src/main/java/bytecode/ByteCodeGenerator.java b/src/main/java/bytecode/ByteCodeGenerator.java index 0846386..5494255 100644 --- a/src/main/java/bytecode/ByteCodeGenerator.java +++ b/src/main/java/bytecode/ByteCodeGenerator.java @@ -2,13 +2,15 @@ package bytecode; import ast.ProgramNode; import ast.ClassNode; +import bytecode.visitor.ProgramVisitor; -public class ByteCodeGenerator { +public class ByteCodeGenerator implements ProgramVisitor { - public void generateByteCode(ProgramNode ast) { - for (ClassNode classDeclarationNode : ast.classes) { + @Override + public void visit(ProgramNode programNode) { + for (ClassNode classDeclarationNode : programNode.classes) { ClassCodeGen classCodeGen = new ClassCodeGen(); - classCodeGen.generateClassCode(classDeclarationNode); + classDeclarationNode.accept(classCodeGen); } } } diff --git a/src/main/java/bytecode/ClassCodeGen.java b/src/main/java/bytecode/ClassCodeGen.java index 1e931c0..d278901 100644 --- a/src/main/java/bytecode/ClassCodeGen.java +++ b/src/main/java/bytecode/ClassCodeGen.java @@ -1,9 +1,12 @@ package bytecode; import ast.ClassNode; +import ast.ProgramNode; import ast.member.FieldNode; import ast.member.MemberNode; import ast.member.MethodNode; +import bytecode.visitor.ClassVisitor; +import bytecode.visitor.ProgramVisitor; import java.io.File; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; @@ -11,12 +14,14 @@ import org.objectweb.asm.Opcodes; import java.io.FileOutputStream; import java.io.IOException; -public class ClassCodeGen { - public void generateClassCode(ClassNode classNode) { +public class ClassCodeGen implements ClassVisitor { + + @Override + public void visit(ClassNode classNode) { ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); Mapper mapper = new Mapper(); classWriter.visit(Opcodes.V1_8, mapper.mapAccesTypeToOpcode(classNode.accessType), classNode.name, null, - "java/lang/Object", null); + "java/lang/Object", null); for (MemberNode memberNode : classNode.members) { if (memberNode instanceof FieldNode) { diff --git a/src/main/java/bytecode/visitor/ClassVisitor.java b/src/main/java/bytecode/visitor/ClassVisitor.java new file mode 100644 index 0000000..85d1c15 --- /dev/null +++ b/src/main/java/bytecode/visitor/ClassVisitor.java @@ -0,0 +1,7 @@ +package bytecode.visitor; + +import ast.ClassNode; + +public interface ClassVisitor { + void visit(ClassNode classNode); +} diff --git a/src/main/java/bytecode/visitor/ProgramVisitor.java b/src/main/java/bytecode/visitor/ProgramVisitor.java new file mode 100644 index 0000000..d569ec6 --- /dev/null +++ b/src/main/java/bytecode/visitor/ProgramVisitor.java @@ -0,0 +1,7 @@ +package bytecode.visitor; + +import ast.ProgramNode; + +public interface ProgramVisitor { + void visit(ProgramNode programNode); +} diff --git a/src/main/java/bytecode/visitor/Visitable.java b/src/main/java/bytecode/visitor/Visitable.java new file mode 100644 index 0000000..af7a369 --- /dev/null +++ b/src/main/java/bytecode/visitor/Visitable.java @@ -0,0 +1,11 @@ +package bytecode.visitor; + +public interface Visitable { + + default void accept(ProgramVisitor programVisitor) { + + } + default void accept(ClassVisitor classVisitor) { + + } +}