(** Run the QSP parser and apply the analyzer over it. See [syntax/S] *) let parse : (module Qsp_syntax.S.Analyzer with type Location.repr = 'a) -> (module Encoding.S) -> Sedlexing.lexbuf -> ('a, Qsp_syntax.Report.t) Result.t = fun (type a) (module S : Qsp_syntax.S.Analyzer with type Location.repr = a) (module E : Encoding.S) -> let module Parser = Parser.Make (S) in let module IncrementalParser = Interpreter.Interpreter (Parser.MenhirInterpreter) in fun lexbuf -> IncrementalParser.of_lexbuf lexbuf (Lexer.lexer (module E)) Parser.Incremental.main |> Result.map_error (fun e -> let message = match e.IncrementalParser.code with | Interpreter.InvalidSyntax -> "Invalid Syntax" | Interpreter.UnrecoverableError -> "UnrecoverableError" | Interpreter.MenhirCode c -> String.concat "" [ String.trim @@ Parser_messages.message c; " (Error code "; string_of_int c; ")"; ] in let report = Qsp_syntax.Report.error (e.start_pos, e.end_pos) message in (* Discard the remaining file to read. The parser is now in a blank state, it does not make sense to keep feeding it with the new tokens. *) Lexer.discard lexbuf; report)