progs/app6.scala
author Christian Urban <christian dot urban at kcl dot ac dot uk>
Mon, 17 Nov 2014 08:38:52 +0000
changeset 308 3703ade9b17c
parent 262 ee4304bc6350
child 343 539b2e88f5b9
permissions -rw-r--r--
updated

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