diff --git a/src/language/ASTBuilder.cpp b/src/language/ASTBuilder.cpp index 462a7004e3db9ec407a7d6b8905b4aa48d491017..6bacf4c077f84d2496e545e364b7547cffc5af3f 100644 --- a/src/language/ASTBuilder.cpp +++ b/src/language/ASTBuilder.cpp @@ -223,6 +223,7 @@ using selector = parse_tree::selector< N_set, Z_set, R_set, + vector_type, string_type, cout_kw, cerr_kw, diff --git a/src/language/ASTNodeDataType.cpp b/src/language/ASTNodeDataType.cpp index b1e9a64d738ee819cd476f4a45cad2238cafa742..f510344bf33de6b0c0d543d97e722d92207e5692 100644 --- a/src/language/ASTNodeDataType.cpp +++ b/src/language/ASTNodeDataType.cpp @@ -20,6 +20,9 @@ dataTypeName(const ASTNodeDataType& data_type) case ASTNodeDataType::double_t: name = "R"; break; + case ASTNodeDataType::vector_t: + name = "vector"; + break; case ASTNodeDataType::string_t: name = "string"; break; @@ -47,7 +50,7 @@ dataTypePromotion(const ASTNodeDataType& data_type_1, const ASTNodeDataType& dat } else if ((std::max(data_type_1, data_type_2) <= ASTNodeDataType::double_t) and (std::min(data_type_1, data_type_2) >= ASTNodeDataType::bool_t)) { return std::max(data_type_1, data_type_2); - } else if ((data_type_1 == ASTNodeDataType::string_t) and (data_type_2 <= ASTNodeDataType::double_t) and + } else if ((data_type_1 == ASTNodeDataType::string_t) and (data_type_2 < ASTNodeDataType::string_t) and (data_type_2 >= ASTNodeDataType::bool_t)) { return data_type_1; } else { @@ -70,8 +73,7 @@ isNaturalConversion(const ASTNodeDataType& data_type, const ASTNodeDataType& tar return ((data_type == ASTNodeDataType::unsigned_int_t) or (data_type == ASTNodeDataType::int_t) or (data_type == ASTNodeDataType::bool_t)); } else if (target_data_type == ASTNodeDataType::string_t) { - return ((data_type == ASTNodeDataType::double_t) or (data_type == ASTNodeDataType::unsigned_int_t) or - (data_type == ASTNodeDataType::int_t) or (data_type == ASTNodeDataType::bool_t)); + return ((data_type >= ASTNodeDataType::bool_t) and (data_type < ASTNodeDataType::string_t)); } return false; } diff --git a/src/language/ASTNodeDataType.hpp b/src/language/ASTNodeDataType.hpp index 5b0b87071e6517320f459cd83ee8910276a84301..214ce45df228c770ed1684e27eb28df4ed7eebab 100644 --- a/src/language/ASTNodeDataType.hpp +++ b/src/language/ASTNodeDataType.hpp @@ -13,6 +13,7 @@ enum class ASTNodeDataType : int32_t int_t = 1, unsigned_int_t = 2, double_t = 3, + vector_t = 4, string_t = 5, typename_t = 10, function_t = 11, diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp index 2a0eba2db745e46999e829984d655548b452d8bf..ad39a0183ffa73ec4cdbf10921c3ebb41f9620ca 100644 --- a/src/language/ASTNodeDataTypeBuilder.cpp +++ b/src/language/ASTNodeDataTypeBuilder.cpp @@ -37,6 +37,8 @@ ASTNodeDataTypeBuilder::_buildDeclarationNodeDataTypes(ASTNode& type_node, ASTNo data_type = ASTNodeDataType::unsigned_int_t; } else if (type_node.is_type<language::R_set>()) { data_type = ASTNodeDataType::double_t; + } else if (type_node.is_type<language::vector_type>()) { + data_type = ASTNodeDataType::vector_t; } else if (type_node.is_type<language::string_type>()) { data_type = ASTNodeDataType::string_t; } @@ -90,6 +92,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const n.m_data_type = ASTNodeDataType::double_t; } else if (n.is_type<language::integer>()) { n.m_data_type = ASTNodeDataType::int_t; + } else if (n.is_type<language::vector_type>()) { + n.m_data_type = ASTNodeDataType::vector_t; } else if (n.is_type<language::literal>()) { n.m_data_type = ASTNodeDataType::string_t; } else if (n.is_type<language::cout_kw>() or n.is_type<language::cerr_kw>() or n.is_type<language::clog_kw>()) { @@ -149,6 +153,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const data_type = ASTNodeDataType::unsigned_int_t; } else if (type_node.is_type<language::R_set>()) { data_type = ASTNodeDataType::double_t; + } else if (type_node.is_type<language::vector_type>()) { + data_type = ASTNodeDataType::vector_t; } else if (type_node.is_type<language::string_type>()) { data_type = ASTNodeDataType::string_t; } @@ -188,7 +194,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const ASTNode& image_domain_node = *function_descriptor.domainMappingNode().children[1]; ASTNode& image_expression_node = *function_descriptor.definitionNode().children[1]; - const size_t nb_image_domains = (image_domain_node.children.size() > 0) ? image_domain_node.children.size() : 1; + const size_t nb_image_domains = + (image_domain_node.is_type<language::type_expression>()) ? image_domain_node.children.size() : 1; const size_t nb_image_expressions = (image_expression_node.is_type<language::expression_list>()) ? image_expression_node.children.size() : 1; @@ -216,6 +223,8 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const value_type = ASTNodeDataType::unsigned_int_t; } else if (image_node.is_type<language::R_set>()) { value_type = ASTNodeDataType::double_t; + } else if (image_node.is_type<language::vector_type>()) { + value_type = ASTNodeDataType::vector_t; } else if (image_node.is_type<language::string_type>()) { value_type = ASTNodeDataType::string_t; } @@ -227,13 +236,13 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const // LCOV_EXCL_STOP }; - if (image_domain_node.children.size() == 0) { - check_image_type(image_domain_node); - } else { + if (image_domain_node.is_type<language::type_expression>()) { for (size_t i = 0; i < image_domain_node.children.size(); ++i) { check_image_type(*image_domain_node.children[i]); } image_domain_node.m_data_type = ASTNodeDataType::typename_t; + } else { + check_image_type(image_domain_node); } n.m_data_type = ASTNodeDataType::void_t; diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp index b53882a3567ef057f5fe4e20fc6cbfee49094078..0f216d9aa95e588c8e7b6648630d6ce88dcfd116 100644 --- a/src/language/PEGGrammar.hpp +++ b/src/language/PEGGrammar.hpp @@ -65,22 +65,30 @@ struct R_set : TAO_PEGTL_KEYWORD("R"){}; struct string_type : TAO_PEGTL_KEYWORD("string") {}; -struct basic_type : sor < B_set, R_set, Z_set, N_set, string_type > {}; +struct scalar_type : sor< B_set, R_set, Z_set, N_set >{}; -struct TYPESPECIFIER : seq< basic_type, ignored> {}; +struct vector_type : seq< R_set, ignored, one< '^' >, ignored, integer >{}; -struct type_expression : list_must< TYPESPECIFIER, one< '*' > >{}; +struct basic_type : sor< scalar_type, string_type >{}; -struct and_kw : TAO_PEGTL_KEYWORD("and") {}; -struct or_kw : TAO_PEGTL_KEYWORD("or") {}; +struct type_specifier : sor< vector_type, basic_type >{}; -struct xor_kw : TAO_PEGTL_KEYWORD("xor") {}; +struct TYPE_SPECIFIER : seq< type_specifier, ignored >{}; -struct not_kw : TAO_PEGTL_KEYWORD("not") {}; -struct true_kw : TAO_PEGTL_KEYWORD("true") {}; -struct false_kw : TAO_PEGTL_KEYWORD("false") {}; +struct type_expression : list_must< TYPE_SPECIFIER, seq< one< '*' > > >{}; -struct BOOL : seq< sor<true_kw, false_kw>, ignored > {}; +struct TYPE_EXPRESSION : seq< type_expression, ignored >{}; + +struct and_kw : TAO_PEGTL_KEYWORD("and") {}; +struct or_kw : TAO_PEGTL_KEYWORD("or") {}; + +struct xor_kw : TAO_PEGTL_KEYWORD("xor") {}; + +struct not_kw : TAO_PEGTL_KEYWORD("not") {}; +struct true_kw : TAO_PEGTL_KEYWORD("true") {}; +struct false_kw : TAO_PEGTL_KEYWORD("false") {}; + +struct BOOL : seq< sor< true_kw, false_kw >, ignored > {}; struct let_kw : TAO_PEGTL_KEYWORD("let") {}; struct LET : seq < let_kw, ignored > {}; @@ -213,9 +221,9 @@ struct name_list; struct affectation : seq< sor< NAME, name_list >, if_must< affect_op, sor< expression_list, expression > > >{}; -struct declaration : if_must< type_expression, sor< NAME, name_list>, opt< if_must< seq< one< '=' >, ignored >, sor< expression_list, expression > > > >{}; +struct declaration : if_must< TYPE_EXPRESSION, sor< NAME, name_list>, opt< if_must< seq< one< '=' >, ignored >, sor< expression_list, expression > > > >{}; -struct type_mapping : seq< type_expression, RIGHT_ARROW, type_expression >{}; +struct type_mapping : seq< TYPE_EXPRESSION, RIGHT_ARROW, TYPE_EXPRESSION >{}; struct name_list : seq< open_parent, list_must< NAME, COMMA >, close_parent >{};