parse.ml 955 B

1234567891011121314151617181920212223242526272829
  1. open Lexing
  2. open Types
  3. open Util
  4. let get_loc lexbuf =
  5. Util.loc_from_lexpos lexbuf.lex_curr_p lexbuf.lex_curr_p
  6. let shift_loc (fname, ystart, yend, xstart, xend) yshift xshift =
  7. (fname, ystart + yshift, yend + yshift, xstart + xshift, xend + xshift)
  8. let shift_back lexbuf = shift_loc (get_loc lexbuf) 0 (-1)
  9. let parse_with_error lexbuf =
  10. try Some (Parser.program Lexer.token lexbuf) with
  11. | Lexer.SyntaxError msg ->
  12. raise (LocError ((shift_back lexbuf), msg))
  13. | Parser.Error ->
  14. raise (LocError ((shift_back lexbuf), "syntax error"))
  15. let phase = function
  16. | FileContent (display_name, content) ->
  17. let lexbuf = Lexing.from_string content in
  18. lexbuf.lex_curr_p <- { lexbuf.lex_curr_p with pos_fname = display_name };
  19. let ast = parse_with_error lexbuf in
  20. begin match ast with
  21. | None -> raise (CompileError "no syntax tree was constructed")
  22. | Some node -> Ast node
  23. end
  24. | _ -> raise (InvalidInput "parse")