@@ -96,14 +96,15 @@ let from_string data =
9696let finalize (ecreader : ecreader ) =
9797 Disposable. dispose ecreader
9898
99+ (* -------------------------------------------------------------------- *)
100+ let isfinal_token = function
101+ | EcParser. FINAL _ -> true
102+ | _ -> false
103+
99104(* -------------------------------------------------------------------- *)
100105let lexer ?(checkpoint : _ I.checkpoint option ) (ecreader : ecreader_r ) =
101106 let lexbuf = ecreader.ecr_lexbuf in
102107
103- let isfinal = function
104- | EcParser. FINAL _ -> true
105- | _ -> false in
106-
107108 if ecreader.ecr_atstart then
108109 ecreader.ecr_trim < - ecreader.ecr_lexbuf.Lexing. lex_curr_p.pos_cnum;
109110
@@ -134,7 +135,7 @@ let lexer ?(checkpoint : _ I.checkpoint option) (ecreader : ecreader_r) =
134135
135136 ecreader.ecr_tokens < - prequeue @ queue;
136137
137- if isfinal token then
138+ if isfinal_token token then
138139 ecreader.ecr_atstart < - true
139140 else
140141 ecreader.ecr_atstart < - ecreader.ecr_atstart && (
@@ -177,6 +178,42 @@ let parse (ecreader : ecreader) : EcParsetree.prog =
177178
178179 in parse (EcParser.Incremental. prog ecreader.ecr_lexbuf.lex_curr_p)
179180
181+ (* -------------------------------------------------------------------- *)
182+ let next_sentence_from (text : string ) (start : int ) : (string * int * int) option =
183+ let len = String. length text in
184+ if start < 0 || start > = len then
185+ None
186+ else
187+ let sub = String. sub text start (len - start) in
188+ let reader = from_string sub in
189+ let ecr = Disposable. get reader in
190+
191+ let exception EOF in
192+
193+ Fun. protect
194+ ~finally :(fun () -> finalize reader )
195+ (fun () ->
196+ try
197+ begin
198+ let exception Done in
199+
200+ try
201+ while true do
202+ match proj3_1 (lexer ecr ) with
203+ | EcParser. FINAL _ -> raise Done
204+ | EcParser. EOF -> raise EOF
205+ | _ -> ()
206+ done
207+ with Done -> ()
208+ end ;
209+
210+ let p = ecr .ecr_lexbuf .Lexing. lex_curr_p .pos_cnum - 1 in
211+ let s = String. sub sub 0 p in
212+
213+ Some (s , start , start + p )
214+ with
215+ | EcLexer. LexicalError _ | EOF -> None)
216+
180217(* -------------------------------------------------------------------- *)
181218let xparse (ecreader : ecreader ) : string * EcParsetree.prog =
182219 let ecr = Disposable. get ecreader in
0 commit comments