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.

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 cpp:char const*[]

  • end is a value of type cpp:char const*[]

Expression Type Semantics, Pre/Post-conditions

T(t)

-

Copy construction of T throws nothing.

std::is_nothrow_copy_constructible<T>::https://en.cppreference.com/w/cpp/types/is_copy_constructible[std::is_nothrow_copy_constructible::value,window="_blank"] == truecpp:

[]T::value_typecpp:

-

Values of this type are returned by the rule when the parse operation is successful

[]t.parse(it,end)cpp:

[]result<T::value_type>cpp:

Attempt to parse the buffer of characters defined by the range []// [it,end)cpp:. Upon success, the return result holds an instance of the rule’s value type, and the reference parameter []itcpp: 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 []itcpp: is modified.

Exemplar

For best results, it is suggested that all constructors for rules be marked []constexprcpp:.

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

  • []grammar::dec_octet_rulecpp:

  • []grammar::delim_rulecpp:

  • []grammar::not_empty_rulecpp:

  • []grammar::optional_rulecpp:

  • []grammar::range_rulecpp:

  • []grammar::token_rulecpp:

  • []grammar::tuple_rulecpp:

  • []grammar::unsigned_rulecpp:

  • []grammar::variant_rule`