progs/display/thompson1.scala
author Christian Urban <urbanc@in.tum.de>
Fri, 28 Apr 2017 11:01:25 +0100
changeset 487 ffbc65112d48
child 488 057b4603b940
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
487
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     1
// Thompson Construction (Part 1)
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     2
// (needs  :load nfa.scala
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     3
//         :load enfa.scala)
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     4
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     5
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     6
// states for Thompson construction
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     7
case class TState(i: Int) extends State
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     8
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     9
object TState {
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    10
  var counter = 0
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    11
  
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    12
  def apply() : TState = {
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    13
    counter += 1;
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    14
    new TState(counter - 1)
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    15
  }
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    16
}
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    17
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    18
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    19
// some types abbreviations
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    20
type NFAt = NFA[TState, Char]
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    21
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    22
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    23
// NFA that does not accept any string
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    24
def NFA_ZERO(): NFAt = {
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    25
  val Q = TState()
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    26
  NFA(Set(Q), { case _ => Set() }, Set())
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    27
}
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    28
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    29
// NFA that accepts the empty string
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    30
def NFA_ONE() : NFAt = {
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    31
  val Q = TState()
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    32
  NFA(Set(Q), { case _ => Set() }, Set(Q))
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    33
}
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    34
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    35
// NFA that accepts the string "c"
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    36
def NFA_CHAR(c: Char) : NFAt = {
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    37
  val Q1 = TState()
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    38
  val Q2 = TState()
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    39
  NFA(Set(Q1), { case (Q1, d) if (c == d) => Set(Q2) }, Set(Q2))
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    40
}