OCaml parser combinator that compiles to direct recursive descent
3.3 kB
95 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 | Optional of { loc : loc; p : expr }
26 | Option of { loc : loc; default : Ppxlib.expression; p : expr }
27 | SepBy of { loc : loc; p : expr; sep : expr }
28 | SepBy1 of { loc : loc; p : expr; sep : expr }
29 | EndBy of { loc : loc; p : expr; sep : expr }
30 | EndBy1 of { loc : loc; p : expr; sep : expr }
31 | ManyTill of { loc : loc; p : expr; end_ : expr }
32 | Count of { loc : loc; n : Ppxlib.expression; p : expr }
33 | Between of { loc : loc; open_ : expr; close : expr; p : expr }
34 | ChainL of { loc : loc; p : expr; op : expr }
35 | ChainL1 of { loc : loc; p : expr; op : expr }
36 | ChainR of { loc : loc; p : expr; op : expr }
37 | ChainR1 of { loc : loc; p : expr; op : expr }
38 | Choice of { loc : loc; ps : expr list; label : string option }
39 | Label of { loc : loc; p : expr; label : string }
40 | Memo of { loc : loc; name : string; p : expr }
41 | Fix of { loc : loc; arity : int; names : string list; body : Ppxlib.expression }
42 | Var of { loc : loc; name : string }
43
44type parser_def = {
45 loc : loc;
46 name : string;
47 expr : expr;
48}
49
50type mutual_def = {
51 loc : loc;
52 names : string list;
53 expr : expr;
54}
55
56let loc_of_expr = function
57 | Pure { loc; _ } -> loc
58 | Fail { loc; _ } -> loc
59 | Satisfy { loc; _ } -> loc
60 | Any { loc } -> loc
61 | Eof { loc } -> loc
62 | Token { loc; _ } -> loc
63 | Tokens { loc; _ } -> loc
64 | OneOf { loc; _ } -> loc
65 | NoneOf { loc; _ } -> loc
66 | Bind { loc; _ } -> loc
67 | Map { loc; _ } -> loc
68 | Apply { loc; _ } -> loc
69 | SeqLeft { loc; _ } -> loc
70 | SeqRight { loc; _ } -> loc
71 | Alt { loc; _ } -> loc
72 | Attempt { loc; _ } -> loc
73 | Cut { loc } -> loc
74 | Lookahead { loc; _ } -> loc
75 | NotFollowedBy { loc; _ } -> loc
76 | Many { loc; _ } -> loc
77 | Some_ { loc; _ } -> loc
78 | Optional { loc; _ } -> loc
79 | Option { loc; _ } -> loc
80 | SepBy { loc; _ } -> loc
81 | SepBy1 { loc; _ } -> loc
82 | EndBy { loc; _ } -> loc
83 | EndBy1 { loc; _ } -> loc
84 | ManyTill { loc; _ } -> loc
85 | Count { loc; _ } -> loc
86 | Between { loc; _ } -> loc
87 | ChainL { loc; _ } -> loc
88 | ChainL1 { loc; _ } -> loc
89 | ChainR { loc; _ } -> loc
90 | ChainR1 { loc; _ } -> loc
91 | Choice { loc; _ } -> loc
92 | Label { loc; _ } -> loc
93 | Memo { loc; _ } -> loc
94 | Fix { loc; _ } -> loc
95 | Var { loc; _ } -> loc