#pragma once #include #include "SimpleExpressionBinaryOperation.h" #include "SimpleExpressionUnaryOperation.h" #include "Utils/ClassUtils.h" #include "Parsing/Matcher/AbstractMatcher.h" #include "Parsing/Matcher/MatcherLabel.h" #include "Parsing/Simple/Expression/ISimpleExpression.h" #include "Parsing/Sequence/SequenceResult.h" #include "Parsing/Simple/SimpleParserValue.h" #include class SimpleExpressionMatchers { public: using matcher_t = AbstractMatcher; typedef IMatcherForLabelSupplier supplier_t; static constexpr auto CAPTURE_OFFSET_EXPRESSION = 7000; static constexpr auto TAG_OFFSET_EXPRESSION = 7000; static constexpr auto CAPTURE_OFFSET_EXPRESSION_EXT = 8000; static constexpr auto TAG_OFFSET_EXPRESSION_EXT = 8000; static constexpr auto LABEL_EXPRESSION = 7000; static constexpr auto MULTI_TOKEN_OFFSET_UNARY = 700; static constexpr auto MULTI_TOKEN_OFFSET_BINARY = 720; private: bool m_enable_string_operands; bool m_enable_identifier_operands; bool m_enable_floating_point_operands; bool m_enable_int_operands; bool m_enable_conditional_operator; public: SimpleExpressionMatchers(); SimpleExpressionMatchers(bool enableStringOperands, bool enableIdentifierOperands, bool enableFloatingPointOperands, bool enableIntOperands, bool enableConditionalOperator); virtual ~SimpleExpressionMatchers(); SimpleExpressionMatchers(const SimpleExpressionMatchers& other) = default; SimpleExpressionMatchers(SimpleExpressionMatchers&& other) noexcept = default; SimpleExpressionMatchers& operator=(const SimpleExpressionMatchers& other) = default; SimpleExpressionMatchers& operator=(SimpleExpressionMatchers&& other) noexcept = default; protected: virtual std::unique_ptr ParseOperandExtension(const supplier_t* labelSupplier) const; virtual std::unique_ptr ProcessOperandExtension(SequenceResult& result) const; _NODISCARD virtual std::vector EnabledUnaryOperations() const; _NODISCARD virtual std::vector EnabledBinaryOperations() const; private: std::unique_ptr ParseBinaryOperationType(const supplier_t* labelSupplier) const; std::unique_ptr ParseOperand(const supplier_t* labelSupplier) const; std::unique_ptr ParseUnaryOperationType(const supplier_t* labelSupplier) const; std::unique_ptr ParseConditionalOperator(const supplier_t* labelSupplier) const; std::unique_ptr ProcessExpressionInParenthesis(SequenceResult& result) const; std::unique_ptr ProcessConditionalOperation(std::unique_ptr condition, SequenceResult& result) const; std::unique_ptr ProcessOperand(SequenceResult& result) const; public: std::unique_ptr Expression(const supplier_t* labelSupplier) const; std::unique_ptr ProcessExpression(SequenceResult& result) const; virtual void ApplyTokensToLexerConfig(SimpleLexer::Config& lexerConfig); };