diff options
| author | Elias Haugsbakk <[email protected]> | 2026-09-19 01:16:24 +0200 |
|---|---|---|
| committer | Elias Haugsbakk <[email protected]> | 2026-09-19 01:59:23 +0200 |
| commit | f83be7809a5c9b4dcedcc184da59872552c97bb4 (patch) | |
| tree | aa687c353cb9b3034b47aba4127dbcbc331e9e62 /src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java | |
| parent | ebdcb13d3a55e898a38b92e103b82fa44d822ddc (diff) | |
Implement IR generator
Diffstat (limited to 'src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java')
| -rw-r--r-- | src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java | 54 |
1 files changed, 54 insertions, 0 deletions
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)); + } + } + } +} |
