summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/parsing/longident.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/parsing/longident.ml')
-rw-r--r--ocaml-binary-annot/parsing/longident.ml43
1 files changed, 43 insertions, 0 deletions
diff --git a/ocaml-binary-annot/parsing/longident.ml b/ocaml-binary-annot/parsing/longident.ml
new file mode 100644
index 0000000000..1b459ca3f4
--- /dev/null
+++ b/ocaml-binary-annot/parsing/longident.ml
@@ -0,0 +1,43 @@
+(***********************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
+(* *)
+(* Copyright 1996 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the Q Public License version 1.0. *)
+(* *)
+(***********************************************************************)
+
+(* $Id$ *)
+
+type t =
+ Lident of string
+ | Ldot of t * string
+ | Lapply of t * t
+
+let rec flat accu = function
+ Lident s -> s :: accu
+ | Ldot(lid, s) -> flat (s :: accu) lid
+ | Lapply(l1, l2) -> Misc.fatal_error "Longident.flat"
+
+let flatten lid = flat [] lid
+
+let last = function
+ Lident s -> s
+ | Ldot(lid, s) -> s
+ | Lapply(l1, l2) -> Misc.fatal_error "Longident.last"
+
+let rec split_at_dots s pos =
+ try
+ let dot = String.index_from s pos '.' in
+ String.sub s pos (dot - pos) :: split_at_dots s (dot + 1)
+ with Not_found ->
+ [String.sub s pos (String.length s - pos)]
+
+let parse s =
+ match split_at_dots s 0 with
+ [] -> Lident "" (* should not happen, but don't put assert false
+ so as not to crash the toplevel (see Genprintval) *)
+ | hd :: tl -> List.fold_left (fun p s -> Ldot(p, s)) (Lident hd) tl