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/string.h>
21 #include <hilti/rt/types/struct.h>
22 #include <hilti/rt/types/tuple.h>
23 #include <hilti/rt/util.h>
25 #include <spicy/rt/filter.h>
26 #include <spicy/rt/global-state.h>
27 #include <spicy/rt/mime.h>
28 #include <spicy/rt/parser-fwd.h>
29 #include <spicy/rt/sink.h>
30 #include <spicy/rt/typedefs.h>
35 HILTI_RT_ENUM(Direction, Originator, Responder, Both);
39 namespace hilti::rt::detail::adl {
41 inline std::string
to_string(const ::spicy::rt::Direction& x, adl::tag ) {
42 switch ( x.value() ) {
43 case spicy::rt::Direction::Originator:
return "originator";
44 case spicy::rt::Direction::Responder:
return "responder";
45 case spicy::rt::Direction::Both:
return "both";
46 case spicy::rt::Direction::Undef:
return "undefined";
56 inline std::ostream& operator<<(std::ostream& out,
const Direction& d) {
return out <<
hilti::rt::to_string(d); }
65 : port(hilti::rt::tuple::get<0>(args)), direction(hilti::rt::tuple::get<1>(args)) {}
72 namespace hilti::rt::detail::adl {
76 if ( x.direction == spicy::rt::Direction::Both )
79 return fmt(
"%s (%s direction)", x.port, x.direction);
96 -> decltype(std::declval<U>().HILTI_INTERNAL(on_0x25_gap)(std::declval<uint64_t>(), std::declval<uint64_t>()),
99 static std::false_type test(...);
100 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
107 static auto test(
int)
108 -> decltype(std::declval<U>().HILTI_INTERNAL(on_0x25_skipped)(std::declval<uint64_t>()), std::true_type());
110 static std::false_type test(...);
111 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
118 static auto test(
int)
119 -> decltype(std::declval<U>().HILTI_INTERNAL(on_0x25_overlap)(std::declval<uint64_t>(),
120 std::declval<const hilti::rt::Bytes&>(),
121 std::declval<const hilti::rt::Bytes&>()),
124 static std::false_type test(...);
125 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
132 static auto test(
int)
133 -> decltype(std::declval<U>().HILTI_INTERNAL(on_0x25_undelivered)(std::declval<uint64_t>(),
134 std::declval<const hilti::rt::Bytes&>()),
137 static std::false_type test(...);
138 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
151 std::string_view
name,
175 std::string_view
name,
198 std::string_view
name,
223 std::string_view
name,
311 std::string prepare_block =
"spicy/prepare/block/";
312 std::string prepare_input =
"spicy/prepare/input/";
313 std::string prepare_stream =
"spicy/prepare/stream/";
315 operator bool()
const {
317 return ! prepare_input.empty();
358 void _initProfiling();
362 inline auto parsers() {
363 const auto& parsers = detail::globalState()->parsers;
365 std::vector<const Parser*> public_parsers;
366 std::ranges::copy_if(parsers, std::back_inserter(public_parsers), [](
const auto& p) {
return p->is_public; });
368 return public_parsers;
372 inline const auto& parserNames() {
return detail::globalState()->parsers_by_name; }
407 ParseError(std::string_view msg, std::string_view location =
"") : RecoverableFailure(msg, location) {}
435 extern void accept_input();
460 template<
typename UnitRef>
462 uint64_t linker_scope,
470 globalState()->parsers.emplace_back(&p);
472 using unit_type =
typename UnitRef::element_type;
475 ! std::is_base_of_v<hilti::rt::trait::hasParameters, unit_type> )
481 if constexpr ( detail::has_on_gap<unit_type>::value )
483 (u.
as<unit_type>()->HILTI_INTERNAL(on_0x25_gap))(seq, len);
486 if constexpr ( detail::has_on_skipped<unit_type>::value )
488 (u.
as<unit_type>()->HILTI_INTERNAL(on_0x25_skipped))(seq);
491 if constexpr ( detail::has_on_overlap<unit_type>::value )
496 (u.
as<unit_type>()->HILTI_INTERNAL(on_0x25_overlap))(seq, old, new_);
499 if constexpr ( detail::has_on_undelivered<unit_type>::value )
502 (u.
as<unit_type>()->HILTI_INTERNAL(on_0x25_undelivered))(seq, bytes);
510 void printParserState(std::string_view unit_id,
516 std::string_view literal_mode,
568 std::string_view error_msg,
569 std::string_view location,
618 std::string_view error_msg,
619 std::string_view location,
636 inline void backtrack() {
throw Backtrack(); }
654 hilti::rt::stream::Direction d);
673 std::string_view location,
690 std::string_view location,
Definition: optional.h:33
Definition: reference.h:717
T * as() const
Definition: reference.h:731
Definition: reference.h:399
Definition: stream.h:1172
std::string fmt(const char *fmt, const Args &... args)
Definition: fmt.h:17
void cannot_be_reached()
Definition: util.cc:53
std::string to_string(T &&x)
Definition: extension-points.h:26
Definition: type-info.h:1276
struct spicy::rt::Parser::@2 profiler_tags
ContextNewFunction context_new
Definition: parser.h:304
hilti::rt::String name
Definition: parser.h:267
bool is_public
Definition: parser.h:270
Parse1Function parse1
Definition: parser.h:284
void(* __hook_undelivered)(const hilti::rt::StrongReferenceGeneric &, uint64_t, const hilti::rt::Bytes &)
Definition: parser.h:355
hilti::rt::String description
Definition: parser.h:324
detail::ParseSinkFunction __parse_sink
Definition: parser.h:340
void(* __hook_skipped)(const hilti::rt::StrongReferenceGeneric &, uint64_t)
Definition: parser.h:352
hilti::rt::Vector< ParserPort > ports
Definition: parser.h:334
hilti::rt::Optional< UnitContext > createContext() const
Definition: parser.h:259
hilti::rt::any parse2
Definition: parser.h:290
void(* __hook_overlap)(const hilti::rt::StrongReferenceGeneric &, uint64_t, const hilti::rt::Bytes &, const hilti::rt::Bytes &)
Definition: parser.h:346
uint64_t linker_scope
Definition: parser.h:277
void(* __hook_gap)(const hilti::rt::StrongReferenceGeneric &, uint64_t, uint64_t)
Definition: parser.h:343
hilti::rt::Vector< MIMEType > mime_types
Definition: parser.h:329
const hilti::rt::TypeInfo * type_info
Definition: parser.h:307
Parse3Function parse3
Definition: parser.h:298