From e7720e2d9e1319712f85cb0527e17f1251bd7d2c Mon Sep 17 00:00:00 2001 From: Elias Haugsbakk Date: Mon, 21 Sep 2026 14:36:59 +0200 Subject: add position info to semantic and IRgen exceptions --- .../kompilator/tokenization/Lexer.java | 34 ++++++++++++---------- .../kompilator/tokenization/Position.java | 4 +++ .../kompilator/tokenization/Token.java | 2 +- 3 files changed, 24 insertions(+), 16 deletions(-) create mode 100644 src/main/java/no/eliashaugsbakk/kompilator/tokenization/Position.java (limited to 'src/main/java/no/eliashaugsbakk/kompilator/tokenization') diff --git a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java index 149835d..517f0e5 100644 --- a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java +++ b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Lexer.java @@ -72,7 +72,7 @@ public class Lexer { position++; } - tokens.add(new Token(EOF, "End of File", line, column)); + tokens.add(new Token(EOF, "End of File", new Position(line, column))); if (Main.VERBOSE) { IO.println("======= Lexer ======="); tokens.forEach(token -> IO.println(token.type().toString() + ": " + token.value())); @@ -99,20 +99,20 @@ public class Lexer { state = IN_WORD; wordBuffer.append(current); } else if (current == ':') { - tokens.add(new Token(COLON, ":", line, column)); + tokens.add(new Token(COLON, ":", new Position(line, column))); state = IN_TYPE; position++; // Skip whitespace } else if (current == '=') { - tokens.add(new Token(ASSIGN, "=", line, column)); + tokens.add(new Token(ASSIGN, "=", new Position(line, column))); } else if (current == '(') { - tokens.add(new Token(LPAREN, "(", line, column)); + tokens.add(new Token(LPAREN, "(", new Position(line, column))); } else if (current == ')') { - tokens.add(new Token(RPAREN, ")", line, column)); + tokens.add(new Token(RPAREN, ")", new Position(line, column))); } else if (current == ';') { - tokens.add(new Token(SEMICOLON, ";", line, column)); + tokens.add(new Token(SEMICOLON, ";", new Position(line, column))); } else if (current == ',') { - tokens.add(new Token(COMMA, ",", line, column)); + tokens.add(new Token(COMMA, ",", new Position(line, column))); } } @@ -124,12 +124,14 @@ public class Lexer { if (current == '?') { state = NORMAL; - tokens.add(new Token(TYPE, wordBuffer.toString(), line, column - wordBuffer.length())); - tokens.add(new Token(NULLABLE, "?", line, column)); + tokens.add( + new Token(TYPE, wordBuffer.toString(), new Position(line, column - wordBuffer.length()))); + tokens.add(new Token(NULLABLE, "?", new Position(line, column))); clearWordBuffer(); } else if (Character.isWhitespace(current) || current == '=' || current == ';') { state = NORMAL; - tokens.add(new Token(TYPE, wordBuffer.toString(), line, column - wordBuffer.length())); + tokens.add( + new Token(TYPE, wordBuffer.toString(), new Position(line, column - wordBuffer.length()))); clearWordBuffer(); } else { wordBuffer.append(current); @@ -138,7 +140,7 @@ public class Lexer { private void inString() { if (current == '"') { - tokens.add(new Token(STRING_LITERAL, wordBuffer.toString(), line, column)); + tokens.add(new Token(STRING_LITERAL, wordBuffer.toString(), new Position(line, column))); wordBuffer.delete(0, wordBuffer.length()); state = NORMAL; position++; // skip closing " @@ -172,15 +174,17 @@ public class Lexer { private void characterizeWord() { if (Keywords.KEYWORDS.contains(wordBuffer.toString())) { if (wordBuffer.toString().contentEquals("set")) { - tokens.add(new Token(KEYWORD, "set", line, column)); + tokens.add(new Token(KEYWORD, "set", new Position(line, column))); } else if (wordBuffer.toString().contentEquals("mut")) { - tokens.add(new Token(KEYWORD, "mut", line, column)); + tokens.add(new Token(KEYWORD, "mut", new Position(line, column))); } else { // this is a function call - tokens.add(new Token(KEYWORD, wordBuffer.toString(), line, column - wordBuffer.length())); + tokens.add(new Token(KEYWORD, wordBuffer.toString(), + new Position(line, column - wordBuffer.length()))); } } else { - tokens.add(new Token(IDENTIFIER, wordBuffer.toString(), line, column - wordBuffer.length())); + tokens.add(new Token(IDENTIFIER, wordBuffer.toString(), + new Position(line, column - wordBuffer.length()))); } clearWordBuffer(); } diff --git a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Position.java b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Position.java new file mode 100644 index 0000000..dea3050 --- /dev/null +++ b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Position.java @@ -0,0 +1,4 @@ +package no.eliashaugsbakk.kompilator.tokenization; + +public record Position(int line, int column) { +} diff --git a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Token.java b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Token.java index 1cab703..8dfb912 100644 --- a/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Token.java +++ b/src/main/java/no/eliashaugsbakk/kompilator/tokenization/Token.java @@ -1,4 +1,4 @@ package no.eliashaugsbakk.kompilator.tokenization; -public record Token(TokenType type, String value, int line, int column) { +public record Token(TokenType type, String value, Position position) { } -- cgit v1.2.3