[OCaml] Org mode parser.
1
(** Parser orchestration.
2
3
Wires the handwritten lexers into the Menhir-generated parsers. *)
4
5
let dummy_pos =
6
{ Lexing.pos_fname = ""; pos_lnum = 0; pos_bol = 0; pos_cnum = 0 }
7
8
(** Parse input text into a [Raw_ast.document]. *)
9
let document ~config input =
10
let st = Lexer.create ~config input in
11
let dummy_lexbuf = Lexing.from_string "" in
12
dummy_lexbuf.Lexing.lex_start_p <- dummy_pos;
13
dummy_lexbuf.Lexing.lex_curr_p <- dummy_pos;
14
let token_fun _lexbuf =
15
let tok = Lexer.next_token st in
16
let ln = Lexer.line_number st in
17
dummy_lexbuf.Lexing.lex_start_p <- { dummy_pos with Lexing.pos_lnum = ln };
18
dummy_lexbuf.Lexing.lex_curr_p <- { dummy_pos with Lexing.pos_lnum = ln };
19
tok
20
in
21
Parser.document token_fun dummy_lexbuf
22
23
(** Parse inline text into a list of [Ast.inline] objects. *)
24
let inline input =
25
let st = Inline_lexer.create input in
26
let dummy_lexbuf = Lexing.from_string "" in
27
dummy_lexbuf.Lexing.lex_start_p <- dummy_pos;
28
dummy_lexbuf.Lexing.lex_curr_p <- dummy_pos;
29
let token_fun _lexbuf = Inline_lexer.next_token st in
30
try Inline_parser.inline_content token_fun dummy_lexbuf
31
with Inline_parser.Error -> [ Ast.Plain input ]
32