]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/ocaml/ocaml/contrib/camlp4/examples/lambda_quot_patt.ml
Update
[l4.git] / l4 / pkg / ocaml / ocaml / contrib / camlp4 / examples / lambda_quot_patt.ml
1 (* Please keep me in sync with brion.inria.fr/gallium/index.php/Lambda_calculus_quotations *)
2
3 open Camlp4.PreCast;;
4 module CamlSyntax = Camlp4OCamlParser.Make(Camlp4OCamlRevisedParser.Make(Syntax));;
5
6 let patt_of_string = CamlSyntax.Gram.parse_string CamlSyntax.patt_eoi;;
7
8 module LambdaGram = MakeGram(Lexer);;
9
10 let term = LambdaGram.Entry.mk "term";;
11 let term_eoi = LambdaGram.Entry.mk "lambda term quotation";;
12
13 Camlp4_config.antiquotations := true;;
14
15 EXTEND LambdaGram
16   GLOBAL: term term_eoi;
17   term:
18     [ "top"
19       [ "fun"; v = var; "->"; t = term -> <:patt< `Lam($v$, $t$) >> ]
20     | "app"
21       [ t1 = SELF; t2 = SELF           -> <:patt< `App($t1$, $t2$) >> ]
22     | "simple"
23       [ `ANTIQUOT((""|"term"), a)      -> patt_of_string _loc a
24       | v = var                        -> <:patt< `Var($v$) >>
25       | "("; t = term; ")"             -> t ]
26     ];
27   var:
28     [[ v = LIDENT               -> <:patt< $str:v$ >>
29      | `ANTIQUOT((""|"var"), a) -> patt_of_string _loc a
30     ]];
31   term_eoi:
32     [[ t = term; `EOI -> t ]];
33 END;;
34
35 let expand_lambda_quot_patt loc _loc_name_opt quotation_contents =
36   LambdaGram.parse_string term_eoi loc quotation_contents;;
37
38 (* function <:lam< fun x -> $(t|u)$ >> -> ... *)
39 Syntax.Quotation.add "lam" Syntax.Quotation.DynAst.patt_tag expand_lambda_quot_patt;;
40
41 Syntax.Quotation.default := "lam";;