progs/re0.scala
changeset 504 3390e863d796
parent 499 b06c81c0b12f
equal deleted inserted replaced
503:3b9496db3fb9 504:3390e863d796
     1 import scala.annotation.tailrec
     1 import scala.annotation.tailrec
       
     2 import scala.language.implicitConversions
     2 
     3 
     3 abstract class Rexp
     4 abstract class Rexp
     4 
     5 
     5 case object NULL extends Rexp
     6 case object NULL extends Rexp
     6 case object EMPTY extends Rexp
     7 case object EMPTY extends Rexp
    14 case class REP(r: Rexp, n: Int) extends Rexp 
    15 case class REP(r: Rexp, n: Int) extends Rexp 
    15 
    16 
    16 // some convenience for typing in regular expressions
    17 // some convenience for typing in regular expressions
    17 implicit def string2rexp(s : String) : Rexp = STR(s)
    18 implicit def string2rexp(s : String) : Rexp = STR(s)
    18 
    19 
    19 implicit def RexpOps(r: Rexp) = new {
    20 implicit def RexpOps(r: Rexp) : Rexp = new {
    20   def | (s: Rexp) = ALT(r, s)
    21   def | (s: Rexp) = ALT(r, s)
    21   def % = STAR(r)
    22   def % = STAR(r)
    22   def %(n: Int) = REP(r, n) 
    23   def %(n: Int) = REP(r, n) 
    23   def %%(n: Int) = SEQ(REP(r, n), STAR(r)) 
    24   def %%(n: Int) = SEQ(REP(r, n), STAR(r)) 
    24   def ? = ALT(EMPTY, r)
    25   def ? = ALT(EMPTY, r)
    25   def unary_! = NOT(r)
    26   def unary_! = NOT(r)
    26   def ~ (s: Rexp) = SEQ(r, s)
    27   def ~ (s: Rexp) = SEQ(r, s)
    27 }
    28 }
    28 
    29 
    29 implicit def stringOps(s: String) = new {
    30 implicit def stringOps(s: String) : Rexp = new {
    30   def | (r: Rexp) = ALT(s, r)
    31   def | (r: Rexp) = ALT(s, r)
    31   def | (r: String) = ALT(s, r)
    32   def | (r: String) = ALT(s, r)
    32   def % = STAR(s)
    33   def % = STAR(s)
    33   def %(n: Int) = REP(s, n)
    34   def %(n: Int) = REP(s, n)
    34   def %%(n: Int) = SEQ(REP(s, n), STAR(s)) 
    35   def %%(n: Int) = SEQ(REP(s, n), STAR(s)) 
    70   case NOT(r) => NOT(der (c, r))
    71   case NOT(r) => NOT(der (c, r))
    71   case REP(r, i) => 
    72   case REP(r, i) => 
    72     if (i == 0) NULL else SEQ(der(c, r), REP(r, i - 1))
    73     if (i == 0) NULL else SEQ(der(c, r), REP(r, i - 1))
    73 }
    74 }
    74 
    75 
       
    76 
    75 // derivative w.r.t. a string (iterates der)
    77 // derivative w.r.t. a string (iterates der)
    76 @tailrec
    78 @tailrec
    77 def ders (s: List[Char], r: Rexp) : Rexp = s match {
    79 def ders (s: List[Char], r: Rexp) : Rexp = s match {
    78   case Nil => r
    80   case Nil => r
    79   case c::s => ders(s, der(c, r))
    81   case c::s => ders(s, der(c, r))