OCaml parser combinator that compiles to direct recursive descent
3.5 kB
101 lines
1type loc = Ppxlib.Location.t
2
3type expr =
4 | Pure of { loc : loc; value : Ppxlib.expression }
5 | Fail of { loc : loc; msg : string }
6 | Satisfy of { loc : loc; pred : Ppxlib.expression; label : string option }
7 | Any of { loc : loc }
8 | Eof of { loc : loc }
9 | Token of { loc : loc; tok : Ppxlib.expression }
10 | Tokens of { loc : loc; toks : Ppxlib.expression }
11 | OneOf of { loc : loc; toks : Ppxlib.expression }
12 | NoneOf of { loc : loc; toks : Ppxlib.expression }
13 | Bind of { loc : loc; p : expr; f : Ppxlib.expression }
14 | Map of { loc : loc; f : Ppxlib.expression; p : expr }
15 | Apply of { loc : loc; pf : expr; px : expr }
16 | SeqLeft of { loc : loc; p : expr; q : expr }
17 | SeqRight of { loc : loc; p : expr; q : expr }
18 | Alt of { loc : loc; p : expr; q : expr }
19 | Attempt of { loc : loc; p : expr }
20 | Cut of { loc : loc }
21 | Lookahead of { loc : loc; p : expr }
22 | NotFollowedBy of { loc : loc; p : expr }
23 | Many of { loc : loc; p : expr }
24 | Some_ of { loc : loc; p : expr }
25 | SkipMany of { loc : loc; p : expr }
26 | SkipSome of { loc : loc; p : expr }
27 | TakeWhile of { loc : loc; pred : Ppxlib.expression; at_least_one : bool }
28 | Optional of { loc : loc; p : expr }
29 | Option of { loc : loc; default : Ppxlib.expression; p : expr }
30 | SepBy of { loc : loc; p : expr; sep : expr }
31 | SepBy1 of { loc : loc; p : expr; sep : expr }
32 | EndBy of { loc : loc; p : expr; sep : expr }
33 | EndBy1 of { loc : loc; p : expr; sep : expr }
34 | ManyTill of { loc : loc; p : expr; end_ : expr }
35 | Count of { loc : loc; n : Ppxlib.expression; p : expr }
36 | Between of { loc : loc; open_ : expr; close : expr; p : expr }
37 | ChainL of { loc : loc; p : expr; op : expr }
38 | ChainL1 of { loc : loc; p : expr; op : expr }
39 | ChainR of { loc : loc; p : expr; op : expr }
40 | ChainR1 of { loc : loc; p : expr; op : expr }
41 | Choice of { loc : loc; ps : expr list; label : string option }
42 | Label of { loc : loc; p : expr; label : string }
43 | Memo of { loc : loc; name : string; p : expr }
44 | Fix of { loc : loc; arity : int; names : string list; body : Ppxlib.expression }
45 | Var of { loc : loc; name : string }
46
47type parser_def = {
48 loc : loc;
49 name : string;
50 expr : expr;
51}
52
53type mutual_def = {
54 loc : loc;
55 names : string list;
56 expr : expr;
57}
58
59let loc_of_expr = function
60 | Pure { loc; _ } -> loc
61 | Fail { loc; _ } -> loc
62 | Satisfy { loc; _ } -> loc
63 | Any { loc } -> loc
64 | Eof { loc } -> loc
65 | Token { loc; _ } -> loc
66 | Tokens { loc; _ } -> loc
67 | OneOf { loc; _ } -> loc
68 | NoneOf { loc; _ } -> loc
69 | Bind { loc; _ } -> loc
70 | Map { loc; _ } -> loc
71 | Apply { loc; _ } -> loc
72 | SeqLeft { loc; _ } -> loc
73 | SeqRight { loc; _ } -> loc
74 | Alt { loc; _ } -> loc
75 | Attempt { loc; _ } -> loc
76 | Cut { loc } -> loc
77 | Lookahead { loc; _ } -> loc
78 | NotFollowedBy { loc; _ } -> loc
79 | Many { loc; _ } -> loc
80 | Some_ { loc; _ } -> loc
81 | SkipMany { loc; _ } -> loc
82 | SkipSome { loc; _ } -> loc
83 | TakeWhile { loc; _ } -> loc
84 | Optional { loc; _ } -> loc
85 | Option { loc; _ } -> loc
86 | SepBy { loc; _ } -> loc
87 | SepBy1 { loc; _ } -> loc
88 | EndBy { loc; _ } -> loc
89 | EndBy1 { loc; _ } -> loc
90 | ManyTill { loc; _ } -> loc
91 | Count { loc; _ } -> loc
92 | Between { loc; _ } -> loc
93 | ChainL { loc; _ } -> loc
94 | ChainL1 { loc; _ } -> loc
95 | ChainR { loc; _ } -> loc
96 | ChainR1 { loc; _ } -> loc
97 | Choice { loc; _ } -> loc
98 | Label { loc; _ } -> loc
99 | Memo { loc; _ } -> loc
100 | Fix { loc; _ } -> loc
101 | Var { loc; _ } -> loc