Go to the documentation of this file.
4 #ifndef LEXY_EXT_PARSE_TREE_ALGORITHM_HPP_INCLUDED
5 #define LEXY_EXT_PARSE_TREE_ALGORITHM_HPP_INCLUDED
14 template <
typename Reader,
typename TokenKind,
typename MemoryResource>
19 using node_t =
typename tree_t::node;
20 using traverse_range =
typename tree_t::traverse_range;
21 using traverse_iterator =
typename traverse_range::iterator;
33 iterator() noexcept =
default;
35 auto deref()
const noexcept
42 void increment() noexcept
53 bool equal(iterator rhs)
const noexcept
55 return _cur == rhs._cur;
57 bool is_end()
const noexcept
63 explicit iterator(
const traverse_range& range) noexcept
64 : _cur(range.begin()), _end(range.end())
71 traverse_iterator _cur;
72 traverse_iterator _end;
77 explicit token_range(
const traverse_range& range) noexcept : _begin(range) {}
79 bool empty()
const noexcept
84 iterator
begin()
const noexcept
89 sentinel
end()
const noexcept
98 return token_range(tree.
traverse(node));
101 template <
typename Reader,
typename TokenKind,
typename MemoryResource>
113 template <
typename Reader,
typename TokenKind,
typename MemoryResource>
115 typename Reader::iterator
position) ->
137 template <
typename Predicate,
typename Iterator,
typename Sentinel>
171 return _cur == rhs._cur;
179 explicit iterator(Predicate&& pred, Iterator cur, Sentinel
end) noexcept
217 template <
typename Predicate,
typename Iterator,
typename Sentinel>
226 template <
typename Reader,
typename TokenKind,
typename MemoryResource,
typename Predicate>
234 else if constexpr (lexy::is_production<Predicate>)
243 template <
typename Reader,
typename TokenKind,
typename MemoryResource,
typename Predicate>
247 -> std::optional<typename lexy::parse_tree<Reader, TokenKind, MemoryResource>::node>
249 auto range =
children(tree, node, predicate);
253 return *range.begin();
265 template <
typename Reader,
typename TokenKind,
typename MemoryResource>
268 typename Reader::iterator
271 return pos_node->lexeme().begin();
276 return tokens.begin()->lexeme().begin();
280 #endif // LEXY_EXT_PARSE_TREE_ALGORITHM_HPP_INCLUDED
constexpr auto position
Produces an iterator to the current reader position without parsing anything.
traverse_range traverse(const node &n) const noexcept
_filtered_node_range(Predicate &&pred, Iterator begin, Sentinel end) noexcept
constexpr auto token(Rule)
Turns the arbitrary rule into a token by matching it without producing any values.
decltype(*Iterator()) node_t
void increment() noexcept
auto deref() const noexcept
constexpr auto empty(const C &c) -> decltype(c.empty())
bool equal(iterator rhs) const noexcept
#define LEXY_PRECONDITION(Expr)
auto children() const noexcept
iterator() noexcept=default
LEXY_EMPTY_MEMBER Sentinel _end
constexpr auto end(const C &c) -> decltype(c.end())
bool empty() const noexcept
friend _filtered_node_range
_filtered_node_range(Predicate &&pred, Iterator begin, Sentinel end) noexcept -> _filtered_node_range< std::decay_t< Predicate >, Iterator, Sentinel >
sentinel end() const noexcept
What sort of token it is.
iterator(Predicate &&pred, Iterator cur, Sentinel end) noexcept
auto child(const lexy::parse_tree< Reader, TokenKind, MemoryResource > &tree, typename lexy::parse_tree< Reader, TokenKind, MemoryResource >::node node, Predicate predicate) -> std::optional< typename lexy::parse_tree< Reader, TokenKind, MemoryResource >::node >
Returns the first child that matches predicate, if there is any.
@ leaf
We're visiting a token.
bool is_end() const noexcept
constexpr auto n() noexcept
LEXY_EMPTY_MEMBER Predicate _predicate
iterator begin() const noexcept
constexpr bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2)
constexpr auto begin(const C &c) -> decltype(c.begin())
auto tokens(const lexy::parse_tree< Reader, TokenKind, MemoryResource > &tree, typename lexy::parse_tree< Reader, TokenKind, MemoryResource >::node node)
bool empty() const noexcept
#define LEXY_EMPTY_MEMBER
auto children(const lexy::parse_tree< Reader, TokenKind, MemoryResource > &, typename lexy::parse_tree< Reader, TokenKind, MemoryResource >::node node, Predicate predicate)
auto find_covering_node(const lexy::parse_tree< Reader, TokenKind, MemoryResource > &tree, typename Reader::iterator position) -> typename lexy::parse_tree< Reader, TokenKind, MemoryResource >::node
auto node_position(const lexy::parse_tree< Reader, TokenKind, MemoryResource > &tree, typename lexy::parse_tree< Reader, TokenKind, MemoryResource >::node node) -> typename Reader::iterator
#define LEXY_ASSERT(Expr, Msg)
node root() const noexcept