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; case "ifStmt": evalIfStatement((IfStatement)statement); break; } } private void evalExpressionStatement(ExpressionStatement stmt){ evaluateExpression(stmt.expr); } private void evalVariableDeclaration(VariableDeclaration vardec){ environment.defineVariable(vardec.name.text, vardec.type); if(vardec.type.equals("int")){ CCode.add("int "+vardec.name.text+";"); } else if(vardec.type.equals("real")){ CCode.add("float "+vardec.name.text+";"); } } private void evalPrintStatement(PrintStatement print){ if(print.expr instanceof Expression.Literal){ if (((Expression.Literal)print.expr).type.equals("int")){ CCode.add("printf(\"%d\","+evaluateExpression(print.expr)+");"); } else if (((Expression.Literal)print.expr).type.equals("double")){ CCode.add("printf(\"%f\","+evaluateExpression(print.expr)+");"); } } else if (print.expr instanceof Expression.Variable){ Object varValue = environment.getVariable((((Expression.Variable)print.expr).name).text); if (varValue.equals("int")){ CCode.add("printf(\"%d\","+evaluateExpression(print.expr)+");"); } else if (varValue.equals("real")){ CCode.add("printf(\"%f\","+evaluateExpression(print.expr)+");"); } } } private void evalIfStatement(IfStatement ifstatement){ CCode.add("if("+evaluateExpression(ifstatement.condition)+"){"); for(Statement s:ifstatement.statements) { evaluateStatement(s); } if(ifstatement.elseStatements.size()>0){ CCode.add("}"); CCode.add("else {"); for(Statement s:ifstatement.elseStatements) { evaluateStatement(s); } } CCode.add("}"); } 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){ CCode.add(expr.name.text+"="+evaluateExpression(expr.value)+";"); } private String evaluateVariableExpression(Variable expr){ return expr.name.text; } }