···266266 loop [x] inp
267267 | Error e -> Error e])
268268269269+ | SkipMany { p; loc } ->
270270+ (match p with
271271+ | Token { tok; _ } ->
272272+ [%expr
273273+ let rec loop input =
274274+ match I.peek input with
275275+ | Some t when t = [%e tok] -> loop (I.advance input)
276276+ | _ -> Ok ((), input)
277277+ in
278278+ loop input]
279279+ | Satisfy { pred; _ } ->
280280+ [%expr
281281+ let rec loop input =
282282+ match I.peek input with
283283+ | Some t when [%e pred] t -> loop (I.advance input)
284284+ | _ -> Ok ((), input)
285285+ in
286286+ loop input]
287287+ | Any _ ->
288288+ [%expr
289289+ let rec loop input =
290290+ match I.peek input with
291291+ | Some _ -> loop (I.advance input)
292292+ | None -> Ok ((), input)
293293+ in
294294+ loop input]
295295+ | _ ->
296296+ let p_code = compile ~loc env p in
297297+ [%expr
298298+ let rec loop input =
299299+ match [%e p_code] with
300300+ | Ok (_, inp) -> loop inp
301301+ | Error _ -> Ok ((), input)
302302+ in
303303+ loop input])
304304+305305+ | SkipSome { p; loc } ->
306306+ (match p with
307307+ | Token { tok; _ } ->
308308+ [%expr
309309+ match I.peek input with
310310+ | Some t when t = [%e tok] ->
311311+ let rec loop input =
312312+ match I.peek input with
313313+ | Some t when t = [%e tok] -> loop (I.advance input)
314314+ | _ -> Ok ((), input)
315315+ in
316316+ loop (I.advance input)
317317+ | _ -> [%e error_expr ~loc [%expr [I.show_token [%e tok]]]]]
318318+ | Satisfy { pred; label; _ } ->
319319+ let expected = match label with
320320+ | Some l -> elist ~loc [estring ~loc l]
321321+ | None -> [%expr ["<satisfy>"]]
322322+ in
323323+ [%expr
324324+ match I.peek input with
325325+ | Some t when [%e pred] t ->
326326+ let rec loop input =
327327+ match I.peek input with
328328+ | Some t when [%e pred] t -> loop (I.advance input)
329329+ | _ -> Ok ((), input)
330330+ in
331331+ loop (I.advance input)
332332+ | _ -> [%e error_expr ~loc expected]]
333333+ | _ ->
334334+ let p_code = compile ~loc env p in
335335+ [%expr
336336+ match [%e p_code] with
337337+ | Ok (_, inp) ->
338338+ let rec loop input =
339339+ match [%e p_code] with
340340+ | Ok (_, inp2) -> loop inp2
341341+ | Error _ -> Ok ((), input)
342342+ in
343343+ loop inp
344344+ | Error e -> Error e])
345345+346346+ | TakeWhile { pred; at_least_one; loc } ->
347347+ if at_least_one then
348348+ [%expr
349349+ match I.peek input with
350350+ | Some t when [%e pred] t ->
351351+ let buf = Buffer.create 16 in
352352+ let rec loop input =
353353+ match I.peek input with
354354+ | Some t when [%e pred] t ->
355355+ Buffer.add_char buf t;
356356+ loop (I.advance input)
357357+ | _ -> Ok (Buffer.contents buf, input)
358358+ in
359359+ Buffer.add_char buf t;
360360+ loop (I.advance input)
361361+ | _ -> [%e error_expr ~loc [%expr ["<take_while1>"]]]]
362362+ else
363363+ [%expr
364364+ let buf = Buffer.create 16 in
365365+ let rec loop input =
366366+ match I.peek input with
367367+ | Some t when [%e pred] t ->
368368+ Buffer.add_char buf t;
369369+ loop (I.advance input)
370370+ | _ -> Ok (Buffer.contents buf, input)
371371+ in
372372+ loop input]
373373+269374 | Optional { p; loc } ->
270375 let p_code = compile ~loc env p in
271376 [%expr