Blame camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.ml

Packit 1f8b6b
open Camlp4;                                             (* -*- camlp4r -*- *)
Packit 1f8b6b
(****************************************************************************)
Packit 1f8b6b
(*                                                                          *)
Packit 1f8b6b
(*                                   OCaml                                  *)
Packit 1f8b6b
(*                                                                          *)
Packit 1f8b6b
(*                            INRIA Rocquencourt                            *)
Packit 1f8b6b
(*                                                                          *)
Packit 1f8b6b
(*  Copyright  2007  Institut  National  de  Recherche en Informatique et   *)
Packit 1f8b6b
(*  en Automatique.  All rights reserved.  This file is distributed under   *)
Packit 1f8b6b
(*  the terms of the GNU Library General Public License, with the special   *)
Packit 1f8b6b
(*  exception on linking described in LICENSE at the top of the Camlp4      *)
Packit 1f8b6b
(*  source tree.                                                            *)
Packit 1f8b6b
(*                                                                          *)
Packit 1f8b6b
(****************************************************************************)
Packit 1f8b6b
Packit 1f8b6b
(* Authors:
Packit 1f8b6b
 * - Nicolas Pouillard: Original version
Packit 1f8b6b
 *)
Packit 1f8b6b
Packit 1f8b6b
module Id = struct
Packit 1f8b6b
  value name = "Camlp4Reloaded";
Packit 1f8b6b
  value version = Sys.ocaml_version;
Packit 1f8b6b
end;
Packit 1f8b6b
Packit 1f8b6b
module Make (Syntax : Sig.Camlp4Syntax) = struct
Packit 1f8b6b
  open Sig;
Packit 1f8b6b
  include Syntax;
Packit 1f8b6b
Packit 1f8b6b
  Gram.Entry.clear match_case;
Packit 1f8b6b
  Gram.Entry.clear semi;
Packit 1f8b6b
Packit 1f8b6b
  value mkseq _loc =
Packit 1f8b6b
    fun
Packit 1f8b6b
    [ <:expr< $_$; $_$ >> as e -> <:expr< do { $e$ } >>
Packit 1f8b6b
    | e -> e ]
Packit 1f8b6b
  ;
Packit 1f8b6b
Packit 1f8b6b
  DELETE_RULE Gram match_case0: patt_as_patt_opt; opt_when_expr; "->"; expr END;
Packit 1f8b6b
Packit 1f8b6b
  value revised =
Packit 1f8b6b
    try
Packit 1f8b6b
      (DELETE_RULE Gram expr: "if"; SELF; "then"; SELF; "else"; SELF END; True)
Packit 1f8b6b
    with [ Struct.Grammar.Delete.Rule_not_found _ -> begin
Packit 1f8b6b
      DELETE_RULE Gram expr: "if"; SELF; "then"; expr LEVEL "top"; "else"; expr LEVEL "top" END;
Packit 1f8b6b
      DELETE_RULE Gram expr: "if"; SELF; "then"; expr LEVEL "top" END; False
Packit 1f8b6b
    end ];
Packit 1f8b6b
Packit 1f8b6b
  if revised then begin
Packit 1f8b6b
    DELETE_RULE Gram expr: "fun"; "["; LIST0 match_case0 SEP "|"; "]" END;
Packit 1f8b6b
    EXTEND Gram
Packit 1f8b6b
      expr: LEVEL "top"
Packit 1f8b6b
      [ [ "function"; a = match_case -> <:expr< fun [ $a$ ] >> ] ];
Packit 1f8b6b
    END;
Packit 1f8b6b
    DELETE_RULE Gram value_let: "value" END;
Packit 1f8b6b
    DELETE_RULE Gram value_val: "value" END;
Packit 1f8b6b
  end else begin
Packit 1f8b6b
    DELETE_RULE Gram value_let: "let" END;
Packit 1f8b6b
    DELETE_RULE Gram value_val: "val" END;
Packit 1f8b6b
  end;
Packit 1f8b6b
Packit 1f8b6b
  EXTEND Gram
Packit 1f8b6b
    GLOBAL: match_case match_case0 expr value_let value_val semi;
Packit 1f8b6b
Packit 1f8b6b
    match_case:
Packit 1f8b6b
      [ [ OPT "|"; l = LIST1 match_case0 SEP "|"; "end" -> Ast.mcOr_of_list l
Packit 1f8b6b
        | "end" -> <:match_case<>> ] ]
Packit 1f8b6b
    ;
Packit 1f8b6b
Packit 1f8b6b
    match_case0:
Packit 1f8b6b
      [ [ p = patt_as_patt_opt; w = opt_when_expr; "->"; e = sequence ->
Packit 1f8b6b
            <:match_case< $p$ when $w$ -> $mkseq _loc e$ >> ] ]
Packit 1f8b6b
    ;
Packit 1f8b6b
Packit 1f8b6b
    expr: LEVEL "top"
Packit 1f8b6b
      [ [ "if"; e1 = sequence; "then"; e2 = sequence; "else"; e3 = sequence; "end" ->
Packit 1f8b6b
            <:expr< if $mkseq _loc e1$ then $mkseq _loc e2$ else $mkseq _loc e3$ >>
Packit 1f8b6b
        | "if"; e1 = sequence; "then"; e2 = sequence; "end" ->
Packit 1f8b6b
            <:expr< if $mkseq _loc e1$ then $mkseq _loc e2$ else () >> ] ]
Packit 1f8b6b
    ;
Packit 1f8b6b
Packit 1f8b6b
    value_let:
Packit 1f8b6b
      [ [ "val" -> () ] ]
Packit 1f8b6b
    ;
Packit 1f8b6b
    value_val:
Packit 1f8b6b
      [ [ "val" -> () ] ]
Packit 1f8b6b
    ;
Packit 1f8b6b
    semi:
Packit 1f8b6b
      [ [ ";;" -> () | ";" -> () | -> () ] ]
Packit 1f8b6b
    ;
Packit 1f8b6b
  END;
Packit 1f8b6b
Packit 1f8b6b
end;
Packit 1f8b6b
Packit 1f8b6b
let module M = Register.OCamlSyntaxExtension Id Make in ();