progs/matcher/re3.sc
changeset 981 14e5ae1fb541
parent 967 ce5de01b9632
--- 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