Header lexy/dsl/brackets.hpp
Rules for parsing bracketed or parenthesized expressions.
Rule DSL lexy::dsl::brackets
lexy/dsl/brackets.hppnamespace lexy::dsl
{
struct brackets-dsl // note: not a rule itself
{
constexpr branch-rule auto open() const;
constexpr branch-rule auto close() const;
constexpr terminator-dsl as_terminator() const;
constexpr brackets-dsl limit(auto ... limit);
constexpr rule auto recovery_rule() const;
//=== rules ===//
constexpr branch-rule auto operator()(rule auto rule) const;
constexpr branch-rule auto try_(rule auto rule) const;
constexpr branch-rule auto opt(rule auto rule) const;
constexpr branch-rule auto list(rule auto item) const;
constexpr branch-rule auto list(rule auto item, separator auto sep) const;
constexpr branch-rule auto opt_list(rule auto item) const;
constexpr branch-rule auto opt_list(rule auto item, separator auto sep) const;
};
constexpr brackets-dsl brackets(branch-rule auto open, branch-rule auto close);
}brackets is not a rule, but a DSL for specifying rules that all parse something surrounded by brackets.
Many rules require a branch rule as argument, like lexy::dsl::list.
However, there isn’t always an easy way to check for a branch condition and sometimes the rule in question is always surrounded by brackets.
Then you can use brackets:
it specifies branch rules for open and closing brackets and provides ways of building rules where any branch condition is just "the closing bracket hasn’t been matched yet".
As such, you don’t need to provide a branch condition anymore.
Common brackets, like parentheses, are predefined (see below).
Note | See lexy::dsl::terminator if you want to parse something that is just terminated by something and doesn’t have an "opening bracket". |
Branch rules .open() and .close()
lexy/dsl/brackets.hppconstexpr branch-rule auto open() const; (1)
constexpr branch-rule auto close() const; (2)Returns the opening bracket rule passed as first argument to
brackets().Returns the opening bracket rule passed as second argument to
brackets().
.as_terminator(), .limit(), and .recovery_rule()
lexy/dsl/brackets.hppconstexpr terminator-dsl as_terminator() const; (1)
constexpr brackets-dsl limit(auto ... limit); (2)
constexpr rule auto recovery_rule() const; (3)Returns the corresponding
terminator.Sets the limit for error recovery.
Returns
as_terminator().recovery_rule().
brackets itself is just a thin wrapper over lexy::dsl::terminator;
as_terminator() returns that terminator:
lexy::dsl::brackets(open, close).as_terminator() is equivalent to lexy::dsl::terminator(close);
lexy::dsl::brackets(open, close).limit(tokens…).as_terminator() is equivalent to lexy::dsl::terminator(close).limit(tokens…).as_terminator().
Bracketed rules
lexy/dsl/brackets.hppconstexpr branch-rule auto operator()(rule auto rule) const
{
return open() >> as_terminator()(rule);
}
constexpr branch-rule auto try_(rule auto rule) const
{
return open() >> as_terminator().try_(rule);
}
constexpr branch-rule auto opt(rule auto rule) const
{
return open() >> as_terminator().opt(rule);
}
constexpr branch-rule auto list(rule auto item) const
{
return open() >> as_terminator().list(item);
}
constexpr branch-rule auto list(rule auto item, separator auto sep) const
{
return open() >> as_terminator().list(item, sep);
}
constexpr branch-rule auto opt_list(rule auto item) const
{
return open() >> as_terminator().opt_list(item);
}
constexpr branch-rule auto opt_list(rule auto item, separator auto sep) const
{
return open() >> as_terminator().opt_list(item, sep);
}Parse something surrounded by brackets.
They are all entirely equivalent to the expression indicated above:
the result is a branch whose condition is open(),
and then it parses as_terminator().foo(…), where the terminator is close().
Predefined brackets
lexy/dsl/brackets.hppnamespace lexy::dsl
{
constexpr brackets-dsl auto round_bracketed = brackets(lit_c<'('>, lit_c<')'>);
constexpr brackets-dsl auto square_bracketed = brackets(lit_c<'['>, lit_c<']'>);
constexpr brackets-dsl auto curly_bracketed = brackets(lit_c<'{'>, lit_c<'}'>);
constexpr brackets-dsl auto angle_bracketed = brackets(lit_c<'<'>, lit_c<'>'>);
constexpr brackets-dsl auto parenthesized = round_bracketed;
}ASCII brackets are pre-defined.