equal
  deleted
  inserted
  replaced
  
    
    
    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  |