12 #include <hilti/rt/exception.h> 13 #include <hilti/rt/fiber.h> 14 #include <hilti/rt/result.h> 15 #include <hilti/rt/type-info.h> 16 #include <hilti/rt/types/bytes.h> 17 #include <hilti/rt/types/null.h> 18 #include <hilti/rt/types/port.h> 19 #include <hilti/rt/types/reference.h> 20 #include <hilti/rt/types/struct.h> 21 #include <hilti/rt/util.h> 23 #include <spicy/rt/filter.h> 24 #include <spicy/rt/global-state.h> 25 #include <spicy/rt/mime.h> 26 #include <spicy/rt/parser-fwd.h> 27 #include <spicy/rt/sink.h> 28 #include <spicy/rt/typedefs.h> 33 HILTI_RT_ENUM(Direction, Originator, Responder, Both, Undef);
39 inline std::string to_string(const ::spicy::rt::Direction& x, adl::tag ) {
40 switch ( x.value() ) {
41 case spicy::rt::Direction::Originator:
return "originator";
42 case spicy::rt::Direction::Responder:
return "responder";
43 case spicy::rt::Direction::Both:
return "both";
44 case spicy::rt::Direction::Undef:
return "undefined";
54 inline std::ostream& operator<<(std::ostream& out,
const Direction& d) {
return out <<
hilti::rt::to_string(d); }
62 ParserPort(std::tuple<hilti::rt::Port, Direction> args) : port(std::get<0>(args)), direction(std::get<1>(args)) {}
73 if ( x.direction == spicy::rt::Direction::Both )
76 return fmt(
"%s (%s direction)", x.port, x.direction);
92 static auto test(
int) -> decltype(
93 std::declval<U>().__on_0x25_gap(std::declval<uint64_t>(), std::declval<uint64_t>()), std::true_type());
96 static std::false_type test(...);
97 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
103 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_skipped(std::declval<uint64_t>()), std::true_type());
105 static std::false_type test(...);
106 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
112 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_overlap(std::declval<uint64_t>(),
113 std::declval<const hilti::rt::Bytes&>(),
114 std::declval<const hilti::rt::Bytes&>()),
117 static std::false_type test(...);
118 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
124 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_undelivered(std::declval<uint64_t>(),
125 std::declval<const hilti::rt::Bytes&>()),
128 static std::false_type test(...);
129 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
141 Parser(std::string name,
bool is_public, Parse1Function parse1, hilti::rt::any parse2, Parse3Function parse3,
144 : name(std::move(name)),
145 is_public(is_public),
147 parse2(std::move(parse2)),
149 context_new(context_new),
151 description(std::move(description)),
152 mime_types(std::move(mime_types)),
153 ports(std::move(ports)) {}
155 Parser(std::string name,
bool is_public, Parse1Function parse1, hilti::rt::any parse2, Parse3Function parse3,
158 : name(std::move(name)),
159 is_public(is_public),
161 parse2(std::move(parse2)),
164 description(std::move(description)),
165 mime_types(std::move(mime_types)),
166 ports(std::move(ports)) {}
171 :
Parser(std::move(name), is_public,
nullptr, std::move(parse2),
nullptr,
nullptr, type, std::move(description),
172 std::move(mime_types), std::move(ports)) {}
177 :
Parser(std::move(name), is_public,
nullptr, std::move(parse2),
nullptr, context_new, type,
178 std::move(description), std::move(mime_types), std::move(ports)) {}
194 return (*context_new)();
217 Parse1Function parse1{};
231 Parse3Function parse3{};
237 ContextNewFunction context_new =
nullptr;
263 std::optional<std::function<void(hilti::rt::StrongReferenceGeneric, uint64_t, uint64_t)>>
__hook_gap;
271 std::optional<std::function<void(hilti::rt::StrongReferenceGeneric, uint64_t)>>
__hook_skipped;
274 std::optional<std::function<void(hilti::rt::StrongReferenceGeneric, uint64_t, const hilti::rt::Bytes&)>>
279 inline auto parsers() {
280 const auto& parsers = detail::globalState()->parsers;
282 std::vector<const Parser*> public_parsers;
283 std::copy_if(parsers.begin(), parsers.end(), std::back_inserter(public_parsers),
284 [](
const auto& p) {
return p->is_public; });
286 return public_parsers;
323 extern void accept_input();
331 extern void decline_input(
const std::string& reason);
348 template<
typename UnitRef>
350 std::string linker_scope,
UnitRef ) {
356 globalState()->parsers.emplace_back(&p);
358 using unit_type =
typename UnitRef::element_type;
361 ! std::is_base_of<hilti::rt::trait::hasParameters, unit_type>::value )
362 p.
__parse_sink = sink::detail::parseFunction<unit_type>();
365 p.
__hook_gap = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_gap, uint64_t, uint64_t>();
368 p.
__hook_skipped = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_skipped, uint64_t>();
371 p.
__hook_overlap = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_overlap, uint64_t,
375 p.
__hook_undelivered = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_undelivered, uint64_t,
376 const hilti::rt::Bytes&>();
386 bool trim,
const std::optional<hilti::rt::RecoverableFailure>& error);
478 inline void backtrack() {
throw Backtrack(); }
491 std::optional<hilti::rt::stream::SafeConstIterator> unitFind(
493 const std::optional<hilti::rt::stream::SafeConstIterator>& i,
const hilti::rt::Bytes& needle,
494 hilti::rt::stream::Direction d);
std::string to_string(T &&x)
Definition: extension-points.h:26
Definition: reference.h:663
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t, uint64_t)> > __hook_gap
Definition: parser.h:263
hilti::rt::Vector< ParserPort > ports
Definition: parser.h:254
std::string linker_scope
Definition: parser.h:210
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t, const hilti::rt::Bytes &, const hilti::rt::Bytes &)> > __hook_overlap
Definition: parser.h:268
void cannot_be_reached() __attribute__((noreturn))
Definition: util.cc:42
std::optional< detail::ParseSinkFunction > __parse_sink
Definition: parser.h:260
Definition: reference.h:345
std::optional< UnitContext > createContext() const
Definition: parser.h:192
Definition: deferred-expression.h:41
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t, const hilti::rt::Bytes &)> > __hook_undelivered
Definition: parser.h:275
Definition: location.h:94
bool is_public
Definition: parser.h:203
Definition: type-info.h:1143
hilti::rt::any parse2
Definition: parser.h:223
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t)> > __hook_skipped
Definition: parser.h:271
hilti::rt::Vector< MIMEType > mime_types
Definition: parser.h:249
std::string description
Definition: parser.h:244
std::string name
Definition: parser.h:200