blob: b9e3e4c4da21530c65ed39960b92f52372ada1d1 [file]
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_EXPRESSION_EXPRESSION_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_EXPRESSION_EXPRESSION_H_
#include <memory>
#include <string>
#include <utility>
#include "absl/container/flat_hash_map.h"
#include "absl/container/flat_hash_set.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
namespace milotic_tlbmc {
class Expression {
public:
virtual ~Expression() = default;
virtual absl::StatusOr<double> Evaluate(
const absl::flat_hash_map<std::string, double>& variable_maps) const = 0;
virtual void GetRequiredVariables(
absl::flat_hash_set<std::string>& variable_names) const = 0;
};
// Parses an expression string into an Expression object.
absl::StatusOr<std::unique_ptr<Expression>> Parse(absl::string_view expression);
// Exposed for testing only. Do not use these functions directly.
namespace expression::internal {
absl::string_view ConsumeWhitespace(absl::string_view s);
char Peek(absl::string_view s);
std::pair<absl::string_view, bool> Consume(absl::string_view s, char c);
absl::StatusOr<std::pair<absl::string_view, std::unique_ptr<Expression>>>
ParsePrimary(absl::string_view s);
absl::StatusOr<std::pair<absl::string_view, std::unique_ptr<Expression>>>
ParseExponent(absl::string_view s);
absl::StatusOr<std::pair<absl::string_view, std::unique_ptr<Expression>>>
ParseFactor(absl::string_view s);
absl::StatusOr<std::pair<absl::string_view, std::unique_ptr<Expression>>>
ParseTerm(absl::string_view s);
absl::StatusOr<std::pair<absl::string_view, std::unique_ptr<Expression>>>
ParseExpression(absl::string_view s);
absl::StatusOr<std::pair<absl::string_view, std::unique_ptr<Expression>>>
ParseConditionalOp(absl::string_view s);
} // namespace expression::internal
} // namespace milotic_tlbmc
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_EXPRESSION_EXPRESSION_H_