parse.ml 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. open Lexing
  2. open Printf
  3. open Ast
  4. let get_position lexbuf =
  5. let pos = lexbuf.lex_curr_p in
  6. sprintf "%s:%d:%d" pos.pos_fname pos.pos_lnum
  7. (pos.pos_cnum - pos.pos_bol + 1)
  8. let get_loc lexbuf =
  9. let pos = lexbuf.lex_curr_p in
  10. let colnum = (pos.pos_cnum - pos.pos_bol + 1) in
  11. Loc (pos.pos_fname, pos.pos_lnum, , colnum, )
  12. sprintf "%s:%d:%d" pos.pos_fname pos.pos_lnum
  13. (pos.pos_cnum - pos.pos_bol + 1)
  14. let parse_with_error lexbuf =
  15. try Some (Parser.program Lexer.token lexbuf) with
  16. | Lexer.SyntaxError msg ->
  17. raise (CompileError (sprintf "%s: %s" (get_loc lexbuf) msg))
  18. | Parser.Error ->
  19. raise (LocError ("syntax error" (get_loc lexbuf)))
  20. let phase repr =
  21. print_endline "- Parse input";
  22. match repr with
  23. | Inputfile (filename, verbose) ->
  24. (* TODO: run preprocessor *)
  25. let infile = match filename with
  26. | Some value -> open_in value
  27. | None -> stdin
  28. in
  29. let display_name = match filename with
  30. | Some value -> value
  31. | None -> "stdin"
  32. in
  33. let lexbuf = Lexing.from_channel infile in
  34. lexbuf.lex_curr_p <- { lexbuf.lex_curr_p with pos_fname = display_name };
  35. let ast = parse_with_error lexbuf in
  36. close_in infile;
  37. (match ast with
  38. | None -> failwith "error during parsing"
  39. | Some ast -> Node (ast, verbose))
  40. | _ -> failwith "invalid input for this phase"