summaryrefslogtreecommitdiff
path: root/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/no/eliashaugsbakk/kompilator/IRGeneration')
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneration.java4
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java54
2 files changed, 54 insertions, 4 deletions
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneration.java b/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneration.java
deleted file mode 100644
index f37db3d..0000000
--- a/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneration.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package no.eliashaugsbakk.kompilator.IRGeneration;
-
-public class IRGeneration {
-}
diff --git a/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java b/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java
new file mode 100644
index 0000000..55b349e
--- /dev/null
+++ b/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java
@@ -0,0 +1,54 @@
+package no.eliashaugsbakk.kompilator.IRGeneration;
+
+import java.util.ArrayList;
+import java.util.List;
+import no.eliashaugsbakk.kompilator.parsing.AST;
+import no.eliashaugsbakk.kompilator.parsing.node.Program;
+import no.eliashaugsbakk.kompilator.parsing.node.expression.Expression;
+import no.eliashaugsbakk.kompilator.parsing.node.expression.FunctionCall;
+import no.eliashaugsbakk.kompilator.parsing.node.expression.StringLiteral;
+import no.eliashaugsbakk.kompilator.parsing.node.statement.ExpressionStatement;
+import no.eliashaugsbakk.kompilator.parsing.node.statement.Statement;
+
+public class IRGenerator {
+ private final AST ast;
+ private final List<String> ir = new ArrayList<>();
+ private int tempVarCounter = 0;
+
+
+ public IRGenerator(AST ast) {
+ this.ast = ast;
+ }
+
+ public List<String> generate() {
+ Program program = (Program) ast.getRoot();
+
+ for (Statement stmt : program.statements) {
+ generateStatement(stmt);
+ }
+
+ return ir;
+ }
+
+ private void generateStatement(Statement stmt) {
+ if (stmt instanceof ExpressionStatement exprStmt) {
+ generateExpression(exprStmt.expression);
+ }
+ }
+
+ private void generateExpression(Expression expr) {
+ if (expr instanceof FunctionCall call) {
+ generateFunctionCall(call);
+ }
+ }
+
+ private void generateFunctionCall(FunctionCall call) {
+ for (Expression arg : call.arguments) {
+ if (arg instanceof StringLiteral stringLit) {
+ String tempVar = "t" + (tempVarCounter++);
+ ir.add(tempVar + ": string = \"" + stringLit.value + "\"");
+ ir.add(String.format("print(%s)", tempVar));
+ }
+ }
+ }
+}