diff --git a/src/language/ASTBuilder.cpp b/src/language/ASTBuilder.cpp index 67ef30cd20e55ae80b3e75654c6d91c230f98fb5..7692ed981d7006c6d9377028caa9eb24c344d1b2 100644 --- a/src/language/ASTBuilder.cpp +++ b/src/language/ASTBuilder.cpp @@ -244,6 +244,7 @@ using selector = parse_tree::selector< language::N_set, language::Z_set, language::R_set, + language::type_id, language::tuple_expression, language::vector_type, language::string_type, diff --git a/src/language/ASTNodeDataType.cpp b/src/language/ASTNodeDataType.cpp index f5a3ff29ec041ff74e707d4c56a25b8c967d7124..cbbc95fe82b7fd38336862eca0ec465e6f14a713 100644 --- a/src/language/ASTNodeDataType.cpp +++ b/src/language/ASTNodeDataType.cpp @@ -46,6 +46,9 @@ dataTypeName(const ASTNodeDataType& data_type) case ASTNodeDataType::typename_t: name = "typename"; break; + case ASTNodeDataType::type_id_t: + name = "type_id"; + break; case ASTNodeDataType::function_t: name = "function"; break; diff --git a/src/language/ASTNodeDataType.hpp b/src/language/ASTNodeDataType.hpp index 2d220a4d95bd627f61e2bc1ea51806da140844bd..af053c4d8e8da1e6fce10acdc691f6364961056d 100644 --- a/src/language/ASTNodeDataType.hpp +++ b/src/language/ASTNodeDataType.hpp @@ -20,14 +20,16 @@ class ASTNodeDataType list_t = 5, string_t = 6, typename_t = 10, - function_t = 11, - c_function_t = 12, + type_id_t = 20, + function_t = 21, + c_function_t = 22, void_t = std::numeric_limits<int32_t>::max() }; private: DataType m_data_type; size_t m_dimension; + std::string_view m_type_name; public: size_t @@ -47,6 +49,10 @@ class ASTNodeDataType ASTNodeDataType(DataType data_type, size_t dimension) : m_data_type{data_type}, m_dimension{dimension} {} + ASTNodeDataType(DataType data_type, std::string_view type_name) + : m_data_type{data_type}, m_dimension{1}, m_type_name{type_name} + {} + ASTNodeDataType(const ASTNodeDataType&) = default; ~ASTNodeDataType() = default; diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp index 07e32c1f26cbbfcbca2a11fa2353f744085d0460..bf6ebea68b8cf67f505c110758e4df29899d1c69 100644 --- a/src/language/ASTNodeDataTypeBuilder.cpp +++ b/src/language/ASTNodeDataTypeBuilder.cpp @@ -41,6 +41,8 @@ ASTNodeDataTypeBuilder::_buildDeclarationNodeDataTypes(ASTNode& type_node, ASTNo data_type = getVectorDataType(type_node); } else if (type_node.is_type<language::string_type>()) { data_type = ASTNodeDataType::string_t; + } else if (type_node.is_type<language::type_id>()) { + data_type = ASTNodeDataType{ASTNodeDataType::type_id_t, type_node.string_view()}; } if (name_node.is_type<language::name_list>()) { @@ -424,7 +426,7 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n) const } } else if (n.is_type<language::B_set>() or n.is_type<language::Z_set>() or n.is_type<language::N_set>() or n.is_type<language::R_set>() or n.is_type<language::string_type>() or - n.is_type<language::vector_type>()) { + n.is_type<language::vector_type>() or n.is_type<language::type_id>()) { n.m_data_type = ASTNodeDataType::typename_t; } else if (n.is_type<language::name_list>() or n.is_type<language::lvalue_list>() or n.is_type<language::function_argument_list>()) { diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp index e65f96f1007ac4c2a0945595f5fa42cc1c24e5c8..98724f5fe932827616d90e3dec2579c7f93e3060 100644 --- a/src/language/PEGGrammar.hpp +++ b/src/language/PEGGrammar.hpp @@ -71,8 +71,8 @@ struct vector_type : seq< R_set, ignored, one< '^' >, ignored, integer >{}; struct basic_type : sor< scalar_type, string_type >{}; -struct type_name; -struct type_specifier : sor< vector_type, basic_type >{}; +struct type_id; +struct type_specifier : sor< vector_type, basic_type, type_id >{}; struct TYPE_SPECIFIER : seq< type_specifier, ignored >{}; @@ -125,7 +125,7 @@ struct identifier_minus_keyword : minus< identifier, keywork > {}; struct module_name : identifier_minus_keyword {}; struct MODULE_NAME : seq< module_name, ignored > {}; -struct type_name : identifier_minus_keyword {}; +struct type_id : identifier_minus_keyword {}; struct name : identifier_minus_keyword {}; struct NAME : seq< name, ignored > {};