diff --git a/src/Parser/Parsing/Simple/SimpleExpressionInterpreter.cpp b/src/Parser/Parsing/Simple/SimpleExpressionInterpreter.cpp new file mode 100644 index 00000000..f8b0bbaf --- /dev/null +++ b/src/Parser/Parsing/Simple/SimpleExpressionInterpreter.cpp @@ -0,0 +1,79 @@ +#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; + SimpleExpressionMatchers().ApplyTokensToLexerConfig(lexerConfig); + + SimpleLexer lexer(m_input, std::move(lexerConfig)); + SimpleExpressionInterpreterParser parser(&lexer); + + if (!parser.Parse()) + return nullptr; + + return parser.GetParsedExpression(); +} diff --git a/src/Parser/Parsing/Simple/SimpleExpressionInterpreter.h b/src/Parser/Parsing/Simple/SimpleExpressionInterpreter.h new file mode 100644 index 00000000..5494cb6f --- /dev/null +++ b/src/Parser/Parsing/Simple/SimpleExpressionInterpreter.h @@ -0,0 +1,14 @@ +#pragma once +#include "Expression/ISimpleExpression.h" +#include "Parsing/IParserLineStream.h" + +class SimpleExpressionInterpreter +{ +public: + explicit SimpleExpressionInterpreter(IParserLineStream* input); + + std::unique_ptr Evaluate() const; + +private: + IParserLineStream* m_input; +};