(****************************************************************************)
(* *)
(* OCaml *)
(* *)
(* INRIA Rocquencourt *)
(* *)
(* Copyright 2006 Institut National de Recherche en Informatique et *)
(* en Automatique. All rights reserved. This file is distributed under *)
(* the terms of the GNU Library General Public License, with the special *)
(* exception on linking described in LICENSE at the top of the Camlp4 *)
(* source tree. *)
(* *)
(****************************************************************************)
(* Authors:
* - Daniel de Rauglaudre: initial version
* - Nicolas Pouillard: refactoring
*)
module Make (Structure : Structure.S) = struct
module Dump = Print.MakeDump Structure;
module Print = Print.Make Structure;
module Tools = Tools.Make Structure;
open Format;
open Structure;
open Tools;
type t 'a = internal_entry;
value name e = e.ename;
value print ppf e = fprintf ppf "%a@\n" Print.entry e;
value dump ppf e = fprintf ppf "%a@\n" Dump.entry e;
(* value find e s = Find.entry e s; *)
value mk g n =
{ egram = g;
ename = n;
estart = empty_entry n;
econtinue _ _ _ = parser [];
edesc = Dlevels [] };
value action_parse entry ts : Action.t =
try entry.estart 0 ts with
[ Stream.Failure ->
Loc.raise (get_prev_loc ts)
(Stream.Error ("illegal begin of " ^ entry.ename))
| Loc.Exc_located _ _ as exc -> raise exc
| exc -> Loc.raise (get_prev_loc ts) exc ];
value lex entry loc cs = entry.egram.glexer loc cs;
value lex_string entry loc str = lex entry loc (Stream.of_string str);
value filter entry ts =
keep_prev_loc (Token.Filter.filter (get_filter entry.egram) ts);
value parse_tokens_after_filter entry ts = Action.get (action_parse entry ts);
value parse_tokens_before_filter entry ts = parse_tokens_after_filter entry (filter entry ts);
value parse entry loc cs = parse_tokens_before_filter entry (lex entry loc cs);
value parse_string entry loc str =
parse_tokens_before_filter entry (lex_string entry loc str);
value of_parser g n (p : Stream.t (Token.t * token_info) -> 'a) : t 'a =
let f ts = Action.mk (p ts) in
{ egram = g;
ename = n;
estart _ = f;
econtinue _ _ _ = parser [];
edesc = Dparser f };
value setup_parser e (p : Stream.t (Token.t * token_info) -> 'a) =
let f ts = Action.mk (p ts) in do {
e.estart := fun _ -> f;
e.econtinue := fun _ _ _ -> parser [];
e.edesc := Dparser f
};
value clear e =
do {
e.estart := fun _ -> parser [];
e.econtinue := fun _ _ _ -> parser [];
e.edesc := Dlevels []
};
value obj x = x;
end;