From 4e839381d1b04db76e332449e6214c451347c0a6 Mon Sep 17 00:00:00 2001 From: Nathan Gober Date: Thu, 31 Mar 2022 15:53:48 -0500 Subject: [PATCH] Fixed parsing on leading zeros after decimal point --- src/include/cx_json_parser.h | 16 ++++++++++------ src/test/json.cpp | 5 +++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/include/cx_json_parser.h b/src/include/cx_json_parser.h index 2c43ba4..1771ad6 100644 --- a/src/include/cx_json_parser.h +++ b/src/include/cx_json_parser.h @@ -50,20 +50,24 @@ namespace JSON fmap([] (char) { return 0; }, make_char_parser('0')) | int1_parser(), [] (char sign, int i) { return sign == '+' ? i : -i; }); - constexpr auto frac_parser = make_char_parser('.') < int0_parser(); - - constexpr auto mantissa_parser = combine( - integral_parser, option(0, frac_parser), - [] (int i, int f) -> double { + constexpr auto frac_parser = make_char_parser('.') < combine( + many(make_char_parser('0'), 0, [](int acc, auto) -> int { return acc+1; }), // count the number of leading zeros + int1_parser(), + [](int exp, int f) -> double { double d = 0; while (f > 0) { d += f % 10; d /= 10; f /= 10; } - return i + d; + while (exp--) { + d /= 10; + } + return d; }); + constexpr auto mantissa_parser = combine(integral_parser, option(0.0, frac_parser), std::plus{}); + constexpr auto e_parser = make_char_parser('e') | make_char_parser('E'); constexpr auto sign_parser = make_char_parser('+') | neg_parser; constexpr auto exponent_parser = diff --git a/src/test/json.cpp b/src/test/json.cpp index 75d127b..1c133aa 100644 --- a/src/test/json.cpp +++ b/src/test/json.cpp @@ -99,6 +99,11 @@ void number_parse_tests() constexpr auto number_val = JSON::number_parser()("456.123e-1"sv); static_assert(number_val && number_val->first == 456.123e-1); } + + { + constexpr auto number_val = JSON::number_parser()("0.0625"sv); + static_assert(number_val && number_val->first == 0.0625); + } } void numobjects_tests()