diff --git a/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp b/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp index 4bb46ce18210f0d4458dd611c98c7fd3cebac026..532644d681473da893d5b7275d1081e367da1385 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 c0de8848941c18c3f792f3739fd5751aa1c7944b..643bfc7e068972948dca6158cbb4c3fbd997fd72 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 12f3bcd498d55a9804d72fd30526b0d676befc87..b68a1dd76592987a57990e6dfbf3cac602592b3f 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 > {};