[#boost-urls-grammar-Rule] = xref:boost.adoc[boost]::xref:boost/urls.adoc[urls]::xref:boost/urls/grammar.adoc[grammar]::Rule :relfileprefix: ../../../ :mrdocs: Concept for a grammar Rule == Synopsis Declared in `<https://www.github.com/boostorg/url/blob/develop/include/boost/url/grammar/type_traits.hpp#L119[boost/url/grammar/type_traits.hpp]>` [source,cpp,subs="verbatim,replacements,macros,-callouts"] ---- template<class T> concept Rule = requires (T t, char const*& it, char const* end) { typename T::value_type; { t.parse(it, end) } ‐> std::same_as<system::result<typename T::value_type>>; }; ---- == Description This concept is satisfied if `T` is a valid grammar Rule A `Rule` defines an algorithm used to match an input buffer of ASCII characters against a set of syntactical specifications. Each rule represents either a terminal symbol or a composition in the represented grammar. The library comes with a set of rules for productions typically found in RFC documents. Rules are not invoked directly; instead, rule variables are used with overloads of xref:boost/urls/grammar/parse-09.adoc[`parse`] which provide a convenient, uniform front end. == Exemplar For best results, it is suggested that all constructors for rules be marked `constexpr`. [,cpp] ---- struct Rule { struct value_type; constexpr Rule( Rule const& ) noexcept = default; auto parse( char const*& it, char const* end ) const -> result< value_type >; }; // Declare a variable of type Rule for notational convenience constexpr Rule rule{}; ---- == Model * `dec_octet_rule` * `delim_rule` * `not_empty_rule` * `optional_rule` * `range_rule` * `token_rule` * `tuple_rule` * `unsigned_rule` * `variant_rule` == See Also xref:boost/urls/grammar/parse-09.adoc[`parse`], xref:boost/urls/grammar/is_rule.adoc[`is_rule`]. [.small]#Created with https://www.mrdocs.com[MrDocs]#