summaryrefslogtreecommitdiffstats
path: root/src/Compiler/Translator.java
diff options
context:
space:
mode:
authorAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-06 01:44:14 +0000
committerAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-06 01:44:14 +0000
commit0c54d7f8cb4b17d80ed21f7a9916ad27a13e34ed (patch)
treed64267b7da1691bad8797f81188798fb9628a212 /src/Compiler/Translator.java
parentd3c80f8bd236b1b4ed571ed6b347095efdaa99ed (diff)
downloadesotericFORTRAN-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.java123
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;
+ }
+
+
+}
+
+