Blame camlp4/unmaintained/etc/pr_extend.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 2002 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 no_slist = ref False;
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
(* Utilities *)
Packit 1f8b6b
Packit 1f8b6b
value rec list elem el k =
Packit 1f8b6b
  match el with
Packit 1f8b6b
  [ [] -> k
Packit 1f8b6b
  | [x] -> [: `elem x k :]
Packit 1f8b6b
  | [x :: l] -> [: `elem x [: :]; list elem l k :] ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value rec listws elem sep el k =
Packit 1f8b6b
  match el with
Packit 1f8b6b
  [ [] -> k
Packit 1f8b6b
  | [x] -> [: `elem x k :]
Packit 1f8b6b
  | [x :: l] -> [: `elem x [: `sep :]; listws elem sep l k :] ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value rec listwbws elem b sep el dg k =
Packit 1f8b6b
  match el with
Packit 1f8b6b
  [ [] -> [: b; k :]
Packit 1f8b6b
  | [x] -> [: `elem b x dg k :]
Packit 1f8b6b
  | [x :: l] ->
Packit 1f8b6b
      let sdg =
Packit 1f8b6b
        match sep with
Packit 1f8b6b
        [ S _ x -> x
Packit 1f8b6b
        | _ -> "" ]
Packit 1f8b6b
      in
Packit 1f8b6b
      [: `elem b x sdg [: :]; listwbws elem [: `sep :] sep l dg k :] ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
(* Extracting *)
Packit 1f8b6b
Packit 1f8b6b
value rec get_globals =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ [(<:patt< _ >>, <:expr< ($e$ : $uid:gmod1$.Entry.e '$_$) >>) :: pel] ->
Packit 1f8b6b
      let (gmod, gl) = get_globals pel in
Packit 1f8b6b
      if gmod = "" || gmod = gmod1 then (gmod1, [e :: gl])
Packit 1f8b6b
      else raise Not_found
Packit 1f8b6b
  | [] -> ("", [])
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value rec get_locals =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ [(<:patt< $_$ >>,
Packit 1f8b6b
      <:expr< (grammar_entry_create $_$ : $_$) >>) :: pel] ->
Packit 1f8b6b
        get_locals pel
Packit 1f8b6b
  | [] -> ()
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value unposition =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< None >> -> None
Packit 1f8b6b
  | <:expr< Some Gramext.First >> -> Some Gramext.First
Packit 1f8b6b
  | <:expr< Some Gramext.Last >> -> Some Gramext.Last
Packit 1f8b6b
  | <:expr< Some (Gramext.Before $str:s$) >> -> Some (Gramext.Before s)
Packit 1f8b6b
  | <:expr< Some (Gramext.After $str:s$) >> -> Some (Gramext.After s)
Packit 1f8b6b
  | <:expr< Some (Gramext.Level $str:s$) >> -> Some (Gramext.Level s)
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value unlabel =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< None >> -> None
Packit 1f8b6b
  | <:expr< Some $str:s$ >> -> Some s
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value unassoc =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< None >> -> None
Packit 1f8b6b
  | <:expr< Some Gramext.NonA >> -> Some Gramext.NonA
Packit 1f8b6b
  | <:expr< Some Gramext.LeftA >> -> Some Gramext.LeftA
Packit 1f8b6b
  | <:expr< Some Gramext.RightA >> -> Some Gramext.RightA
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value rec unaction =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< fun ($lid:locp$ : Loc.t) -> ($a$ : $_$) >>
Packit 1f8b6b
    when locp = Stdpp.loc_name.val ->
Packit 1f8b6b
      let ao =
Packit 1f8b6b
        match a with
Packit 1f8b6b
        [ <:expr< () >> -> None
Packit 1f8b6b
        | _ -> Some a ]
Packit 1f8b6b
      in
Packit 1f8b6b
      ([], ao)
Packit 1f8b6b
  | <:expr< fun ($p$ : $_$) -> $e$ >> ->
Packit 1f8b6b
      let (pl, a) = unaction e in ([p :: pl], a)
Packit 1f8b6b
  | <:expr@_loc< fun _ -> $e$ >> ->
Packit 1f8b6b
      let (pl, a) = unaction e in ([ <:patt< _ >> :: pl ], a)
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value untoken =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< ($str:x$, $str:y$) >> -> (x, y)
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
type symbol =
Packit 1f8b6b
  [ Snterm of MLast.expr
Packit 1f8b6b
  | Snterml of MLast.expr and string
Packit 1f8b6b
  | Slist0 of symbol
Packit 1f8b6b
  | Slist0sep of symbol and symbol
Packit 1f8b6b
  | Slist1 of symbol
Packit 1f8b6b
  | Slist1sep of symbol and symbol
Packit 1f8b6b
  | Sopt of symbol
Packit 1f8b6b
  | Sself
Packit 1f8b6b
  | Snext
Packit 1f8b6b
  | Stoken of Token.pattern
Packit 1f8b6b
  | Srules of list (list (option MLast.patt * symbol) * option MLast.expr) ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value rec unsymbol =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< Gramext.Snterm ($uid:_$.Entry.obj ($e$ : $_$)) >> -> Snterm e
Packit 1f8b6b
  | <:expr< Gramext.Snterml ($uid:_$.Entry.obj ($e$ : $_$)) $str:s$ >> ->
Packit 1f8b6b
      Snterml e s
Packit 1f8b6b
  | <:expr< Gramext.Snterml ($uid:_$.Entry.obj ($e$ : $_$), $str:s$) >> ->
Packit 1f8b6b
      Snterml e s
Packit 1f8b6b
  | <:expr< Gramext.Slist0 $e$ >> -> Slist0 (unsymbol e)
Packit 1f8b6b
  | <:expr< Gramext.Slist0sep $e1$ $e2$ >> ->
Packit 1f8b6b
      Slist0sep (unsymbol e1) (unsymbol e2)
Packit 1f8b6b
  | <:expr< Gramext.Slist0sep ($e1$, $e2$) >> ->
Packit 1f8b6b
      Slist0sep (unsymbol e1) (unsymbol e2)
Packit 1f8b6b
  | <:expr< Gramext.Slist1 $e$ >> -> Slist1 (unsymbol e)
Packit 1f8b6b
  | <:expr< Gramext.Slist1sep $e1$ $e2$ >> ->
Packit 1f8b6b
      Slist1sep (unsymbol e1) (unsymbol e2)
Packit 1f8b6b
  | <:expr< Gramext.Slist1sep ($e1$, $e2$) >> ->
Packit 1f8b6b
      Slist1sep (unsymbol e1) (unsymbol e2)
Packit 1f8b6b
  | <:expr< Gramext.Sopt $e$ >> -> Sopt (unsymbol e)
Packit 1f8b6b
  | <:expr< Gramext.Sself >> -> Sself
Packit 1f8b6b
  | <:expr< Gramext.Snext >> -> Snext
Packit 1f8b6b
  | <:expr< Gramext.Stoken $e$ >> -> Stoken (untoken e)
Packit 1f8b6b
  | <:expr< Gramext.srules $e$ >> -> Srules (unrule_list [] e)
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
and unpsymbol_list pl e =
Packit 1f8b6b
  match (pl, e) with
Packit 1f8b6b
  [ ([], <:expr< [] >>) -> []
Packit 1f8b6b
  | ([p :: pl], <:expr< [$e$ :: $el$] >>) ->
Packit 1f8b6b
      let op =
Packit 1f8b6b
        match p with
Packit 1f8b6b
        [ <:patt< _ >> -> None
Packit 1f8b6b
        | _ -> Some p ]
Packit 1f8b6b
      in
Packit 1f8b6b
      [(op, unsymbol e) :: unpsymbol_list pl el]
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
and unrule =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr@_loc< ($e1$, Gramext.action $e2$) >> ->
Packit 1f8b6b
      let (pl, a) =
Packit 1f8b6b
        match unaction e2 with
Packit 1f8b6b
        [ ([], None) -> ([], Some <:expr< () >>)
Packit 1f8b6b
        | x -> x ]
Packit 1f8b6b
      in
Packit 1f8b6b
      let sl = unpsymbol_list (List.rev pl) e1 in
Packit 1f8b6b
      (sl, a)
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
and unrule_list rl =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< [$e$ :: $el$] >> -> unrule_list [unrule e :: rl] el
Packit 1f8b6b
  | <:expr< [] >> -> rl
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value unlevel =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< ($e1$, $e2$, $e3$) >> ->
Packit 1f8b6b
      (unlabel e1, unassoc e2, unrule_list [] e3)
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value rec unlevel_list =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< [$e$ :: $el$] >> -> [unlevel e :: unlevel_list el]
Packit 1f8b6b
  | <:expr< [] >> -> []
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value unentry =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< (Grammar.Entry.obj ($e$ : Grammar.Entry.e '$_$), $pos$, $ll$) >> ->
Packit 1f8b6b
      (e, unposition pos, unlevel_list ll)
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value rec unentry_list =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< [$e$ :: $el$] >> -> [unentry e :: unentry_list el]
Packit 1f8b6b
  | <:expr< [] >> -> []
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value unextend_body e =
Packit 1f8b6b
  let ((_, globals), e) =
Packit 1f8b6b
    match e with
Packit 1f8b6b
    [ <:expr< let $list:pel$ in $e1$ >> ->
Packit 1f8b6b
        try (get_globals pel, e1) with
Packit 1f8b6b
        [ Not_found -> (("", []), e) ]
Packit 1f8b6b
    | _ -> (("", []), e) ]
Packit 1f8b6b
  in
Packit 1f8b6b
  let e =
Packit 1f8b6b
    match e with
Packit 1f8b6b
    [ <:expr<
Packit 1f8b6b
        let grammar_entry_create s =
Packit 1f8b6b
          Grammar.Entry.create (Grammar.of_entry $_$) s
Packit 1f8b6b
        in
Packit 1f8b6b
        $e$ >> ->
Packit 1f8b6b
       let e =
Packit 1f8b6b
         match e with
Packit 1f8b6b
         [ <:expr< let $list:pel$ in $e1$ >> ->
Packit 1f8b6b
             try let _ = get_locals pel in e1 with
Packit 1f8b6b
             [ Not_found -> e ]
Packit 1f8b6b
         | _ -> e ]
Packit 1f8b6b
       in
Packit 1f8b6b
       e
Packit 1f8b6b
    | _ -> e ]
Packit 1f8b6b
  in
Packit 1f8b6b
  let el = unentry_list e in
Packit 1f8b6b
  (globals, el)
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value ungextend_body e =
Packit 1f8b6b
  let e =
Packit 1f8b6b
    match e with
Packit 1f8b6b
    [ <:expr<
Packit 1f8b6b
        let grammar_entry_create = Gram.Entry.create in
Packit 1f8b6b
        let $list:ll$ in $e$
Packit 1f8b6b
      >> ->
Packit 1f8b6b
        let _ = get_locals ll in e
Packit 1f8b6b
    | _ -> e ]
Packit 1f8b6b
  in
Packit 1f8b6b
  match e with
Packit 1f8b6b
  [ <:expr< do { $list:el$ } >> ->
Packit 1f8b6b
      List.map
Packit 1f8b6b
        (fun
Packit 1f8b6b
         [ <:expr< $uid:_$.extend ($e$ : $uid:_$.Entry.e '$_$) $pos$ $ll$ >> ->
Packit 1f8b6b
             (e, unposition pos, unlevel_list ll)
Packit 1f8b6b
         | _ -> raise Not_found ])
Packit 1f8b6b
        el
Packit 1f8b6b
  | _ -> raise Not_found ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
(* Printing *)
Packit 1f8b6b
Packit 1f8b6b
value ident s k = HVbox [: `S LR s; k :];
Packit 1f8b6b
value string s k = HVbox [: `S LR ("\"" ^ s ^ "\""); k :];
Packit 1f8b6b
Packit 1f8b6b
value position =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ None -> [: :]
Packit 1f8b6b
  | Some Gramext.First -> [: `S LR "FIRST" :]
Packit 1f8b6b
  | Some Gramext.Last -> [: `S LR "LAST" :]
Packit 1f8b6b
  | Some (Gramext.Before s) -> [: `S LR "BEFORE"; `string s [: :] :]
Packit 1f8b6b
  | Some (Gramext.After s) -> [: `S LR "AFTER"; `string s [: :] :]
Packit 1f8b6b
  | Some (Gramext.Level s) -> [: `S LR "LEVEL"; `string s [: :] :] ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value action expr a dg k =
Packit 1f8b6b
  expr a dg k
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value token (con, prm) k =
Packit 1f8b6b
  if con = "" then string prm k
Packit 1f8b6b
  else if prm = "" then HVbox [: `S LR con; k :]
Packit 1f8b6b
  else HVbox [: `S LR con; `string prm k :]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value simplify_rules rl =
Packit 1f8b6b
  try
Packit 1f8b6b
    List.map
Packit 1f8b6b
      (fun
Packit 1f8b6b
       [ ([(Some <:patt< $lid:x$ >>, s)], Some <:expr< $lid:y$ >>) ->
Packit 1f8b6b
           if x = y then ([(None, s)], None) else raise Exit
Packit 1f8b6b
       | ([], _) as r -> r
Packit 1f8b6b
       | _ -> raise Exit ])
Packit 1f8b6b
      rl
Packit 1f8b6b
  with
Packit 1f8b6b
  [ Exit -> rl ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value rec symbol s k =
Packit 1f8b6b
  match s with
Packit 1f8b6b
  [ Snterm e -> expr e "" k
Packit 1f8b6b
  | Snterml e s -> HVbox [: `expr e "" [: :]; `S LR "LEVEL"; `string s k :]
Packit 1f8b6b
  | Slist0 s -> HVbox [: `S LR "LIST0"; `symbol s k :]
Packit 1f8b6b
  | Slist0sep s sep ->
Packit 1f8b6b
      HVbox
Packit 1f8b6b
        [: `S LR "LIST0"; `symbol s [: :]; `S LR "SEP";
Packit 1f8b6b
           `symbol sep k :]
Packit 1f8b6b
  | Slist1 s -> HVbox [: `S LR "LIST1"; `symbol s k :]
Packit 1f8b6b
  | Slist1sep s sep ->
Packit 1f8b6b
      HVbox
Packit 1f8b6b
        [: `S LR "LIST1"; `symbol  s [: :]; `S LR "SEP";
Packit 1f8b6b
           `symbol  sep k :]
Packit 1f8b6b
  | Sopt s -> HVbox [: `S LR "OPT"; `symbol  s k :]
Packit 1f8b6b
  | Sself -> HVbox [: `S LR "SELF"; k :]
Packit 1f8b6b
  | Snext -> HVbox [: `S LR "NEXT"; k :]
Packit 1f8b6b
  | Stoken tok -> token tok k
Packit 1f8b6b
  | Srules
Packit 1f8b6b
      [([(Some <:patt< a >>, Snterm <:expr< a_list >>)], Some <:expr< a >>);
Packit 1f8b6b
       ([(Some <:patt< a >>,
Packit 1f8b6b
          ((Slist0 _ | Slist1 _ | Slist0sep _ _ | Slist1sep _ _) as s))],
Packit 1f8b6b
          Some <:expr< Qast.List a >>)]
Packit 1f8b6b
    when not no_slist.val
Packit 1f8b6b
    ->
Packit 1f8b6b
      match s with
Packit 1f8b6b
      [ Slist0 s -> HVbox [: `S LR "SLIST0"; `simple_symbol s k :]
Packit 1f8b6b
      | Slist1 s -> HVbox [: `S LR "SLIST1"; `simple_symbol s k :]
Packit 1f8b6b
      | Slist0sep s sep ->
Packit 1f8b6b
          HVbox
Packit 1f8b6b
            [: `S LR "SLIST0"; `simple_symbol s [: :]; `S LR "SEP";
Packit 1f8b6b
               `symbol sep k :]
Packit 1f8b6b
      | Slist1sep s sep ->
Packit 1f8b6b
          HVbox
Packit 1f8b6b
            [: `S LR "SLIST1"; `simple_symbol s [: :]; `S LR "SEP";
Packit 1f8b6b
               `simple_symbol sep k :]
Packit 1f8b6b
      | _ -> assert False ]
Packit 1f8b6b
  | Srules
Packit 1f8b6b
      [([(Some <:patt< a >>, Snterm <:expr< a_opt >>)], Some <:expr< a >>);
Packit 1f8b6b
       ([(Some <:patt< a >>, Sopt s)], Some <:expr< Qast.Option a >>)]
Packit 1f8b6b
    when not no_slist.val
Packit 1f8b6b
    ->
Packit 1f8b6b
      let s =
Packit 1f8b6b
        match s with
Packit 1f8b6b
        [ Srules
Packit 1f8b6b
            [([(Some <:patt< x >>, Stoken ("", str))],
Packit 1f8b6b
              Some <:expr< Qast.Str x >>)] ->
Packit 1f8b6b
            Stoken ("", str)
Packit 1f8b6b
        | s -> s ]
Packit 1f8b6b
      in
Packit 1f8b6b
      HVbox [: `S LR "SOPT"; `simple_symbol s k :]
Packit 1f8b6b
  | Srules rl ->
Packit 1f8b6b
      let rl = simplify_rules rl in
Packit 1f8b6b
      HVbox [: `HVbox [: :]; rule_list  rl k :] ]
Packit 1f8b6b
and simple_symbol s k =
Packit 1f8b6b
  match s with
Packit 1f8b6b
  [ Snterml _ _ -> HVbox [: `S LO "("; `symbol s [: `S RO ")"; k :] :]
Packit 1f8b6b
  | s -> symbol s k ]
Packit 1f8b6b
and psymbol (p, s) k =
Packit 1f8b6b
  match p with
Packit 1f8b6b
  [ None -> symbol s k
Packit 1f8b6b
  | Some p -> HVbox [: `patt p "" [: `S LR "=" :]; `symbol  s k :] ]
Packit 1f8b6b
and psymbol_list sl k =
Packit 1f8b6b
  listws psymbol (S RO ";") sl k
Packit 1f8b6b
and rule  b (sl, a) dg k =
Packit 1f8b6b
  match a with
Packit 1f8b6b
  [ None -> HVbox [: b; `HOVbox [: psymbol_list sl k :] :]
Packit 1f8b6b
  | Some a ->
Packit 1f8b6b
      HVbox
Packit 1f8b6b
        [: b;
Packit 1f8b6b
           `HOVbox
Packit 1f8b6b
              [: `HOVbox
Packit 1f8b6b
                   [: `HVbox [: :];
Packit 1f8b6b
                      psymbol_list  sl [: `S LR "->" :] :];
Packit 1f8b6b
                 `action expr a dg k :] :] ]
Packit 1f8b6b
and rule_list ll k =
Packit 1f8b6b
  listwbws rule [: `S LR "[" :] (S LR "|") ll ""
Packit 1f8b6b
    [: `S LR "]"; k :]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value label =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ Some s -> [: `S LR ("\"" ^ s ^ "\"") :]
Packit 1f8b6b
  | None -> [: :] ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value intloc loc = ((Loc.start_off loc), (Loc.stop_off loc));
Packit 1f8b6b
Packit 1f8b6b
value intloc2 (bp, ep) = (bp.Lexing.pos_cnum, ep.Lexing.pos_cnum);
Packit 1f8b6b
Packit 1f8b6b
Packit 1f8b6b
value assoc =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ Some Gramext.NonA -> [: `S LR "NONA" :]
Packit 1f8b6b
  | Some Gramext.LeftA -> [: `S LR "LEFTA" :]
Packit 1f8b6b
  | Some Gramext.RightA -> [: `S LR "RIGHTA" :]
Packit 1f8b6b
  | None -> [: :] ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value level b (lab, ass, rl) _ k =
Packit 1f8b6b
  let s =
Packit 1f8b6b
    if rl = [] then [: `S LR "[ ]"; k :]
Packit 1f8b6b
    else [: `Vbox [: `HVbox [: :]; rule_list rl k :] :]
Packit 1f8b6b
  in
Packit 1f8b6b
  match (lab, ass) with
Packit 1f8b6b
  [ (None, None) -> HVbox [: b; s :]
Packit 1f8b6b
  | _ ->
Packit 1f8b6b
      Vbox
Packit 1f8b6b
        [: `HVbox [: b; label lab; assoc ass :];
Packit 1f8b6b
           `HVbox [: `HVbox [: :]; s :] :] ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value level_list ll k =
Packit 1f8b6b
  Vbox
Packit 1f8b6b
    [: `HVbox [: :];
Packit 1f8b6b
       listwbws level [: `S LR "[" :] (S LR "|") ll ""
Packit 1f8b6b
         [: `S LR "]"; k :] :]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value entry (e, pos, ll) k =
Packit 1f8b6b
  BEbox
Packit 1f8b6b
    [: `LocInfo (intloc(MLast.loc_of_expr e))
Packit 1f8b6b
          (HVbox [: `expr e "" [: `S RO ":" :]; position pos :]);
Packit 1f8b6b
       `level_list  ll [: :];
Packit 1f8b6b
       `HVbox [: `S RO ";"; k :] :]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value entry_list el k =
Packit 1f8b6b
  Vbox [: `HVbox [: :]; list entry el k :]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value extend_body (globals, e) k =
Packit 1f8b6b
  let s = entry_list e k in
Packit 1f8b6b
  match globals with
Packit 1f8b6b
  [ [] -> s
Packit 1f8b6b
  | sl ->
Packit 1f8b6b
      HVbox
Packit 1f8b6b
        [: `HVbox [: :];
Packit 1f8b6b
           `HOVbox
Packit 1f8b6b
             [: `S LR "GLOBAL"; `S RO ":";
Packit 1f8b6b
                list (fun e k -> HVbox [: `expr e "" k :]) sl
Packit 1f8b6b
                  [: `S RO ";" :] :];
Packit 1f8b6b
           `s :] ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value extend e _ k =
Packit 1f8b6b
  match e with
Packit 1f8b6b
  [ <:expr< Grammar.extend $e$ >> ->
Packit 1f8b6b
      try
Packit 1f8b6b
        let ex = unextend_body e in
Packit 1f8b6b
        BEbox
Packit 1f8b6b
          [: `S LR "EXTEND"; `extend_body ex [: :];
Packit 1f8b6b
             `HVbox [: `S LR "END"; k :] :]
Packit 1f8b6b
      with
Packit 1f8b6b
      [ Not_found ->
Packit 1f8b6b
          HVbox
Packit 1f8b6b
            [: `S LR "Grammar.extend";
Packit 1f8b6b
               `HOVbox
Packit 1f8b6b
                  [: `S LO "(";
Packit 1f8b6b
                     `expr e "" [: `HVbox [: `S RO ")"; k :] :] :] :] ]
Packit 1f8b6b
  | _ -> expr e "" k ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value get_gextend =
Packit 1f8b6b
  fun
Packit 1f8b6b
  [ <:expr< let $list:gl$ in $e$ >> ->
Packit 1f8b6b
      try
Packit 1f8b6b
        let (gmod, gl) = get_globals gl in
Packit 1f8b6b
        let el = ungextend_body e in
Packit 1f8b6b
        Some (gmod, gl, el)
Packit 1f8b6b
      with
Packit 1f8b6b
      [ Not_found -> None ]
Packit 1f8b6b
  | _ -> None ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value gextend e _ k =
Packit 1f8b6b
  match get_gextend e with
Packit 1f8b6b
  [ Some (gmod, gl, el) ->
Packit 1f8b6b
      BEbox
Packit 1f8b6b
        [: `HVbox [: `S LR "GEXTEND"; `S LR gmod :];
Packit 1f8b6b
           `extend_body (gl, el) [: :];
Packit 1f8b6b
           `HVbox [: `S LR "END"; k :] :]
Packit 1f8b6b
  | None -> expr e "" k ]
Packit 1f8b6b
;
Packit 1f8b6b
Packit 1f8b6b
value is_gextend e = get_gextend e <> None;
Packit 1f8b6b
Packit 1f8b6b
(* Printer extensions *)
Packit 1f8b6b
Packit 1f8b6b
let lev =
Packit 1f8b6b
  try find_pr_level "expr1" pr_expr.pr_levels with
Packit 1f8b6b
  [ Failure _ -> find_pr_level "top" pr_expr.pr_levels ]
Packit 1f8b6b
in
Packit 1f8b6b
lev.pr_rules :=
Packit 1f8b6b
  extfun lev.pr_rules with
Packit 1f8b6b
  [ <:expr< let $list:_$ in $_$ >> as e when is_gextend e ->
Packit 1f8b6b
      fun _ next _ k -> [: `next e "" 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< Grammar.extend $_$ >> 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< Grammar.extend $_$ >> as e ->
Packit 1f8b6b
      fun _ _ _ k -> [: `extend e "" k :]
Packit 1f8b6b
  | <:expr< let $list:_$ in $_$ >> as e when is_gextend e ->
Packit 1f8b6b
      fun _ _ _ k -> [: `gextend e "" k :] ];
Packit 1f8b6b
Packit 1f8b6b
Pcaml.add_option "-no_slist" (Arg.Set no_slist)
Packit 1f8b6b
  "Don't reconstruct SLIST and SOPT";