From 43909b350b9084ed33f121a15c5770224cbdc79f Mon Sep 17 00:00:00 2001
From: AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>
Date: Sat, 4 Dec 2021 05:24:43 +0000
Subject: Added basic function support

---
 src/Compiler/Translator.java | 78 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 76 insertions(+), 2 deletions(-)

(limited to 'src/Compiler/Translator.java')

diff --git a/src/Compiler/Translator.java b/src/Compiler/Translator.java
index a79242d..e0bff23 100644
--- a/src/Compiler/Translator.java
+++ b/src/Compiler/Translator.java
@@ -16,15 +16,14 @@ public class Translator{
     public List<String> compileToC(List<Statement> statements, boolean printC){
         CCode.add("#include <stdio.h>");
         CCode.add("#include <string.h>");
-        CCode.add("int main(){");
         try{
             for (Statement statement: statements){
                 evaluateStatement(statement);
+                CCode.add("");
             }
         } catch (Error e){
 
         }
-        CCode.add("}");
 
         if (printC) {
             for(String t:CCode){
@@ -37,6 +36,15 @@ public class Translator{
 
     private void evaluateStatement(Statement statement){
         switch(statement.getStatmentType()){
+            case "main":
+                evalMainFunction((MainFunction)statement);
+                break;
+            case "function":
+                evalFunction((Function)statement);
+                break;
+            case "functionDec":
+                evalFunctionDeclaration((FunctionDeclaration)statement);
+                break;
             case "exprStmt":
                 evalExpressionStatement((ExpressionStatement)statement);
                 break;
@@ -64,8 +72,57 @@ public class Translator{
             case "dowhileStmt":
                 evalDoWhileStatement((DoWhileStatement)statement);
                 break;
+            case "return":
+                evalReturnStatement((ReturnStatement)statement);
+                break;
         }
     } 
+
+    private void evalMainFunction(MainFunction stmt){
+        CCode.add("int main(){");
+        evaluateStatement(stmt.block);
+        CCode.add("}");
+    }
+
+    private void evalFunction(Function stmt){
+
+        String functionString = stmt.returnType+" "+stmt.name.text+"(";
+        boolean first=true;
+        for(int i=0;i<stmt.arguments.size();i++){
+            if(!first){
+                functionString+=",";
+            }
+            environment.defineVariable(evaluateExpression(stmt.arguments.get(i)), stmt.argumentTypes.get(i));
+            functionString+=stmt.argumentTypes.get(i)+" "+evaluateExpression(stmt.arguments.get(i));
+            first=false;
+        }
+        functionString+="){";
+        CCode.add(functionString);
+        evaluateStatement(stmt.block);
+        CCode.add("}");
+    }
+
+    private void evalReturnStatement(ReturnStatement stmt){
+        CCode.add("return "+evaluateExpression(stmt.returnValue)+";");
+
+        
+    }
+
+    private void evalFunctionDeclaration(FunctionDeclaration stmt){
+
+        String functionString = stmt.returnType+" "+stmt.name.text+"(";
+        boolean first=true;
+        for(int i=0;i<stmt.argumentTypes.size();i++){
+            if(!first){
+                functionString+=",";
+            }
+            functionString+=stmt.argumentTypes.get(i);
+            first=false;
+        }
+        functionString+=");";
+        CCode.add(functionString);
+    }
+
     private void evalExpressionStatement(ExpressionStatement stmt){
         evaluateExpression(stmt.expr);
     }
@@ -192,6 +249,8 @@ public class Translator{
                 return evaluateArrayVariable((ArrayVariable)expression);
             case "var":
                 return evaluateVariableExpression((Variable)expression);
+            case "functCall":
+                return evaluateFunctionCall((FunctionCall)expression);
             default:
                 return null;
         }
@@ -287,6 +346,21 @@ public class Translator{
         return expr.name.text;
     }
 
+    private String evaluateFunctionCall(FunctionCall expr){
+        String functioncall="";
+        functioncall+=expr.name.text+"(";
+        boolean first=true;
+        for(Token arg:expr.arguments){
+            if(!first){
+                functioncall+=",";
+            }
+            functioncall+=arg.text;
+            first=false;
+        }
+        functioncall+=")";
+        return functioncall;
+    }
+
 
 
 }
-- 
cgit v1.2.3