summaryrefslogtreecommitdiffstats
path: root/src/Compiler/Translator.java
blob: b62df632debd514b6b2c9d4c305fe80718df2665 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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;
    }


}