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
open Forester_prelude
type t =
| Word of string
| Symbol of char
[@@deriving show]
let cs_symbol_rx = Str.regexp {|^[^A-Za-z]$|}
let cs_word_rx = Str.regexp {|^[A-Za-z]+$|}
let is_alpha c =
let i = Char.code c in
i >= 65 && i <= 90 || i >= 97 && i <= 122
let rec parse_word acc xs =
match xs with
| [] -> Word (String_util.implode_bwd acc), ""
| x :: xs ->
if is_alpha x then
parse_word (Bwd.Snoc (acc, x)) xs
else
Word (String_util.implode_bwd acc), String_util.implode (x :: xs)
let parse input =
match String_util.explode input with
| x :: xs ->
if is_alpha x then
Some (parse_word (Bwd.Snoc (Bwd.Emp, x)) xs)
else
Some (Symbol x, String_util.implode xs)
| [] -> None