From 619def44c1cca9f3cdf63544d5f24f2c7a7d9b77 Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Tue, 22 Feb 2022 17:03:21 +0100 Subject: Initial self-hosting commit This is the initial version of our tool that is able to build itself. In can be bootstrapped by ./bin/bootstrap.py Co-authored-by: Oliver Reiche Co-authored-by: Victor Moreno --- .../build_engine/expression/evaluator.hpp | 76 ++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/buildtool/build_engine/expression/evaluator.hpp (limited to 'src/buildtool/build_engine/expression/evaluator.hpp') diff --git a/src/buildtool/build_engine/expression/evaluator.hpp b/src/buildtool/build_engine/expression/evaluator.hpp new file mode 100644 index 00000000..b4cd5979 --- /dev/null +++ b/src/buildtool/build_engine/expression/evaluator.hpp @@ -0,0 +1,76 @@ +#ifndef INCLUDED_SRC_BUILDTOOL_BUILD_ENGINE_EXPRESSION_EVALUATOR_HPP +#define INCLUDED_SRC_BUILDTOOL_BUILD_ENGINE_EXPRESSION_EVALUATOR_HPP + +#include +#include + +#include "src/buildtool/build_engine/expression/expression.hpp" +#include "src/buildtool/build_engine/expression/function_map.hpp" + +class Configuration; + +class Evaluator { + public: + class EvaluationError : public std::exception { + public: + explicit EvaluationError(std::string const& msg, + bool while_eval = false, + bool user_context = false) noexcept + : msg_{(while_eval ? "" + : (user_context ? "UserError: " + : "EvaluationError: ")) + + msg}, + while_eval_{while_eval}, + user_context_{user_context} {} + [[nodiscard]] auto what() const noexcept -> char const* final { + return msg_.c_str(); + } + + [[nodiscard]] auto WhileEvaluation() const -> bool { + return while_eval_; + } + + [[nodiscard]] auto UserContext() const -> bool { return user_context_; } + + [[nodiscard]] static auto WhileEvaluating(ExpressionPtr const& expr, + Configuration const& env, + std::exception const& ex) + -> EvaluationError; + + [[nodiscard]] static auto WhileEval(ExpressionPtr const& expr, + Configuration const& env, + EvaluationError const& ex) + -> EvaluationError; + + [[nodiscard]] static auto WhileEvaluating(const std::string& where, + std::exception const& ex) + -> Evaluator::EvaluationError; + + [[nodiscard]] static auto WhileEval(const std::string& where, + EvaluationError const& ex) + -> Evaluator::EvaluationError; + + private: + std::string msg_; + bool while_eval_; + bool user_context_; + }; + + // Exception-free evaluation of expression + [[nodiscard]] static auto EvaluateExpression( + ExpressionPtr const& expr, + Configuration const& env, + FunctionMapPtr const& provider_functions, + std::function const& logger, + std::function const& note_user_context = []() {}) noexcept + -> ExpressionPtr; + + private: + constexpr static std::size_t kLineWidth = 80; + [[nodiscard]] static auto Evaluate(ExpressionPtr const& expr, + Configuration const& env, + FunctionMapPtr const& functions) + -> ExpressionPtr; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_BUILD_ENGINE_EXPRESSION_EVALUATOR_HPP -- cgit v1.2.3