diff options
Diffstat (limited to 'src/Compiler/Translator.java')
-rw-r--r-- | src/Compiler/Translator.java | 78 |
1 files changed, 76 insertions, 2 deletions
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; + } + } |