summaryrefslogtreecommitdiff
path: root/src/ast/nodes/FuncdefNode.java
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2024-06-30 13:45:57 +0200
committerGitHub <noreply@github.com>2024-06-30 13:45:57 +0200
commit8aa8b5834953cab15c0687608f4fafea2e6c61be (patch)
tree1835ae7c789136b4a6c44c12efd4247a0b96d893 /src/ast/nodes/FuncdefNode.java
parent7125bb27fedaafd5a56b5122e4251b182448ddac (diff)
parent06d7c8dee25c065b1a569337f34d3cd5e892a31d (diff)
Merge pull request #10 from boozec/check-semantics
Co-Authored-By: geno <gabriele.genovese2@studio.unibo.it> Co-Authored-By: L0P0P <grassoemanuele@live.com>
Diffstat (limited to 'src/ast/nodes/FuncdefNode.java')
-rw-r--r--src/ast/nodes/FuncdefNode.java33
1 files changed, 27 insertions, 6 deletions
diff --git a/src/ast/nodes/FuncdefNode.java b/src/ast/nodes/FuncdefNode.java
index 67bc772..c4f5846 100644
--- a/src/ast/nodes/FuncdefNode.java
+++ b/src/ast/nodes/FuncdefNode.java
@@ -1,7 +1,9 @@
package ast.nodes;
import java.util.ArrayList;
+import java.util.HashMap;
+import semanticanalysis.STentry;
import semanticanalysis.SemanticError;
import semanticanalysis.SymbolTable;
import ast.types.*;
@@ -11,9 +13,10 @@ import org.antlr.v4.runtime.tree.TerminalNode;
* Node for the `funcdef` statement of the grammar.
*/
public class FuncdefNode implements Node {
- private TerminalNode name;
- private Node paramlist;
- private Node block;
+
+ private final TerminalNode name;
+ private final Node paramlist;
+ private final Node block;
public FuncdefNode(TerminalNode name, Node paramlist, Node block) {
this.name = name;
@@ -23,13 +26,30 @@ public class FuncdefNode implements Node {
@Override
public ArrayList<SemanticError> checkSemantics(SymbolTable ST, int _nesting) {
- ArrayList<SemanticError> errors = new ArrayList<SemanticError>();
+ ArrayList<SemanticError> errors = new ArrayList();
+ int paramNumber = ((ParamlistNode) paramlist).getParamNumber();
+ Type returnType = this.block.typeCheck();
+ FunctionType ft = new FunctionType(paramNumber, returnType);
+
+ ST.insert(this.name.toString(), ft, _nesting, "");
+
+ HashMap<String, STentry> HM = new HashMap();
+
+ ST.add(HM);
+
+ ST.insert(this.name.toString(), ft, _nesting + 1, "");
if (paramlist != null) {
- errors.addAll(paramlist.checkSemantics(ST, _nesting));
+ errors.addAll(paramlist.checkSemantics(ST, _nesting + 1));
}
- errors.addAll(block.checkSemantics(ST, _nesting));
+ // TODO: think to the fucking offset
+ // Offset is increased for the possible return value
+ ST.increaseoffset();
+
+ errors.addAll(block.checkSemantics(ST, _nesting + 1));
+
+ ST.remove();
return errors;
}
@@ -46,6 +66,7 @@ public class FuncdefNode implements Node {
return "";
}
+ @Override
public String toPrint(String prefix) {
String str = prefix + "Funcdef(" + name + ")\n";