ident.mli 5.78 KB
Newer Older
Andrei Paskevich's avatar
Andrei Paskevich committed
1 2 3
(********************************************************************)
(*                                                                  *)
(*  The Why3 Verification Platform   /   The Why3 Development Team  *)
Guillaume Melquiond's avatar
Guillaume Melquiond committed
4
(*  Copyright 2010-2018   --   Inria - CNRS - Paris-Sud University  *)
Andrei Paskevich's avatar
Andrei Paskevich committed
5 6 7 8
(*                                                                  *)
(*  This software is distributed under the terms of the GNU Lesser  *)
(*  General Public License version 2.1, with the special exception  *)
(*  on linking described in file LICENSE.                           *)
9
(*                                                                  *)
Andrei Paskevich's avatar
Andrei Paskevich committed
10
(********************************************************************)
11

MARCHE Claude's avatar
MARCHE Claude committed
12 13
(** Identifiers *)

MARCHE Claude's avatar
MARCHE Claude committed
14 15
(** {2 Labels} *)

Andrei Paskevich's avatar
Andrei Paskevich committed
16 17 18 19 20
type label = private {
  lab_string : string;
  lab_tag    : int;
}

21 22
module Mlab : Extmap.S with type key = label
module Slab : Extset.S with module M = Mlab
23

Andrei Paskevich's avatar
Andrei Paskevich committed
24
val lab_compare : label -> label -> int
Andrei Paskevich's avatar
Andrei Paskevich committed
25
val lab_equal : label -> label -> bool
Andrei Paskevich's avatar
Andrei Paskevich committed
26
val lab_hash : label -> int
Andrei Paskevich's avatar
Andrei Paskevich committed
27 28

val create_label : string -> label
MARCHE Claude's avatar
MARCHE Claude committed
29

30 31
(* functions for working with counterexample model labels *)

32
val remove_model_labels : labels : Slab.t -> Slab.t
Guillaume Melquiond's avatar
Guillaume Melquiond committed
33
(** Returns a copy of labels without labels ["model"] and ["model_projected"]. *)
34

35 36 37 38
val append_to_model_trace_label : labels : Slab.t ->
  to_append : string ->
  Slab.t
(** The returned set of labels will contain the same set of labels
Guillaume Melquiond's avatar
Guillaume Melquiond committed
39 40
    as argument labels except that a label of the form ["model_trace:*"]
    will be ["model_trace:*to_append"]. *)
41 42 43 44 45

val append_to_model_element_name : labels : Slab.t ->
  to_append : string ->
  Slab.t
(** The returned set of labels will contain the same set of labels
Guillaume Melquiond's avatar
Guillaume Melquiond committed
46 47
    as argument labels except that a label of the form ["model_trace:*@*"]
    will be ["model_trace:*to_append@*"]. *)
48 49

val get_model_element_name : labels : Slab.t -> string
Guillaume Melquiond's avatar
Guillaume Melquiond committed
50 51 52
(** If labels contain a label of the form ["model_trace:name@*"],
    return ["name"].
    Throws [Not_found] if there is no label of the form ["model_trace:*"]. *)
53

54
val get_model_trace_string : labels : Slab.t -> string
Guillaume Melquiond's avatar
Guillaume Melquiond committed
55 56 57
(** If labels contain a label of the form ["model_trace:mt_string"],
    return ["mt_string"].
    Throws [Not_found] if there is no label of the form ["model_trace:*"]. *)
58

59
val get_model_trace_label : labels : Slab.t -> Slab.elt
Guillaume Melquiond's avatar
Guillaume Melquiond committed
60 61
(** Return a label of the form ["model_trace:*"].
    Throws [Not_found] if there is no such label. *)
62

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
(** {2 Naming convention } *)

val infix: string -> string
(** Apply the naming convention for infix operator (+) *)

val prefix: string -> string
(** Apply the naming convention for prefix operator *)

val mixfix: string -> string
(** Apply the naming convention for mixfix operator *)

val kind_of_fix: string -> [ `None
                           | `Prefix of string
                           | `Infix  of string
                           | `Mixfix of string ]

MARCHE Claude's avatar
MARCHE Claude committed
79
(** {2 Identifiers} *)
80 81

type ident = private {
Piotr Trojanek's avatar
Piotr Trojanek committed
82 83 84 85
  id_string : string;               (** non-unique name *)
  id_label  : Slab.t;               (** identifier labels *)
  id_loc    : Loc.position option;  (** optional location *)
  id_tag    : Weakhtbl.tag;         (** unique magical tag *)
86 87
}

88 89 90
module Mid : Extmap.S with type key = ident
module Sid : Extset.S with module M = Mid
module Hid : Exthtbl.S with type key = ident
Andrei Paskevich's avatar
Andrei Paskevich committed
91
module Wid : Weakhtbl.S with type key = ident
92

Andrei Paskevich's avatar
Andrei Paskevich committed
93
val id_compare : ident -> ident -> int
94
val id_equal : ident -> ident -> bool
Andrei Paskevich's avatar
Andrei Paskevich committed
95 96
val id_hash : ident -> int

Piotr Trojanek's avatar
Piotr Trojanek committed
97
(** a user-created type of unregistered identifiers *)
98 99 100 101 102
type preid = {
  pre_name  : string;
  pre_label : Slab.t;
  pre_loc   : Loc.position option;
}
103

Piotr Trojanek's avatar
Piotr Trojanek committed
104
(** register a pre-ident (you should never use this function) *)
105
val id_register : preid -> ident
106

Piotr Trojanek's avatar
Piotr Trojanek committed
107
(** create a fresh pre-ident *)
108
val id_fresh : ?label:Slab.t -> ?loc:Loc.position -> string -> preid
109

Piotr Trojanek's avatar
Piotr Trojanek committed
110
(** create a localized pre-ident *)
111
val id_user : ?label:Slab.t -> string -> Loc.position -> preid
112

Piotr Trojanek's avatar
Piotr Trojanek committed
113
(** create a duplicate pre-ident with given labels *)
114 115
val id_lab : Slab.t -> ident -> preid

Piotr Trojanek's avatar
Piotr Trojanek committed
116
(** create a duplicate pre-ident *)
117
val id_clone : ?label:Slab.t -> ident -> preid
118

Piotr Trojanek's avatar
Piotr Trojanek committed
119
(** create a derived pre-ident (inherit labels and location) *)
120
val id_derive : ?label:Slab.t -> string -> ident -> preid
121

122
(* DEPRECATED : retrieve preid name without registering *)
123
val preid_name : preid -> string
Francois Bobot's avatar
Francois Bobot committed
124

125 126
(** Unique persistent names for pretty printing *)

127
type ident_printer
128

129 130
val create_ident_printer :
  ?sanitizer : (string -> string) -> string list -> ident_printer
MARCHE Claude's avatar
MARCHE Claude committed
131
(** start a new printer with a sanitizing function and a blacklist *)
132

133 134
val id_unique :
  ident_printer -> ?sanitizer : (string -> string) -> ident -> string
135
(** use ident_printer to generate a unique name for ident
MARCHE Claude's avatar
MARCHE Claude committed
136
    an optional sanitizer is applied over the printer's sanitizer *)
137

138 139 140 141 142
val id_unique_label :
  ident_printer -> ?sanitizer : (string -> string) -> ident -> string
(** Do the same as id_unique except that it tries first to
   use the "name:" label to generate the name instead of id.id_string *)

143
val string_unique : ident_printer -> string -> string
MARCHE Claude's avatar
MARCHE Claude committed
144
(** Uniquify string *)
145

146 147 148 149
val known_id: ident_printer -> ident -> bool
(** Returns true if the printer already knows the id.
    false if it does not. *)

150
val forget_id : ident_printer -> ident -> unit
MARCHE Claude's avatar
MARCHE Claude committed
151
(** forget an ident *)
152

153
val forget_all : ident_printer -> unit
MARCHE Claude's avatar
MARCHE Claude committed
154
(** forget all idents *)
155

156 157 158
val sanitizer' : (char -> string) -> (char -> string) -> (char -> string) -> string -> string
(** generic sanitizer taking a separate encoder for the first and last letter *)

159
val sanitizer : (char -> string) -> (char -> string) -> string -> string
MARCHE Claude's avatar
MARCHE Claude committed
160 161 162
(** generic sanitizer taking a separate encoder for the first letter *)

(** various character encoders *)
163 164 165 166 167

val char_to_alpha : char -> string
val char_to_lalpha : char -> string
val char_to_ualpha : char -> string
val char_to_alnum : char -> string
168
val char_to_lalnum : char -> string
169
val char_to_alnumus : char -> string
170
val char_to_lalnumus : char -> string