diff options
author | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-11-06 01:44:14 +0000 |
---|---|---|
committer | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-11-06 01:44:14 +0000 |
commit | 0c54d7f8cb4b17d80ed21f7a9916ad27a13e34ed (patch) | |
tree | d64267b7da1691bad8797f81188798fb9628a212 /src/Compiler/Translator.java | |
parent | d3c80f8bd236b1b4ed571ed6b347095efdaa99ed (diff) | |
download | esotericFORTRAN-0c54d7f8cb4b17d80ed21f7a9916ad27a13e34ed.tar.gz esotericFORTRAN-0c54d7f8cb4b17d80ed21f7a9916ad27a13e34ed.zip |
Re-arranged files and added C compilation
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; + } + + +} + + |