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
module Parser = struct
type state =
| Current_line of { n : int ; value : Line.t }
| Finished of { n : int }
let initial_state = Current_line {
n = 0 ;
value = Line.empty ;
}
let line_number = function
| Current_line { n ; value } ->
if (String.equal (value :> string) "") then n else n + 1
| Finished { n } -> n
let step st i = match st, i with
| Finished _, _ -> st, []
| Current_line { n ; value }, None ->
Finished { n },
if Line.is_empty value then [] else [ value ]
| Current_line { n ; value }, Some input ->
match Line.rightmost input with
| None, line ->
let value = Line.append value line in
Current_line { n ; value }, []
| Some left, right ->
match Line.parse_string left with
| [] -> assert false
| h :: t ->
Current_line {
n = n + List.length t + 1 ;
value = right
},
(Line.append value h) :: t
end