summaryrefslogtreecommitdiffstats
path: root/src/Compiler/Translator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/Compiler/Translator.java')
-rw-r--r--src/Compiler/Translator.java78
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;
+ }
+
}