progs/re4.scala
changeset 631 f618dd4de24a
parent 623 47a299e7010f
child 638 0367aa7c764b
equal deleted inserted replaced
630:9b1c15c3eb6f 631:f618dd4de24a
    31   case SEQ(r1, r2) => 
    31   case SEQ(r1, r2) => 
    32     if (nullable(r1)) ALT(SEQ(der(c, r1), r2), der(c, r2))
    32     if (nullable(r1)) ALT(SEQ(der(c, r1), r2), der(c, r2))
    33     else SEQ(der(c, r1), r2)
    33     else SEQ(der(c, r1), r2)
    34   case STAR(r1) => SEQ(der(c, r1), STAR(r1))
    34   case STAR(r1) => SEQ(der(c, r1), STAR(r1))
    35   case NTIMES(r1, i) => 
    35   case NTIMES(r1, i) => 
    36     if (i == 0) ZERO else der(c, SEQ(r1, NTIMES(r1, i - 1)))
    36     if (i == 0) ZERO else SEQ(der(c, r1), NTIMES(r1, i - 1))
    37 }
    37 }
    38 
    38 
    39 def simp(r: Rexp) : Rexp = r match {
    39 def simp(r: Rexp) : Rexp = r match {
    40   case ALT(r1, r2) => (simp(r1), simp(r2)) match {
    40   case ALT(r1, r2) => (simp(r1), simp(r2)) match {
    41     case (ZERO, r2s) => r2s
    41     case (ZERO, r2s) => r2s
    70   case (s, ALT(r1, r2)) => ALT(ders2(s, r1), ders2(s, r2))
    70   case (s, ALT(r1, r2)) => ALT(ders2(s, r1), ders2(s, r2))
    71   case (c::s, r) => ders2(s, simp(der(c, r)))
    71   case (c::s, r) => ders2(s, simp(der(c, r)))
    72 }
    72 }
    73 
    73 
    74 // the main matcher function
    74 // the main matcher function
    75 def matches(r: Rexp, s: String) : Boolean = nullable(ders2(s.toList, r))
    75 def matcher(r: Rexp, s: String) : Boolean = 
       
    76   nullable(ders2(s.toList, r))
    76 
    77 
    77 
    78 
    78 // one or zero
    79 // one or zero
    79 def OPT(r: Rexp) = ALT(r, ONE)
    80 def OPT(r: Rexp) = ALT(r, ONE)
    80 
    81 
    87 // for measuring time
    88 // for measuring time
    88 def time_needed[T](i: Int, code: => T) = {
    89 def time_needed[T](i: Int, code: => T) = {
    89   val start = System.nanoTime()
    90   val start = System.nanoTime()
    90   for (j <- 1 to i) code
    91   for (j <- 1 to i) code
    91   val end = System.nanoTime()
    92   val end = System.nanoTime()
    92   "%.5f".format((end - start) / (i * 1.0e9))
    93   (end - start) / (i * 1.0e9)
    93 }
    94 }
    94 
    95 
    95 
    96 
    96 // test: (a?{n}) (a{n})
    97 // test: (a?{n}) (a{n})
    97 for (i <- 0 to 7000000 by 500000) {
    98 for (i <- 0 to 7000000 by 500000) {
    98   println(s"$i: ${time_needed(2, matches(EVIL1(i), "a" * i))}")
    99   println(f"$i: ${time_needed(2, matcher(EVIL1(i), "a" * i))}%.5f")
    99 }
   100 }
   100 
   101 
   101 
   102 
   102 // test: (a*)* b
   103 // test: (a*)* b
   103 for (i <- 1 to 7000001 by 500000) {
   104 for (i <- 0 to 7000000 by 500000) {
   104   println(s"$i: ${time_needed(2, matches(EVIL2, "a" * i))}")
   105   println(f"$i: ${time_needed(2, matcher(EVIL2, "a" * i))}%.5f")
   105 }
   106 }
   106 
   107 
   107 
   108 
   108 
   109 
   109 // the size of a regular expressions - for testing purposes 
   110 // the size of a regular expressions - for testing purposes 
   133 
   134 
   134 // test: ("a" | "aa")*
   135 // test: ("a" | "aa")*
   135 val EVIL3 = STAR(ALT(CHAR('a'), SEQ(CHAR('a'), CHAR('a'))))
   136 val EVIL3 = STAR(ALT(CHAR('a'), SEQ(CHAR('a'), CHAR('a'))))
   136 
   137 
   137 // test: ("" | "a" | "aa")*
   138 // test: ("" | "a" | "aa")*
   138 val EVIL3 = STAR(ALT(ONE, ALT(CHAR('a'), SEQ(CHAR('a'), CHAR('a')))))
   139 val EVIL4 = STAR(ALT(ONE, ALT(CHAR('a'), SEQ(CHAR('a'), CHAR('a')))))
   139 
   140 
   140 val t1  = ders2("a".toList, EVIL3)
   141 val t1  = ders2("a".toList, EVIL3)
   141 val t1s = simp(t1) 
   142 val t1s = simp(t1) 
   142 val t2  = ders2("aa".toList, t1s)
   143 val t2  = ders2("aa".toList, t1s)
   143 val t2s = simp(t2)
   144 val t2s = simp(t2)