Lazy lexing

This commit is contained in:
백현웅 2022-01-17 15:21:27 +09:00
parent 7d6c833e58
commit fd6bf1346e

12
lex.ml
View file

@ -38,24 +38,24 @@ let rec partition_while f seq : 'a Seq.t * 'a Seq.t =
let tokenize (str : string) : tokens = let tokenize (str : string) : tokens =
let seq = String.to_seq str in let seq = String.to_seq str in
let rec aux seq = let rec aux seq () =
let open Token in let open Token in
match seq () with match seq () with
| Seq.Nil -> Seq.empty | Seq.Nil -> Seq.Nil
| Seq.Cons (x, s) -> | Seq.Cons (x, s) ->
if is_whitespace x then if is_whitespace x then
aux s (* skip whitespace *) aux s () (* skip whitespace *)
else if is_digit x then else if is_digit x then
let n, s = partition_while is_num seq in let n, s = partition_while is_num seq in
let n = int_of_string @@ String.of_seq n in let n = int_of_string @@ String.of_seq n in
Seq.cons (Int n) (aux s) Seq.Cons (Int n, aux s)
else if is_ident_start x then else if is_ident_start x then
let id, s = partition_while is_ident seq in let id, s = partition_while is_ident seq in
let id = String.of_seq id in let id = String.of_seq id in
Seq.cons (Ident id) (aux s) Seq.Cons (Ident id, aux s)
else else
match find_token seq with match find_token seq with
| None -> raise Token_not_found | None -> raise Token_not_found
| Some (t, s) -> Seq.cons t (aux s) | Some (t, s) -> Seq.Cons (t, aux s)
in in
aux seq aux seq