progs/matcher/re3.sc
changeset 981 14e5ae1fb541
parent 967 ce5de01b9632
equal deleted inserted replaced
980:0c491eff5b01 981:14e5ae1fb541
   198 @arg(doc = "Tests that show not all is hunky-dory, but a solution leads too far afield.")
   198 @arg(doc = "Tests that show not all is hunky-dory, but a solution leads too far afield.")
   199 @main
   199 @main
   200 def fail() = { test3(); test4(); test5() } 
   200 def fail() = { test3(); test4(); test5() } 
   201 
   201 
   202 
   202 
       
   203 // simplification
       
   204 def simp2(r: Rexp) : Rexp = r match {
       
   205   case ALT(r1, r2) => (simp2(r1), simp2(r2)) match {
       
   206     case (ZERO, r2s) => r2s
       
   207     case (r1s, ZERO) => r1s
       
   208     //case (r1s, r2s) => if (r1s == r2s) r1s else ALT (r1s, r2s)
       
   209     case (r1s, r2s) => ALT(r1s, r2s)
       
   210   }
       
   211   case SEQ(r1, r2) =>  (simp2(r1), simp2(r2)) match {
       
   212     case (ZERO, _) => ZERO
       
   213     case (_, ZERO) => ZERO
       
   214     //case (ONE, r2s) => r2s
       
   215     //case (r1s, ONE) => r1s
       
   216     case (r1s, r2s) => SEQ(r1s, r2s)
       
   217   }
       
   218   case r => r
       
   219 }
       
   220 
       
   221 // some convenience for typing in regular expressions
       
   222 import scala.language.implicitConversions
       
   223 
       
   224 def charlist2rexp(s : List[Char]): Rexp = s match {
       
   225   case Nil => ONE
       
   226   case c::Nil => CHAR(c)
       
   227   case c::s => SEQ(CHAR(c), charlist2rexp(s))
       
   228 }
       
   229 
       
   230 given Conversion[String, Rexp] = (s => charlist2rexp(s.toList))
       
   231 
       
   232 val HELLO : Rexp = "hello"
       
   233 
       
   234 extension (r: Rexp) {
       
   235   def | (s: Rexp) = ALT(r, s)
       
   236   def % = STAR(r)
       
   237   def ~ (s: Rexp) = SEQ(r, s)
       
   238 }
       
   239 
       
   240 val re = (ONE | "a" | "ab") ~ ("c" | "bc") ~ ("d" | "e")
       
   241 simp2(der('d', der('c', der('b', der('a', re)))))