progs/re3a.scala
changeset 457 921fdd17d2b8
parent 455 1dbf84ade62c
child 471 9476086849ad
equal deleted inserted replaced
456:2fddf8ab744f 457:921fdd17d2b8
    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