parse.ml 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  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 parse_with_error lexbuf =
  9. try Some (Parser.program Lexer.token lexbuf) with
  10. | Lexer.SyntaxError msg ->
  11. raise (CompileError (sprintf "%s: %s" (get_position lexbuf) msg))
  12. | Parser.Error ->
  13. raise (CompileError (sprintf "%s: syntax error" (get_position lexbuf)))
  14. let phase repr =
  15. print_endline "- Parse input";
  16. match repr with
  17. | Inputfile (filename, verbose) ->
  18. (* TODO: run preprocessor *)
  19. let infile = match filename with
  20. | Some value -> open_in value
  21. | None -> stdin
  22. in
  23. let display_name = match filename with
  24. | Some value -> value
  25. | None -> "stdin"
  26. in
  27. let lexbuf = Lexing.from_channel infile in
  28. lexbuf.lex_curr_p <- { lexbuf.lex_curr_p with pos_fname = display_name };
  29. let ast = parse_with_error lexbuf in
  30. close_in infile;
  31. (match ast with
  32. | None -> failwith "error during parsing"
  33. | Some ast -> Node (ast, verbose))
  34. | _ -> failwith "invalid input for this phase"