--- 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