From 49baed3d32a287bdba73522609063af71136f8f9 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Tue, 3 Mar 2020 18:56:25 +0100 Subject: [PATCH] Add argument-less builtin-functions management --- ...STNodeBuiltinFunctionExpressionBuilder.cpp | 8 +--- src/language/BuiltinFunctionEmbedder.hpp | 43 +++++++++++++++++++ src/language/PEGGrammar.hpp | 2 +- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp b/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp index 4bb46ce18..532644d68 100644 --- a/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp +++ b/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp @@ -147,12 +147,8 @@ ASTNodeBuiltinFunctionExpressionBuilder::_buildArgumentProcessors( throw parse_error(error_message.str(), argument_nodes.begin()); } - if (arguments_number > 1) { - for (size_t i = 0; i < arguments_number; ++i) { - this->_storeArgumentProcessor(parameter_type_list, flattened_datatype_list, i, _processor); - } - } else { - this->_storeArgumentProcessor(parameter_type_list, flattened_datatype_list, 0, _processor); + for (size_t i = 0; i < arguments_number; ++i) { + this->_storeArgumentProcessor(parameter_type_list, flattened_datatype_list, i, _processor); } } diff --git a/src/language/BuiltinFunctionEmbedder.hpp b/src/language/BuiltinFunctionEmbedder.hpp index c0de88489..643bfc7e0 100644 --- a/src/language/BuiltinFunctionEmbedder.hpp +++ b/src/language/BuiltinFunctionEmbedder.hpp @@ -167,4 +167,47 @@ class BuiltinFunctionEmbedder : public IBuiltinFunctionEmbedder } }; +template <typename FX> +class BuiltinFunctionEmbedder<FX, void> : public IBuiltinFunctionEmbedder +{ + private: + std::function<FX(void)> m_f; + + public: + PUGS_INLINE ASTNodeDataType + getReturnDataType() const final + { + return ast_node_data_type_from<FX>; + } + + PUGS_INLINE std::vector<ASTNodeDataType> + getParameterDataTypes() const final + { + return {}; + } + + PUGS_INLINE size_t + numberOfParameters() const final + { + return 0; + } + + public: + PUGS_INLINE + DataVariant + apply(const std::vector<DataVariant>&) const final + { + if constexpr (std::is_arithmetic_v<FX>) { + return {m_f()}; + } else if constexpr (std::is_same_v<FX, void>) { + m_f(); + return {}; + } else { + return EmbeddedData(_createHandler(m_f())); + } + } + + BuiltinFunctionEmbedder(std::function<void(void)> f) : m_f(f) {} +}; + #endif // BUILTIN_FUNCTION_EMBEDDER_HPP diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp index 12f3bcd49..b68a1dd76 100644 --- a/src/language/PEGGrammar.hpp +++ b/src/language/PEGGrammar.hpp @@ -149,7 +149,7 @@ struct expression; struct parented_expression : if_must< open_parent, expression, close_parent >{}; struct tuple_expression; -struct function_argument_list : if_must< open_parent, list_must< sor< tuple_expression, expression >, COMMA >, close_parent >{}; +struct function_argument_list : if_must< open_parent, opt< list_must< sor< tuple_expression, expression >, COMMA > >, close_parent >{}; struct function_evaluation : seq< NAME, function_argument_list > {}; struct primary_expression : sor< BOOL, REAL, INTEGER, LITERAL, function_evaluation, NAME, parented_expression > {}; -- GitLab