From b50c7e99603e9f85d82d700d62c16c4fcef88715 Mon Sep 17 00:00:00 2001 From: Geno <48206120+gabrielegenovese@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:57:56 +0200 Subject: Code generation (#20) Co-authored-by: geno Co-authored-by: Santo Cariotti --- src/ast/nodes/ReturnStmtNode.java | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'src/ast/nodes/ReturnStmtNode.java') diff --git a/src/ast/nodes/ReturnStmtNode.java b/src/ast/nodes/ReturnStmtNode.java index bb49ded..15c8d69 100644 --- a/src/ast/nodes/ReturnStmtNode.java +++ b/src/ast/nodes/ReturnStmtNode.java @@ -1,7 +1,9 @@ package ast.nodes; import ast.types.*; + import java.util.ArrayList; + import semanticanalysis.SemanticError; import semanticanalysis.SymbolTable; @@ -12,16 +14,23 @@ public class ReturnStmtNode implements Node { private final Node exprList; + // VERY scatchy + private int localvar; + private int paramNumber; + public ReturnStmtNode(Node exprList) { this.exprList = exprList; } @Override - public ArrayList checkSemantics(SymbolTable ST, int _nesting) { + public ArrayList checkSemantics(SymbolTable ST, int _nesting, FunctionType ft) { ArrayList errors = new ArrayList<>(); + // If I am in a "return", `ft` will be null. + this.localvar = ft.getLocalvarNum(); + this.paramNumber = ft.getParamNumber(); if (this.exprList != null) { - errors.addAll(this.exprList.checkSemantics(ST, _nesting)); + errors.addAll(this.exprList.checkSemantics(ST, _nesting, ft)); } return errors; @@ -36,10 +45,21 @@ public class ReturnStmtNode implements Node { return new VoidType(); } - // TODO: add code generation for return stmt @Override public String codeGeneration() { - return ""; + String expS = exprList.codeGeneration(); + for (int i = 0; i < localvar; i++) { + expS += "pop\n"; + } + return expS + + "popr RA\n" + + "addi SP " + paramNumber + "\n" + + "pop\n" + + "store FP 0(FP)\n" + + "move FP AL\n" + + "subi AL 1\n" + + "pop\n" + + "rsub RA\n"; } @Override -- cgit v1.2.3-71-g8e6c