parse.ml 968 B

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