diff options
Diffstat (limited to 'src/main/java/no/eliashaugsbakk/kompilator/IRGeneration')
| -rw-r--r-- | src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneration.java | 4 | ||||
| -rw-r--r-- | src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java | 54 |
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)); + } + } + } +} |
