forward.h 933 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #pragma once
  2. #include <iosfwd>
  3. #include <type_traits>
  4. #include <variant>
  5. namespace abnf::detail {
  6. template <typename, typename> struct in_variant : std::false_type {};
  7. template <typename T, typename... Ts>
  8. struct in_variant<T, std::variant<Ts...>>
  9. : std::disjunction<std::is_same<T, Ts>...> {};
  10. }
  11. namespace abnf {
  12. struct literal;
  13. struct reference;
  14. struct char_range;
  15. struct repeated;
  16. struct one_of;
  17. struct rule;
  18. using rule_part =
  19. std::variant<literal, char_range, reference, repeated, one_of>;
  20. class grammar;
  21. grammar parse(std::istream & in);
  22. grammar parse(std::istream && in);
  23. std::ostream & operator<<(std::ostream & os, rule const & rule);
  24. std::ostream & operator<<(std::ostream & os, grammar const & grammar);
  25. template <typename T>
  26. concept rule_part_like = detail::in_variant<T, rule_part>::value;
  27. template <typename T>
  28. concept rule_like =
  29. std::is_constructible_v<rule_part, T> || std::is_same_v<rule, T>;
  30. }