4 #ifndef LEXY_DSL_BASE_HPP_INCLUDED
5 #define LEXY_DSL_BASE_HPP_INCLUDED
80 template <
typename Rule>
83 if constexpr (lexy::is_unconditional_branch_rule<Rule>)
85 else if constexpr (lexy::is_branch_rule<Rule>)
90 template <
typename Rule>
95 #define LEXY_PARSER_FUNC LEXY_FORCE_INLINE constexpr
99 template <
typename Rule,
typename NextParser>
102 template <
typename BranchRule,
typename Reader>
105 template <
typename Production,
typename Reader>
109 template <
typename Production,
typename Reader>
113 template <
typename Rule,
typename Reader>
116 constexpr std::true_type
try_parse(
const void*,
const Reader&)
121 template <
typename Context>
125 template <
typename NextParser,
typename Context,
typename... Args>
133 template <
typename BranchRule,
typename Reader,
template <
typename>
typename Continuation>
138 template <
typename ControlBlock>
139 constexpr
auto try_parse(
const ControlBlock* cb,
const Reader& reader)
141 return impl.try_parse(cb, reader);
144 template <
typename Context>
147 impl.cancel(context);
150 template <
typename NextParser,
typename Context,
typename... Args>
153 return impl.template finish<Continuation<NextParser>>(context, reader,
LEXY_FWD(args)...);
158 template <
typename... PrevArgs>
161 template <
typename Context,
typename Reader,
typename... Args>
166 static_assert(
sizeof...(Args) == 0,
"pattern rule must not produce any values");
174 template <
typename Context,
typename Reader,
typename Sink,
typename... Args>
177 if constexpr (
sizeof...(Args) > 0)
185 template <
typename NextParser>
188 template <
typename Context,
typename Reader,
typename Sink,
typename... Args>
191 if constexpr (std::is_same_v<typename Sink::return_type, void>)
207 template <
typename NextParser>
213 template <
typename Context,
typename NextParser,
215 typename Context::whitespace_production>>
220 template <
typename Context,
typename NextParser>
228 template <
typename TokenRule,
typename Reader>
231 template <
typename TokenRule,
typename Reader>
236 using try_parse_result = decltype(parser.try_parse(reader));
237 if constexpr (std::is_same_v<try_parse_result, std::true_type>)
239 parser.try_parse(reader);
240 reader.set_position(parser.end);
241 return std::true_type{};
243 else if constexpr (std::is_same_v<try_parse_result, std::false_type>)
246 return std::false_type{};
250 if (!parser.try_parse(reader))
253 reader.set_position(parser.end);
259 #endif // LEXY_DSL_BASE_HPP_INCLUDED