From f83be7809a5c9b4dcedcc184da59872552c97bb4 Mon Sep 17 00:00:00 2001 From: Elias Haugsbakk Date: Sat, 19 Sep 2026 01:16:24 +0200 Subject: Implement IR generator --- .../kompilator/IRGeneration/IRGeneration.java | 4 -- .../kompilator/IRGeneration/IRGenerator.java | 54 ++++++++++++++++++++++ .../java/no/eliashaugsbakk/kompilator/Main.java | 9 ++-- .../kompilator/asmGeneration/AssemblyBuilder.java | 4 +- .../eliashaugsbakk/kompilator/parsing/Parser.java | 4 +- .../kompilator/semanticAnalysis/Analyzer.java | 4 +- .../kompilator/tokenization/Keywords.java | 4 +- 7 files changed, 66 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneration.java create mode 100644 src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java (limited to 'src/main') 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 ir = new ArrayList<>(); + private int tempVarCounter = 0; + + + public IRGenerator(AST ast) { + this.ast = ast; + } + + public List 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)); + } + } + } +} diff --git a/src/main/java/no/eliashaugsbakk/kompilator/Main.java b/src/main/java/no/eliashaugsbakk/kompilator/Main.java index b1ad70a..f59420c 100644 --- a/src/main/java/no/eliashaugsbakk/kompilator/Main.java +++ b/src/main/java/no/eliashaugsbakk/kompilator/Main.java @@ -4,6 +4,7 @@ import java.util.List; import no.eliashaugsbakk.kompilator.IO.File; import no.eliashaugsbakk.kompilator.IO.FileReaderWriter; import no.eliashaugsbakk.kompilator.IO.FileReaderWriterException; +import no.eliashaugsbakk.kompilator.IRGeneration.IRGenerator; import no.eliashaugsbakk.kompilator.asmGeneration.AssemblyBuilder; import no.eliashaugsbakk.kompilator.assembleAndLink.AssemblerAndLinker; import no.eliashaugsbakk.kompilator.parsing.AST; @@ -56,15 +57,11 @@ public class Main { System.exit(1); } - // TODO: - // List IR = new IRGenerator(ast).generate(); - - List IR = List.of(); + List IR = new IRGenerator(ast).generate(); String assembly = new AssemblyBuilder().createAssembly(IR); - AssemblerAndLinker assemblerAndLinker = new AssemblerAndLinker(); - assemblerAndLinker.assembleAndLink(inputProgram.fileName(), assembly); + new AssemblerAndLinker().assembleAndLink(inputProgram.fileName(), assembly); System.exit(0); } diff --git a/src/main/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilder.java b/src/main/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilder.java index 94a753b..c039bcb 100644 --- a/src/main/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilder.java +++ b/src/main/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilder.java @@ -88,8 +88,8 @@ public class AssemblyBuilder { this.text.append(String.format(""" mov rax, 1 mov rdi, 1 - lea rsi, [%s] - lea rdx, [%d] + lea rsi, %s + mov rdx, %d syscall """, variableName, stringLength)); diff --git a/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java b/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java index 53af71c..712df22 100644 --- a/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java +++ b/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java @@ -41,8 +41,8 @@ public class Parser { } else if (token.type() == EOF) { break; } else { - IO.println("Unknown token: " + token.value() + ". Skipping..."); - position++; + throw new ParserException(token.line(), token.colum(), + "Unexpected token: " + token.value()); } } diff --git a/src/main/java/no/eliashaugsbakk/kompilator/semanticAnalysis/Analyzer.java b/src/main/java/no/eliashaugsbakk/kompilator/semanticAnalysis/Analyzer.java index 0b01b14..9452fc1 100644 --- a/src/main/java/no/eliashaugsbakk/kompilator/semanticAnalysis/Analyzer.java +++ b/src/main/java/no/eliashaugsbakk/kompilator/semanticAnalysis/Analyzer.java @@ -1,5 +1,7 @@ package no.eliashaugsbakk.kompilator.semanticAnalysis; +import static no.eliashaugsbakk.kompilator.tokenization.Keywords.KEYWORDS; + import no.eliashaugsbakk.kompilator.parsing.AST; import no.eliashaugsbakk.kompilator.parsing.node.Program; import no.eliashaugsbakk.kompilator.parsing.node.expression.Expression; @@ -41,7 +43,7 @@ public class Analyzer { } private void checkFunctionCall(FunctionCall call) throws SemanticException { - if (!call.functionName.equals("print")) { + if (!KEYWORDS.contains(call.functionName)) { throw new SemanticException("unknown function: " + call.functionName); } diff --git a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Keywords.java b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Keywords.java index f2f70d3..3b3bec9 100644 --- a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Keywords.java +++ b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Keywords.java @@ -2,6 +2,6 @@ package no.eliashaugsbakk.kompilator.tokenization; import java.util.Set; -class Keywords { - static final Set KEYWORDS = Set.of("print"); +public class Keywords { + public static final Set KEYWORDS = Set.of("skriv"); } -- cgit v1.2.3