32 lines
1018 B
OCaml
32 lines
1018 B
OCaml
|
(* This module provides support for managing and printing errors when
|
||
|
preprocessing C# source files. *)
|
||
|
|
||
|
type message = string
|
||
|
type start = Lexing.position
|
||
|
type stop = Lexing.position
|
||
|
type seg = start * stop
|
||
|
|
||
|
let mk_seg buffer =
|
||
|
Lexing.(lexeme_start_p buffer, lexeme_end_p buffer)
|
||
|
|
||
|
type vline = int
|
||
|
|
||
|
exception Lexer of (message * seg * vline)
|
||
|
exception Parser of (message * seg * vline)
|
||
|
|
||
|
let print (kind: string) (msg, (start, stop), vend) =
|
||
|
let open Lexing in
|
||
|
let delta = vend - stop.pos_lnum in
|
||
|
let vstart = start.pos_lnum + delta
|
||
|
in assert (msg <> "");
|
||
|
prerr_endline
|
||
|
((if kind = "" then msg else kind) ^ " error at line "
|
||
|
^ string_of_int vstart ^ ", char "
|
||
|
^ string_of_int (start.pos_cnum - start.pos_bol)
|
||
|
^ (if stop.pos_lnum = start.pos_lnum
|
||
|
then "--" ^ string_of_int (stop.pos_cnum - stop.pos_bol)
|
||
|
else " to line " ^ string_of_int vend
|
||
|
^ ", char "
|
||
|
^ string_of_int (stop.pos_cnum - stop.pos_bol))
|
||
|
^ (if kind = "" then "." else ":\n" ^ msg))
|