forward.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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_base;
  21. class grammar_group;
  22. class grammar;
  23. grammar parse(std::istream & in);
  24. grammar parse(std::istream && in);
  25. grammar_group parse_group(std::istream & in);
  26. grammar_group parse_group(std::istream && in);
  27. std::ostream & operator<<(std::ostream & os, rule const & rule);
  28. std::ostream & operator<<(std::ostream & os, grammar_base const & grammar);
  29. std::ostream & operator<<(std::ostream & os, grammar const & grammar);
  30. template <typename T>
  31. concept rule_part_like = detail::in_variant<T, rule_part>::value;
  32. template <typename T>
  33. concept rule_like =
  34. std::is_constructible_v<rule_part, T> || std::is_same_v<rule, T>;
  35. }