1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
(* camlp4r pa_extend.cmo q_MLast.cmo *)
(***********************************************************************)
(* *)
(* Camlp4 *)
(* *)
(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *)
(* *)
(* Copyright 1998 Institut National de Recherche en Informatique et *)
(* Automatique. Distributed only by permission. *)
(* *)
(***********************************************************************)
(* $Id: pa_extend_m.ml,v 2.0 1998/12/01 08:21:15 ddr Exp $ *)
open Pa_extend;
value psymbol p s t =
let symb = {used = []; text = s; styp = fun _ -> t} in
{pattern = p; symbol = symb}
;
EXTEND
symbol: LEVEL "top"
[ NONA
[ min = [ UIDENT "SLIST0" -> False | UIDENT "SLIST1" -> True ];
s = SELF; sep = OPT [ UIDENT "SEP"; t = symbol -> t ] ->
let used =
match sep with
[ Some symb -> [mk_name loc <:expr< anti >> :: symb.used @ s.used]
| None -> s.used ]
in
let text n =
let rl =
let r1 =
let prod =
let n = mk_name loc <:expr< anti_list >> in
[psymbol <:patt< a >> (snterm loc n None)
<:ctyp< 'anti_list >>]
in
let act = <:expr< a >> in {prod = prod; action = act}
in
let r2 =
let psymb =
let symb =
{used = []; text = slist loc min sep s;
styp = fun n -> <:ctyp< list $s.styp n$ >>}
in
let patt = <:patt< l >> in {pattern = patt; symbol = symb}
in
let act = <:expr< list l >> in {prod = [psymb]; action = act}
in
[r1; r2]
in
srules loc "anti" rl n
in
{used = used; text = text; styp = fun _ -> <:ctyp< ast >>} ] ]
;
END;
|