Skip to content
Snippets Groups Projects
parse.ml 1021 B
open Lexing
open Types

let loc_from_lexpos pstart pend =
  let (fname, ystart, yend, xstart, xend) = begin
    pstart.pos_fname,
    pstart.pos_lnum,
    pend.pos_lnum,
    (pstart.pos_cnum - pstart.pos_bol + 1),
    (pend.pos_cnum - pend.pos_bol)
  end in
  if ystart = yend && xend < xstart then
    (fname, ystart, yend, xstart, xstart)
  else
    (fname, ystart, yend, xstart, xend)

let get_loc lexbuf =
  loc_from_lexpos lexbuf.lex_curr_p lexbuf.lex_curr_p

let shift_loc (fname, ystart, yend, xstart, xend) yshift xshift =
  (fname, ystart + yshift, yend + yshift, xstart + xshift, xend + xshift)

let shift_back lexbuf =
  shift_loc (get_loc lexbuf) 0 (-1)

let parse_input display_name content =
  let lexbuf = Lexing.from_string content in
  lexbuf.lex_curr_p <- { lexbuf.lex_curr_p with pos_fname = display_name };
  try Parser.stylesheet Lexer.token lexbuf with
  | SyntaxError msg ->
    raise (LocError (shift_back lexbuf, msg))
  | Parser.Error ->
    raise (LocError (shift_back lexbuf, "syntax error"))