From 191515bbc33fa79745216699a4caa0bc11769163 Mon Sep 17 00:00:00 2001 From: "K. Lange" Date: Thu, 29 Feb 2024 00:29:59 +0900 Subject: [PATCH] Support exponential notation in lexer --- src/compiler.c | 3 ++- src/scanner.c | 6 ++++++ src/vendor/rline.c | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/compiler.c b/src/compiler.c index 214d7997..db3fc6af 100644 --- a/src/compiler.c +++ b/src/compiler.c @@ -800,7 +800,8 @@ static void number(struct GlobalState * state, int exprType, RewindState *rewind invalidTarget(state, exprType, "literal"); for (size_t j = 0; j < state->parser.previous.length; ++j) { - if (state->parser.previous.start[j] == '.') { + if (start[j] == 'x' || start[j] == 'X') break; + if (start[j] == '.' || start[j] == 'e' || start[j] == 'E') { #ifndef KRK_NO_FLOAT emitConstant(krk_parse_float(start, state->parser.previous.length)); #else diff --git a/src/scanner.c b/src/scanner.c index 75e2909d..c228bc96 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -180,6 +180,12 @@ static KrkToken number(KrkScanner * scanner, char c) { while (isDigit(peek(scanner))) advance(scanner); } + if (peek(scanner) == 'e' || peek(scanner) == 'E') { + advance(scanner); + if (peek(scanner) == '+' || peek(scanner) == '-') advance(scanner); + while (isDigit(peek(scanner))) advance(scanner); + } + return makeToken(scanner, TOKEN_NUMBER); } diff --git a/src/vendor/rline.c b/src/vendor/rline.c index f0a369a2..9d2de423 100644 --- a/src/vendor/rline.c +++ b/src/vendor/rline.c @@ -672,6 +672,11 @@ static int paint_krk_numeral(struct syntax_state * state) { paint(1, FLAG_NUMERAL); while (isdigit(charat())) paint(1, FLAG_NUMERAL); } + if (charat() == 'e' || charat() == 'E') { + paint(1, FLAG_NUMERAL); + if (charat() == '-' || charat() == '+') paint(1, FLAG_NUMERAL); + while (isdigit(charat())) paint(1, FLAG_NUMERAL); + } } return 0; }