diff --git a/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp b/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp index 884711c081ded349d32663f80180c06c4911bfba..a97c13443bd628a2226de54623c673d464916a0c 100644 --- a/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp +++ b/src/language/ast/ASTNodeAffectationExpressionBuilder.cpp @@ -9,24 +9,24 @@ #include <language/utils/ParseError.hpp> #include <utils/Exceptions.hpp> -ASTNodeAffectationExpressionBuilder::ASTNodeAffectationExpressionBuilder(ASTNode& n) +ASTNodeAffectationExpressionBuilder::ASTNodeAffectationExpressionBuilder(ASTNode& node) { - const ASTNodeDataType& target_data_type = n.children[0]->m_data_type; - const ASTNodeDataType& source_data_type = n.children[1]->m_data_type; + const ASTNodeDataType& target_data_type = node.children[0]->m_data_type; + const ASTNodeDataType& source_data_type = node.children[1]->m_data_type; const std::string affectation_name = [&] { - if (n.is_type<language::eq_op>()) { + if (node.is_type<language::eq_op>()) { return affectationMangler<language::eq_op>(target_data_type, source_data_type); - } else if (n.is_type<language::multiplyeq_op>()) { + } else if (node.is_type<language::multiplyeq_op>()) { return affectationMangler<language::multiplyeq_op>(target_data_type, source_data_type); - } else if (n.is_type<language::divideeq_op>()) { + } else if (node.is_type<language::divideeq_op>()) { return affectationMangler<language::divideeq_op>(target_data_type, source_data_type); - } else if (n.is_type<language::pluseq_op>()) { + } else if (node.is_type<language::pluseq_op>()) { return affectationMangler<language::pluseq_op>(target_data_type, source_data_type); - } else if (n.is_type<language::minuseq_op>()) { + } else if (node.is_type<language::minuseq_op>()) { return affectationMangler<language::minuseq_op>(target_data_type, source_data_type); } else { - throw ParseError("unexpected error: undefined affectation operator", std::vector{n.begin()}); + throw ParseError("unexpected error: undefined affectation operator", std::vector{node.begin()}); } }(); @@ -34,12 +34,15 @@ ASTNodeAffectationExpressionBuilder::ASTNodeAffectationExpressionBuilder(ASTNode OperatorRepository::instance().getAffectationProcessorBuilder(affectation_name); if (optional_processor_builder.has_value()) { - n.m_node_processor = optional_processor_builder.value()->getNodeProcessor(n); + ASTNode& lhs_node = *node.children[0]; + ASTNode& rhs_node = *node.children[1]; + + node.m_node_processor = optional_processor_builder.value()->getNodeProcessor(lhs_node, rhs_node); } else { std::ostringstream error_message; error_message << "undefined affectation type: "; error_message << rang::fgB::red << affectation_name << rang::fg::reset; - throw ParseError(error_message.str(), std::vector{n.children[0]->begin()}); + throw ParseError(error_message.str(), std::vector{node.begin()}); } } diff --git a/src/language/node_processor/AffectationProcessor.hpp b/src/language/node_processor/AffectationProcessor.hpp index 959578619b023bc28236b1ae52141b018aad8c69..db5d0fc75d2da20977fbd5df3ced68d09f90783b 100644 --- a/src/language/node_processor/AffectationProcessor.hpp +++ b/src/language/node_processor/AffectationProcessor.hpp @@ -222,7 +222,7 @@ class MatrixComponentAffectationExecutor final : public IAffectationExecutor }()}; public: - MatrixComponentAffectationExecutor(ASTNode& node, + MatrixComponentAffectationExecutor(ASTNode& lhs_node, ArrayT& lhs_array, ASTNode& index0_expression, ASTNode& index1_expression) @@ -230,7 +230,7 @@ class MatrixComponentAffectationExecutor final : public IAffectationExecutor { // LCOV_EXCL_START if constexpr (not m_is_defined) { - throw ParseError("unexpected error: invalid operands to affectation expression", std::vector{node.begin()}); + throw ParseError("unexpected error: invalid operands to affectation expression", std::vector{lhs_node.begin()}); } // LCOV_EXCL_STOP } @@ -371,7 +371,7 @@ template <typename OperatorT, typename ValueT, typename DataT> class AffectationProcessor final : public INodeProcessor { private: - ASTNode& m_node; + ASTNode& m_rhs_node; std::unique_ptr<IAffectationExecutor> m_affectation_executor; @@ -379,16 +379,16 @@ class AffectationProcessor final : public INodeProcessor DataVariant execute(ExecutionPolicy& exec_policy) { - m_affectation_executor->affect(exec_policy, m_node.children[1]->execute(exec_policy)); + m_affectation_executor->affect(exec_policy, m_rhs_node.execute(exec_policy)); return {}; } - AffectationProcessor(ASTNode& node) : m_node{node} + AffectationProcessor(ASTNode& lhs_node, ASTNode& rhs_node) : m_rhs_node{rhs_node} { - if (node.children[0]->is_type<language::name>()) { - const std::string& symbol = m_node.children[0]->string(); - auto [i_symbol, found] = m_node.m_symbol_table->find(symbol, m_node.children[0]->begin()); + if (lhs_node.is_type<language::name>()) { + const std::string& symbol = lhs_node.string(); + auto [i_symbol, found] = lhs_node.m_symbol_table->find(symbol, lhs_node.begin()); Assert(found); DataVariant& value = i_symbol->attributes().value(); @@ -397,23 +397,21 @@ class AffectationProcessor final : public INodeProcessor } using AffectationExecutorT = AffectationExecutor<OperatorT, ValueT, DataT>; - m_affectation_executor = std::make_unique<AffectationExecutorT>(m_node, std::get<ValueT>(value)); - } else if (node.children[0]->is_type<language::subscript_expression>()) { - auto& array_subscript_expression = *node.children[0]; - - auto& array_expression = *array_subscript_expression.children[0]; + m_affectation_executor = std::make_unique<AffectationExecutorT>(lhs_node, std::get<ValueT>(value)); + } else if (lhs_node.is_type<language::subscript_expression>()) { + auto& array_expression = *lhs_node.children[0]; Assert(array_expression.is_type<language::name>()); const std::string& symbol = array_expression.string(); - auto [i_symbol, found] = m_node.m_symbol_table->find(symbol, array_subscript_expression.begin()); + auto [i_symbol, found] = lhs_node.m_symbol_table->find(symbol, lhs_node.begin()); Assert(found); DataVariant& value = i_symbol->attributes().value(); if (array_expression.m_data_type == ASTNodeDataType::vector_t) { - Assert(array_subscript_expression.children.size() == 2); + Assert(lhs_node.children.size() == 2); - auto& index_expression = *array_subscript_expression.children[1]; + auto& index_expression = *lhs_node.children[1]; switch (array_expression.m_data_type.dimension()) { case 1: { @@ -423,7 +421,7 @@ class AffectationProcessor final : public INodeProcessor } using AffectationExecutorT = VectorComponentAffectationExecutor<OperatorT, ArrayTypeT, ValueT, DataT>; m_affectation_executor = - std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), index_expression); + std::make_unique<AffectationExecutorT>(lhs_node, std::get<ArrayTypeT>(value), index_expression); break; } case 2: { @@ -433,7 +431,7 @@ class AffectationProcessor final : public INodeProcessor } using AffectationExecutorT = VectorComponentAffectationExecutor<OperatorT, ArrayTypeT, ValueT, DataT>; m_affectation_executor = - std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), index_expression); + std::make_unique<AffectationExecutorT>(lhs_node, std::get<ArrayTypeT>(value), index_expression); break; } case 3: { @@ -443,22 +441,21 @@ class AffectationProcessor final : public INodeProcessor } using AffectationExecutorT = VectorComponentAffectationExecutor<OperatorT, ArrayTypeT, ValueT, DataT>; m_affectation_executor = - std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), index_expression); + std::make_unique<AffectationExecutorT>(lhs_node, std::get<ArrayTypeT>(value), index_expression); break; } // LCOV_EXCL_START default: { - throw ParseError("unexpected error: invalid vector dimension", - std::vector{array_subscript_expression.begin()}); + throw ParseError("unexpected error: invalid vector dimension", std::vector{lhs_node.begin()}); } // LCOV_EXCL_STOP } } else if (array_expression.m_data_type == ASTNodeDataType::matrix_t) { - Assert(array_subscript_expression.children.size() == 3); + Assert(lhs_node.children.size() == 3); Assert(array_expression.m_data_type.nbRows() == array_expression.m_data_type.nbColumns()); - auto& index0_expression = *array_subscript_expression.children[1]; - auto& index1_expression = *array_subscript_expression.children[2]; + auto& index0_expression = *lhs_node.children[1]; + auto& index1_expression = *lhs_node.children[2]; switch (array_expression.m_data_type.nbRows()) { case 1: { @@ -467,7 +464,8 @@ class AffectationProcessor final : public INodeProcessor value = ArrayTypeT{}; } using AffectationExecutorT = MatrixComponentAffectationExecutor<OperatorT, ArrayTypeT, ValueT, DataT>; - m_affectation_executor = std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), + + m_affectation_executor = std::make_unique<AffectationExecutorT>(lhs_node, std::get<ArrayTypeT>(value), index0_expression, index1_expression); break; } @@ -477,7 +475,8 @@ class AffectationProcessor final : public INodeProcessor value = ArrayTypeT{}; } using AffectationExecutorT = MatrixComponentAffectationExecutor<OperatorT, ArrayTypeT, ValueT, DataT>; - m_affectation_executor = std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), + + m_affectation_executor = std::make_unique<AffectationExecutorT>(lhs_node, std::get<ArrayTypeT>(value), index0_expression, index1_expression); break; } @@ -487,14 +486,14 @@ class AffectationProcessor final : public INodeProcessor value = ArrayTypeT{}; } using AffectationExecutorT = MatrixComponentAffectationExecutor<OperatorT, ArrayTypeT, ValueT, DataT>; - m_affectation_executor = std::make_unique<AffectationExecutorT>(node, std::get<ArrayTypeT>(value), + + m_affectation_executor = std::make_unique<AffectationExecutorT>(lhs_node, std::get<ArrayTypeT>(value), index0_expression, index1_expression); break; } // LCOV_EXCL_START default: { - throw ParseError("unexpected error: invalid vector dimension", - std::vector{array_subscript_expression.begin()}); + throw ParseError("unexpected error: invalid vector dimension", std::vector{lhs_node.begin()}); } // LCOV_EXCL_STOP } @@ -505,25 +504,41 @@ class AffectationProcessor final : public INodeProcessor } } else { // LCOV_EXCL_START - throw ParseError("unexpected error: invalid lhs", std::vector{node.children[0]->begin()}); + throw ParseError("unexpected error: invalid lhs", std::vector{lhs_node.begin()}); // LCOV_EXCL_STOP } } }; +class AffectationToDataVariantProcessorBase : public INodeProcessor +{ + protected: + DataVariant* m_lhs; + + public: + AffectationToDataVariantProcessorBase(ASTNode& lhs_node) + { + const std::string& symbol = lhs_node.string(); + auto [i_symbol, found] = lhs_node.m_symbol_table->find(symbol, lhs_node.begin()); + Assert(found); + + m_lhs = &i_symbol->attributes().value(); + } + + virtual ~AffectationToDataVariantProcessorBase() = default; +}; + template <typename OperatorT, typename ValueT> -class AffectationToTinyVectorFromListProcessor final : public INodeProcessor +class AffectationToTinyVectorFromListProcessor final : public AffectationToDataVariantProcessorBase { private: - ASTNode& m_node; - - DataVariant* m_lhs; + ASTNode& m_rhs_node; public: DataVariant execute(ExecutionPolicy& exec_policy) { - AggregateDataVariant children_values = std::get<AggregateDataVariant>(m_node.children[1]->execute(exec_policy)); + AggregateDataVariant children_values = std::get<AggregateDataVariant>(m_rhs_node.execute(exec_policy)); static_assert(std::is_same_v<OperatorT, language::eq_op>, "forbidden affection operator for list to vectors"); @@ -537,7 +552,7 @@ class AffectationToTinyVectorFromListProcessor final : public INodeProcessor v[i] = child_value; } else { // LCOV_EXCL_START - throw ParseError("unexpected error: unexpected right hand side type in affectation", m_node.begin()); + throw ParseError("unexpected error: unexpected right hand side type in affectation", m_rhs_node.begin()); // LCOV_EXCL_STOP } }, @@ -548,29 +563,22 @@ class AffectationToTinyVectorFromListProcessor final : public INodeProcessor return {}; } - AffectationToTinyVectorFromListProcessor(ASTNode& node) : m_node{node} - { - const std::string& symbol = m_node.children[0]->string(); - auto [i_symbol, found] = m_node.m_symbol_table->find(symbol, m_node.children[0]->begin()); - Assert(found); - - m_lhs = &i_symbol->attributes().value(); - } + AffectationToTinyVectorFromListProcessor(ASTNode& lhs_node, ASTNode& rhs_node) + : AffectationToDataVariantProcessorBase(lhs_node), m_rhs_node{rhs_node} + {} }; template <typename OperatorT, typename ValueT> -class AffectationToTinyMatrixFromListProcessor final : public INodeProcessor +class AffectationToTinyMatrixFromListProcessor final : public AffectationToDataVariantProcessorBase { private: - ASTNode& m_node; - - DataVariant* m_lhs; + ASTNode& m_rhs_node; public: DataVariant execute(ExecutionPolicy& exec_policy) { - AggregateDataVariant children_values = std::get<AggregateDataVariant>(m_node.children[1]->execute(exec_policy)); + AggregateDataVariant children_values = std::get<AggregateDataVariant>(m_rhs_node.execute(exec_policy)); static_assert(std::is_same_v<OperatorT, language::eq_op>, "forbidden affection operator for list to vectors"); @@ -585,7 +593,7 @@ class AffectationToTinyMatrixFromListProcessor final : public INodeProcessor v(i, j) = child_value; } else { // LCOV_EXCL_START - throw ParseError("unexpected error: unexpected right hand side type in affectation", m_node.begin()); + throw ParseError("unexpected error: unexpected right hand side type in affectation", m_rhs_node.begin()); // LCOV_EXCL_STOP } }, @@ -597,29 +605,22 @@ class AffectationToTinyMatrixFromListProcessor final : public INodeProcessor return {}; } - AffectationToTinyMatrixFromListProcessor(ASTNode& node) : m_node{node} - { - const std::string& symbol = m_node.children[0]->string(); - auto [i_symbol, found] = m_node.m_symbol_table->find(symbol, m_node.children[0]->begin()); - Assert(found); - - m_lhs = &i_symbol->attributes().value(); - } + AffectationToTinyMatrixFromListProcessor(ASTNode& lhs_node, ASTNode& rhs_node) + : AffectationToDataVariantProcessorBase(lhs_node), m_rhs_node{rhs_node} + {} }; template <typename ValueT> -class AffectationToTupleProcessor final : public INodeProcessor +class AffectationToTupleProcessor final : public AffectationToDataVariantProcessorBase { private: - ASTNode& m_node; - - DataVariant* m_lhs; + ASTNode& m_rhs_node; public: DataVariant execute(ExecutionPolicy& exec_policy) { - DataVariant value = m_node.children[1]->execute(exec_policy); + DataVariant value = m_rhs_node.execute(exec_policy); std::visit( [&](auto&& v) { @@ -646,12 +647,12 @@ class AffectationToTupleProcessor final : public INodeProcessor *m_lhs = std::vector<ValueT>{ValueT{zero}}; } else { // LCOV_EXCL_START - throw ParseError("unexpected error: unexpected right hand side type in affectation", m_node.begin()); + throw ParseError("unexpected error: unexpected right hand side type in affectation", m_rhs_node.begin()); // LCOV_EXCL_STOP } } else { // LCOV_EXCL_START - throw ParseError("unexpected error: unexpected right hand side type in affectation", m_node.begin()); + throw ParseError("unexpected error: unexpected right hand side type in affectation", m_rhs_node.begin()); // LCOV_EXCL_STOP } }, @@ -660,23 +661,16 @@ class AffectationToTupleProcessor final : public INodeProcessor return {}; } - AffectationToTupleProcessor(ASTNode& node) : m_node{node} - { - const std::string& symbol = m_node.children[0]->string(); - auto [i_symbol, found] = m_node.m_symbol_table->find(symbol, m_node.children[0]->begin()); - Assert(found); - - m_lhs = &i_symbol->attributes().value(); - } + AffectationToTupleProcessor(ASTNode& lhs_node, ASTNode& rhs_node) + : AffectationToDataVariantProcessorBase(lhs_node), m_rhs_node{rhs_node} + {} }; template <typename ValueT> -class AffectationToTupleFromListProcessor final : public INodeProcessor +class AffectationToTupleFromListProcessor final : public AffectationToDataVariantProcessorBase { private: - ASTNode& m_node; - - DataVariant* m_lhs; + ASTNode& m_rhs_node; void _copyAggregateDataVariant(const AggregateDataVariant& children_values) @@ -711,7 +705,7 @@ class AffectationToTupleFromListProcessor final : public INodeProcessor } else { // LCOV_EXCL_START throw ParseError("unexpected error: unexpected right hand side type in affectation", - m_node.children[1]->children[i]->begin()); + m_rhs_node.children[i]->begin()); // LCOV_EXCL_STOP } }, @@ -728,7 +722,7 @@ class AffectationToTupleFromListProcessor final : public INodeProcessor } else { // LCOV_EXCL_START throw ParseError("unexpected error: unexpected right hand side type in affectation", - m_node.children[1]->children[i]->begin()); + m_rhs_node.children[i]->begin()); // LCOV_EXCL_STOP } } else if constexpr (is_tiny_matrix_v<ValueT>) { @@ -745,7 +739,7 @@ class AffectationToTupleFromListProcessor final : public INodeProcessor } else { // LCOV_EXCL_START throw ParseError("unexpected error: unexpected right hand side type in affectation", - m_node.children[1]->children[i]->begin()); + m_rhs_node.children[i]->begin()); // LCOV_EXCL_STOP } }, @@ -763,13 +757,13 @@ class AffectationToTupleFromListProcessor final : public INodeProcessor } else { // LCOV_EXCL_START throw ParseError("unexpected error: unexpected right hand side type in affectation", - m_node.children[1]->children[i]->begin()); + m_rhs_node.children[i]->begin()); // LCOV_EXCL_STOP } } else { // LCOV_EXCL_START throw ParseError("unexpected error: unexpected right hand side type in affectation", - m_node.children[1]->children[i]->begin()); + m_rhs_node.children[i]->begin()); // LCOV_EXCL_STOP } }, @@ -805,8 +799,7 @@ class AffectationToTupleFromListProcessor final : public INodeProcessor } } else { // LCOV_EXCL_START - throw ParseError("unexpected error: unexpected right hand side type in tuple affectation", - m_node.children[1]->begin()); + throw ParseError("unexpected error: unexpected right hand side type in tuple affectation", m_rhs_node.begin()); // LCOV_EXCL_STOP } @@ -826,34 +819,23 @@ class AffectationToTupleFromListProcessor final : public INodeProcessor this->_copyVector(value_list); } else { // LCOV_EXCL_START - throw ParseError("unexpected error: invalid lhs (expecting list or tuple)", - std::vector{m_node.children[1]->begin()}); + throw ParseError("unexpected error: invalid lhs (expecting list or tuple)", std::vector{m_rhs_node.begin()}); // LCOV_EXCL_STOP } }, - m_node.children[1]->execute(exec_policy)); + m_rhs_node.execute(exec_policy)); return {}; } - AffectationToTupleFromListProcessor(ASTNode& node) : m_node{node} - { - const std::string& symbol = m_node.children[0]->string(); - auto [i_symbol, found] = m_node.m_symbol_table->find(symbol, m_node.children[0]->begin()); - Assert(found); - - m_lhs = &i_symbol->attributes().value(); - } + AffectationToTupleFromListProcessor(ASTNode& lhs_node, ASTNode& rhs_node) + : AffectationToDataVariantProcessorBase(lhs_node), m_rhs_node{rhs_node} + {} }; template <typename ValueT> -class AffectationFromZeroProcessor final : public INodeProcessor +class AffectationFromZeroProcessor final : public AffectationToDataVariantProcessorBase { - private: - ASTNode& m_node; - - DataVariant* m_lhs; - public: DataVariant execute(ExecutionPolicy&) @@ -862,14 +844,7 @@ class AffectationFromZeroProcessor final : public INodeProcessor return {}; } - AffectationFromZeroProcessor(ASTNode& node) : m_node{node} - { - const std::string& symbol = m_node.children[0]->string(); - auto [i_symbol, found] = m_node.m_symbol_table->find(symbol, m_node.children[0]->begin()); - Assert(found); - - m_lhs = &i_symbol->attributes().value(); - } + AffectationFromZeroProcessor(ASTNode& lhs_node) : AffectationToDataVariantProcessorBase(lhs_node) {} }; template <typename OperatorT> diff --git a/src/language/utils/AffectationProcessorBuilder.hpp b/src/language/utils/AffectationProcessorBuilder.hpp index 8d11599a01c67566e0f88fcb34cad581bc76de45..0e4b7ace65654b650989e817dbe2e4a545ae320f 100644 --- a/src/language/utils/AffectationProcessorBuilder.hpp +++ b/src/language/utils/AffectationProcessorBuilder.hpp @@ -15,18 +15,18 @@ class AffectationProcessorBuilder final : public IAffectationProcessorBuilder public: AffectationProcessorBuilder() = default; std::unique_ptr<INodeProcessor> - getNodeProcessor(ASTNode& node) const + getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final { if constexpr (std::is_same_v<ValueT, TinyVector<1>> and std::is_same_v<DataT, int64_t> and std::is_same_v<OperatorT, language::eq_op>) { // Special treatment for the case 0 -> R^1 - if ((node.children[1]->is_type<language::integer>()) and (std::stoi(node.children[1]->string()) == 0)) { - return std::make_unique<AffectationFromZeroProcessor<ValueT>>(node); + if ((rhs_node.is_type<language::integer>()) and (std::stoi(rhs_node.string()) == 0)) { + return std::make_unique<AffectationFromZeroProcessor<ValueT>>(lhs_node); } else { - return std::make_unique<AffectationProcessor<OperatorT, ValueT, DataT>>(node); + return std::make_unique<AffectationProcessor<OperatorT, ValueT, DataT>>(lhs_node, rhs_node); } } else { - return std::make_unique<AffectationProcessor<OperatorT, ValueT, DataT>>(node); + return std::make_unique<AffectationProcessor<OperatorT, ValueT, DataT>>(lhs_node, rhs_node); } } }; @@ -37,9 +37,9 @@ class AffectationToTupleProcessorBuilder final : public IAffectationProcessorBui public: AffectationToTupleProcessorBuilder() = default; std::unique_ptr<INodeProcessor> - getNodeProcessor(ASTNode& node) const + getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final { - return std::make_unique<AffectationToTupleProcessor<ValueT>>(node); + return std::make_unique<AffectationToTupleProcessor<ValueT>>(lhs_node, rhs_node); } }; @@ -49,10 +49,10 @@ class AffectationToTupleFromListProcessorBuilder final : public IAffectationProc public: AffectationToTupleFromListProcessorBuilder() = default; std::unique_ptr<INodeProcessor> - getNodeProcessor(ASTNode& node) const + getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final { - ASTNodeNaturalConversionChecker(*node.children[1], node.children[0]->m_data_type); - return std::make_unique<AffectationToTupleFromListProcessor<ValueT>>(node); + ASTNodeNaturalConversionChecker(rhs_node, lhs_node.m_data_type); + return std::make_unique<AffectationToTupleFromListProcessor<ValueT>>(lhs_node, rhs_node); } }; @@ -62,9 +62,9 @@ class AffectationToTinyVectorFromListProcessorBuilder final : public IAffectatio public: AffectationToTinyVectorFromListProcessorBuilder() = default; std::unique_ptr<INodeProcessor> - getNodeProcessor(ASTNode& node) const + getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final { - return std::make_unique<AffectationToTinyVectorFromListProcessor<OperatorT, ValueT>>(node); + return std::make_unique<AffectationToTinyVectorFromListProcessor<OperatorT, ValueT>>(lhs_node, rhs_node); } }; @@ -74,9 +74,9 @@ class AffectationToTinyMatrixFromListProcessorBuilder final : public IAffectatio public: AffectationToTinyMatrixFromListProcessorBuilder() = default; std::unique_ptr<INodeProcessor> - getNodeProcessor(ASTNode& node) const + getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final { - return std::make_unique<AffectationToTinyMatrixFromListProcessor<OperatorT, ValueT>>(node); + return std::make_unique<AffectationToTinyMatrixFromListProcessor<OperatorT, ValueT>>(lhs_node, rhs_node); } }; @@ -86,12 +86,12 @@ class AffectationFromZeroProcessorBuilder final : public IAffectationProcessorBu public: AffectationFromZeroProcessorBuilder() = default; std::unique_ptr<INodeProcessor> - getNodeProcessor(ASTNode& node) const + getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final { - if (std::stoi(node.children[1]->string()) == 0) { - return std::make_unique<AffectationFromZeroProcessor<ValueT>>(node); + if (std::stoi(rhs_node.string()) == 0) { + return std::make_unique<AffectationFromZeroProcessor<ValueT>>(lhs_node); } else { - throw ParseError("invalid integral value (0 is the solely valid value)", std::vector{node.children[1]->begin()}); + throw ParseError("invalid integral value (0 is the solely valid value)", std::vector{lhs_node.begin()}); } } }; diff --git a/src/language/utils/IAffectationProcessorBuilder.hpp b/src/language/utils/IAffectationProcessorBuilder.hpp index 6d5f8540df9435bba4b86e6bee22f980b5727d7b..cc0ca85f67ece81b6c1313a13c429dfeb9718cd7 100644 --- a/src/language/utils/IAffectationProcessorBuilder.hpp +++ b/src/language/utils/IAffectationProcessorBuilder.hpp @@ -9,7 +9,7 @@ class INodeProcessor; class IAffectationProcessorBuilder { public: - virtual std::unique_ptr<INodeProcessor> getNodeProcessor(ASTNode& node) const = 0; + virtual std::unique_ptr<INodeProcessor> getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const = 0; virtual ~IAffectationProcessorBuilder() = default; };