parse.ml 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. open Lexing
  2. open Printf
  3. open Ast
  4. let get_loc lexbuf =
  5. Util.loc_from_lexpos lexbuf.lex_curr_p lexbuf.lex_curr_p
  6. let parse_with_error lexbuf =
  7. try Some (Parser.program Lexer.token lexbuf) with
  8. | Lexer.SyntaxError msg ->
  9. raise (LocError (get_loc lexbuf, msg))
  10. | Parser.Error ->
  11. raise (LocError (get_loc lexbuf, "syntax error"))
  12. let phase input =
  13. print_endline "- Parse input";
  14. match input with
  15. | Args args ->
  16. let infile = match args.filename with
  17. | Some value -> open_in value
  18. | None -> stdin
  19. in
  20. let display_name = match args.filename with
  21. | Some value -> value
  22. | None -> "stdin"
  23. in
  24. let lexbuf = Lexing.from_channel infile in
  25. lexbuf.lex_curr_p <- { lexbuf.lex_curr_p with pos_fname = display_name };
  26. let ast = parse_with_error lexbuf in
  27. close_in infile;
  28. (match ast with
  29. | None -> raise (CompileError "error during parsing")
  30. | Some ast -> Ast (ast, args))
  31. | _ -> raise (InvalidInput "parse")