package Compiler; import java.util.ArrayList; import java.util.List; import Compiler.Expression.*; import Compiler.Statement.*; public class Translator{ List CCode = new ArrayList<>(); private Environment environment = new Environment(); public List compileToC(List statements){ CCode.add("#include "); 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; } }