package archetype

  1. Overview
  2. Docs

Source file pureLexer.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

open Parser
open Parser.MenhirInterpreter

type ptoken = token * Lexing.position * Lexing.position

module Lexer : sig
  type t
  val initialize : Lexing.lexbuf -> unit
  val start : t
  val next  : t -> ptoken * t
  val get   : t -> ptoken
  val get'  : t -> token
  val current_position : t -> Position.t
  val skip_until_before : (token -> bool) -> t -> t
end = struct

  let buffer =
    ref []

  let size =
    ref 0

  let more = ref (fun () -> assert false)

  let initialize lexbuf =
    more := lexer_lexbuf_to_supplier Lexer.token lexbuf

  type t = int

  let start = 0

  let get pos =
    List.nth !buffer (!size - pos)

  let token_of_ptoken (p, _, _) = p

  let current_position_of_ptoken (_, start, stop) =
    Position.lex_join start stop

  let current_position pos =
    current_position_of_ptoken (get pos)

  let get' pos =
    token_of_ptoken (get pos)

  let next pos =
    if pos >= !size - 1 then (
      buffer := !more () :: !buffer;
      incr size;
    );
    let pos = pos + 1 in
    (get pos, pos)

  let skip_until_before pred pos =
    let rec aux pos =
      let token, _, _ = get pos in
      if token = EOF then pos
      else if pred token then pos - 1
      else aux (snd (next pos))
    in
    aux pos

end
OCaml

Innovation. Community. Security.