+let lexbuf_set_filename lb filename : unit =
+ let Lexing.({lex_start_p; lex_curr_p}) = lb in
+ lb.Lexing.lex_start_p <- {lex_start_p with Lexing.pos_fname = filename};
+ lb.Lexing.lex_curr_p <- {lex_curr_p with Lexing.pos_fname = filename}
+
let () =
let path_to_program_file = Sys.argv.(1) in
let ic = open_in path_to_program_file in
let lexbuf = Lexing.from_channel ic in
+ lexbuf_set_filename lexbuf path_to_program_file;
(match Tiger.Parser.program Tiger.Lexer.token lexbuf with
- | exception Parsing.Parse_error ->
- let
- Lexing.({lex_curr_p = {pos_lnum; pos_bol; pos_cnum; _}; _}) = lexbuf
- in
- Printf.printf
- "Syntax error in file %S, around line: %d, column: %d\n"
- path_to_program_file pos_lnum (pos_cnum - pos_bol)
+ | exception Tiger.Error.T msg ->
+ Printf.eprintf "%s\n" msg;
+ exit 1;
| absyn ->
print_endline (Tiger.Absyn.to_string absyn)
);
module Absyn = Tiger_absyn
+module Error = Tiger_error
module Lexer = Tiger_lexer
module Parser = Tiger_parser
module Parser_token = Tiger_parser_token
; end_char = ecnum - ebol
; end_line = eline
}
+
+let to_string
+ { file
+ ; start_char
+ ; start_line
+ ; end_char
+ ; end_line
+ }
+=
+ Printf.sprintf
+ "file: %S, between (line/char) %d/%d and %d/%d"
+ file start_line start_char end_line end_char