summaryrefslogtreecommitdiff
path: root/src/library/scala/util/automata/DetWordAutom.scala
blob: e0075e5bc8109ab67e2d6fe9e30f3f6961d93200 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*                     __                                               *\
**     ________ ___   / /  ___     Scala API                            **
**    / __/ __// _ | / /  / _ |    (c) 2003-2006, LAMP/EPFL             **
**  __\ \/ /__/ __ |/ /__/ __ |                                         **
** /____/\___/_/ |_/____/_/ | |                                         **
**                          |/                                          **
\*                                                                      */

// $Id$


package scala.util.automata


import scala.collection.{Set, Map}

/** A deterministic automaton. States are integers, where
 *  0 is always the only initial state. Transitions are represented
 *  in the delta function. A default transitions is one that
 *  is taken when no other transition can be taken.
 *  All states are reachable. Accepting states are those for which
 *  the partial function 'finals' is defined.
 *
 *  @author Burak Emir
 *  @version 1.0
 */
abstract class DetWordAutom[T <: AnyRef] {

  val nstates: Int
  val finals: Array[Int]
  val delta: Array[Map[T,Int]]
  val default: Array[Int]

  /**
   *  @param q ...
   *  @return  ...
   */
  def isFinal(q: Int) = finals(q) != 0

  /**
   *  @param q ...
   *  @return  ...
   */
  def isSink(q: Int) = delta(q).isEmpty && default(q) == q

  /**
   *  @param q     ...
   *  @param label ...
   *  @return      ...
   */
  def next(q: Int, label: T) = {
    delta(q).get(label) match {
      case Some(p) => p
      case _       => default(q)
    }
  }

  override def toString() = {
    val sb = new compat.StringBuilder()
    sb.append("[DetWordAutom  nstates=")
    sb.append(nstates)
    sb.append(" finals=")
    var map = new scala.collection.immutable.ListMap[Int,Int]
    var j = 0; while( j < nstates ) {
      if (j < finals.length)
        map = map.update(j, finals(j))
      j = j + 1
    }
    sb.append(map.toString())
    sb.append(" delta=\n")
    for (val i <- 0 until nstates) {
      sb.append( i )
      sb.append("->")
      sb.append(delta(i).toString())
      sb.append('\n')
      if (i < default.length) {
        sb.append("_>")
        sb.append(default(i).toString())
        sb.append('\n')
      }
    }
    sb.toString()
  }
}