From 2edeaaaee3831b8841c6670bdd54491c1b757501 Mon Sep 17 00:00:00 2001 From: SirYwell Date: Tue, 6 May 2025 22:37:50 +0200 Subject: [PATCH] Fix semantic analysis of negative hexadecimals --- .../vads/compiler/parser/ast/LiteralTree.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/kit/kastel/vads/compiler/parser/ast/LiteralTree.java b/src/main/java/edu/kit/kastel/vads/compiler/parser/ast/LiteralTree.java index 22dfc81..986d66a 100644 --- a/src/main/java/edu/kit/kastel/vads/compiler/parser/ast/LiteralTree.java +++ b/src/main/java/edu/kit/kastel/vads/compiler/parser/ast/LiteralTree.java @@ -14,14 +14,18 @@ public record LiteralTree(String value, int base, Span span) implements Expressi } public OptionalLong parseValue() { - int begin = 0; int end = value.length(); - if (base == 16) { - begin = 2; // ignore 0x - } + return switch (base) { + case 16 -> parseHex(end); + case 10 -> parseDec(end); + default -> throw new IllegalArgumentException("unexpected base " + base); + }; + } + + private OptionalLong parseDec(int end) { long l; try { - l = Long.parseLong(value, begin, end, base); + l = Long.parseLong(value, 0, end, base); } catch (NumberFormatException _) { return OptionalLong.empty(); } @@ -31,4 +35,12 @@ public record LiteralTree(String value, int base, Span span) implements Expressi return OptionalLong.of(l); } + private OptionalLong parseHex(int end) { + try { + return OptionalLong.of(Integer.parseUnsignedInt(value, 2, end, 16)); + } catch (NumberFormatException e) { + return OptionalLong.empty(); + } + } + }