File: custom_ulexing.ml

package info (click to toggle)
ulex 0.5-3
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 156 kB
  • ctags: 260
  • sloc: ml: 1,070; makefile: 73; sh: 50
file content (48 lines) | stat: -rw-r--r-- 999 bytes parent folder | download | duplicates (10)
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
(* This example shows how to use ulex with a custom implementation
   for lex buffers. *)

module Ulexing =
struct
  exception Error

  type t = {
    buf : string;
    mutable pos : int;
    mutable mark_pos : int;
    mutable mark_val : int;
    mutable start : int;
  }

  let from_immutable_string s =
    { buf = s; pos = 0; mark_pos = 0; mark_val = 0; start = 0 }

  let start b =
    b.mark_pos <- b.pos;
    b.mark_val <- (-1);
    b.start <- b.pos

  let mark b i =
    b.mark_pos <- b.pos;
    b.mark_val <- i

  let backtrack b =
    b.pos <- b.mark_pos;
    b.mark_val

  let next b =
    if b.pos < String.length b.buf 
    then let c = Char.code b.buf.[b.pos] in b.pos <- b.pos + 1; c
    else (-1)

  let lexeme b =
    String.sub b.buf b.start (b.pos - b.start)
end


let () =
  let rec split = lexer
    | ['a'-'z' 'A'-'Z']* -> print_endline (Ulexing.lexeme lexbuf); split lexbuf
    | eof -> ()
    | _ -> split lexbuf
  in
  split (Ulexing.from_immutable_string "Hello, world !")