| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581 |
- // Copyright (C) 2020 T. Zachary Laine
- //
- // 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)
- #ifndef BOOST_PARSER_PARSER_FWD_HPP
- #define BOOST_PARSER_PARSER_FWD_HPP
- #include <boost/parser/config.hpp>
- #include <boost/parser/error_handling_fwd.hpp>
- #include <any>
- #include <cstdint>
- #include <functional>
- #include <map>
- #include <memory>
- #include <optional>
- #include <variant>
- namespace boost::parser::detail { namespace text {
- struct null_sentinel_t;
- }}
- namespace boost { namespace parser {
- /** A sentinel type that compares equal to a pointer to a character value
- type, iff the pointer is null. */
- using null_sentinel_t = boost::parser::detail::text::null_sentinel_t;
- /** A variable template that indicates that type `T` is an optional-like
- type. */
- template<typename T>
- constexpr bool enable_optional = false;
- /** A variable template that indicates that type `T` is an variant-like
- type. */
- template<typename T>
- constexpr bool enable_variant = false;
- #ifndef BOOST_PARSER_DOXYGEN
- template<typename T>
- constexpr bool enable_optional<std::optional<T>> = true;
- template<typename... Ts>
- constexpr bool enable_variant<std::variant<Ts...>> = true;
- #endif
- /** A type trait that evaluates to the attribute type for parser `Parser`
- used to parse range `R`, as if by calling `parse(r, parser)`, using
- some `R r` and `Parser parser`. Note that this implies that pointers
- to null-terminated strings are supported types for `R`. The result is
- not wrapped in a `std::optional` like the result of a call to
- `parse()` would be. If `Parser` produces no attribute, the result is
- the no-attribute sentinel type `none`. */
- template<typename R, typename Parser>
- struct attribute;
- /** An alias for `typename attribute<R, Parser>::type`. */
- template<typename R, typename Parser>
- using attribute_t = typename attribute<R, Parser>::type;
- /** Produces a `subrange` comprising the given pointer and
- `null_sentinel`. This should be used to make Null-Terminated Byte
- Strings ("NTBSs") compatible with ranges. */
- template<typename CharT>
- constexpr auto null_term(CharT * ptr)
- {
- return BOOST_PARSER_SUBRANGE(ptr, detail::text::null_sentinel);
- }
- namespace detail {
- template<typename T>
- constexpr bool is_optional_v = enable_optional<T>;
- struct nope;
- enum class flags : unsigned int {
- gen_attrs = 1 << 0,
- use_skip = 1 << 1,
- trace = 1 << 2,
- in_apply_parser = 1 << 3
- };
- struct symbol_table_trie_element
- {
- std::any trie_;
- bool has_case_folded_;
- };
- using symbol_table_tries_t =
- std::map<void *, symbol_table_trie_element, std::less<void *>>;
- using pending_symtab_ops_visitor = std::function<void()>;
- struct pending_symtab_ops_entry
- {
- pending_symtab_ops_visitor visit_;
- // Contains std::vector<detail::symbol_table_operation<T>> (T is
- // known to visit_).
- std::any ops_;
- };
- using pending_symbol_table_operations_t = std::map<
- void const *,
- pending_symtab_ops_entry,
- std::less<void const *>>;
- template<
- bool DoTrace,
- bool UseCallbacks,
- typename Iter,
- typename Sentinel,
- typename ErrorHandler>
- inline auto make_context(
- Iter first,
- Sentinel last,
- bool & success,
- int & indent,
- ErrorHandler const & error_handler,
- nope const &,
- symbol_table_tries_t & symbol_table_tries,
- pending_symbol_table_operations_t &
- pending_symbol_table_operations) noexcept;
- struct skip_skipper;
- struct char_subrange
- {
- char32_t lo_;
- char32_t hi_;
- };
- template<typename Tag>
- struct char_subranges
- {};
- struct hex_digit_subranges
- {};
- struct control_subranges
- {};
- template<typename Tag>
- struct char_set
- {};
- struct punct_chars
- {};
- struct symb_chars
- {};
- struct lower_case_chars
- {};
- struct upper_case_chars
- {};
- }
- /** Repeats the application of another parser `p` of type `Parser`,
- optionally applying another parser `d` of type `DelimiterParser` in
- between each pair of applications of `p`. The parse succeeds if `p`
- succeeds at least the minumum number of times, and `d` succeeds each
- time it is applied. The attribute produced is a sequence of the type
- of attribute produced by `Parser`. */
- template<
- typename Parser,
- typename DelimiterParser = detail::nope,
- typename MinType = int64_t,
- typename MaxType = int64_t>
- struct repeat_parser;
- /** Repeats the application of another parser `p` of type `Parser`, `[0,
- Inf)` times. The parse always succeeds. The attribute produced is a
- sequence of the type of attribute produced by `Parser`. */
- template<typename Parser>
- struct zero_plus_parser;
- /** Repeats the application of another parser `p` of type `Parser`, `[1,
- Inf)` times. The parse succeeds iff `p` succeeds at least once. The
- attribute produced is a sequence of the type of attribute produced by
- `Parser`. */
- template<typename Parser>
- struct one_plus_parser;
- /** Repeats the application of another parser `p` of type `Parser`, `[1,
- Inf)` times, applying a parser `d` of type `DelimiterParser` in
- between each pair of applications of `p`. The parse succeeds iff `p`
- succeeds at least once, and `d` succeeds each time it is applied. The
- attribute produced is a sequence of the type of attribute produced by
- `Parser`. */
- template<typename Parser, typename DelimiterParser>
- struct delimited_seq_parser;
- /** Repeats the application of another parser of type `Parser`, `[0, 1]`
- times. The parse always succeeds. The attribute produced is a
- `std::optional<T>`, where `T` is the type of attribute produced by
- `Parser`. */
- template<typename Parser>
- struct opt_parser;
- /** Applies each parser in `ParserTuple`, in order, stopping after the
- application of the first one that succeeds. The parse succeeds iff
- one of the sub-parsers succeeds. The attribute produced is a
- `std::variant` over the types of attribute produced by the parsers in
- `ParserTuple`. */
- template<typename ParserTuple>
- struct or_parser;
- /** Applies each parsers in `ParserTuple`, an any order, stopping after
- all of them have matched the input. The parse succeeds iff all the
- parsers match, regardless of the order in which they do. The
- attribute produced is a `parser::tuple` containing the attributes of
- the subparsers, in their order of the parsers' appearance in
- `ParserTuple`, not the order of the parsers' matches. It is an error
- to specialize `perm_parser` with a `ParserTuple` template parameter
- that includes an `eps_parser`. */
- template<typename ParserTuple, typename DelimiterParser>
- struct perm_parser;
- /** Applies each parser in `ParserTuple`, in order. The parse succeeds
- iff all of the sub-parsers succeed. The attribute produced is a
- `std::tuple` over the types of attribute produced by the parsers in
- `ParserTuple`. The BacktrackingTuple template parameter is a
- `parser::tuple` of `std::bool_constant` values. The `i`th such value
- indicates whether backtracking is allowed if the `i`th parser
- fails. */
- template<
- typename ParserTuple,
- typename BacktrackingTuple,
- typename CombiningGroups>
- struct seq_parser;
- /** Applies the given parser `p` of type `Parser` and an invocable `a` of
- type `Action`. `Action` shall model `semantic_action`, and `a` will
- only be invoked if `p` succeeds. The parse succeeds iff `p` succeeds.
- Produces no attribute. */
- template<typename Parser, typename Action>
- struct action_parser;
- /** Applies the given parser `p` of type `Parser`. The attribute produced
- by `p` is passed to the fiven invocable `f` of type `F`. `f` will
- only be invoked if `p` succeeds and sttributes are currently being
- generated. The parse succeeds iff `p` succeeds. The attribute
- produced is the the result of the call to `f`. */
- template<typename Parser, typename F>
- struct transform_parser;
- /** Applies the given parser `p` of type `Parser`. This parser produces
- no attribute, and suppresses the production of any attributes that
- would otherwise be produced by `p`. The parse succeeds iff `p`
- succeeds. */
- template<typename Parser>
- struct omit_parser;
- /** Applies the given parser `p` of type `Parser`; regardless of the
- attribute produced by `Parser`, this parser's attribute is equivalent
- to `_where(ctx)` within a semantic action on `p`. The parse succeeds
- iff `p` succeeds. */
- template<typename Parser>
- struct raw_parser;
- #if defined(BOOST_PARSER_DOXYGEN) || BOOST_PARSER_USE_CONCEPTS
- /** Applies the given parser `p` of type `Parser`. Regardless of the
- attribute produced by `Parser`, this parser's attribute is equivalent
- to `std::basic_string_view<char_type>` within a semantic action on
- `p`, where `char_type` is the type of character in the sequence being
- parsed. If the parsed range is transcoded, `char_type` will be the
- type being transcoded from. If the underlying range of `char_type` is
- non-contiguous, code using `string_view_parser` is ill-formed. The
- parse succeeds iff `p` succeeds. This parser is only available in
- C++20 and later. */
- template<typename Parser>
- struct string_view_parser;
- #endif
- /** Applies the given parser `p` of type `Parser`, disabling the current
- skipper in use, if any. The parse succeeds iff `p` succeeds. The
- attribute produced is the type of attribute produced by `Parser`. */
- template<typename Parser>
- struct lexeme_parser;
- /** Applies the given parser `p` of type `Parser`, enabling
- case-insensitive matching, based on Unicode case folding. The parse
- succeeds iff `p` succeeds. The attribute produced is the type of
- attribute produced by `Parser`. */
- template<typename Parser>
- struct no_case_parser;
- /** Applies the given parser `p` of type `Parser`, using a parser of type
- `SkipParser` as the skipper. The parse succeeds iff `p` succeeds.
- The attribute produced is the type of attribute produced by
- `Parser`. */
- template<typename Parser, typename SkipParser = detail::nope>
- struct skip_parser;
- /** Applies the given parser `p` of type `Parser`, producing no attributes
- and consuming no input. The parse succeeds iff `p`'s success is
- unequal to `FailOnMatch`. */
- template<typename Parser, bool FailOnMatch>
- struct expect_parser;
- /** Matches one of a set S of possible inputs, each of which is associated
- with an attribute value of type `T`, forming a symbol table. New
- elements and their associated attributes may be added to or removed
- from S dynamically, during parsing; any such changes are reverted at
- the end of parsing. The parse succeeds iff an element of S is
- matched. \see `symbols` */
- template<typename T>
- struct symbol_parser;
- /** Applies another parser `p`, associated with this parser via `TagType`.
- The attribute produced is `Attribute`. Both a default-constructed
- object of type `LocalState`, and a default-constructed object of type
- `ParamsTuple`, are added to the parse context before the associated
- parser is applied. The parse succeeds iff `p` succeeds. If
- `CanUseCallbacks` is `true`, and if this parser is used within a call
- to `callback_parse()`, the attribute is produced via callback;
- otherwise, the attribute is produced as normal (as a return value, or
- as an out-param). The rule may be constructed with user-friendly
- diagnostic text that will appear if the top-level parse is executed
- with `trace_mode == boost::parser::trace::on`. */
- template<
- bool CanUseCallbacks,
- typename TagType,
- typename Attribute,
- typename LocalState,
- typename ParamsTuple>
- struct rule_parser;
- /** Matches anything, and consumes no input. If `Predicate` is anything
- other than `detail::nope` (which it is by default), and `pred_(ctx)`
- evaluates to false, where `ctx` is the parser context, the parse
- fails. */
- template<typename Predicate>
- struct eps_parser;
- /** Matches only the end of input. Produces no attribute. */
- struct eoi_parser;
- /** Matches anything, consumes no input, and produces an attribute of type
- `RESOLVE(Attribute)`. */
- template<typename Attribute>
- struct attr_parser;
- /** A tag type that can be passed as the first parameter to `char_()` when
- the second parameter is a sorted, random access sequence that can be
- matched using a binary search.*/
- struct sorted_t
- {};
- inline constexpr sorted_t sorted;
- /** Matches a single code point. If `AttributeType` is not `void`,
- `AttributeType` is the attribute type produced; otherwise, the
- attribute type is the decayed type of the matched code point. The
- parse fails only if the parser is constructed with a specific set of
- expected code point values that does not include the matched code
- point. */
- template<typename Expected, typename AttributeType = void>
- struct char_parser;
- /** Matches a single code point that is equal to one of the code points
- associated with tag type `Tag`. This is used to create sets of
- characters for matching Unicode character classes like punctuation or
- lower case. Attribute type is the attribute type of the character
- being matched. */
- template<typename Tag>
- struct char_set_parser;
- /** Matches a single code point that falls into one of the subranges of
- code points associated with tag type `Tag`. This is used to create
- sets of characters for matching Unicode character classes like hex
- digits or control characters. Attribute type is the attribute type of
- the character being matched. */
- template<typename Tag>
- struct char_subrange_parser;
- /** Matches a single decimal digit code point, using the Unicode character
- class Hex_Digit. Attribute type is the attribute type of the
- character being matched. */
- struct digit_parser;
- /** Matches a particular string, delimited by an iterator sentinel pair;
- produces no attribute. */
- template<typename StrIter, typename StrSentinel>
- struct string_parser;
- /** Matches a string delimited by quotation marks; produces a
- `std::string` attribute. */
- template<
- typename Quotes = detail::nope,
- typename Escapes = detail::nope,
- typename CharParser = char_parser<detail::nope>>
- struct quoted_string_parser;
- /** Matches an end-of-line (`NewlinesOnly == true`), whitespace
- (`NewlinesOnly == false`), or (`NoNewlines == true`) blank (whitespace
- but not newline) code point, based on the Unicode definitions of each
- (also matches the two code points `"\r\n"`). Produces no
- attribute. */
- template<bool NewlinesOnly, bool NoNewlines>
- struct ws_parser;
- /** Matches the strings "true" and "false", producing an attribute of
- `true` or `false`, respectively, and fails on any other input. */
- struct bool_parser;
- /** Matches an unsigned number of radix `Radix`, of at least `MinDigits`
- and at most `MaxDigits`, producing an attribute of type `T`. Fails on
- any other input. The parse will also fail if `Expected` is anything
- but `detail::nope` (which it is by default), and the produced
- attribute is not equal to `expected_`. `Radix` must be one of `2`,
- `8`, `10`, or `16`. */
- template<
- typename T,
- int Radix = 10,
- int MinDigits = 1,
- int MaxDigits = -1,
- typename Expected = detail::nope>
- struct uint_parser;
- /** Matches a signed number of radix `Radix`, of at least `MinDigits` and
- at most `MaxDigits`, producing an attribute of type `T`. Fails on any
- other input. The parse will also fail if `Expected` is anything but
- `detail::nope` (which it is by default), and the produced
- attribute is not equal to `expected_`. `Radix` must be one of `2`,
- `8`, `10`, or `16`. */
- template<
- typename T,
- int Radix = 10,
- int MinDigits = 1,
- int MaxDigits = -1,
- typename Expected = detail::nope>
- struct int_parser;
- /** Matches a floating point number, producing an attribute of type
- `T`. */
- template<typename T>
- struct float_parser;
- /** Applies at most one of the parsers in `OrParser`. If `switch_value_`
- matches one or more of the values in the parsers in `OrParser`, the
- first such parser is applied, and the success or failure and attribute
- of the parse are those of the applied parser. Otherwise, the parse
- fails. */
- template<typename SwitchValue, typename OrParser = detail::nope>
- struct switch_parser;
- /** A wrapper for parsers that provides the operations that must be
- supported by all parsers (e.g. `operator>>()`). `GlobalState` is an
- optional state object that can be accessed within semantic actions via
- a call to `_globals()`. This global state object is ignored for all
- but the topmost parser; the topmost global state object is available
- in the semantic actions of all nested parsers. `ErrorHandler` is the
- type of the error handler to be used on parse failure. This handler
- is ignored on all but the topmost parser; the topmost parser's error
- handler is used for all errors encountered during parsing. */
- template<
- typename Parser,
- typename GlobalState = detail::nope,
- typename ErrorHandler = default_error_handler>
- struct parser_interface;
- using no_attribute = detail::nope;
- using no_local_state = detail::nope;
- using no_params = detail::nope;
- /** A type used to declare named parsing rules. The `TagType` template
- parameter is used to associate a particular `rule` with the
- `rule_parser` used during parsing. */
- template<
- typename TagType,
- typename Attribute = no_attribute,
- typename LocalState = no_local_state,
- typename ParamsTuple = no_params>
- struct rule;
- /** A type used to declare named parsing rules that support reporting of
- attributes via callback. The `TagType` template parameter is used to
- associate a particular `rule` with the `rule_parser` used during
- parsing. */
- template<
- typename TagType,
- typename Attribute = no_attribute,
- typename LocalState = no_local_state,
- typename ParamsTuple = no_params>
- struct callback_rule;
- #ifdef BOOST_PARSER_DOXYGEN
- /** Returns a reference to the attribute(s) (i.e. return value) of the
- bottommost parser; multiple attributes will be stored within a
- `parser::tuple`. You may write to this value in a semantic action to
- control what attribute value(s) the associated parser produces.
- Returns `none` if the bottommost parser does produce an attribute. */
- decltype(auto) _val(Context const & context);
- #endif
- /** Returns a reference to the attribute or attributes already produced by
- the bottommost parser; multiple attributes will be stored within a
- `parser::tuple`. Returns `none` if the bottommost parser does produce
- an attribute. */
- template<typename Context>
- decltype(auto) _attr(Context const & context);
- /** Returns a `subrange` that describes the matched range of the
- bottommost parser. */
- template<typename Context>
- decltype(auto) _where(Context const & context);
- /** Returns an iterator to the beginning of the entire sequence being
- parsed. The effect of calling this within a semantic action
- associated with a skip-parser is undefined */
- template<typename Context>
- decltype(auto) _begin(Context const & context);
- /** Returns an iterator to the end of the entire sequence being parsed. */
- template<typename Context>
- decltype(auto) _end(Context const & context);
- /** Returns a reference to a `bool` that represents the success or failure
- of the bottommost parser. You can assign `false` to this within a
- semantic action to force a parser to fail its parse. */
- template<typename Context>
- decltype(auto) _pass(Context const & context);
- /** Returns a reference to one or more local values that the bottommost
- rule is declared to have; multiple values will be stored within a
- `parser::tuple`. Returns `none` if there is no bottommost rule, or if
- that rule has no locals. */
- template<typename Context>
- decltype(auto) _locals(Context const & context);
- /** Returns a reference to one or more parameters passed to the bottommost
- rule `r`, by using `r` as `r.with(param0, param1, ... paramN)`;
- multiple values will be stored within a `parser::tuple`. Returns
- `none` if there is no bottommost rule, or if that rule was not given
- any parameters. */
- template<typename Context>
- decltype(auto) _params(Context const & context);
- /** Returns a reference to the globals object associated with the
- top-level parser. Returns `none` if there is no associated globals
- object. */
- template<typename Context>
- decltype(auto) _globals(Context const & context);
- /** Returns a reference to the error handler object associated with the
- top-level parser. Returns `none` if there is no associated error
- handler. */
- template<typename Context>
- decltype(auto) _error_handler(Context const & context);
- /** Report that the error described in `message` occurred at `location`,
- using the context's error handler. */
- #if BOOST_PARSER_USE_CONCEPTS
- template<std::forward_iterator I, typename Context>
- #else
- template<typename I, typename Context>
- #endif
- void _report_error(
- Context const & context, std::string_view message, I location);
- /** Report that the error described in `message` occurred at
- `_where(context).begin()`, using the context's error handler. */
- template<typename Context>
- void _report_error(Context const & context, std::string_view message);
- /** Report that the warning described in `message` occurred at `location`,
- using the context's error handler. */
- #if BOOST_PARSER_USE_CONCEPTS
- template<std::forward_iterator I, typename Context>
- #else
- template<typename I, typename Context>
- #endif
- void _report_warning(
- Context const & context, std::string_view message, I location);
- /** Report that the warning described in `message` occurred at
- `_where(context).begin()`, using the context's error handler. */
- template<typename Context>
- void _report_warning(Context const & context, std::string_view message);
- }}
- #endif
|