#include "SimpleExpressionInterpreter.h" #include "Utils/ClassUtils.h" #include "Expression/SimpleExpressionMatchers.h" #include "Matcher/SimpleMatcherFactory.h" #include "Parsing/Impl/AbstractParser.h" class SimpleExpressionInterpreterParserState { public: std::unique_ptr m_expression; }; class SimpleExpressionInterpreterExpressionSequence final : public AbstractSequence { public: SimpleExpressionInterpreterExpressionSequence() { const SimpleMatcherFactory create(this); AddLabeledMatchers(m_expression_matchers.Expression(this), SimpleExpressionMatchers::LABEL_EXPRESSION); AddMatchers(create.Label(SimpleExpressionMatchers::LABEL_EXPRESSION)); } protected: void ProcessMatch(SimpleExpressionInterpreterParserState* state, SequenceResult& result) const override { state->m_expression = m_expression_matchers.ProcessExpression(result); } private: SimpleExpressionMatchers m_expression_matchers; }; class SimpleExpressionInterpreterParser final : public AbstractParser { public: explicit SimpleExpressionInterpreterParser(ILexer* lexer) : AbstractParser(lexer, std::make_unique()) { } _NODISCARD std::unique_ptr GetParsedExpression() const { return std::move(m_state->m_expression); } protected: const std::vector& GetTestsForState() override { static std::vector sequences { new SimpleExpressionInterpreterExpressionSequence() }; return sequences; } }; SimpleExpressionInterpreter::SimpleExpressionInterpreter(IParserLineStream* input) : m_input(input) { } std::unique_ptr SimpleExpressionInterpreter::Evaluate() const { SimpleLexer::Config lexerConfig; lexerConfig.m_emit_new_line_tokens = false; lexerConfig.m_read_integer_numbers = true; lexerConfig.m_read_floating_point_numbers = true; lexerConfig.m_read_strings = true; lexerConfig.m_string_escape_sequences = true; SimpleExpressionMatchers().ApplyTokensToLexerConfig(lexerConfig); SimpleLexer lexer(m_input, std::move(lexerConfig)); SimpleExpressionInterpreterParser parser(&lexer); if (!parser.Parse()) return nullptr; return parser.GetParsedExpression(); }