2011-07-27 07:17:02 -07:00
|
|
|
(****************************************************************************)
|
|
|
|
(* *)
|
|
|
|
(* OCaml *)
|
|
|
|
(* *)
|
|
|
|
(* INRIA Rocquencourt *)
|
|
|
|
(* *)
|
|
|
|
(* Copyright 2007 Institut National de Recherche en Informatique et *)
|
|
|
|
(* en Automatique. All rights reserved. This file is distributed under *)
|
|
|
|
(* the terms of the GNU Library General Public License, with the special *)
|
|
|
|
(* exception on linking described in LICENSE at the top of the OCaml *)
|
|
|
|
(* source tree. *)
|
|
|
|
(* *)
|
|
|
|
(****************************************************************************)
|
|
|
|
|
2007-10-08 07:19:34 -07:00
|
|
|
open Camlp4.PreCast;
|
|
|
|
module CamlSyntax = Camlp4OCamlParser.Make (Camlp4OCamlRevisedParser.Make Syntax);
|
|
|
|
|
|
|
|
value expr_of_string = CamlSyntax.Gram.parse_string CamlSyntax.expr_eoi;
|
|
|
|
|
|
|
|
module LambdaGram = MakeGram Lexer;
|
|
|
|
|
|
|
|
value term = LambdaGram.Entry.mk "term";
|
|
|
|
value term_eoi = LambdaGram.Entry.mk "lambda term quotation";
|
|
|
|
|
|
|
|
Camlp4_config.antiquotations.val := True;
|
|
|
|
|
|
|
|
EXTEND LambdaGram
|
|
|
|
GLOBAL: term term_eoi;
|
|
|
|
term:
|
|
|
|
[ "top"
|
|
|
|
[ "fun"; v = var; "->"; t = term -> <:expr< `Lam $v$ $t$ >> ]
|
|
|
|
| "app"
|
|
|
|
[ t1 = SELF; t2 = SELF -> <:expr< `App $t1$ $t2$ >> ]
|
|
|
|
| "simple"
|
|
|
|
[ `ANTIQUOT (""|"term") a -> expr_of_string _loc a
|
|
|
|
| v = var -> <:expr< `Var $v$ >>
|
|
|
|
| "("; t = term; ")" -> t ]
|
|
|
|
];
|
|
|
|
var:
|
|
|
|
[[ v = LIDENT -> <:expr< $str:v$ >>
|
|
|
|
| `ANTIQUOT (""|"var") a -> expr_of_string _loc a
|
|
|
|
]];
|
|
|
|
term_eoi:
|
|
|
|
[[ t = term; `EOI -> t ]];
|
|
|
|
END;
|
|
|
|
|
|
|
|
value expand_lambda_quot_expr loc _loc_name_opt quotation_contents =
|
|
|
|
LambdaGram.parse_string term_eoi loc quotation_contents;
|
|
|
|
|
|
|
|
Syntax.Quotation.add "lam" Syntax.Quotation.DynAst.expr_tag expand_lambda_quot_expr;
|
|
|
|
|
|
|
|
Syntax.Quotation.default.val := "lam";
|