From 728f164d8a512807083fe86b56d954e2e53fff87 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 2 Dec 2023 12:35:53 +0800 Subject: [PATCH] add impl --- src/lexer.cpp | 32 +++++++++++++++++++------------- tests/02_float.py | 8 ++++++++ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/lexer.cpp b/src/lexer.cpp index de8a33dd..5a8b8241 100644 --- a/src/lexer.cpp +++ b/src/lexer.cpp @@ -273,24 +273,25 @@ static bool is_unicode_Lo_char(uint32_t c) { const char* i = token_start; while(kValidChars.count(*i)) i++; std::string_view text(token_start, i - token_start); - curr_char = i; + this->curr_char = i; - if(i[-1] == 'L'){ - add_token(TK("@long")); - return; + if(text[0] != '.'){ + // try long + if(i[-1] == 'L'){ + add_token(TK("@long")); + return; + } + // try integer + i64 int_out; + if(parse_int(text, &int_out, -1)){ + add_token(TK("@num"), int_out); + return; + } } - // try integer - i64 int_out; - bool ok = parse_int(text, &int_out, -1); - if(ok){ - add_token(TK("@num"), int_out); - return; - } // try float double float_out; char* p_end; - try{ float_out = std::strtod(text.data(), &p_end); }catch(...){ @@ -346,7 +347,12 @@ static bool is_unicode_Lo_char(uint32_t c) { add_token(TK("..")); } } else { - add_token(TK(".")); + char next_char = peekchar(); + if(next_char >= '0' && next_char <= '9'){ + eat_number(); + }else{ + add_token(TK(".")); + } } return true; } diff --git a/tests/02_float.py b/tests/02_float.py index fa4794ae..a4868875 100644 --- a/tests/02_float.py +++ b/tests/02_float.py @@ -59,3 +59,11 @@ assert math.isnan(0/0) assert 2**-600 == 0.0 assert 2.0 ** 600 == inf assert (-2.0) ** 601 == -inf + +# test .123 forms +assert float(".123") == 0.123 +assert .123 == 0.123 +assert eq(.5 *2, 1.0) +assert eq(2 * .5, 1.0) +assert eq(2 * (.5), 1.0) +assert eq(2 * (.5 + 1), 3.0)