55 lines
1.2 KiB
Standard ML
55 lines
1.2 KiB
Standard ML
(* Starting with int regex *)
|
|
datatype re
|
|
= Null
|
|
| Eps
|
|
| Chr of int
|
|
| Cat of re * re
|
|
| Alt of re * re
|
|
| Star of re
|
|
|
|
fun op /\ (x, y) = Cat (x, y)
|
|
fun op \/ (x, y) = Alt (x, y)
|
|
infixr 8 /\
|
|
infixr 9 \/
|
|
|
|
(* checker : re -> (int list -> bool) -> (int list -> bool) *)
|
|
fun compile r k l =
|
|
case r of
|
|
Null => false
|
|
| Eps => k l
|
|
| Chr c =>
|
|
(case l of
|
|
[] => false
|
|
| x::xs => if x=c then k xs
|
|
else k (x::xs))
|
|
| Cat (r1, r2) => compile r1
|
|
(fn xs => compile r2 k xs) l
|
|
| Alt (r1, r2) => compile r1 k l orelse compile r2 k l
|
|
| Star rr => (compile Eps k l) orelse compile (Cat (r, Star rr)) k l
|
|
(*
|
|
- compile (Chr 3) (fn l => fn b => if l=nil then b else false) [3];
|
|
val it = true : bool
|
|
- compile (Chr 3) (fn l => fn b => if l=nil then b else false) [2];
|
|
val it = false : bool
|
|
*)
|
|
|
|
(* matcher : re -> (int list -> bool) *)
|
|
fun matcher r l = compile r
|
|
(fn l => if l=nil then true else false) l
|
|
(*
|
|
- matcher ((Chr 1) /\ (Chr 2)) [1];
|
|
val it = false : bool
|
|
- matcher ((Chr 1) /\ (Chr 2)) [1,2];
|
|
val it = true : bool
|
|
- matcher ((Chr 1) /\ (Chr 2)) [1,2,3];
|
|
val it = false : bool
|
|
*)
|
|
|
|
(*
|
|
Goes into an infinite loop when [Star] is involved.
|
|
|
|
Puzzles me..
|
|
|
|
See: https://www.cs.cmu.edu/~rwh/papers/regexp/jfp.pdf
|
|
*)
|