aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-06-28 09:24:34 +0100
committergingerBill <bill@gingerbill.org>2024-06-28 09:24:34 +0100
commit35651cfc173bc42f1afc19c4e2cec46501808dd0 (patch)
tree1b1cc4f682a7d7490218fb7aeec6c7eccf18d325
parentdde7cb6e7f1c9196286c924fae9e06f6a8f9b43f (diff)
Improve tokenization for false integer literals but not effect possible float literals
-rw-r--r--src/tokenizer.cpp28
1 files changed, 15 insertions, 13 deletions
diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp
index 8458062b6..2af41b881 100644
--- a/src/tokenizer.cpp
+++ b/src/tokenizer.cpp
@@ -432,8 +432,10 @@ gb_internal gb_inline i32 digit_value(Rune r) {
return 16; // NOTE(bill): Larger than highest possible
}
-gb_internal gb_inline void scan_mantissa(Tokenizer *t, i32 base) {
- base = 16; // always check for any possible letter
+gb_internal gb_inline void scan_mantissa(Tokenizer *t, i32 base, bool force_base) {
+ if (!force_base) {
+ base = 16; // always check for any possible letter
+ }
while (digit_value(t->curr_rune) < base || t->curr_rune == '_') {
advance_to_next_rune(t);
}
@@ -458,7 +460,7 @@ gb_internal void scan_number_to_token(Tokenizer *t, Token *token, bool seen_deci
token->string.len += 1;
token->pos.column -= 1;
token->kind = Token_Float;
- scan_mantissa(t, 10);
+ scan_mantissa(t, 10, true);
goto exponent;
}
@@ -468,7 +470,7 @@ gb_internal void scan_number_to_token(Tokenizer *t, Token *token, bool seen_deci
switch (t->curr_rune) {
case 'b': // Binary
advance_to_next_rune(t);
- scan_mantissa(t, 2);
+ scan_mantissa(t, 2, false);
if (t->curr - prev <= 2) {
tokenizer_err(t, "Invalid binary integer");
token->kind = Token_Invalid;
@@ -476,7 +478,7 @@ gb_internal void scan_number_to_token(Tokenizer *t, Token *token, bool seen_deci
goto end;
case 'o': // Octal
advance_to_next_rune(t);
- scan_mantissa(t, 8);
+ scan_mantissa(t, 8, false);
if (t->curr - prev <= 2) {
tokenizer_err(t, "Invalid octal integer");
token->kind = Token_Invalid;
@@ -484,7 +486,7 @@ gb_internal void scan_number_to_token(Tokenizer *t, Token *token, bool seen_deci
goto end;
case 'd': // Decimal
advance_to_next_rune(t);
- scan_mantissa(t, 10);
+ scan_mantissa(t, 10, false);
if (t->curr - prev <= 2) {
tokenizer_err(t, "Invalid explicitly decimal integer");
token->kind = Token_Invalid;
@@ -492,7 +494,7 @@ gb_internal void scan_number_to_token(Tokenizer *t, Token *token, bool seen_deci
goto end;
case 'z': // Dozenal
advance_to_next_rune(t);
- scan_mantissa(t, 12);
+ scan_mantissa(t, 12, false);
if (t->curr - prev <= 2) {
tokenizer_err(t, "Invalid dozenal integer");
token->kind = Token_Invalid;
@@ -500,7 +502,7 @@ gb_internal void scan_number_to_token(Tokenizer *t, Token *token, bool seen_deci
goto end;
case 'x': // Hexadecimal
advance_to_next_rune(t);
- scan_mantissa(t, 16);
+ scan_mantissa(t, 16, false);
if (t->curr - prev <= 2) {
tokenizer_err(t, "Invalid hexadecimal integer");
token->kind = Token_Invalid;
@@ -509,7 +511,7 @@ gb_internal void scan_number_to_token(Tokenizer *t, Token *token, bool seen_deci
case 'h': // Hexadecimal Float
token->kind = Token_Float;
advance_to_next_rune(t);
- scan_mantissa(t, 16);
+ scan_mantissa(t, 16, false);
if (t->curr - prev <= 2) {
tokenizer_err(t, "Invalid hexadecimal float");
token->kind = Token_Invalid;
@@ -534,12 +536,12 @@ gb_internal void scan_number_to_token(Tokenizer *t, Token *token, bool seen_deci
}
goto end;
default:
- scan_mantissa(t, 10);
+ scan_mantissa(t, 10, true);
goto fraction;
}
}
- scan_mantissa(t, 10);
+ scan_mantissa(t, 10, true);
fraction:
@@ -551,7 +553,7 @@ fraction:
advance_to_next_rune(t);
token->kind = Token_Float;
- scan_mantissa(t, 10);
+ scan_mantissa(t, 10, true);
}
exponent:
@@ -561,7 +563,7 @@ exponent:
if (t->curr_rune == '-' || t->curr_rune == '+') {
advance_to_next_rune(t);
}
- scan_mantissa(t, 10);
+ scan_mantissa(t, 10, false);
}
switch (t->curr_rune) {