Header lexy/dsl/digit.hpp
Token rules that match individual digits or sequence of digits.
Bases
lexy/dsl/digit.hpp
namespace lexy::dsl
{
struct binary {};
struct octal {};
struct decimal {};
struct hex_lower {};
struct hex_upper {};
struct hex {};
}
The tag types binary
, octal
, decimal
, hex_lower
, hex_upper
, and hex
indicate the base of a number and what digits are allowed.
The bases
Tag | Radix | Digits |
---|---|---|
| 2 |
|
| 8 |
|
| 10 |
|
| 16 |
|
| 16 |
|
| 16 |
|
Char class rule lexy::dsl::zero
lexy/dsl/digit.hpp
namespace lexy::dsl
{
constexpr char-class-rule auto zero;
}
zero
is a char class rule that matches 0
.
Its name is digit.zero
.
In the parse tree, it creates a single token node with the lexy::predefined_token_kind
lexy::digit_token_kind
.
Char class rule lexy::dsl::digit
lexy/dsl/digit.hpp
namespace lexy::dsl
{
template <typename Base = decimal>
constexpr char-class-rule auto digit;
}
digit
is a char class rule that matches one digit of the specified Base
.
Its name is digit.<base>
.
In the parse tree, it creates a single token node with the lexy::predefined_token_kind
lexy::digit_token_kind
.
Note | The only difference between lexy::dsl::digit<decimal> and lexy::dsl::ascii::digit is the name of the char class. |
Token rule lexy::dsl::digits
lexy/dsl/digit.hpp
namespace lexy
{
struct forbidden_leading_zero {};
}
namespace lexy::dsl
{
class digits-dsl // models token-rule
{
public:
constexpr digit-dsl sep(token-rule auto s) const;
constexpr digit-dsl no_leading_zero() const;
};
template <typename Base = decimal>
constexpr digits-dsl auto digits;
}
digits
is a token rule that matches one or more digits of the specified Base
with optional separator.
- Matching
Matches and consumes
digit<Base>
once, then tries to match and consume it again until it no longer matches. If a separator has been specified using.sep()
, it tries to match it after every digit. If it succeeds, matchesdigit<Base>
immediately afterwards.- Errors
lexy::forbidden_leading_zero
: if.no_leading_zero()
was called and it matcheszero
as its first digit, which is then followed by a digit or separator. The error is raised at the position of the zero. The rule then fails without consuming additional input.All errors raised by matching the initial digit. The rule then fails.
All errors raised by matching a digit after a separator to prevent trailing separators. The rule then fails.
- Parse tree
Single token node with the
lexy::predefined_token_kind
lexy::digit_token_kind
.
Note | If a digit separator is specified, it can be between any two digits. lexy does not enforce the use of thousands separators only, or other conventions. |
Note | digits does not produce the value of the number it parsed.
Use lexy::dsl::integer for that. |
Token rule lexy::dsl::n_digits
lexy/dsl/digit.hpp
namespace lexy::dsl
{
class n_digits-dsl // models token-rule
{
public:
constexpr n_digits-dsl sep(token-rule auto s) const;
};
template <std::size_t N, typename Base = decimal>
constexpr n_digits-dsl auto n_digits;
}
n_digits
is a token rule that matches exactly N
digits of the specified Base
with optional separator.
- Matching
Matches and consumes
digit<Base>
N
times; any additional trailing digits are ignored. If a digit separator has been specified using.sep()
, it tries to match it after every digit except the last one. This does not count towards the number of digits.- Errors
All errors raised by matching
digit<Base>
. The rule then fails.- Parse tree
Single token node with the
lexy::predefined_token_kind
lexy::digit_token_kind
.
\x
escape sequenceNote | If a digit separator is specified, it can be between any two digits. lexy does not enforce the use of thousands separators only, or other conventions. |
Note | n_digits does not produce the value of the number it parsed.
Use lexy::dsl::integer or lexy::dsl::code_point_id for that. |
Pre-defined digit separators
lexy/dsl/digit.hpp
namespace lexy::dsl
{
constexpr token-rule auto digit_sep_underscore = lit_c<'_'>;
constexpr token-rule auto digit_sep_tick = lit_c<'\''>; // note: single character
}
The token rules digit_sep_underscore
and digit_sep_tick
are two convenience aliases for lexy::dsl::lit_c
that match common digit separators.