diff -r f516892da470 -r b64e876832cc re3.scala --- a/re3.scala Mon Nov 05 20:31:58 2012 +0000 +++ b/re3.scala Sun Nov 11 17:28:11 2012 +0000 @@ -32,11 +32,12 @@ } } case class NTIMES(r: Rexp, n: Int) extends Rexp { - override def simp = r.simp match { - case NULL => NULL - case EMPTY => EMPTY - case r => NTIMES(r, n) - } + override def simp = if (n == 0) EMPTY else + r.simp match { + case NULL => NULL + case EMPTY => EMPTY + case r => NTIMES(r, n) + } } // some convenience for typing in regular expressions @@ -57,7 +58,7 @@ case ALT(r1, r2) => nullable(r1) || nullable(r2) case SEQ(r1, r2) => nullable(r1) && nullable(r2) case STAR(_) => true - case NTIMES(r, i) => if (i == 0) false else nullable(r) + case NTIMES(r, i) => if (i == 0) true else nullable(r) } // derivative of a regular expression w.r.t. a character @@ -88,13 +89,6 @@ //one or zero def OPT(r: Rexp) = ALT(r, EMPTY) -//n-times -/*def NTIMES(r: Rexp, n: Int) : Rexp = n match { - case 0 => NULL - case 1 => r - case n => SEQ(r, NTIMES(r, n - 1)) -}*/ - def RTEST(n: Int) = SEQ(NTIMES(OPT("a"), n), NTIMES("a", n)) def time_needed[T](i: Int, code: => T) = { @@ -105,8 +99,8 @@ } -for (i <- 1 to 10001 by 500) { - println(i + " " + time_needed(1, matcher(RTEST(i), "a" * i))) +for (i <- 1 to 11001 by 500) { + println(i + " " + + " " + time_needed(1, matcher(RTEST(i), "a" * i))) }