diff -r 0c491eff5b01 -r 14e5ae1fb541 progs/matcher/re3.sc --- a/progs/matcher/re3.sc Mon Feb 03 13:25:59 2025 +0000 +++ b/progs/matcher/re3.sc Fri Sep 05 16:59:48 2025 +0100 @@ -200,3 +200,42 @@ def fail() = { test3(); test4(); test5() } +// simplification +def simp2(r: Rexp) : Rexp = r match { + case ALT(r1, r2) => (simp2(r1), simp2(r2)) match { + case (ZERO, r2s) => r2s + case (r1s, ZERO) => r1s + //case (r1s, r2s) => if (r1s == r2s) r1s else ALT (r1s, r2s) + case (r1s, r2s) => ALT(r1s, r2s) + } + case SEQ(r1, r2) => (simp2(r1), simp2(r2)) match { + case (ZERO, _) => ZERO + case (_, ZERO) => ZERO + //case (ONE, r2s) => r2s + //case (r1s, ONE) => r1s + case (r1s, r2s) => SEQ(r1s, r2s) + } + case r => r +} + +// some convenience for typing in regular expressions +import scala.language.implicitConversions + +def charlist2rexp(s : List[Char]): Rexp = s match { + case Nil => ONE + case c::Nil => CHAR(c) + case c::s => SEQ(CHAR(c), charlist2rexp(s)) +} + +given Conversion[String, Rexp] = (s => charlist2rexp(s.toList)) + +val HELLO : Rexp = "hello" + +extension (r: Rexp) { + def | (s: Rexp) = ALT(r, s) + def % = STAR(r) + def ~ (s: Rexp) = SEQ(r, s) +} + +val re = (ONE | "a" | "ab") ~ ("c" | "bc") ~ ("d" | "e") +simp2(der('d', der('c', der('b', der('a', re))))) \ No newline at end of file