summaryrefslogtreecommitdiff
path: root/src/main/java/no/eliashaugsbakk
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/no/eliashaugsbakk')
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGeneration.java4
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java54
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/Main.java9
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/asmGeneration/AssemblyBuilder.java4
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java4
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/semanticAnalysis/Analyzer.java4
-rw-r--r--src/main/java/no/eliashaugsbakk/kompilator/tokenization/Keywords.java4
7 files changed, 66 insertions, 17 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));
+ }
+ }
+ }
+}
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<String> IR = new IRGenerator(ast).generate();
-
- List<String> IR = List.of();
+ List<String> 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<String> KEYWORDS = Set.of("print");
+public class Keywords {
+ public static final Set<String> KEYWORDS = Set.of("skriv");
}