progs/dfa.scala
changeset 623 8e63f9745f46
parent 576 414f1daf5728
equal deleted inserted replaced
622:af5cb349fa9e 623:8e63f9745f46
     1 // DFAs in Scala  using partial functions
     1 // DFAs in Scala  using partial functions
     2 import scala.util.Try
     2 import scala.util.Try
     3 
     3 
     4 // type abbreviation for partial functions
     4 // a type abbreviation for partial functions
     5 type :=>[A, B] = PartialFunction[A, B]
     5 type :=>[A, B] = PartialFunction[A, B]
     6 
     6 
     7 
     7 
     8 case class DFA[A, C](start: A,               // starting state
     8 case class DFA[A, C](start: A,               // the starting state
     9                      delta: (A, C) :=> A,    // transition (partial fun)
     9                      delta: (A, C) :=> A,    // transitions (partial fun)
    10                      fins:  A => Boolean) {  // final states
    10                      fins:  A => Boolean) {  // the final states
    11 
    11 
    12   def deltas(q: A, s: List[C]) : A = s match {
    12   def deltas(q: A, s: List[C]) : A = s match {
    13     case Nil => q
    13     case Nil => q
    14     case c::cs => deltas(delta(q, c), cs)
    14     case c::cs => deltas(delta(q, c), cs)
    15   }
    15   }
    50 case object S0 extends S
    50 case object S0 extends S
    51 case object S1 extends S
    51 case object S1 extends S
    52 case object S2 extends S
    52 case object S2 extends S
    53 case object Sink extends S
    53 case object Sink extends S
    54 
    54 
    55 // transition function with a sink state
    55 // a transition function with a sink state
    56 val sigma : (S, Char) :=> S = 
    56 val sigma : (S, Char) :=> S = 
    57   { case (S0, 'a') => S1
    57   { case (S0, 'a') => S1
    58     case (S1, 'a') => S2
    58     case (S1, 'a') => S2
    59     case _ => Sink
    59     case _ => Sink
    60   }
    60   }