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"(