(** Parser orchestration. Wires the handwritten lexers into the Menhir-generated parsers. *) let dummy_pos = { Lexing.pos_fname = ""; pos_lnum = 0; pos_bol = 0; pos_cnum = 0 } (** Parse input text into a [Raw_ast.document]. *) let document ~config input = let st = Lexer.create ~config input in let dummy_lexbuf = Lexing.from_string "" in dummy_lexbuf.Lexing.lex_start_p <- dummy_pos; dummy_lexbuf.Lexing.lex_curr_p <- dummy_pos; let token_fun _lexbuf = let tok = Lexer.next_token st in let ln = Lexer.line_number st in dummy_lexbuf.Lexing.lex_start_p <- { dummy_pos with Lexing.pos_lnum = ln }; dummy_lexbuf.Lexing.lex_curr_p <- { dummy_pos with Lexing.pos_lnum = ln }; tok in Parser.document token_fun dummy_lexbuf (** Parse inline text into a list of [Ast.inline] objects. *) let inline input = let st = Inline_lexer.create input in let dummy_lexbuf = Lexing.from_string "" in dummy_lexbuf.Lexing.lex_start_p <- dummy_pos; dummy_lexbuf.Lexing.lex_curr_p <- dummy_pos; let token_fun _lexbuf = Inline_lexer.next_token st in try Inline_parser.inline_content token_fun dummy_lexbuf with Inline_parser.Error -> [ Ast.Plain input ]