Source file parser_utils.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
module type Parser_type =
sig
type token
type result
val input : (Lexing.lexbuf -> token) -> Lexing.lexbuf -> result
val rule : Lexing.lexbuf -> token
end
exception Error of exn * (int * int * string * string)
module Make(T : Parser_type) =
struct
let parse_buf_exn lexbuf =
try
T.input T.rule lexbuf
with exn ->
begin
let curr = lexbuf.Lexing.lex_curr_p in
let line = curr.Lexing.pos_lnum in
let cnum = curr.Lexing.pos_cnum - curr.Lexing.pos_bol in
let tok = Lexing.lexeme lexbuf in
let tail = Sql_lexer.ruleTail "" lexbuf in
raise (Error (exn,(line,cnum,tok,tail)))
end
let parse_buf lexbuf = try Some (parse_buf_exn lexbuf) with _ -> None
let parse_stdin () = parse_buf (Lexing.from_channel stdin)
let parse_string str =
parse_buf (Lexing.from_string str)
let parse_file filename =
let contents = try Std.input_file filename with _ -> "" in
parse_string contents
end