diff options
Diffstat (limited to 'src/Compiler/Translator.java')
-rw-r--r-- | src/Compiler/Translator.java | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/Compiler/Translator.java b/src/Compiler/Translator.java new file mode 100644 index 0000000..b62df63 --- /dev/null +++ b/src/Compiler/Translator.java @@ -0,0 +1,123 @@ +package Compiler; + +import java.util.ArrayList; +import java.util.List; + +import Compiler.Expression.*; +import Compiler.Statement.*; + + +public class Translator{ + + List<String> CCode = new ArrayList<>(); + private Environment environment = new Environment(); + + + public List<String> compileToC(List<Statement> statements){ + CCode.add("#include <stdio.h>"); + CCode.add("int main(){"); + try{ + for (Statement statement: statements){ + evaluateStatement(statement); + } + } catch (Error e){ + + } + CCode.add("}"); + + for(String t:CCode){ + System.out.println(t); + } + System.out.println(""); + return CCode; + } + + private void evaluateStatement(Statement statement){ + switch(statement.getStatmentType()){ + case "exprStmt": + evalExpressionStatement((ExpressionStatement)statement); + break; + case "vardec": + evalVariableDeclaration((VariableDeclaration)statement); + break; + case "print": + evalPrintStatement((PrintStatement)statement); + break; + } + } + private void evalExpressionStatement(ExpressionStatement stmt){ + evaluateExpression(stmt.expr); + } + + private void evalVariableDeclaration(VariableDeclaration vardec){ + environment.defineVariable(vardec.name.text, null); + CCode.add("int "+vardec.name.text+";"); + } + + private void evalPrintStatement(PrintStatement print){ + CCode.add("printf(\"%d\","+evaluateExpression(print.expr)+");"); + } + + private String evaluateExpression(Expression expression){ + switch(expression.getExpressionType()){ + case "binary": + return evaluateBinaryExpression((Binary)expression); + case "literal": + return evaluateLiteralExpression((Literal)expression); + case "bracket": + return evaluateBracketedExpression((BracketedExpression)expression); + case "assign": + evaluateAssignmentExpression((AssignmentExpression)expression); + return ""; + case "var": + return evaluateVariableExpression((Variable)expression); + default: + return null; + } + } + + private String evaluateBinaryExpression(Binary expr){ + switch (expr.op.type){ + case PLUS: + //return "leftEval+rightEval" + return evaluateExpression(expr.left)+"+"+evaluateExpression(expr.right); + case STAR: + return evaluateExpression(expr.left)+"*"+evaluateExpression(expr.right); + case MINUS: + return evaluateExpression(expr.left)+"-"+evaluateExpression(expr.right); + case SLASH: + return evaluateExpression(expr.left)+"/"+evaluateExpression(expr.right); + case GREATER: + return evaluateExpression(expr.left)+">"+evaluateExpression(expr.right); + case LESS: + return evaluateExpression(expr.left)+"<"+evaluateExpression(expr.right); + case EQUALITY: + return evaluateExpression(expr.left)+"=="+evaluateExpression(expr.right); + default: + break; + } + return null; + } + + private String evaluateLiteralExpression(Literal expr){ + return (expr.value.value).toString(); + } + + private String evaluateBracketedExpression(BracketedExpression expr){ + return evaluateExpression(expr.expr); + } + + private void evaluateAssignmentExpression(AssignmentExpression expr){ + Object assignedValue = evaluateExpression(expr.value); + environment.assignVariable(expr.name.text, assignedValue); + CCode.add(expr.name.text+"="+evaluateExpression(expr.value)+";"); + } + + private String evaluateVariableExpression(Variable expr){ + return expr.name.text; + } + + +} + + |