diff --git a/src/main/java/com/auberer/compilerdesignlectureproject/ast/ASTFctDefNode.java b/src/main/java/com/auberer/compilerdesignlectureproject/ast/ASTFctDefNode.java index 4559545a..48ad9f33 100644 --- a/src/main/java/com/auberer/compilerdesignlectureproject/ast/ASTFctDefNode.java +++ b/src/main/java/com/auberer/compilerdesignlectureproject/ast/ASTFctDefNode.java @@ -30,8 +30,8 @@ public ASTTypeNode getType(){ public ASTParamLstNode getParams(){ return getChild(ASTParamLstNode.class,0); } - public ASTStmtLstNode getBody(){ - return getChild(ASTStmtLstNode.class,0); + public ASTLogicNode getBody(){ + return getChild(ASTLogicNode.class,0); } } diff --git a/src/main/java/com/auberer/compilerdesignlectureproject/ast/ASTParamLstNode.java b/src/main/java/com/auberer/compilerdesignlectureproject/ast/ASTParamLstNode.java index 0327e1b1..396618fc 100644 --- a/src/main/java/com/auberer/compilerdesignlectureproject/ast/ASTParamLstNode.java +++ b/src/main/java/com/auberer/compilerdesignlectureproject/ast/ASTParamLstNode.java @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.Setter; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -11,7 +12,7 @@ @Setter public class ASTParamLstNode extends ASTNode { - List paramNames; + List paramNames = new ArrayList<>(); @Override public T accept(ASTVisitor visitor) { diff --git a/src/main/java/com/auberer/compilerdesignlectureproject/parser/Parser.java b/src/main/java/com/auberer/compilerdesignlectureproject/parser/Parser.java index 1348a4a3..c5d71045 100644 --- a/src/main/java/com/auberer/compilerdesignlectureproject/parser/Parser.java +++ b/src/main/java/com/auberer/compilerdesignlectureproject/parser/Parser.java @@ -379,10 +379,12 @@ public ASTParamLstNode parseParamLst() { enterNode(node); parseType(); + node.addParamName(lexer.getToken().getText()); lexer.expect(TokenType.TOK_IDENTIFIER); while (lexer.getToken().getType() == TokenType.TOK_COMMA) { lexer.expect(TokenType.TOK_COMMA); parseType(); + node.addParamName(lexer.getToken().getText()); lexer.expect(TokenType.TOK_IDENTIFIER); } exitNode(node); diff --git a/src/main/java/com/auberer/compilerdesignlectureproject/sema/SymbolTableBuilder.java b/src/main/java/com/auberer/compilerdesignlectureproject/sema/SymbolTableBuilder.java index 493785e9..060e89fc 100644 --- a/src/main/java/com/auberer/compilerdesignlectureproject/sema/SymbolTableBuilder.java +++ b/src/main/java/com/auberer/compilerdesignlectureproject/sema/SymbolTableBuilder.java @@ -162,8 +162,9 @@ public Void visitFctDef(ASTFctDefNode node) { currentScopes.push(functionScope); - //visit(node.getBody()); + visit(node.getParams()); + visit(node.getBody()); currentScopes.pop(); @@ -194,8 +195,8 @@ public Void visitFctCall(ASTFctCallNode node) { visitChildren(node); - if (currentScopes.peek().lookupSymbolStrict(node.getName(), node) == null) { - throw new SemaError(node, "Function not defined"); + if (currentScopes.peek().lookupSymbol(node.getName(), node) == null) { + throw new SemaError(node, "Function with name " + node.getName() + " not defined"); } return null; diff --git a/src/test/java/com/auberer/compilerdesignlectureproject/parser/FunctionCallTest.java b/src/test/java/com/auberer/compilerdesignlectureproject/parser/FunctionCallTest.java index 2b07e4e5..6138c418 100644 --- a/src/test/java/com/auberer/compilerdesignlectureproject/parser/FunctionCallTest.java +++ b/src/test/java/com/auberer/compilerdesignlectureproject/parser/FunctionCallTest.java @@ -1,13 +1,13 @@ package com.auberer.compilerdesignlectureproject.parser; -import com.auberer.compilerdesignlectureproject.ast.ASTCallParamsNode; -import com.auberer.compilerdesignlectureproject.ast.ASTFctCallNode; +import com.auberer.compilerdesignlectureproject.ast.*; import com.auberer.compilerdesignlectureproject.lexer.Lexer; import com.auberer.compilerdesignlectureproject.lexer.Token; import com.auberer.compilerdesignlectureproject.lexer.TokenType; import com.auberer.compilerdesignlectureproject.reader.CodeLoc; import com.auberer.compilerdesignlectureproject.reader.Reader; import com.auberer.compilerdesignlectureproject.sema.SymbolTableBuilder; +import com.auberer.compilerdesignlectureproject.sema.SymbolTableEntry; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -61,14 +61,35 @@ void testFunctionCall() { @Test @DisplayName("Integration test for function call") void testIntegrationTestForFunctionCall() { - String fctDef = "call myFunc(7);"; + String fctDef = "func int myFunc(int x) int i = 17; return x; cnuf func int fn2() call myFunc(7); return 2; cnuf"; + Reader reader = new Reader(fctDef); Lexer lexer = new Lexer(reader, false); Parser parser = new Parser(lexer); - ASTFctCallNode astFctCallNode = parser.parseFctCall(); + ASTEntryNode parseNode = parser.parse(); + + ASTFctDefNode defNode = parseNode.getChild(ASTFctDefNode.class, 0); + ASTFctDefNode defWithCallNode = parseNode.getChild(ASTFctDefNode.class, 1); + + ASTFctCallNode callNode = defWithCallNode.getChild(ASTLogicNode.class, 0).getChild(ASTStmtLstNode.class, 0).getChild(ASTStmtNode.class, 0).getChild(ASTAssignStmtNode.class, 0).getChild(ASTLogicalExprNode.class, 0).getChild(ASTCompareExprNode.class, 0).getChild(ASTAdditiveExprNode.class, 0).getChild(ASTMultiplicativeExprNode.class, 0).getChild(ASTPrefixExprNode.class, 0).getChild(ASTAtomicExprNode.class, 0).getFctCall(); + SymbolTableBuilder symboltablebuilder = new SymbolTableBuilder(); + symboltablebuilder.visitFctDef(defNode); + symboltablebuilder.visitFctCall(callNode); + } - symboltablebuilder.visitFctCall(astFctCallNode); + private static void searchNodeForFctCallNode(ASTNode node, String path) { + if(node.getChildren().isEmpty()){ + System.out.println("no node found for path: " + path); + } + node.getChildren().forEach((child) -> { + if (child instanceof ASTFctCallNode) { + System.out.println(path + "ASTFctCallNode"); + } + else { + searchNodeForFctCallNode(child, path + child.getClass().toString()+ " -> "); + } + }); } }