type loc = Ppxlib.Location.t type expr = | Pure of { loc : loc; value : Ppxlib.expression } | Fail of { loc : loc; msg : string } | Satisfy of { loc : loc; pred : Ppxlib.expression; label : string option } | Any of { loc : loc } | Eof of { loc : loc } | Token of { loc : loc; tok : Ppxlib.expression } | Tokens of { loc : loc; toks : Ppxlib.expression } | OneOf of { loc : loc; toks : Ppxlib.expression } | NoneOf of { loc : loc; toks : Ppxlib.expression } | Bind of { loc : loc; p : expr; f : Ppxlib.expression } | Map of { loc : loc; f : Ppxlib.expression; p : expr } | Apply of { loc : loc; pf : expr; px : expr } | SeqLeft of { loc : loc; p : expr; q : expr } | SeqRight of { loc : loc; p : expr; q : expr } | Alt of { loc : loc; p : expr; q : expr } | Attempt of { loc : loc; p : expr } | Cut of { loc : loc } | Lookahead of { loc : loc; p : expr } | NotFollowedBy of { loc : loc; p : expr } | Many of { loc : loc; p : expr } | Some_ of { loc : loc; p : expr } | SkipMany of { loc : loc; p : expr } | SkipSome of { loc : loc; p : expr } | TakeWhile of { loc : loc; pred : Ppxlib.expression; at_least_one : bool } | Optional of { loc : loc; p : expr } | Option of { loc : loc; default : Ppxlib.expression; p : expr } | SepBy of { loc : loc; p : expr; sep : expr } | SepBy1 of { loc : loc; p : expr; sep : expr } | EndBy of { loc : loc; p : expr; sep : expr } | EndBy1 of { loc : loc; p : expr; sep : expr } | ManyTill of { loc : loc; p : expr; end_ : expr } | Count of { loc : loc; n : Ppxlib.expression; p : expr } | Between of { loc : loc; open_ : expr; close : expr; p : expr } | ChainL of { loc : loc; p : expr; op : expr } | ChainL1 of { loc : loc; p : expr; op : expr } | ChainR of { loc : loc; p : expr; op : expr } | ChainR1 of { loc : loc; p : expr; op : expr } | Choice of { loc : loc; ps : expr list; label : string option } | Label of { loc : loc; p : expr; label : string } | Memo of { loc : loc; name : string; p : expr } | Fix of { loc : loc; arity : int; names : string list; body : Ppxlib.expression } | Var of { loc : loc; name : string } type parser_def = { loc : loc; name : string; expr : expr; } type mutual_def = { loc : loc; names : string list; expr : expr; } let loc_of_expr = function | Pure { loc; _ } -> loc | Fail { loc; _ } -> loc | Satisfy { loc; _ } -> loc | Any { loc } -> loc | Eof { loc } -> loc | Token { loc; _ } -> loc | Tokens { loc; _ } -> loc | OneOf { loc; _ } -> loc | NoneOf { loc; _ } -> loc | Bind { loc; _ } -> loc | Map { loc; _ } -> loc | Apply { loc; _ } -> loc | SeqLeft { loc; _ } -> loc | SeqRight { loc; _ } -> loc | Alt { loc; _ } -> loc | Attempt { loc; _ } -> loc | Cut { loc } -> loc | Lookahead { loc; _ } -> loc | NotFollowedBy { loc; _ } -> loc | Many { loc; _ } -> loc | Some_ { loc; _ } -> loc | SkipMany { loc; _ } -> loc | SkipSome { loc; _ } -> loc | TakeWhile { loc; _ } -> loc | Optional { loc; _ } -> loc | Option { loc; _ } -> loc | SepBy { loc; _ } -> loc | SepBy1 { loc; _ } -> loc | EndBy { loc; _ } -> loc | EndBy1 { loc; _ } -> loc | ManyTill { loc; _ } -> loc | Count { loc; _ } -> loc | Between { loc; _ } -> loc | ChainL { loc; _ } -> loc | ChainL1 { loc; _ } -> loc | ChainR { loc; _ } -> loc | ChainR1 { loc; _ } -> loc | Choice { loc; _ } -> loc | Label { loc; _ } -> loc | Memo { loc; _ } -> loc | Fix { loc; _ } -> loc | Var { loc; _ } -> loc