From fc73bce943e6a918f2f1a28801b0bed5fff4232e Mon Sep 17 00:00:00 2001 From: aNNiMON Date: Sat, 9 Sep 2023 21:58:32 +0300 Subject: [PATCH] Add columns in position information --- .../ownlang/exceptions/LexerException.java | 8 +++++--- .../com/annimon/ownlang/parser/Lexer.java | 4 ++-- .../annimon/ownlang/parser/ParseError.java | 20 ++----------------- .../annimon/ownlang/parser/ParseErrors.java | 4 ++-- .../com/annimon/ownlang/parser/Parser.java | 12 +++++------ .../java/com/annimon/ownlang/parser/Pos.java | 12 +++++++++++ .../com/annimon/ownlang/parser/Token.java | 8 ++------ .../com/annimon/ownlang/parser/LexerTest.java | 6 +++--- .../java/com/annimon/ownlang/utils/Repl.java | 7 ++----- 9 files changed, 36 insertions(+), 45 deletions(-) create mode 100644 ownlang-parser/src/main/java/com/annimon/ownlang/parser/Pos.java diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/exceptions/LexerException.java b/ownlang-parser/src/main/java/com/annimon/ownlang/exceptions/LexerException.java index 26689e1..383e01f 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/exceptions/LexerException.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/exceptions/LexerException.java @@ -1,5 +1,7 @@ package com.annimon.ownlang.exceptions; +import com.annimon.ownlang.parser.Pos; + /** * * @author aNNiMON @@ -9,8 +11,8 @@ public final class LexerException extends RuntimeException { public LexerException(String message) { super(message); } - - public LexerException(int row, int col, String message) { - super("["+row+":"+col+"] " + message); + + public LexerException(Pos pos, String message) { + super(pos.format() + " " + message); } } \ No newline at end of file diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Lexer.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Lexer.java index 4bed518..746c5f0 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Lexer.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Lexer.java @@ -357,10 +357,10 @@ public final class Lexer { } private void addToken(TokenType type, String text) { - tokens.add(new Token(type, text, row, col)); + tokens.add(new Token(type, text, new Pos(row, col))); } private LexerException error(String text) { - return new LexerException(row, col, text); + return new LexerException(new Pos(row, col), text); } } diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ParseError.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ParseError.java index 7506552..b2e2e27 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ParseError.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ParseError.java @@ -1,25 +1,9 @@ package com.annimon.ownlang.parser; -public final class ParseError { - - private final int line; - private final Exception exception; - - public ParseError(int line, Exception exception) { - this.line = line; - this.exception = exception; - } - - public int getLine() { - return line; - } - - public Exception getException() { - return exception; - } +public record ParseError(Exception exception, Pos pos) { @Override public String toString() { - return "ParseError on line " + line + ": " + exception.getMessage(); + return "ParseError on line " + pos.row() + ": " + exception; } } diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ParseErrors.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ParseErrors.java index 8387349..4d1c44f 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ParseErrors.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ParseErrors.java @@ -17,8 +17,8 @@ public final class ParseErrors implements Iterable { errors.clear(); } - public void add(Exception ex, int line) { - errors.add(new ParseError(line, ex)); + public void add(Exception ex, Pos pos) { + errors.add(new ParseError(ex, pos)); } public boolean hasErrors() { diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java index 626b0f5..aa6a0a0 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Parser.java @@ -22,7 +22,7 @@ public final class Parser { return program; } - private static final Token EOF = new Token(TokenType.EOF, "", -1, -1); + private static final Token EOF = new Token(TokenType.EOF, "", new Pos(-1, -1)); private static final EnumMap ASSIGN_OPERATORS; static { @@ -71,7 +71,7 @@ public final class Parser { try { result.add(statement()); } catch (Exception ex) { - parseErrors.add(ex, getErrorLine()); + parseErrors.add(ex, getErrorPos()); recover(); } } @@ -79,10 +79,10 @@ public final class Parser { return result; } - private int getErrorLine() { - if (size == 0) return 0; - if (pos >= size) return tokens.get(size - 1).row(); - return tokens.get(pos).row(); + private Pos getErrorPos() { + if (size == 0) return new Pos(0, 0); + if (pos >= size) return tokens.get(size - 1).pos(); + return tokens.get(pos).pos(); } private void recover() { diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Pos.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Pos.java new file mode 100644 index 0000000..75bf8b9 --- /dev/null +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Pos.java @@ -0,0 +1,12 @@ +package com.annimon.ownlang.parser; + +public record Pos(int row, int col) { + + public Pos normalize() { + return new Pos(Math.max(0, row - 1), Math.max(0, col - 1)); + } + + public String format() { + return "[" + row + ":" + col + "]"; + } +} diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Token.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Token.java index c9704cb..a271d22 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Token.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/Token.java @@ -3,14 +3,10 @@ package com.annimon.ownlang.parser; /** * @author aNNiMON */ -public record Token(TokenType type, String text, int row, int col) { - - public String position() { - return "[" + row + " " + col + "]"; - } +public record Token(TokenType type, String text, Pos pos) { @Override public String toString() { - return type.name() + " " + position() + " " + text; + return type.name() + " " + pos().format() + " " + text; } } diff --git a/ownlang-parser/src/test/java/com/annimon/ownlang/parser/LexerTest.java b/ownlang-parser/src/test/java/com/annimon/ownlang/parser/LexerTest.java index 0f05acb..6e081d3 100644 --- a/ownlang-parser/src/test/java/com/annimon/ownlang/parser/LexerTest.java +++ b/ownlang-parser/src/test/java/com/annimon/ownlang/parser/LexerTest.java @@ -172,11 +172,11 @@ public class LexerTest { } private static Token token(TokenType type) { - return token(type, "", 0, 0); + return token(type, "", new Pos(0, 0)); } - private static Token token(TokenType type, String text, int row, int col) { - return new Token(type, text, row, col); + private static Token token(TokenType type, String text, Pos pos) { + return new Token(type, text, pos); } } diff --git a/ownlang-utils/src/main/java/com/annimon/ownlang/utils/Repl.java b/ownlang-utils/src/main/java/com/annimon/ownlang/utils/Repl.java index 10ee60e..1e38482 100644 --- a/ownlang-utils/src/main/java/com/annimon/ownlang/utils/Repl.java +++ b/ownlang-utils/src/main/java/com/annimon/ownlang/utils/Repl.java @@ -7,10 +7,7 @@ import com.annimon.ownlang.exceptions.StoppedException; import com.annimon.ownlang.lib.Functions; import com.annimon.ownlang.lib.UserDefinedFunction; import com.annimon.ownlang.lib.Variables; -import com.annimon.ownlang.parser.Lexer; -import com.annimon.ownlang.parser.Parser; -import com.annimon.ownlang.parser.Token; -import com.annimon.ownlang.parser.TokenType; +import com.annimon.ownlang.parser.*; import com.annimon.ownlang.parser.ast.BlockStatement; import com.annimon.ownlang.parser.ast.Statement; import com.annimon.ownlang.parser.visitors.PrintVisitor; @@ -36,7 +33,7 @@ public final class Repl { RESET = ":reset", EXIT = ":exit"; - private static final Token PRINTLN_TOKEN = new Token(TokenType.PRINTLN, "", 0, 0); + private static final Token PRINTLN_TOKEN = new Token(TokenType.PRINTLN, "", new Pos(0, 0)); public static void main(String[] args) { System.out.println("Welcome to OwnLang " + Version.VERSION + " REPL");