(* Lecture 9: Higher-Order Functions *) (* Regular expression matching, corrected version *) datatype regExp = Char of char | Times of regExp * regExp | Epsilon | Plus of regExp * regExp | Empty | Star of regExp; (* val acc : regExp -> char list -> (char list -> bool) -> bool *) fun acc (Char(c)) (c1::s) k = if (c = c1) then k s else false | acc (Char(c)) (nil) k = false | acc (Times(r1,r2)) s k = acc r1 s (fn s' => acc r2 s' k) | acc (Epsilon) s k = k s | acc (Plus(r1,r2)) s k = acc r1 s k orelse acc r2 s k | acc (Empty) s k = false | acc (Star(r)) s k = k s orelse acc r s (fn s' => if s = s' then false else acc (Star(r)) s' k); (* val accept : regExp -> string -> bool *) fun accept r s = acc r (String.explode s) (fn nil => true | (_::_) => false); val C0 = Char(#"0"); val C1 = Char(#"1"); val a1 = accept (Times(C0,C0)); (* 00 *) val a2 = accept (Star(Plus(C0,C1))); (* (0+1)* *) val a3 = accept (Times(Times(Times(Star(Plus(C0,C1)),C0),C0), Star(Plus(C0,C1)))); (* (0+1)*00(0+1)* *) val a4 = accept (Times(Plus(C0,Epsilon),Star(Plus(C1,Times(C1,C0))))); (* (0+e)(1+10)* *) val a5 = accept (Plus(Star(Epsilon),C0)); (* e*+0 *)