From dbd2cf4e0d96a99d688394bf02f1b65d0258be97 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Wed, 15 Jan 2020 12:37:28 +0100 Subject: [PATCH] Fix real values grammar Values such as `1e4` where not interpreted as real! This kind of construction produced a syntax error! This has been there for a long time (incredible!). --- src/language/PEGGrammar.hpp | 40 +++++---- tests/test_ASTNodeDataTypeBuilder.cpp | 114 +++++++++++++++++++++++++- 2 files changed, 132 insertions(+), 22 deletions(-) diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp index e3249dd6a..b53882a35 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 e65254e01..9835caa53 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"( -- GitLab