From b6391d55f80c8c40717f5f3913b8f20a24b36edb Mon Sep 17 00:00:00 2001 From: Blendi Date: Mon, 20 Apr 2026 20:48:52 +0200 Subject: [PATCH] lexer: hex literal floats and exponents --- src/lexer.c | 37 ++++++++++++++++++++++++++++++++++++- src/main.c | 4 ++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/lexer.c b/src/lexer.c index a28be50..25cb142 100644 --- a/src/lexer.c +++ b/src/lexer.c @@ -92,11 +92,46 @@ noom_uint_t noomL_getnumber(const char* s, noomL_ErrorType* error, noom_LuaVersi len++; } + if (version >= NOOM_VERSION_52) { // 5.2 added exponent and decimal to hex literals. + + if (s[len] == '.') { // decimals in hex. smh. + len++; + + while (noomL_ishex(s[len])) { + len++; + } + + if (len == 3) { // only 0x. is a malformed number, even if followed by an exponent + *error = NOOML_ERROR_MALFORMED_NUM; + return 0; + } + } + + if (noomL_lower(s[len]) == 'p') { + len++; + + // sign for exponent + if (s[len] == '-' || s[len] == '+') len++; + + noom_uint_t slen = len; + + while (noomL_ishex(s[len])) { + len++; + } + + if (slen == len) { // nothing after `p` + *error = NOOML_ERROR_MALFORMED_NUM; + return 0; + } + } + + } + if (len == 2) { // nothing after the x; malformed number. *error = NOOML_ERROR_MALFORMED_NUM; return 0; } - + return len; } else { while (noomL_isnumber(s[len])) { // int part diff --git a/src/main.c b/src/main.c index c5ba517..1582e5f 100644 --- a/src/main.c +++ b/src/main.c @@ -33,14 +33,14 @@ void print_node(noomP_Node* node, noom_uint_t depth) { int main(int argc, char** argv) { // uhh uhhh uhhhhh - const char* code = "local a = 0xff + 5e-2 + .1e2"; + const char* code = "local a = 0x0.1E"; noom_uint_t pos = 0; printf("LEX OUTPUT:\n"); noomL_Token token; while (1) { - noomL_lex(code, pos, &token, NOOM_VERSION_51); + noomL_lex(code, pos, &token, NOOM_VERSION_54); printf("%s ", noomL_formatTokenType(token.type)); for (noom_uint_t i = 0; i < token.length; i++) putchar((code + token.offset)[i]);