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;
}
}
|