grammar.h 2.6 KB

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