summaryrefslogtreecommitdiffstats
path: root/src/ast/nodes/ReturnStmtNode.java
diff options
context:
space:
mode:
authorGeno <48206120+gabrielegenovese@users.noreply.github.com>2024-07-11 10:57:56 +0000
committerGitHub <noreply@github.com>2024-07-11 10:57:56 +0000
commitb50c7e99603e9f85d82d700d62c16c4fcef88715 (patch)
tree5052206f06e0426a43599cb236652614db04d22e /src/ast/nodes/ReturnStmtNode.java
parentf0692ff5f9e39cbd1c203e9d5abebf55a3d0f6fc (diff)
Code generation (#20)
Co-authored-by: geno <gabrigeno@gmail> Co-authored-by: Santo Cariotti <santo@dcariotti.me>
Diffstat (limited to 'src/ast/nodes/ReturnStmtNode.java')
-rw-r--r--src/ast/nodes/ReturnStmtNode.java28
1 files changed, 24 insertions, 4 deletions
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<SemanticError> checkSemantics(SymbolTable ST, int _nesting) {
+ public ArrayList<SemanticError> checkSemantics(SymbolTable ST, int _nesting, FunctionType ft) {
ArrayList<SemanticError> 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