dsl/scan.hpp
Go to the documentation of this file.
1 // Copyright (C) 2020-2023 Jonathan Müller and lexy contributors
2 // SPDX-License-Identifier: BSL-1.0
3 
4 #ifndef LEXY_DSL_SCAN_HPP_INCLUDED
5 #define LEXY_DSL_SCAN_HPP_INCLUDED
6 
8 #include <lexy/dsl/base.hpp>
9 #include <lexy/dsl/parse_as.hpp>
10 #include <lexy/error.hpp>
11 #include <lexy/lexeme.hpp>
12 
13 //=== rule forward declaration ===//
14 namespace lexyd
15 {
16 template <typename Production>
17 struct _prd;
18 template <typename Rule, typename Tag>
19 struct _peek;
20 template <typename Token>
21 struct _capt;
22 template <typename T, typename Base>
23 struct _int_dsl;
24 
25 struct _scan;
26 } // namespace lexyd
27 
28 namespace lexy::_detail
29 {
30 template <typename Derived, typename Reader>
31 class scanner;
32 }
33 
34 //=== scan_result ===//
35 namespace lexy
36 {
37 constexpr struct scan_failed_t
38 {
39 } scan_failed;
40 
41 template <typename T>
43 {
44 public:
45  using value_type = T;
46 
47  constexpr scan_result() = default;
48  constexpr scan_result(scan_failed_t) {}
49 
50  template <typename U = T, typename = std::enable_if_t<std::is_constructible_v<T, U>>>
51  constexpr scan_result(U&& value)
52  {
53  _value.emplace(LEXY_MOV(value));
54  }
55 
56  constexpr explicit operator bool() const noexcept
57  {
58  return has_value();
59  }
60  constexpr bool has_value() const noexcept
61  {
62  return static_cast<bool>(_value);
63  }
64 
65  constexpr decltype(auto) value() const& noexcept
66  {
67  return *_value;
68  }
69  constexpr decltype(auto) value() && noexcept
70  {
71  return LEXY_MOV(*_value);
72  }
73 
74  template <typename U = T>
75  constexpr decltype(auto) value_or(U&& fallback) const& noexcept
76  {
77  return _value ? *_value : LEXY_FWD(fallback);
78  }
79  template <typename U = T>
80  constexpr decltype(auto) value_or(U&& fallback) && noexcept
81  {
82  return _value ? LEXY_MOV(*_value) : LEXY_FWD(fallback);
83  }
84 
85 private:
87 
89 
90  template <typename Derived, typename Reader>
91  friend class _detail::scanner;
92 };
93 template <>
95 {
96 public:
97  using value_type = void;
98 
99  constexpr scan_result() = default;
101  constexpr scan_result(bool has_value)
102  {
103  if (has_value)
104  _value.emplace();
105  }
106 
107  constexpr explicit operator bool() const noexcept
108  {
109  return has_value();
110  }
111  constexpr bool has_value() const noexcept
112  {
113  return static_cast<bool>(_value);
114  }
115 
116 private:
118 
120 
121  template <typename Derived, typename Reader>
122  friend class _detail::scanner;
123 };
124 
125 template <typename T>
127 template <typename T>
129 } // namespace lexy
130 
131 //=== scanner implementation ===//
132 namespace lexy::_detail
133 {
134 template <typename Reader>
136 {
137  Reader _impl;
138 
139  constexpr auto reader() const&
140  {
141  return _impl;
142  }
143 };
144 
146 {
147  template <typename Context, typename Reader, typename T>
148  LEXY_PARSER_FUNC static bool parse(Context&, Reader&, lazy_init<T>* dest, T&& value)
149  {
150  dest->emplace(LEXY_MOV(value));
151  return true;
152  }
153 
154  template <typename Context, typename Reader>
155  LEXY_PARSER_FUNC static bool parse(Context&, Reader&, lazy_init<void>* dest)
156  {
157  dest->emplace();
158  return true;
159  }
160 };
161 
162 // The common interface of all scanner types.
163 template <typename Derived, typename Reader>
164 class scanner
165 {
166 public:
167  using encoding = typename Reader::encoding;
168 
169  constexpr scanner(const scanner&) noexcept = delete;
170  constexpr scanner& operator=(const scanner&) noexcept = delete;
171 
172  //=== status ===//
173  constexpr explicit operator bool() const noexcept
174  {
175  return _state == _state_normal;
176  }
177 
178  constexpr bool is_at_eof() const
179  {
180  return _reader.peek() == Reader::encoding::eof();
181  }
182 
183  constexpr auto position() const noexcept -> typename Reader::iterator
184  {
185  return _reader.position();
186  }
187 
188  constexpr auto remaining_input() const noexcept
189  {
191  }
192 
193  //=== parsing ===//
194  template <typename T, typename Rule, typename = std::enable_if_t<lexy::is_rule<Rule>>>
195  constexpr void parse(scan_result<T>& result, Rule)
196  {
197  if (_state == _state_failed)
198  return;
199 
201  auto success
202  = parser::parse(static_cast<Derived&>(*this).context(), _reader, &result._value);
203  if (!success)
205  }
206 
207  template <typename Production, typename = lexy::production_rule<Production>>
208  constexpr auto parse(Production = {})
209  {
210  using context_t = LEXY_DECAY_DECLTYPE(static_cast<Derived&>(*this).context());
211  using value_type =
212  typename lexy::production_value_callback<Production,
213  typename context_t::state_type>::return_type;
214 
216  parse(result, lexyd::_prd<Production>{});
217  return result;
218  }
219 
220  template <typename Rule, typename = std::enable_if_t<lexy::is_rule<Rule>>>
221  constexpr void parse(Rule rule)
222  {
223  scan_result<void> result;
224  parse(result, rule);
225  }
226 
227  //=== branch parsing ===//
228  template <typename T, typename Rule, typename = std::enable_if_t<lexy::is_rule<Rule>>>
229  constexpr bool branch(scan_result<T>& result, Rule)
230  {
231  static_assert(lexy::is_branch_rule<Rule>);
232  if (_state == _state_failed)
233  return false;
234 
235  auto& context = static_cast<Derived&>(*this).context();
237  if (!parser.try_parse(context.control_block, _reader))
238  {
239  parser.cancel(context);
240  return false; // branch wasn't token
241  }
242 
243  auto success = parser.template finish<lexy::_detail::scan_final_parser>(context, _reader,
244  &result._value);
245  if (!success)
247  return true; // branch was taken
248  }
249 
250  template <typename Production, typename T, typename = lexy::production_rule<Production>>
251  constexpr bool branch(scan_result<T>& result, Production = {})
252  {
253  return branch(result, lexyd::_prd<Production>{});
254  }
255 
256  template <typename Rule, typename = std::enable_if_t<lexy::is_rule<Rule>>>
257  constexpr bool branch(Rule rule)
258  {
259  scan_result<void> result;
260  return branch(result, rule);
261  }
262 
263  //=== error handling ===//
265  {
266  public:
269 
270  constexpr void cancel() &&
271  {
272  auto& context = static_cast<Derived&>(*_self).context();
273  context.on(parse_events::recovery_cancel{}, _self->_reader.position());
275  }
276 
277  constexpr void finish() &&
278  {
279  auto& context = static_cast<Derived&>(*_self).context();
280  context.on(parse_events::recovery_finish{}, _self->_reader.position());
282  }
283 
284  private:
285  constexpr explicit error_recovery_guard(scanner& self) noexcept : _self(&self)
286  {
287  auto& context = static_cast<Derived&>(*_self).context();
288  context.on(parse_events::recovery_start{}, _self->_reader.position());
290  }
291 
293  friend scanner;
294  };
295 
296  constexpr auto error_recovery()
297  {
299  return error_recovery_guard(*this);
300  }
301 
302  template <typename TokenRule>
303  constexpr bool discard(TokenRule rule)
304  {
305  static_assert(lexy::is_token_rule<TokenRule>);
306  if (_state == _state_failed)
307  return false;
308 
309  auto begin = _reader.position();
310  auto result = lexy::try_match_token(rule, _reader);
311  auto end = _reader.position();
312 
313  auto& context = static_cast<Derived&>(*this).context();
315 
316  return result;
317  }
318 
319  template <typename Tag, typename... Args>
320  constexpr void error(Tag, Args&&... args)
321  {
322  auto& context = static_cast<Derived&>(*this).context();
323  context.on(parse_events::error{}, lexy::error<Reader, Tag>(LEXY_FWD(args)...));
324  }
325 
326  template <typename Tag, typename... Args>
327  constexpr void fatal_error(Tag tag, Args&&... args)
328  {
329  error(tag, LEXY_FWD(args)...);
331  }
332 
333  //=== convenience ===//
334  template <typename T, typename Rule, typename = std::enable_if_t<lexy::is_rule<Rule>>>
335  constexpr auto parse(Rule rule)
336  {
337  scan_result<T> result;
338  parse(result, rule);
339  return result;
340  }
341 
342  template <typename Rule>
343  constexpr bool peek(Rule)
344  {
345  static_assert(lexy::is_rule<Rule>);
346  return branch(dsl::_peek<Rule, void>{});
347  }
348 
349  template <typename T, typename Base, typename Digits>
350  constexpr auto integer(Digits digits)
351  {
352  scan_result<T> result;
354  return result;
355  }
356  template <typename T, typename Digits>
357  constexpr auto integer(Digits digits)
358  {
359  scan_result<T> result;
361  return result;
362  }
363 
364  template <typename Rule>
365  constexpr auto capture(Rule rule) -> scan_result<lexeme<Reader>>
366  {
367  static_assert(lexy::is_rule<Rule>);
368 
369  auto begin = _reader.position();
370  parse(rule);
371  auto end = _reader.position();
372 
373  if (*this)
374  return lexeme<Reader>(begin, end);
375  else
376  return scan_failed;
377  }
378  template <typename Token>
379  constexpr auto capture_token(Token)
380  {
382  parse(result, lexyd::_capt<Token>{});
383  return result;
384  }
385 
386 protected:
387  constexpr explicit scanner(const Reader& reader) noexcept
389  {}
390 
391  constexpr Reader& reader() noexcept
392  {
393  return _reader;
394  }
395 
396 private:
397  Reader _reader;
398 
399  enum
400  {
402  _state_failed, // after a failure
403  _state_recovery, // recovery guard active
404  } _state;
405 };
406 } // namespace lexy::_detail
407 
408 //=== dsl::scan ===//
409 namespace lexy
410 {
411 template <typename Context, typename Reader>
412 class rule_scanner : public _detail::scanner<rule_scanner<Context, Reader>, Reader>
413 {
414 public:
415  using production = typename Context::production;
416 
417  constexpr std::size_t recursion_depth() const noexcept
418  {
419  auto& cb = _context->control_block();
420  return static_cast<std::size_t>(cb.cur_depth);
421  }
422 
423  constexpr auto begin() const noexcept -> typename Reader::iterator
424  {
425  return _begin;
426  }
427 
428 private:
429  constexpr explicit rule_scanner(Context& context, Reader reader)
430  : _detail::scanner<rule_scanner<Context, Reader>, Reader>(reader), _context(&context),
432  {}
433 
434  constexpr Context& context() noexcept
435  {
436  return *_context;
437  }
438 
439  Context* _context;
440  typename Reader::iterator _begin;
441 
443  friend lexyd::_scan;
444 };
445 } // namespace lexy
446 
447 namespace lexyd
448 {
449 template <typename Context, typename Scanner, typename StatePtr>
450 using _detect_scan_state = decltype(Context::production::scan(LEXY_DECLVAL(Scanner&), *StatePtr()));
451 
452 struct _scan : rule_base
453 {
454  template <typename NextParser>
455  struct p
456  {
457  template <typename Scanner, typename Context, typename Reader, typename... Args>
458  LEXY_PARSER_FUNC static bool _parse(Scanner& scanner, Context& context, Reader& reader,
459  Args&&... args)
460  {
461  lexy::scan_result result = [&] {
462  if constexpr (lexy::_detail::is_detected<
463  _detect_scan_state, Context, decltype(scanner),
464  decltype(context.control_block->parse_state)>)
465  return Context::production::scan(scanner, *context.control_block->parse_state,
466  LEXY_FWD(args)...);
467  else
468  return Context::production::scan(scanner, LEXY_FWD(args)...);
469  }();
470  reader.set_position(scanner.position());
471  if (!result)
472  return false;
473 
474  if constexpr (std::is_void_v<typename decltype(result)::value_type>)
475  return NextParser::parse(context, reader);
476  else
477  return NextParser::parse(context, reader, LEXY_MOV(result).value());
478  }
479 
480  template <typename Context, typename Reader, typename... Args>
481  LEXY_PARSER_FUNC static bool parse(Context& context, Reader& reader, Args&&... args)
482  {
483  lexy::rule_scanner scanner(context, reader);
484  return _parse(scanner, context, reader, LEXY_FWD(args)...);
485  }
486  };
487 };
488 
489 inline constexpr auto scan = _scan{};
490 } // namespace lexyd
491 
492 namespace lexy
493 {
494 template <typename T>
496 {
498 
499  static constexpr auto rule = dsl::scan;
500  static constexpr auto value = lexy::forward<T>;
501 };
502 } // namespace lexy
503 
504 #endif // LEXY_DSL_SCAN_HPP_INCLUDED
505 
lexy::scan_result< void >
Definition: dsl/scan.hpp:94
lexy::scan_result< void >::_value
_detail::lazy_init< void > _value
Definition: dsl/scan.hpp:119
LEXY_MOV
#define LEXY_MOV(...)
Definition: config.hpp:21
lexy::scan_result< void >::scan_result
constexpr scan_result(_detail::lazy_init< void > &&value)
Definition: dsl/scan.hpp:117
lexy::_detail::scanner::branch
constexpr bool branch(scan_result< T > &result, Production={})
Definition: dsl/scan.hpp:251
lexy::_detail::scanner::branch
constexpr bool branch(Rule rule)
Definition: dsl/scan.hpp:257
lexy::parse_events::recovery_start
Definition: dsl/base.hpp:61
lexy::scan_production::value
static constexpr auto value
Definition: dsl/scan.hpp:500
lexy::_detail::scanner::branch
constexpr bool branch(scan_result< T > &result, Rule)
Definition: dsl/scan.hpp:229
lexy::scan_result::scan_result
constexpr scan_result(U &&value)
Definition: dsl/scan.hpp:51
lexy::_detail::is_detected
constexpr bool is_detected
Definition: detect.hpp:28
lexy::scan_result
Definition: dsl/scan.hpp:42
lexy::_detail::scanner< rule_scanner< Context, Reader >, Reader >::encoding
typename Reader::encoding encoding
Definition: dsl/scan.hpp:167
lexyd::_detect_scan_state
decltype(Context::production::scan(LEXY_DECLVAL(Scanner &), *StatePtr())) _detect_scan_state
Definition: dsl/scan.hpp:450
lexyd::_scan::p::_parse
static LEXY_PARSER_FUNC bool _parse(Scanner &scanner, Context &context, Reader &reader, Args &&... args)
Definition: dsl/scan.hpp:458
lexy::scan_result< void >::scan_result
constexpr scan_result(bool has_value)
Definition: dsl/scan.hpp:101
lexy::_detail::scanner::_reader
Reader _reader
Definition: dsl/scan.hpp:397
lexy::_detail::scanner::remaining_input
constexpr auto remaining_input() const noexcept
Definition: dsl/scan.hpp:188
lexy::_detail::scanner::peek
constexpr bool peek(Rule)
Definition: dsl/scan.hpp:343
lexy::branch_parser_for
typename BranchRule::template bp< Reader > branch_parser_for
Definition: dsl/base.hpp:103
lexy::_detail::scanner::error_recovery
constexpr auto error_recovery()
Definition: dsl/scan.hpp:296
lexy::rule_scanner::begin
constexpr auto begin() const noexcept -> typename Reader::iterator
Definition: dsl/scan.hpp:423
LEXY_FWD
#define LEXY_FWD(...)
Definition: config.hpp:22
lexy::rule_scanner
Definition: dsl/scan.hpp:412
lexy::_detail::scanner::parse
constexpr auto parse(Production={})
Definition: dsl/scan.hpp:208
lexyd::_prd
Definition: capture.hpp:123
lexy::rule_scanner::rule_scanner
constexpr rule_scanner(Context &context, Reader reader)
Definition: dsl/scan.hpp:429
lexy::rule_scanner::production
typename Context::production production
Definition: dsl/scan.hpp:415
lexy::scan_result
scan_result(T &&) -> scan_result< std::decay_t< T >>
lexyd::_scan::p::parse
static LEXY_PARSER_FUNC bool parse(Context &context, Reader &reader, Args &&... args)
Definition: dsl/scan.hpp:481
lexy::_detail::scanner::integer
constexpr auto integer(Digits digits)
Definition: dsl/scan.hpp:350
lexy
Definition: any_ref.hpp:12
LEXY_PRECONDITION
#define LEXY_PRECONDITION(Expr)
Definition: assert.hpp:36
cx::end
constexpr auto end(const C &c) -> decltype(c.end())
Definition: wildcards.hpp:686
lexy::_detail::scanner::parse
constexpr void parse(Rule rule)
Definition: dsl/scan.hpp:221
lexyd::_capt
Definition: dsl/scan.hpp:21
lexy::_detail::scanner::_state_recovery
@ _state_recovery
Definition: dsl/scan.hpp:403
detail::void
j template void())
Definition: json.hpp:4893
lexy::error
Generic failure.
Definition: error.hpp:14
lexy::_detail::scanner::error_recovery_guard
Definition: dsl/scan.hpp:264
lexy::scan_failed
constexpr struct lexy::scan_failed_t scan_failed
lexy::_detail::scanner::parse
constexpr void parse(scan_result< T > &result, Rule)
Definition: dsl/scan.hpp:195
lexyd::_scan
Definition: dsl/scan.hpp:452
forward.hpp
lexy::parse
constexpr auto parse(const Input &input, const ErrorCallback &callback)
Parses the production into a value, invoking the callback on error.
Definition: parse.hpp:171
lexy::_detail::scanner_input::_impl
Reader _impl
Definition: dsl/scan.hpp:137
lexy::_detail::lazy_init::emplace
constexpr T & emplace(Args &&... args)
Definition: lazy_init.hpp:105
lexy::production_value_callback
Definition: grammar.hpp:274
lexy::_detail::lazy_init
Definition: lazy_init.hpp:97
lexy::scan_production::rule
static constexpr auto rule
Definition: dsl/scan.hpp:499
lexy::parse_events::error
Definition: dsl/base.hpp:55
lexy::_detail::scanner_input::reader
constexpr auto reader() const &
Definition: dsl/scan.hpp:139
lexy::try_match_token
constexpr LEXY_FORCE_INLINE auto try_match_token(TokenRule, Reader &reader)
Definition: dsl/base.hpp:232
lexeme.hpp
lexy::_detail::scanner::is_at_eof
constexpr bool is_at_eof() const
Definition: dsl/scan.hpp:178
lexy::scan_production
Definition: dsl/scan.hpp:495
lexy::scan_result< void >::scan_result
constexpr scan_result(scan_failed_t)
Definition: dsl/scan.hpp:100
lexy::_detail::scanner::integer
constexpr auto integer(Digits digits)
Definition: dsl/scan.hpp:357
lexy::_detail::scanner::capture_token
constexpr auto capture_token(Token)
Definition: dsl/scan.hpp:379
lexy::rule_scanner::_begin
Reader::iterator _begin
Definition: dsl/scan.hpp:440
lexy::_detail::scanner::error_recovery_guard::_self
scanner * _self
Definition: dsl/scan.hpp:292
lexy::_detail::scanner::operator=
constexpr scanner & operator=(const scanner &) noexcept=delete
LEXY_DECAY_DECLTYPE
#define LEXY_DECAY_DECLTYPE(...)
Definition: config.hpp:26
lexyd::rule_base
Definition: grammar.hpp:17
lexyd::scan
constexpr auto scan
Definition: dsl/scan.hpp:489
lexy::_detail::scanner::parse
constexpr auto parse(Rule rule)
Definition: dsl/scan.hpp:335
lexyd::digits
constexpr auto digits
Matches a non-empty list of digits.
Definition: digit.hpp:531
lexy::_detail::scanner::error_recovery_guard::error_recovery_guard
error_recovery_guard(const error_recovery_guard &)=delete
lexy::error_token_kind
@ error_token_kind
Definition: grammar.hpp:77
lexy::parse_events::recovery_finish
Definition: dsl/base.hpp:66
parse_as.hpp
lexy::_detail::scanner::scanner
constexpr scanner(const scanner &) noexcept=delete
LEXY_PARSER_FUNC
#define LEXY_PARSER_FUNC
Definition: dsl/base.hpp:95
lexy::_detail::scanner::capture
constexpr auto capture(Rule rule) -> scan_result< lexeme< Reader >>
Definition: dsl/scan.hpp:365
lexy::scanner
Definition: action/scan.hpp:31
cx::begin
constexpr auto begin(const C &c) -> decltype(c.begin())
Definition: wildcards.hpp:661
lexy::scan_failed_t
Definition: dsl/scan.hpp:37
lexy::scan_result::has_value
constexpr bool has_value() const noexcept
Definition: dsl/scan.hpp:60
lexy::scan_result::scan_result
constexpr scan_result()=default
base.hpp
lexy::_detail::lazy_init< void >
Definition: lazy_init.hpp:204
lexy::_detail::scanner::discard
constexpr bool discard(TokenRule rule)
Definition: dsl/scan.hpp:303
lexy::_detail
Definition: any_ref.hpp:12
lexy::scan_result::value_type
T value_type
Definition: dsl/scan.hpp:45
lexyd::_int_dsl
Definition: dsl/integer.hpp:487
lexy::rule_scanner::context
constexpr Context & context() noexcept
Definition: dsl/scan.hpp:434
lexyd::_scan::p
Definition: dsl/scan.hpp:455
lexy::parse_events::token
Definition: dsl/base.hpp:44
lexy::lexeme
Definition: lexeme.hpp:16
lexy::_detail::scanner::error
constexpr void error(Tag, Args &&... args)
Definition: dsl/scan.hpp:320
lexy::_detail::cp_error::success
@ success
lexy::_detail::scanner::fatal_error
constexpr void fatal_error(Tag tag, Args &&... args)
Definition: dsl/scan.hpp:327
lexy::_detail::scanner::scanner
constexpr scanner(const Reader &reader) noexcept
Definition: dsl/scan.hpp:387
lexy::_detail::scanner::reader
constexpr Reader & reader() noexcept
Definition: dsl/scan.hpp:391
lexy::_detail::scanner::error_recovery_guard::operator=
error_recovery_guard & operator=(const error_recovery_guard &)=delete
lexy::parser_for
typename Rule::template p< NextParser > parser_for
Definition: dsl/base.hpp:100
lexy::_detail::scan_final_parser::parse
static LEXY_PARSER_FUNC bool parse(Context &, Reader &, lazy_init< T > *dest, T &&value)
Definition: dsl/scan.hpp:148
lexy::_detail::scanner::error_recovery_guard::cancel
constexpr void cancel() &&
Definition: dsl/scan.hpp:270
lexy::scan_result::value_or
constexpr decltype(auto) value_or(U &&fallback) const &noexcept
Definition: dsl/scan.hpp:75
lexy::_detail::scan_final_parser::parse
static LEXY_PARSER_FUNC bool parse(Context &, Reader &, lazy_init< void > *dest)
Definition: dsl/scan.hpp:155
lexy::_detail::scanner::position
constexpr auto position() const noexcept -> typename Reader::iterator
Definition: dsl/scan.hpp:183
lexy::_detail::scanner::_state_failed
@ _state_failed
Definition: dsl/scan.hpp:402
lexy::_detail::scan_final_parser
Definition: dsl/scan.hpp:145
lexy::rule_scanner::recursion_depth
constexpr std::size_t recursion_depth() const noexcept
Definition: dsl/scan.hpp:417
lexy::scan_result< void >::value_type
void value_type
Definition: dsl/scan.hpp:97
LEXY_DECLVAL
#define LEXY_DECLVAL(...)
Definition: config.hpp:24
lexy::scan_result::scan_result
constexpr scan_result(_detail::lazy_init< T > &&value)
Definition: dsl/scan.hpp:86
lexy::parse_events::recovery_cancel
Definition: dsl/base.hpp:71
lexy::_detail::lazy_init< void >::emplace
constexpr void emplace()
Definition: lazy_init.hpp:211
lexy::_detail::scanner
Definition: dsl/scan.hpp:31
lexy::_detail::scanner::error_recovery_guard::error_recovery_guard
constexpr error_recovery_guard(scanner &self) noexcept
Definition: dsl/scan.hpp:285
lexy::scan_result< void >::has_value
constexpr bool has_value() const noexcept
Definition: dsl/scan.hpp:111
lexy::_detail::scanner::_state
enum lexy::_detail::scanner::@5 _state
lexy::_detail::scanner::error_recovery_guard::finish
constexpr void finish() &&
Definition: dsl/scan.hpp:277
lexyd
Definition: trace.hpp:22
lexy::_detail::scanner_input
Definition: dsl/scan.hpp:135
lexyd::eof
constexpr auto eof
Matches EOF.
Definition: eof.hpp:72
lexy::scan_result::scan_result
constexpr scan_result(scan_failed_t)
Definition: dsl/scan.hpp:48
lexy::_detail::scanner::error_recovery_guard::scanner
friend scanner
Definition: dsl/scan.hpp:293
lexy::_detail::scanner::_state_normal
@ _state_normal
Definition: dsl/scan.hpp:401
lexy::scan_result::value
constexpr decltype(auto) value() const &noexcept
Definition: dsl/scan.hpp:65
lexy::scan_result::_value
_detail::lazy_init< T > _value
Definition: dsl/scan.hpp:88
lexy::rule_scanner::_context
Context * _context
Definition: dsl/scan.hpp:439
error.hpp


behaviortree_cpp_v4
Author(s): Davide Faconti
autogenerated on Fri Jun 28 2024 02:20:08