22
22
(* TEMPORARY reprendre compl`etement implementation et interface
25
let log kind verbosity msg =
26
if kind >= verbosity then
27
Printf.fprintf stderr "%t%!" msg
25
(* ---------------------------------------------------------------------------- *)
38
29
let get_initialized_ref ref =
46
37
ref (None : string option)
42
(* 2011/10/19: do not use [Filename.basename]. The [#] annotations that
43
we insert in the [.ml] file must retain their full path. This does
44
mean that the [#] annotations depend on how menhir is invoked -- e.g.
45
[menhir foo/bar.mly] and [cd foo && menhir bar.mly] will produce
46
different files. Nevertheless, this seems useful/reasonable. *)
48
(* This also influences the type error messages produced by [--infer]. *)
51
50
let set_filename name =
52
basename := Some (Filename.basename name);
51
filename := Some name;
53
52
filemark := Mark.fresh()
56
get_initialized_ref basename
55
get_initialized_ref filename
58
57
let get_filemark () =
61
ref (None : string option)
63
let get_file_contents () =
64
get_initialized_ref file_contents
66
(* ---------------------------------------------------------------------------- *)
68
(* Logging and log levels. *)
70
let log kind verbosity msg =
71
if kind >= verbosity then
72
Printf.fprintf stderr "%t%!" msg
83
(* ---------------------------------------------------------------------------- *)
85
(* Errors and warnings. *)
68
94
fprintf stderr "%s\n%!" message
70
let errorN positions message =
71
printN positions (Printf.sprintf "Error: %s" message);
96
let error_message message =
99
let error positions message =
100
printN positions (error_message message);
74
let error_lexbuf lexbuf message =
75
errorN [ Positions.lex_join lexbuf.Lexing.lex_start_p lexbuf.Lexing.lex_curr_p ] message
77
103
let errorp v message =
78
errorN [ Positions.position v ] message
80
let error1 position message =
81
errorN [ Positions.lex_join position position ] message
86
let signalN positions message =
104
error [ Positions.position v ] message
106
let signal positions message =
87
107
printN positions message;
90
let signal position1 position2 message =
91
signalN [ Positions.lex_join position1 position2 ] message
93
let signalp v message =
94
signalN [ Positions.position v ] message
97
ref (None : in_channel option)
100
get_initialized_ref file
102
let warningN positions message =
110
let warning positions message =
103
111
printN positions (Printf.sprintf "Warning: %s" message)
105
let warningp v message =
106
warningN [ Positions.position v ] message
108
let warning2 position1 position2 message =
109
warningN [ Positions.lex_join position1 position2 ] message
111
let warning message =
116
(* Certain warnings about the grammar can optionally be treated as errors.
117
The following function emits a warning or error message, via [warning] or
118
[signal]. It does not stop the program; the client must at some point call
119
[errors] and stop the program if any errors have been reported. *)
121
let grammar_warning positions message =
122
if Settings.strict then
123
signal positions (error_message message)
125
warning positions message