def simp(r: Rexp): Rexp = r match {+ −
case ALT(r1, r2) => {+ −
val r1s = simp(r1)+ −
val r2s = simp(r2)+ −
(r1s, r2s) match {+ −
case (NULL, _) => r2s+ −
case (_, NULL) => r1s+ −
case _ => if (r1s == r2s) r1s else ALT(r1s, r2s)+ −
}+ −
}+ −
case SEQ(r1, r2) => {+ −
val r1s = simp(r1)+ −
val r2s = simp(r2)+ −
(r1s, r2s) match {+ −
case (NULL, _) => NULL+ −
case (_, NULL) => NULL+ −
case (EMPTY, _) => r2s+ −
case (_, EMPTY) => r1s+ −
case _ => SEQ(r1s, r2s)+ −
}+ −
}+ −
case NTIMES(r, n) => NTIMES(simp(r), n) + −
case r => r+ −
}+ −
+ −
def ders (s: List[Char], r: Rexp) : Rexp = s match {+ −
case Nil => r+ −
case c::s => ders(s, simp(der(c, r)))+ −
}+ −
+ −