[/ Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com) Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Official repository: https://github.com/boostorg/url ] [section 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 __parse__ which provide a convenient, uniform front end. [heading Related Identifiers] __is_rule__, __parse__. [heading Requirements] In this table: * `T` is a type meeting the requirements of ['Rule] * `t` is a const value of type `T` * `it` is an ['lvalue] with type `char const*` * `end` is a value of type `char const*` [table Valid expressions [[Expression] [Type] [Semantics, Pre/Post-conditions]] [ [ ``` T(t) ``` ] [] [ Copy construction of `T` throws nothing. `std::is_nothrow_copy_constructible::value == true` ] ][ [ ``` T::value_type ``` ] [] [ Values of this type are returned by the rule when the parse operation is successful ] ][ [ ``` t.parse(it,end) ``` ] [`result`] [ Attempt to parse the buffer of characters defined by the range `[it,end)`. Upon success, the return result holds an instance of the rule's value type, and the reference parameter `it` is modified to point to the first unconsumed character. Otherwise, upon failure the result holds an error. In this case the implementation defines if and how the reference parameter `it` is modified. ] ]] [heading Exemplar] For best results, it is suggested that all constructors for rules be marked `constexpr`. ``` 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{}; ``` [heading Models] * __dec_octet_rule__ * __delim_rule__ * __not_empty_rule__ * __optional_rule__ * __range_rule__ * __token_rule__ * __tuple_rule__ * __unsigned_rule__ * __variant_rule__ [endsect]