From 9aeb813b720bd71d147279ac8f6ac3d6735dead6 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Thu, 7 Nov 2019 18:10:08 +0100
Subject: [PATCH] Begin implementation of compound types

---
 src/language/ASTNodeDataTypeBuilder.cpp |  2 ++
 src/language/PEGGrammar.hpp             | 11 ++++++-----
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp
index 1857b73ab..05cbe4703 100644
--- a/src/language/ASTNodeDataTypeBuilder.cpp
+++ b/src/language/ASTNodeDataTypeBuilder.cpp
@@ -44,6 +44,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n)
           data_type = ASTNodeDataType::double_t;
         } else if (type_node.is_type<language::string_type>()) {
           data_type = ASTNodeDataType::string_t;
+        } else if (type_node.is_type<language::type_expression>()) {
+          data_type = ASTNodeDataType::typename_t;
         }
 
         Assert(data_type != ASTNodeDataType::undefined_t);   // LCOV_EXCL_LINE
diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp
index bc2556cdc..f3d245ecd 100644
--- a/src/language/PEGGrammar.hpp
+++ b/src/language/PEGGrammar.hpp
@@ -71,6 +71,8 @@ struct basic_type : sor < B_set, R_set, Z_set, N_set, string_type > {};
 
 struct TYPESPECIFIER : seq< basic_type, ignored> {};
 
+struct type_expression : list_must< TYPESPECIFIER, one< '*' > >{};
+
 struct and_kw :  TAO_PEGTL_KEYWORD("and") {};
 struct or_kw :  TAO_PEGTL_KEYWORD("or") {};
 
@@ -205,18 +207,17 @@ struct logical_or : list_must< logical_and, or_op >{};
 
 struct expression : logical_or {};
 
-struct affect_op : sor< eq_op, multiplyeq_op, divideeq_op, pluseq_op, minuseq_op > {};
+struct expression_list : seq< open_parent, expression, plus< if_must< COMMA, expression > >, close_parent >{};
 
-struct affectation : seq< NAME , if_must< affect_op, expression > >{};
+struct affect_op : sor< eq_op, multiplyeq_op, divideeq_op, pluseq_op, minuseq_op > {};
 
-struct declaration : if_must< TYPESPECIFIER, NAME, opt< if_must< seq< one< '=' >, ignored >, expression > > >{};
+struct affectation : seq< NAME , if_must< affect_op,  sor< expression_list, expression > > >{};
 
-struct type_expression : list_must< TYPESPECIFIER, one< '*' > >{};
+struct declaration : if_must< type_expression, NAME, opt< if_must< seq< one< '=' >, ignored >, sor< expression_list, expression > > > >{};
 
 struct type_mapping : seq< type_expression, RIGHT_ARROW, type_expression >{};
 
 struct name_list : seq< open_parent, list_must< NAME, COMMA >, close_parent >{};
-struct expression_list : seq< open_parent, expression, plus< if_must< COMMA, expression > >, close_parent >{};
 
 struct function_definition : seq< sor< name_list, NAME >, RIGHT_ARROW, sor< expression_list, expression > >{};
 
-- 
GitLab