···85 | `First -> "first"
86 ;;
8788- let to_dyn t : Dyn.t = Enum (to_string t)
89 let equal = Poly.equal
90 let pp ch k = Format.pp_print_string ch (to_string k)
91end
···175 | After of Category.t
176 | Pmark of Pmark.t
177178- let rec dyn_of_def =
000000000000000000000000000179 let open Dyn in
180 function
181 | Cst cset -> Cset.to_dyn cset
182- | Alt alt -> variant "Alt" (List.map ~f:to_dyn alt)
183- | Seq (sem, x, y) -> variant "Seq" [ Sem.to_dyn sem; to_dyn x; to_dyn y ]
0000000184 | Eps -> Enum "Eps"
185- | Rep (_, sem, t) -> variant "Rep" [ Sem.to_dyn sem; to_dyn t ]
186 | Mark m -> variant "Mark" [ Mark.to_dyn m ]
187 | Pmark m -> variant "Pmark" [ Pmark.to_dyn m ]
188 | Erase (x, y) -> variant "Erase" [ Mark.to_dyn x; Mark.to_dyn y ]
189 | Before c -> variant "Before" [ Category.to_dyn c ]
190 | After c -> variant "After" [ Category.to_dyn c ]
191192- and to_dyn { id = _; def } = dyn_of_def def
193194 let with_sem prev next fmt pp () =
195 let open Fmt in
···414415 type t = E.t list
416417- let rec to_dyn t = Dyn.list (List.map ~f:dyn_of_e t)
418419- and dyn_of_e =
420 let open Dyn in
421 function
422- | E.TSeq (sem, x, y) -> variant "TSeq" [ Sem.to_dyn sem; to_dyn x; Expr.to_dyn y ]
0000423 | TExp (marks, e) ->
424 let e =
425- let base = [ Expr.to_dyn e ] in
426 if Marks.(equal empty marks) then base else Marks.to_dyn marks :: base
427 in
428 variant "TExp" e
429 | TMatch m -> variant "TMarks" [ Marks.to_dyn m ]
430 ;;
00431432 open E
433
···85 | `First -> "first"
86 ;;
87088 let equal = Poly.equal
89 let pp ch k = Format.pp_print_string ch (to_string k)
90end
···174 | After of Category.t
175 | Pmark of Pmark.t
176177+ let wrap_sem sem sem' v =
178+ let open Dyn in
179+ let name = Sem.to_string sem' in
180+ match sem with
181+ | Some sem when Sem.equal sem sem' -> v
182+ | None | Some _ ->
183+ (match v with
184+ | List v -> variant name v
185+ | _ -> variant name [ v ])
186+ ;;
187+188+ let rec seq_as_list sem = function
189+ | Eps -> []
190+ | Cst cs -> [ Cst cs ]
191+ | Seq (sem', x, y) ->
192+ if Sem.equal sem sem'
193+ then x.def :: seq_as_list sem y.def
194+ else raise_notrace Not_found
195+ | _ -> raise_notrace Not_found
196+ ;;
197+198+ let seq_as_list sem t =
199+ match seq_as_list sem t with
200+ | exception Not_found -> None
201+ | s -> Some s
202+ ;;
203+204+ let rec dyn_of_def sem =
205 let open Dyn in
206 function
207 | Cst cset -> Cset.to_dyn cset
208+ | Alt alt -> variant "Alt" (List.map ~f:(to_dyn sem) alt)
209+ | Seq (sem', x, y) ->
210+ let to_dyn = to_dyn (Some sem') in
211+ let x =
212+ match seq_as_list sem' y.def with
213+ | None -> variant "Seq" [ to_dyn x; to_dyn y ]
214+ | Some y -> variant "Seq" (to_dyn x :: List.map y ~f:(dyn_of_def sem))
215+ in
216+ wrap_sem sem sem' x
217 | Eps -> Enum "Eps"
218+ | Rep (_, sem', t) -> wrap_sem sem sem' (variant "Rep" [ to_dyn (Some sem') t ])
219 | Mark m -> variant "Mark" [ Mark.to_dyn m ]
220 | Pmark m -> variant "Pmark" [ Pmark.to_dyn m ]
221 | Erase (x, y) -> variant "Erase" [ Mark.to_dyn x; Mark.to_dyn y ]
222 | Before c -> variant "Before" [ Category.to_dyn c ]
223 | After c -> variant "After" [ Category.to_dyn c ]
224225+ and to_dyn sem { id = _; def } = dyn_of_def sem def
226227 let with_sem prev next fmt pp () =
228 let open Fmt in
···447448 type t = E.t list
449450+ let rec to_dyn sem t = Dyn.list (List.map ~f:(dyn_of_e sem) t)
451452+ and dyn_of_e sem =
453 let open Dyn in
454 function
455+ | E.TSeq (sem', x, y) ->
456+ wrap_sem
457+ sem
458+ sem'
459+ (variant "TSeq" [ to_dyn (Some sem') x; Expr.to_dyn (Some sem') y ])
460 | TExp (marks, e) ->
461 let e =
462+ let base = [ Expr.to_dyn sem e ] in
463 if Marks.(equal empty marks) then base else Marks.to_dyn marks :: base
464 in
465 variant "TExp" e
466 | TMatch m -> variant "TMarks" [ Marks.to_dyn m ]
467 ;;
468+469+ let to_dyn = to_dyn None
470471 open E
472
+39-28
lib_test/expect/test_automata.ml
···49 loop (State.create cat re) 'a';
50 [%expect
51 {|
52- ((TExp (Seq first 97 (Seq first 97 (Seq first 97 97)))))
53- ((TExp (Seq first 97 (Seq first 97 97))))
54- ((TExp (Seq first 97 97)))
55 ((TExp 97))
56 ((TExp Eps))
57 ((TMarks ()))
58 > matched
59 |}];
60 loop (State.create cat re) 'b';
61- [%expect
62- {|
63- ((TExp (Seq first 97 (Seq first 97 (Seq first 97 97)))))
64 ()
65 > failed
66 |}]
···71 let n = 5 in
72 let s = String.make n c in
73 let ids = Ids.create () in
74- let re = Automata.alt ids (List.init ~len:n ~f:(fun _ -> str ids `First s)) in
000000075 let wa = Working_area.create () in
76 let rec loop d c =
77 Format.printf "%a@." pp_state d;
···86 [%expect
87 {|
88 ((TExp
89- (Alt (Seq first 97 (Seq first 97 (Seq first 97 (Seq first 97 97))))
90- (Seq first 97 (Seq first 97 (Seq first 97 (Seq first 97 97))))
91- (Seq first 97 (Seq first 97 (Seq first 97 (Seq first 97 97))))
92- (Seq first 97 (Seq first 97 (Seq first 97 (Seq first 97 97))))
93- (Seq first 97 (Seq first 97 (Seq first 97 (Seq first 97 97)))))))
94- ((TExp (Seq first 97 (Seq first 97 (Seq first 97 97))))
95- (TExp (Seq first 97 (Seq first 97 (Seq first 97 97))))
96- (TExp (Seq first 97 (Seq first 97 (Seq first 97 97))))
97- (TExp (Seq first 97 (Seq first 97 (Seq first 97 97))))
98- (TExp (Seq first 97 (Seq first 97 (Seq first 97 97)))))
99- ((TExp (Seq first 97 (Seq first 97 97)))
100- (TExp (Seq first 97 (Seq first 97 97)))
101- (TExp (Seq first 97 (Seq first 97 97)))
102- (TExp (Seq first 97 (Seq first 97 97)))
103- (TExp (Seq first 97 (Seq first 97 97))))
104- ((TExp (Seq first 97 97)) (TExp (Seq first 97 97)) (TExp (Seq first 97 97))
105- (TExp (Seq first 97 97)) (TExp (Seq first 97 97)))
106- ((TExp 97) (TExp 97) (TExp 97) (TExp 97) (TExp 97))
107- ((TExp Eps))
108- ((TMarks ()))
109- > matched
00000110 |}]
111;;