From d0f3f3b9386ba0b2ee8520150074ff487fdc8c75 Mon Sep 17 00:00:00 2001 From: StefanZ3 Date: Mon, 13 May 2024 22:04:02 +0200 Subject: [PATCH] change methods in ASTGenerator --- src/main/java/ASTGenerator.java | 38 ++++++++++++++----- .../abstractSyntaxTree/Class/RefType.java | 4 +- .../Statement/IStatement.java | 3 +- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/main/java/ASTGenerator.java b/src/main/java/ASTGenerator.java index 869ecce..b629df4 100644 --- a/src/main/java/ASTGenerator.java +++ b/src/main/java/ASTGenerator.java @@ -18,7 +18,6 @@ public class ASTGenerator extends DecafBaseVisitor { public Node visitProgram(DecafParser.ProgramContext ctx) { List classes = new ArrayList<>(); for (DecafParser.ClassdeclContext classDecl : ctx.classdecl()) { - // Node refType = new RefType(classDecl.Identifier().getText(), new ArrayList<>(), new ArrayList<>()); classes.add((RefType) visit(classDecl)); } return new Program(classes); @@ -28,13 +27,22 @@ public class ASTGenerator extends DecafBaseVisitor { public Node visitClassdecl(DecafParser.ClassdeclContext ctx) { List fieldDecls = new ArrayList<>(); List methodDecls = new ArrayList<>(); + boolean hasMain; + if(ctx.MainMethodDecl() != null) { + hasMain = true; + } else { + hasMain = false; + } for (DecafParser.LocalVarDeclContext fieldDecl: ctx.localVarDecl()) { fieldDecls.add((FieldDecl) visit(fieldDecl)); } + for (DecafParser.ConstuctorDeclContext constDecl: ctx.constuctorDecl()) { + methodDecls.add((MethodDecl) visit(constDecl)); + } for (DecafParser.MethodDeclContext methodDecl: ctx.methodDecl()) { methodDecls.add((MethodDecl) visit(methodDecl)); } - return new RefType(ctx.Identifier().getText(),fieldDecls, methodDecls); + return new RefType(ctx.Identifier().getText(),fieldDecls, methodDecls, hasMain); } @Override @@ -42,25 +50,37 @@ public class ASTGenerator extends DecafBaseVisitor { return new FieldDecl(ctx.type().getText(), ctx.Identifier().getText()); } + @Override + public Node visitConstuctorDecl(DecafParser.ConstuctorDeclContext ctx) { + String name = ctx.Identifier().getText(); + ParameterList parameterList = (ParameterList) visit(ctx.parameterList()); + return new MethodDecl("", "", name, parameterList, new BlockStatement(new ArrayList<>(), "void")); + } + @Override public Node visitMethodDecl(DecafParser.MethodDeclContext ctx) { String type; String name = ctx.Identifier().getText(); - List parameterList = new ArrayList<>(); - if (ctx.Void() != null) { + ParameterList parameterList = (ParameterList) visit(ctx.parameterList()); + if (ctx.Void() != null) { type = "void"; } else { type = ctx.type().getText(); } - DecafParser.ParameterListContext parameterListContext = ctx.parameterList(); - for (DecafParser.ParameterContext parameter: parameterListContext.parameter()) { - parameterList.add((Parameter) visit(parameter)); - } - return new MethodDecl("", type , name, new ParameterList(parameterList), new BlockStatement(new ArrayList<>(), "void")); + return new MethodDecl("", type , name, parameterList, new BlockStatement(new ArrayList<>(), "void")); } @Override public Node visitParameter(DecafParser.ParameterContext ctx) { return new Parameter(ctx.type().getText(), ctx.Identifier().getText()); } + + @Override + public Node visitParameterList(DecafParser.ParameterListContext ctx) { + List parameters = new ArrayList<>(); + for (DecafParser.ParameterContext parameter: ctx.parameter()) { + parameters.add((Parameter) visit(parameter)); + } + return new ParameterList(parameters); + } } diff --git a/src/main/java/abstractSyntaxTree/Class/RefType.java b/src/main/java/abstractSyntaxTree/Class/RefType.java index 7cd2519..74a1b3c 100644 --- a/src/main/java/abstractSyntaxTree/Class/RefType.java +++ b/src/main/java/abstractSyntaxTree/Class/RefType.java @@ -19,11 +19,13 @@ public class RefType extends AbstractType implements IClass, Node { public RefType(String name, List fieldDecls, - List methodDecls + List methodDecls, + boolean hasMain ){ this.name = name; this.fieldDecls = fieldDecls; this.methodDecls = methodDecls; + this.hasMain = hasMain; } public TypeCheckResult typeCheck(HashMap>>> methodContext, diff --git a/src/main/java/abstractSyntaxTree/Statement/IStatement.java b/src/main/java/abstractSyntaxTree/Statement/IStatement.java index bcc5162..0760a99 100644 --- a/src/main/java/abstractSyntaxTree/Statement/IStatement.java +++ b/src/main/java/abstractSyntaxTree/Statement/IStatement.java @@ -1,12 +1,13 @@ package abstractSyntaxTree.Statement; import TypeCheck.TypeCheckResult; +import abstractSyntaxTree.Node; import org.objectweb.asm.MethodVisitor; import java.util.HashMap; import java.util.List; -public interface IStatement { +public interface IStatement extends Node {