blob: eef11e4c2dbf48f0329d007254b71c19c301edc8 [file] [log] [blame]
#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 "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);
bool Consume(absl::string_view& s, char c);
absl::StatusOr<std::unique_ptr<Expression>> ParsePrimary(absl::string_view& s);
absl::StatusOr<std::unique_ptr<Expression>> ParseFactor(absl::string_view& s);
absl::StatusOr<std::unique_ptr<Expression>> ParseTerm(absl::string_view& s);
absl::StatusOr<std::unique_ptr<Expression>> ParseExpression(
absl::string_view& s);
} // namespace expression::internal
} // namespace milotic_tlbmc
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_EXPRESSION_EXPRESSION_H_