Blame camlp4/unmaintained/etc/pr_op_main.ml

Packit 1f8b6b
(* camlp4r q_MLast.cmo ./pa_extfun.cmo *)
Packit 1f8b6b
(***********************************************************************)
Packit 1f8b6b
(*                                                                     *)
Packit 1f8b6b
(*                             Camlp4                                  *)
Packit 1f8b6b
(*                                                                     *)
Packit 1f8b6b
(*        Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt     *)
Packit 1f8b6b
(*                                                                     *)
Packit 1f8b6b
(*  Copyright 1998 Institut National de Recherche en Informatique et   *)
Packit 1f8b6b
(*  Automatique.  Distributed only by permission.                      *)
Packit 1f8b6b
(*                                                                     *)
Packit 1f8b6b
(***********************************************************************)
Packit 1f8b6b
Packit 1f8b6b
Packit 1f8b6b
Packit 1f8b6b
open Pcaml;
Packit 1f8b6b
open Spretty;
Packit 1f8b6b
Packit 1f8b6b
value _loc = Loc.mk "FIXME pr_op_main.ml";
Packit 1f8b6b
Packit 1f8b6b
value expr e dg k = pr_expr.pr_fun "top" e dg k;
Packit 1f8b6b
value patt e dg k = pr_patt.pr_fun "top" e dg k;
Packit 1f8b6b
Packit 1f8b6b
value spatt p dg k =
Packit 1f8b6b
  match p with
Packit 1f8b6b
  [ <:patt< $lid:s$ >> ->
Packit 1f8b6b
      if String.length s >= 2 && s.[1] == ''' then
Packit 1f8b6b
        HVbox [: `S LR (" " ^ s); k :]
Packit 1f8b6b
      else patt p dg k
Packit 1f8b6b
  | _ -> patt p dg k ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
(* Streams *)
Packit 1f8b6b
Packit 1f8b6b
value stream e _ k =
Packit 1f8b6b
  let rec get =
Packit 1f8b6b
    fun
Packit 1f8b6b
    [ <:expr< Stream.iapp $x$ $y$ >> -> [(False, x) :: get y]
Packit 1f8b6b
    | <:expr< Stream.icons $x$ $y$ >> -> [(True, x) :: get y]
Packit 1f8b6b
    | <:expr< Stream.ising $x$ >> -> [(True, x)]
Packit 1f8b6b
    | <:expr< Stream.lapp (fun _ -> $x$) $y$ >> -> [(False, x) :: get y]
Packit 1f8b6b
    | <:expr< Stream.lcons (fun _ -> $x$) $y$ >> -> [(True, x) :: get y]
Packit 1f8b6b
    | <:expr< Stream.lsing (fun _ -> $x$) >> -> [(True, x)]
Packit 1f8b6b
    | <:expr< Stream.sempty >> -> []
Packit 1f8b6b
    | <:expr< Stream.slazy (fun _ -> $x$) >> -> [(False, x)]
Packit 1f8b6b
    | <:expr< Stream.slazy $x$ >> -> [(False, <:expr< $x$ () >>)]
Packit 1f8b6b
    | e -> [(False, e)] ]
Packit 1f8b6b
  in
Packit 1f8b6b
  let elem e dg k =
Packit 1f8b6b
    match e with
Packit 1f8b6b
    [ (True, e) -> [: `HOVbox [: `S LO "'"; `expr e dg k :] :]
Packit 1f8b6b
    | (False, e) -> [: `expr e dg k :] ]
Packit 1f8b6b
  in
Packit 1f8b6b
  let rec glop e k =
Packit 1f8b6b
    match e with
Packit 1f8b6b
    [ [] -> k
Packit 1f8b6b
    | [e] -> [: elem e "" k :]
Packit 1f8b6b
    | [e :: el] -> [: elem e ";" [: `S RO ";" :]; glop el k :] ]
Packit 1f8b6b
  in
Packit 1f8b6b
  HOVbox [: `S LR "[<"; glop (get e) [: `S LR ">]"; k :] :]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
(* Parsers *)
Packit 1f8b6b
Packit 1f8b6b
open Parserify;
Packit 1f8b6b
Packit 1f8b6b
value parser_cases b spel dg k =
Packit 1f8b6b
  let rec parser_cases b spel dg k =
Packit 1f8b6b
    match spel with
Packit 1f8b6b
    [ [] -> [: `HVbox [: b; k :] :]
Packit 1f8b6b
    | [(sp, epo, e)] -> [: `parser_case b sp epo e dg k :]
Packit 1f8b6b
    | [(sp, epo, e) :: spel] ->
Packit 1f8b6b
        [: `parser_case b sp epo e "|" [: :];
Packit 1f8b6b
           parser_cases [: `S LR "|" :] spel dg k :] ]
Packit 1f8b6b
  and parser_case b sp epo e dg k =
Packit 1f8b6b
    let epo =
Packit 1f8b6b
      match epo with
Packit 1f8b6b
      [ Some p -> [: `patt p "" [: `S LR "->" :] :]
Packit 1f8b6b
      | _ -> [: `S LR "->" :] ]
Packit 1f8b6b
    in
Packit 1f8b6b
    HVbox
Packit 1f8b6b
      [: b;
Packit 1f8b6b
         `HOVbox
Packit 1f8b6b
            [: `HOVbox
Packit 1f8b6b
                 [: `S LR "[<";
Packit 1f8b6b
                    stream_patt [: :] sp [: `S LR ">]"; epo :] :];
Packit 1f8b6b
               `expr e dg k :] :]
Packit 1f8b6b
  and stream_patt b sp k =
Packit 1f8b6b
    match sp with
Packit 1f8b6b
    [ [] -> [: `HVbox [: b; k :] :]
Packit 1f8b6b
    | [(spc, None)] -> [: `stream_patt_comp b spc "" k :]
Packit 1f8b6b
    | [(spc, Some e)] ->
Packit 1f8b6b
        [: `HVbox
Packit 1f8b6b
              [: `stream_patt_comp b spc "" [: :];
Packit 1f8b6b
                 `HVbox [: `S LR "??"; `expr e "" k :] :] :]
Packit 1f8b6b
    | [(spc, None) :: spcl] ->
Packit 1f8b6b
        [: `stream_patt_comp b spc ";" [: `S RO ";" :];
Packit 1f8b6b
           stream_patt [: :] spcl k :]
Packit 1f8b6b
    | [(spc, Some e) :: spcl] ->
Packit 1f8b6b
        [: `HVbox
Packit 1f8b6b
              [: `stream_patt_comp b spc "" [: :];
Packit 1f8b6b
                 `HVbox [: `S LR "??"; `expr e ";" [: `S RO ";" :] :] :];
Packit 1f8b6b
           stream_patt [: :] spcl k :] ]
Packit 1f8b6b
  and stream_patt_comp b spc dg k =
Packit 1f8b6b
    match spc with
Packit 1f8b6b
    [ SPCterm (p, w) ->
Packit 1f8b6b
        HVbox [: b; `S LO "'"; `spatt p "" (when_opt w k) :]
Packit 1f8b6b
    | SPCnterm p e ->
Packit 1f8b6b
        HVbox [: b; `HVbox [: `patt p "" [: `S LR "=" :]; `expr e dg k :] :]
Packit 1f8b6b
    | SPCsterm p -> HVbox [: b; `patt p "" k :] ]
Packit 1f8b6b
  and when_opt wo k =
Packit 1f8b6b
    match wo with
Packit 1f8b6b
    [ Some e -> [: `S LR "when"; `expr e "" k :]
Packit 1f8b6b
    | _ -> k ]
Packit 1f8b6b
  in
Packit 1f8b6b
  parser_cases b spel dg k
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value parser_body e dg k =
Packit 1f8b6b
  let (bp, e) =
Packit 1f8b6b
    match e with
Packit 1f8b6b
    [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e)
Packit 1f8b6b
    | e -> (None, e) ]
Packit 1f8b6b
  in
Packit 1f8b6b
  match parser_of_expr e with
Packit 1f8b6b
  [ [] ->
Packit 1f8b6b
      let spe = ([], None, <:expr< raise Stream.Failure >>) in
Packit 1f8b6b
      HVbox
Packit 1f8b6b
        [: `HVbox
Packit 1f8b6b
              [: `S LR "parser";
Packit 1f8b6b
                 match bp with
Packit 1f8b6b
                 [ Some p -> [: `patt p "" [: :] :]
Packit 1f8b6b
                 | _ -> [: :] ] :];
Packit 1f8b6b
           parser_cases [: :] [spe] dg k :]
Packit 1f8b6b
  | spel ->
Packit 1f8b6b
      BEVbox
Packit 1f8b6b
        [: `HVbox
Packit 1f8b6b
              [: `S LR "parser";
Packit 1f8b6b
                 match bp with
Packit 1f8b6b
                 [ Some p -> [: `patt p "" [: :] :]
Packit 1f8b6b
                 | _ -> [: :] ] :];
Packit 1f8b6b
           parser_cases [: :] spel dg k :] ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value pmatch e dg k =
Packit 1f8b6b
  let (me, e) =
Packit 1f8b6b
    match e with
Packit 1f8b6b
    [ <:expr< let (__strm : Stream.t _) = $me$ in $e$ >> -> (me, e)
Packit 1f8b6b
    | _ -> failwith "Pr_op.pmatch" ]
Packit 1f8b6b
  in
Packit 1f8b6b
  let (bp, e) =
Packit 1f8b6b
    match e with
Packit 1f8b6b
    [ <:expr< let $bp$ = Stream.count __strm in $e$ >> -> (Some bp, e)
Packit 1f8b6b
    | e -> (None, e) ]
Packit 1f8b6b
  in
Packit 1f8b6b
  let spel = parser_of_expr e in
Packit 1f8b6b
  Vbox
Packit 1f8b6b
    [: `HVbox [: :];
Packit 1f8b6b
       `HVbox
Packit 1f8b6b
          [: `S LR "match"; `expr me "" [: `S LR "with" :]; `S LR "parser";
Packit 1f8b6b
             match bp with
Packit 1f8b6b
             [ Some p -> [: `patt p "" [: :] :]
Packit 1f8b6b
             | _ -> [: :] ] :];
Packit 1f8b6b
       `BEbox [: `HVbox [: :]; parser_cases [: :] spel dg k :] :]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
(* Printer extensions *)
Packit 1f8b6b
Packit 1f8b6b
pr_expr_fun_args.val :=
Packit 1f8b6b
  extfun pr_expr_fun_args.val with
Packit 1f8b6b
  [ <:expr< fun __strm -> $_$ >> as ge -> ([], ge)
Packit 1f8b6b
  | <:expr< fun [(__strm : $_$) -> $_$] >> as ge -> ([], ge) ];
Packit 1f8b6b
Packit 1f8b6b
let lev = find_pr_level "expr1" pr_expr.pr_levels in
Packit 1f8b6b
lev.pr_rules :=
Packit 1f8b6b
  extfun lev.pr_rules with
Packit 1f8b6b
  [ <:expr< let (__strm : Stream.t _) = $_$ in $_$ >> as e ->
Packit 1f8b6b
      fun _ _ dg k ->
Packit 1f8b6b
        if not (List.mem dg ["|"; ";"]) then [: `pmatch e dg k :]
Packit 1f8b6b
        else [: `S LO "("; `pmatch e "" [: `S RO ")"; k :] :]
Packit 1f8b6b
  | <:expr< fun __strm -> $x$ >> ->
Packit 1f8b6b
      fun _ _ dg k ->
Packit 1f8b6b
        if not (List.mem dg ["|"; ";"]) then [: `parser_body x dg k :]
Packit 1f8b6b
        else [: `S LO "("; `parser_body x "" [: `S RO ")"; k :] :]
Packit 1f8b6b
  | <:expr< fun [ (__strm : $_$) -> $x$ ] >> ->
Packit 1f8b6b
      fun _ _ dg k ->
Packit 1f8b6b
        if not (List.mem dg ["|"; ";"]) then [: `parser_body x dg k :]
Packit 1f8b6b
        else [: `S LO "("; `parser_body x "" [: `S RO ")"; k :] :] ];
Packit 1f8b6b
Packit 1f8b6b
let lev = find_pr_level "apply" pr_expr.pr_levels in
Packit 1f8b6b
lev.pr_rules :=
Packit 1f8b6b
  extfun lev.pr_rules with
Packit 1f8b6b
  [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> |
Packit 1f8b6b
    <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> |
Packit 1f8b6b
    <:expr< Stream.lcons (fun _ -> $_$) $_$ >> |
Packit 1f8b6b
    <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> |
Packit 1f8b6b
    <:expr< Stream.slazy $_$ >> as e ->
Packit 1f8b6b
      fun _ next _ k -> [: `next e "" k :] ];
Packit 1f8b6b
Packit 1f8b6b
let lev = find_pr_level "dot" pr_expr.pr_levels in
Packit 1f8b6b
lev.pr_rules :=
Packit 1f8b6b
  extfun lev.pr_rules with
Packit 1f8b6b
  [ <:expr< Stream.sempty >> as e ->
Packit 1f8b6b
      fun _ next _ k -> [: `next e "" k :] ];
Packit 1f8b6b
Packit 1f8b6b
let lev = find_pr_level "simple" pr_expr.pr_levels in
Packit 1f8b6b
lev.pr_rules :=
Packit 1f8b6b
  extfun lev.pr_rules with
Packit 1f8b6b
  [ <:expr< Stream.iapp $_$ $_$ >> | <:expr< Stream.icons $_$ $_$ >> |
Packit 1f8b6b
    <:expr< Stream.ising $_$ >> | <:expr< Stream.lapp (fun _ -> $_$) $_$ >> |
Packit 1f8b6b
    <:expr< Stream.lcons (fun _ -> $_$) $_$ >> |
Packit 1f8b6b
    <:expr< Stream.lsing (fun _ -> $_$) >> | <:expr< Stream.sempty >> |
Packit 1f8b6b
    <:expr< Stream.slazy $_$ >> as e ->
Packit 1f8b6b
      fun _ _ _ k ->
Packit 1f8b6b
        [: `stream e "" k :] ];