diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp index e3249dd6af58a210432d0e5ed44a330183a2f4f6..b53882a3567ef057f5fe4e20fc6cbfee49094078 100644 --- a/src/language/PEGGrammar.hpp +++ b/src/language/PEGGrammar.hpp @@ -25,29 +25,27 @@ struct integer : plus< digit > {}; struct INTEGER : seq< integer, ignored >{}; +struct exponent + : seq< one< 'E', 'e' >, + opt< one< '+', '-' > >, + plus<digit> + >{}; + struct real - : seq< sor< seq< - plus< digit >, - one < '.' >, - star< digit > - >, - seq< - one < '.' >, - plus< digit > - > + : sor< seq< sor< seq< + plus< digit >, + one < '.' >, + star< digit > + >, + seq< + one < '.' >, + plus< digit > + > + >, + opt< exponent > >, - opt< - seq< - one< 'E', - 'e' >, - opt< one< '+', - '-' > - >, - plus<digit> - > - > - >{}; - + seq< plus< digit, exponent > > + >{}; struct escaped_c : one< '\'', '"', '?', '\\', 'a', 'b', 'f', 'n', 'r', 't', 'v' > {}; struct character : if_must_else< one< '\\' >, escaped_c, ascii::any> {}; diff --git a/tests/test_ASTNodeDataTypeBuilder.cpp b/tests/test_ASTNodeDataTypeBuilder.cpp index e65254e011652b815141b2c3dd077585db01e676..9835caa53ebaba3ef0a241d38e4c0cf380859b2f 100644 --- a/tests/test_ASTNodeDataTypeBuilder.cpp +++ b/tests/test_ASTNodeDataTypeBuilder.cpp @@ -54,7 +54,7 @@ import a_module_name; CHECK_AST(data, result); } - SECTION("real") + SECTION("real 1") { std::string_view data = R"( 1.3; @@ -68,6 +68,118 @@ import a_module_name; CHECK_AST(data, result); } + SECTION("real 2") + { + std::string_view data = R"( +.5; +)"; + + std::string_view result = R"( +(root:void) + `-(language::real:.5:R) +)"; + + CHECK_AST(data, result); + } + + SECTION("real 3") + { + std::string_view data = R"( +5e-1; +)"; + + std::string_view result = R"( +(root:void) + `-(language::real:5e-1:R) +)"; + + CHECK_AST(data, result); + } + + SECTION("real 4") + { + std::string_view data = R"( +2e+1; +)"; + + std::string_view result = R"( +(root:void) + `-(language::real:2e+1:R) +)"; + + CHECK_AST(data, result); + } + + SECTION("real 5") + { + std::string_view data = R"( +2e1; +)"; + + std::string_view result = R"( +(root:void) + `-(language::real:2e1:R) +)"; + + CHECK_AST(data, result); + } + + SECTION("real 6") + { + std::string_view data = R"( +5.e-1; +)"; + + std::string_view result = R"( +(root:void) + `-(language::real:5.e-1:R) +)"; + + CHECK_AST(data, result); + } + + SECTION("real 7") + { + std::string_view data = R"( +5.e+1; +)"; + + std::string_view result = R"( +(root:void) + `-(language::real:5.e+1:R) +)"; + + CHECK_AST(data, result); + } + + SECTION("real 8") + { + std::string_view data = R"( +3.4e+1; +)"; + + std::string_view result = R"( +(root:void) + `-(language::real:3.4e+1:R) +)"; + + CHECK_AST(data, result); + } + + SECTION("real 9") + { + std::string_view data = R"( +.231e1; +)"; + + std::string_view result = R"( +(root:void) + `-(language::real:.231e1:R) +)"; + + CHECK_AST(data, result); + } + SECTION("true") { std::string_view data = R"(