lexer: hex literal floats and exponents

This commit is contained in:
2026-04-20 20:48:52 +02:00
parent 0e6a08d702
commit b6391d55f8
2 changed files with 38 additions and 3 deletions

View File

@@ -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

View File

@@ -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]);