File: pa_extend_m.ml

package info (click to toggle)
camlp4 2.04-3
  • links: PTS
  • area: main
  • in suites: potato
  • size: 1,576 kB
  • ctags: 3,108
  • sloc: ml: 26,444; makefile: 736; sh: 203
file content (58 lines) | stat: -rw-r--r-- 2,271 bytes parent folder | download
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;