feat: support binary octal and hexadecimal integer literals

This commit is contained in:
2026-10-29 21:14:06 +01:00
parent e804f027f3
commit 00984d1728
5 changed files with 184 additions and 5 deletions
+29
View File
@@ -411,6 +411,35 @@ lex :: proc(
case:
if value >= '0' && value <= '9' {
start := cursor
base: byte
if value == '0' && cursor+1 < len(bytes) {
switch bytes[cursor+1] {
case 'b', 'B': base = 2
case 'o', 'O': base = 8
case 'x', 'X': base = 16
}
}
if base != 0 {
cursor += 2
digits_start := cursor
valid := true
for cursor < len(bytes) && is_identifier_continue(bytes[cursor]) {
digit := bytes[cursor]
valid = valid && is_hex_digit(digit) && (base == 16 || digit-'0' < base)
cursor += 1
}
if !valid || cursor == digits_start {
id := source.add(
diagnostics,
source.Span{file=source_file.id, start=source.Offset(start), end=source.Offset(cursor)},
"invalid digits in prefixed integer literal",
)
append_token(&stream, source_file, .Invalid, start, cursor, diagnostic=id)
} else {
append_token(&stream, source_file, .Integer, start, cursor)
}
continue
}
for cursor < len(bytes) && bytes[cursor] >= '0' && bytes[cursor] <= '9' {
cursor += 1
}