-
Taddeüs Kroes authoredTaddeüs Kroes authored
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"))