progs/re3a.scala
changeset 457 85586bada20a
parent 455 192f4c59633e
child 471 e5df48ff7033
equal deleted inserted replaced
456:4abd90760ffe 457:85586bada20a
    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
    36     if (i == 0) ZERO else
    37     if (nullable(r1)) SEQ(der(c, r1), UPNTIMES(r1, i - 1))
    37     if (nullable(r1)) SEQ(der(c, r1), UPNTIMES(r1, i - 1))
    38     else SEQ(der(c, r1), NTIMES(r1, i))
    38     else SEQ(der(c, r1), NTIMES(r1, i - 1))
    39   case UPNTIMES(r1, i) => 
    39   case UPNTIMES(r1, i) => 
    40     if (i == 0) ZERO
    40     if (i == 0) ZERO
    41     else SEQ(der(c, r1), UPNTIMES(r1, i - 1)) 
    41     else SEQ(der(c, r1), UPNTIMES(r1, i - 1)) 
    42 }
    42 }
    43 
    43 
    65 }
    65 }
    66 
    66 
    67 
    67 
    68 // main matcher function
    68 // main matcher function
    69 def matcher(r: Rexp, s: String) : Boolean = nullable(ders(s.toList, r))
    69 def matcher(r: Rexp, s: String) : Boolean = nullable(ders(s.toList, r))
    70 
       
    71 
    70 
    72 //one or zero
    71 //one or zero
    73 def OPT(r: Rexp) = ALT(r, ONE)
    72 def OPT(r: Rexp) = ALT(r, ONE)
    74 
    73 
    75 //evil regular expressions
    74 //evil regular expressions