grammar.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #pragma once
  2. #include <initializer_list>
  3. #include <limits>
  4. #include <map>
  5. #include <string>
  6. #include <vector>
  7. #include <abnf/detail/iless.h>
  8. #include <abnf/forward.h>
  9. namespace abnf {
  10. struct rule {
  11. rule() = default;
  12. rule(rule_part part);
  13. rule(rule_part_like auto && part);
  14. rule(std::initializer_list<rule_part> rules);
  15. friend bool operator==(rule const & lhs, rule const & rhs);
  16. std::vector<rule_part> rules;
  17. };
  18. struct literal {
  19. explicit literal(std::string_view lit);
  20. friend bool operator==(literal const &, literal const &) = default;
  21. std::string value;
  22. };
  23. struct reference {
  24. explicit reference(std::string_view ref);
  25. friend bool operator==(reference const &, reference const &) = default;
  26. std::string value;
  27. };
  28. struct char_range { // TODO: UTF8/Codepoint handling
  29. char_range() = default;
  30. char_range(int val) : first(val), last(val) {}
  31. char_range(int first, int last) : first(first), last(last) {}
  32. friend bool operator==(char_range const &, char_range const &) = default;
  33. int first;
  34. int last;
  35. };
  36. struct repeated {
  37. friend bool operator==(repeated const &, repeated const &) = default;
  38. rule rule;
  39. size_t min = 0;
  40. size_t max = std::numeric_limits<size_t>::max();
  41. };
  42. struct one_of {
  43. explicit one_of(rule_part part) : rules{part} {}
  44. one_of(std::initializer_list<rule> rules) : rules(rules) {}
  45. one_of(std::initializer_list<rule_part> rules)
  46. : rules(rules.begin(), rules.end()) {}
  47. friend bool operator==(one_of const &, one_of const &) = default;
  48. std::vector<rule> rules;
  49. };
  50. inline bool operator==(rule const & lhs, rule const & rhs) {
  51. return lhs.rules == rhs.rules;
  52. }
  53. class grammar {
  54. public:
  55. using rule_store = std::map<std::string, rule, detail::iless>;
  56. private:
  57. struct satisfies_result;
  58. public:
  59. grammar(std::string_view name, rule base_rule, rule_store rules = {})
  60. : name_(name), base_rule_(std::move(base_rule)),
  61. rules_(std::move(rules)) {}
  62. bool satisfies(std::string_view text) const;
  63. private:
  64. grammar() = default;
  65. satisfies_result satisfies(std::string_view & text, rule const & rule) const;
  66. satisfies_result satisfies(std::string_view text, auto const & lit) const;
  67. friend bool operator==(grammar const &, grammar const &) = default;
  68. private:
  69. friend std::ostream & operator<<(std::ostream &, grammar const &);
  70. friend grammar parse(std::istream &);
  71. std::string name_;
  72. rule base_rule_;
  73. // TODO: Default Rules of ABNF
  74. static rule_store const s_default_rules_;
  75. rule_store rules_;
  76. };
  77. rule::rule(rule_part_like auto && part)
  78. : rule(rule_part(std::forward<decltype(part)>(part))) {}
  79. }