dsl/base.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_BASE_HPP_INCLUDED
5 #define LEXY_DSL_BASE_HPP_INCLUDED
6 
9 #include <lexy/grammar.hpp>
10 #include <lexy/input/base.hpp>
11 
12 //=== parse_events ===//
13 namespace lexy::parse_events
14 {
18 {};
22 {};
26 {};
27 
32 {};
36 {};
40 {};
41 
44 struct token
45 {};
46 
51 {};
52 
55 struct error
56 {};
57 
62 {};
67 {};
72 {};
73 } // namespace lexy::parse_events
74 
75 namespace lexyd
76 {
77 namespace _ev = lexy::parse_events;
78 
79 // Does not copy token tags.
80 template <typename Rule>
82 {
83  if constexpr (lexy::is_unconditional_branch_rule<Rule>)
85  else if constexpr (lexy::is_branch_rule<Rule>)
86  return branch_base{};
87  else
88  return rule_base{};
89 }
90 template <typename Rule>
91 using _copy_base = decltype(_copy_base_impl<Rule>());
92 } // namespace lexyd
93 
94 //=== parser ===//
95 #define LEXY_PARSER_FUNC LEXY_FORCE_INLINE constexpr
96 
97 namespace lexy
98 {
99 template <typename Rule, typename NextParser>
100 using parser_for = typename Rule::template p<NextParser>;
101 
102 template <typename BranchRule, typename Reader>
103 using branch_parser_for = typename BranchRule::template bp<Reader>;
104 
105 template <typename Production, typename Reader>
106 struct _pb : lexy::branch_parser_for<lexy::production_rule<Production>, Reader>
107 {};
108 // We create a new type here to shorten its name.
109 template <typename Production, typename Reader>
111 
113 template <typename Rule, typename Reader>
115 {
116  constexpr std::true_type try_parse(const void*, const Reader&)
117  {
118  return {};
119  }
120 
121  template <typename Context>
122  constexpr void cancel(Context&)
123  {}
124 
125  template <typename NextParser, typename Context, typename... Args>
126  LEXY_PARSER_FUNC bool finish(Context& context, Reader& reader, Args&&... args)
127  {
128  return parser_for<Rule, NextParser>::parse(context, reader, LEXY_FWD(args)...);
129  }
130 };
131 
133 template <typename BranchRule, typename Reader, template <typename> typename Continuation>
135 {
137 
138  template <typename ControlBlock>
139  constexpr auto try_parse(const ControlBlock* cb, const Reader& reader)
140  {
141  return impl.try_parse(cb, reader);
142  }
143 
144  template <typename Context>
145  constexpr void cancel(Context& context)
146  {
147  impl.cancel(context);
148  }
149 
150  template <typename NextParser, typename Context, typename... Args>
151  LEXY_PARSER_FUNC bool finish(Context& context, Reader& reader, Args&&... args)
152  {
153  return impl.template finish<Continuation<NextParser>>(context, reader, LEXY_FWD(args)...);
154  }
155 };
156 
158 template <typename... PrevArgs>
160 {
161  template <typename Context, typename Reader, typename... Args>
162  LEXY_PARSER_FUNC static std::true_type parse(Context&, Reader&, const PrevArgs&..., Args&&...)
163  {
164  // A rule is used inside a loop or similar situation, where it must not produce values, but
165  // it did.
166  static_assert(sizeof...(Args) == 0, "pattern rule must not produce any values");
167  return {};
168  }
169 };
170 
173 {
174  template <typename Context, typename Reader, typename Sink, typename... Args>
175  LEXY_PARSER_FUNC static std::true_type parse(Context&, Reader&, Sink& sink, Args&&... args)
176  {
177  if constexpr (sizeof...(Args) > 0)
178  sink(LEXY_FWD(args)...);
179 
180  return {};
181  }
182 };
183 
185 template <typename NextParser>
187 {
188  template <typename Context, typename Reader, typename Sink, typename... Args>
189  LEXY_PARSER_FUNC static auto parse(Context& context, Reader& reader, Sink& sink, Args&&... args)
190  {
191  if constexpr (std::is_same_v<typename Sink::return_type, void>)
192  {
193  LEXY_MOV(sink).finish();
194  return NextParser::parse(context, reader, LEXY_FWD(args)...);
195  }
196  else
197  {
198  return NextParser::parse(context, reader, LEXY_FWD(args)..., LEXY_MOV(sink).finish());
199  }
200  }
201 };
202 } // namespace lexy
203 
204 //=== whitespace ===//
205 namespace lexy::_detail
206 {
207 template <typename NextParser>
209 } // namespace lexy::_detail
210 
211 namespace lexy
212 {
213 template <typename Context, typename NextParser,
214  typename = lexy::production_whitespace<typename Context::production,
215  typename Context::whitespace_production>>
217 {};
218 // If we know the whitespace rule is void, go to NextParser immediately.
219 // This is both an optimization and also doesn't require inclusion of whitespace.hpp.
220 template <typename Context, typename NextParser>
221 struct whitespace_parser<Context, NextParser, void> : NextParser
222 {};
223 } // namespace lexy
224 
225 //=== token parser ===//
226 namespace lexy
227 {
228 template <typename TokenRule, typename Reader>
229 using token_parser_for = typename TokenRule::template tp<Reader>;
230 
231 template <typename TokenRule, typename Reader>
232 LEXY_FORCE_INLINE constexpr auto try_match_token(TokenRule, Reader& reader)
233 {
235 
236  using try_parse_result = decltype(parser.try_parse(reader));
237  if constexpr (std::is_same_v<try_parse_result, std::true_type>)
238  {
239  parser.try_parse(reader);
240  reader.set_position(parser.end);
241  return std::true_type{};
242  }
243  else if constexpr (std::is_same_v<try_parse_result, std::false_type>)
244  {
245  // try_parse() is pure and we don't want to advance the reader, so no need to call it.
246  return std::false_type{};
247  }
248  else
249  {
250  if (!parser.try_parse(reader))
251  return false;
252 
253  reader.set_position(parser.end);
254  return true;
255  }
256 }
257 } // namespace lexy
258 
259 #endif // LEXY_DSL_BASE_HPP_INCLUDED
260 
LEXY_MOV
#define LEXY_MOV(...)
Definition: config.hpp:21
lexy::continuation_branch_parser::cancel
constexpr void cancel(Context &context)
Definition: dsl/base.hpp:145
lexy::parse_events::production_finish
Definition: dsl/base.hpp:21
lexyd::branch_base
Definition: grammar.hpp:20
lexy::parse_events::recovery_start
Definition: dsl/base.hpp:61
lexy::sink_parser::parse
static LEXY_PARSER_FUNC std::true_type parse(Context &, Reader &, Sink &sink, Args &&... args)
Definition: dsl/base.hpp:175
config.hpp
lexy::parse_events
Definition: trace.hpp:14
lexy::branch_parser_for
typename BranchRule::template bp< Reader > branch_parser_for
Definition: dsl/base.hpp:103
LEXY_FWD
#define LEXY_FWD(...)
Definition: config.hpp:22
lexy
Definition: any_ref.hpp:12
detail::void
j template void())
Definition: json.hpp:4893
grammar.hpp
lexy::parse_events::backtracked
Definition: dsl/base.hpp:50
lexyd::_copy_base_impl
auto _copy_base_impl()
Definition: dsl/base.hpp:81
lexy::unconditional_branch_parser::cancel
constexpr void cancel(Context &)
Definition: dsl/base.hpp:122
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::unconditional_branch_parser
A branch parser that takes a branch unconditionally and forwards to the regular parser.
Definition: dsl/base.hpp:114
lexy::parse_events::error
Definition: dsl/base.hpp:55
lexy::try_match_token
constexpr LEXY_FORCE_INLINE auto try_match_token(TokenRule, Reader &reader)
Definition: dsl/base.hpp:232
lexy::sink_finish_parser
A parser that finishes a sink and continues with the next one.
Definition: dsl/base.hpp:186
lexyd::unconditional_branch_base
Definition: grammar.hpp:23
lexy::_detail::automatic_ws_parser
Definition: dsl/base.hpp:208
lexy::sink_parser
A parser that forwards all arguments to a sink, which is the first argument.
Definition: dsl/base.hpp:172
lexy::pattern_parser::parse
static LEXY_PARSER_FUNC std::true_type parse(Context &, Reader &, const PrevArgs &..., Args &&...)
Definition: dsl/base.hpp:162
lexyd::rule_base
Definition: grammar.hpp:17
lexy::parse_events::production_start
Definition: dsl/base.hpp:17
lexy::unconditional_branch_parser::try_parse
constexpr std::true_type try_parse(const void *, const Reader &)
Definition: dsl/base.hpp:116
lexy::parse_events::recovery_finish
Definition: dsl/base.hpp:66
lexy::production_whitespace
decltype(_production_whitespace< Production, WhitespaceProduction >()) production_whitespace
Definition: grammar.hpp:229
LEXY_PARSER_FUNC
#define LEXY_PARSER_FUNC
Definition: dsl/base.hpp:95
lexy::whitespace_parser
Definition: dsl/base.hpp:216
lexy::parse_events::operation_chain_op
Definition: dsl/base.hpp:35
lexy::_detail
Definition: any_ref.hpp:12
lexy::continuation_branch_parser::finish
LEXY_PARSER_FUNC bool finish(Context &context, Reader &reader, Args &&... args)
Definition: dsl/base.hpp:151
lexy::parse_events::production_cancel
Definition: dsl/base.hpp:25
lexy::pattern_parser
A parser that does not support any arguments.
Definition: dsl/base.hpp:159
lexy::parse_events::token
Definition: dsl/base.hpp:44
LEXY_FORCE_INLINE
#define LEXY_FORCE_INLINE
Definition: config.hpp:148
lexy::continuation_branch_parser
A branch parser that parses a branch rule but with a special continuation.
Definition: dsl/base.hpp:134
lexy::_pb
Definition: dsl/base.hpp:106
lexy::sink_finish_parser::parse
static LEXY_PARSER_FUNC auto parse(Context &context, Reader &reader, Sink &sink, Args &&... args)
Definition: dsl/base.hpp:189
lexy::parser_for
typename Rule::template p< NextParser > parser_for
Definition: dsl/base.hpp:100
base.hpp
lexy::unconditional_branch_parser::finish
LEXY_PARSER_FUNC bool finish(Context &context, Reader &reader, Args &&... args)
Definition: dsl/base.hpp:126
lexy::parse_events::recovery_cancel
Definition: dsl/base.hpp:71
lexy::token_parser_for
typename TokenRule::template tp< Reader > token_parser_for
Definition: dsl/base.hpp:229
lexy::parse_events::operation_chain_finish
Definition: dsl/base.hpp:39
lexyd
Definition: trace.hpp:22
lexy::continuation_branch_parser::try_parse
constexpr auto try_parse(const ControlBlock *cb, const Reader &reader)
Definition: dsl/base.hpp:139
lexy::continuation_branch_parser::impl
branch_parser_for< BranchRule, Reader > impl
Definition: dsl/base.hpp:136
lazy_init.hpp
lexy::parse_events::operation_chain_start
Definition: dsl/base.hpp:31
lexyd::_copy_base
decltype(_copy_base_impl< Rule >()) _copy_base
Definition: dsl/base.hpp:91


behaviortree_cpp_v4
Author(s): Davide Faconti
autogenerated on Tue Jun 25 2024 02:20:35