Iros
 
Loading...
Searching...
No Matches
alternation.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/constexpr.h"
10#include "di/vocab/prelude.h"
11
12namespace di::parser {
13namespace detail {
15
16 template<typename... Parsers>
18 : public ParserBase<AlternationParser<Parsers...>>
20 public:
21 template<typename... Ps>
22 constexpr explicit AlternationParser(InPlace, Ps&&... parsers) : m_parsers(util::forward<Ps>(parsers)...) {}
23
24 template<concepts::ParserContext Context>
26 constexpr auto parse(Context& context) const {
27 constexpr bool should_be_void = (concepts::LanguageVoid<meta::ParserValue<Context, Parsers>> && ...);
28
30 meta::Conditional<should_be_void, void,
33 Context>;
34
35 auto process_index = function::ycombinator([&]<size_t index>(auto& self, Constexpr<index>) -> Result {
36 if constexpr (index >= sizeof...(Parsers)) {
37 return Result(Unexpected(context.make_error()));
38 } else {
39 using Value = meta::ExpectedValue<
40 decltype(util::get<index>(util::declval<Tuple<Parsers...> const&>()).parse(context))>;
41 auto result = util::get<index>(m_parsers).parse(context);
42 if (!result) {
43 return self(c_<index + 1>);
44 }
45 if constexpr (should_be_void) {
46 return Result();
47 } else if constexpr (concepts::LanguageVoid<Value>) {
48 return Result(in_place, c_<index>);
49 } else {
50 return Result(in_place, c_<index>, util::move(result).value());
51 }
52 }
53 });
54
55 return process_index(c_<0ZU>);
56 }
57
58 Tuple<Parsers...> m_parsers;
59 };
60
62 template<concepts::DecayConstructible... Parsers>
63 constexpr auto operator()(Parsers&&... parsers) const {
64 return AlternationParser<meta::Decay<Parsers>...>(in_place, util::forward<Parsers>(parsers)...);
65 }
66 };
67}
68
69constexpr inline auto alternation = detail::AlternationFunction {};
70
71template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
73constexpr auto operator|(Left&& left, Right&& right) {
74 return alternation(util::forward<Left>(left), util::forward<Right>(right));
75}
76
77template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
81constexpr auto operator|(Left&& left, Right&& right) {
82 return vocab::apply(
83 [&]<typename... Rs>(Rs&&... rs) {
84 return alternation(util::forward<Left>(left), util::forward<Rs>(rs)...);
85 },
86 util::forward<Right>(right).m_parsers);
87}
88
89template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
93constexpr auto operator|(Left&& left, Right&& right) {
94 return vocab::apply(
95 [&]<typename... Ls>(Ls&&... ls) {
96 return alternation(util::forward<Ls>(ls)..., util::forward<Right>(right));
97 },
98 util::forward<Left>(left).m_parsers);
99}
100
101template<concepts::DecayConstructible Left, concepts::DecayConstructible Right>
105constexpr auto operator|(Left&& left, Right&& right) {
106 return vocab::apply(
107 [&]<typename... Ls>(Ls&&... ls) {
108 return vocab::apply(
109 [&]<typename... Rs>(Rs&&... rs) {
110 return alternation(util::forward<Ls>(ls)..., util::forward<Rs>(rs)...);
111 },
112 util::forward<Right>(right).m_parsers);
113 },
114 util::forward<Left>(left).m_parsers);
115}
116}
Definition parser_base.h:5
Definition alternation.h:19
Tuple< Parsers... > m_parsers
Definition alternation.h:58
constexpr AlternationParser(InPlace, Ps &&... parsers)
Definition alternation.h:22
constexpr auto parse(Context &context) const
Definition alternation.h:26
Definition tuple_forward_declaration.h:5
Definition unexpected.h:14
Definition variant_forward_declaration.h:6
Definition operations.h:114
Definition core.h:128
Definition parser.h:10
constexpr auto ycombinator
Definition ycombinator.h:63
detail::ConditionalHelper< value, T, U >::Type Conditional
Definition core.h:88
vocab::Expected< T, meta::ParserContextError< Context > > ParserContextResult
Definition parser_context_result.h:8
meta::ExpectedValue< decltype(util::declval< Parser & >().parse(util::declval< Context & >()))> ParserValue
Definition parser_value.h:10
meta::RemoveCVRef< T >::Value ExpectedValue
Definition vocab.h:35
Definition zstring_parser.h:10
Definition zstring_parser.h:9
constexpr auto alternation
Definition alternation.h:69
Definition vocab.h:96
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto apply(F &&f, Tup &&tuple) -> decltype(detail::apply_impl(meta::MakeIndexSequence< meta::TupleSize< Tup > > {}, util::forward< F >(f), util::forward< Tup >(tuple)))
Definition apply.h:22
Expected< T, Error > Result
Definition result.h:8
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto in_place
Definition in_place.h:8
Definition ls.cpp:4
A wrapper for a constexpr value.
Definition core.h:77
Definition alternation.h:61
constexpr auto operator()(Parsers &&... parsers) const
Definition alternation.h:63
Definition in_place.h:4
Definition void.h:6