1 (* Please keep me in sync with brion.inria.fr/gallium/index.php/Lambda_calculus_quotations *)
4 module CamlSyntax = Camlp4OCamlParser.Make(Camlp4OCamlRevisedParser.Make(Syntax));;
6 let patt_of_string = CamlSyntax.Gram.parse_string CamlSyntax.patt_eoi;;
8 module LambdaGram = MakeGram(Lexer);;
10 let term = LambdaGram.Entry.mk "term";;
11 let term_eoi = LambdaGram.Entry.mk "lambda term quotation";;
13 Camlp4_config.antiquotations := true;;
16 GLOBAL: term term_eoi;
19 [ "fun"; v = var; "->"; t = term -> <:patt< `Lam($v$, $t$) >> ]
21 [ t1 = SELF; t2 = SELF -> <:patt< `App($t1$, $t2$) >> ]
23 [ `ANTIQUOT((""|"term"), a) -> patt_of_string _loc a
24 | v = var -> <:patt< `Var($v$) >>
25 | "("; t = term; ")" -> t ]
28 [[ v = LIDENT -> <:patt< $str:v$ >>
29 | `ANTIQUOT((""|"var"), a) -> patt_of_string _loc a
32 [[ t = term; `EOI -> t ]];
35 let expand_lambda_quot_patt loc _loc_name_opt quotation_contents =
36 LambdaGram.parse_string term_eoi loc quotation_contents;;
38 (* function <:lam< fun x -> $(t|u)$ >> -> ... *)
39 Syntax.Quotation.add "lam" Syntax.Quotation.DynAst.patt_tag expand_lambda_quot_patt;;
41 Syntax.Quotation.default := "lam";;