gen_cxx: use callbacks to iterate rowset
[sqlgg.git] / parser_utils.ml
blob8c3f8bab2f13760798035365d211bd9b23eca185
1 (* Simple wrapper tying together parser and lexer *)
3 module type Parser_type =
4 sig
5 type token
6 type result
7 val input : (Lexing.lexbuf -> token) -> Lexing.lexbuf -> result
8 val rule : Lexing.lexbuf -> token
9 end
11 module Make(T : Parser_type) =
12 struct
13 let parse_buf_exn lexbuf =
14 try
15 T.input T.rule lexbuf
16 with exn ->
17 begin
18 let curr = lexbuf.Lexing.lex_curr_p in
19 let line = curr.Lexing.pos_lnum in
20 let cnum = curr.Lexing.pos_cnum - curr.Lexing.pos_bol in
21 let tok = Lexing.lexeme lexbuf in
22 let extra = Printexc.to_string exn in
23 Error.report "Exception %s in %u:%u at lexeme \"%s\"" extra line cnum tok;
24 raise exn
25 end
27 let parse_buf lexbuf = try Some (parse_buf_exn lexbuf) with exn -> None
29 let parse_stdin () = parse_buf (Lexing.from_channel stdin)
30 let parse_string str = (*Error.log "Parsing : %s" str; *)
31 parse_buf (Lexing.from_string str)
33 let parse_file filename =
34 let contents = try Std.input_file filename with exn -> "" in
35 parse_string contents
37 end