36   case Nil => r  | 
    36   case Nil => r  | 
    37   case c::s => ders(s, der(c, r))  | 
    37   case c::s => ders(s, der(c, r))  | 
    38 }  | 
    38 }  | 
    39   | 
    39   | 
    40 // the main matcher function  | 
    40 // the main matcher function  | 
    41 def matches(r: Rexp, s: String) : Boolean =   | 
    41 def matcher(r: Rexp, s: String) : Boolean =   | 
    42   nullable(ders(s.toList, r))  | 
    42   nullable(ders(s.toList, r))  | 
    43   | 
    43   | 
    44   | 
    44   | 
    45 // examples from the homework  | 
    45 // examples from the homework  | 
    46   | 
    46   | 
    77 // for measuring time  | 
    77 // for measuring time  | 
    78 def time_needed[T](i: Int, code: => T) = { | 
    78 def time_needed[T](i: Int, code: => T) = { | 
    79   val start = System.nanoTime()  | 
    79   val start = System.nanoTime()  | 
    80   for (j <- 1 to i) code  | 
    80   for (j <- 1 to i) code  | 
    81   val end = System.nanoTime()  | 
    81   val end = System.nanoTime()  | 
    82   "%.5f".format((end - start) / (i * 1.0e9))  | 
    82   (end - start) / (i * 1.0e9)  | 
    83 }  | 
    83 }  | 
    84   | 
    84   | 
    85   | 
    85   | 
    86 // test: (a?{n}) (a{n}) | 
    86 // test: (a?{n}) (a{n}) | 
    87 println("Test (a?{n}) (a{n})") | 
    87 println("Test (a?{n}) (a{n})") | 
    88   | 
    88   | 
    89 for (i <- 0 to 20 by 2) { | 
    89 for (i <- 0 to 20 by 2) { | 
    90   println(s"$i: ${time_needed(2, matches(EVIL1(i), "a" * i))}") | 
    90   println(f"$i: ${time_needed(2, matcher(EVIL1(i), "a" * i))}%.5f") | 
    91 }  | 
    91 }  | 
    92   | 
    92   | 
    93 // test: (a*)* b  | 
    93 // test: (a*)* b  | 
    94 println("Test (a*)* b") | 
    94 println("Test (a*)* b") | 
    95   | 
    95   | 
    96 for (i <- 0 to 20 by 2) { | 
    96 for (i <- 0 to 20 by 2) { | 
    97   println(s"$i: ${time_needed(2, matches(EVIL2, "a" * i))}") | 
    97   println(f"$i: ${time_needed(2, matcher(EVIL2, "a" * i))}%.5f") | 
    98 }  | 
    98 }  | 
    99   | 
    99   | 
   100   | 
   100   | 
   101 // the size of a regular expressions - for testing purposes   | 
   101 // the size of a regular expressions - for testing purposes   | 
   102 def size(r: Rexp) : Int = r match { | 
   102 def size(r: Rexp) : Int = r match { |