progs/display/thompson2.scala
author Christian Urban <urbanc@in.tum.de>
Sun, 07 May 2017 00:20:58 +0100
changeset 488 057b4603b940
parent 487 ffbc65112d48
child 489 4430477595ec
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 2)
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     2
488
057b4603b940 updated
Christian Urban <urbanc@in.tum.de>
parents: 487
diff changeset
     3
// some more type abbreviations
487
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     4
type NFAtrans = (TState, Char) :=> Set[TState]
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     5
type eNFAtrans = (TState, Option[Char]) :=> Set[TState]
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     6
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     7
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     8
// for composing an eNFA transition with a NFA transition
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     9
implicit class RichPF(val f: eNFAtrans) extends AnyVal {
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    10
  def +++(g: NFAtrans) : eNFAtrans = 
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    11
  { case (q, None) =>  applyOrElse(f, (q, None)) 
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    12
    case (q, Some(c)) => 
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    13
      applyOrElse(f, (q, Some(c))) | applyOrElse(g, (q, c))  }
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    14
}
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    15
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    16
// sequence of two NFAs
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    17
def NFA_SEQ(enfa1: NFAt, enfa2: NFAt) : NFAt = {
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    18
  val new_delta : eNFAtrans = 
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    19
    { case (q, None) if enfa1.fins(q) => enfa2.starts }
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    20
  
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    21
  eNFA(enfa1.starts, new_delta +++ enfa1.delta +++ enfa2.delta, 
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    22
       enfa2.fins)
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    23
}
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    24
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    25
// alternative of two NFAs
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    26
def NFA_ALT(enfa1: NFAt, enfa2: NFAt) : NFAt = {
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    27
  val Q = TState()
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    28
  val new_delta : eNFAtrans = 
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    29
    { case (Q, None) => enfa1.starts | enfa2.starts }
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    30
  val new_fins = (q: TState) => enfa1.fins(q) || enfa2.fins(q)
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    31
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    32
  eNFA(Set(Q), new_delta +++ enfa1.delta +++ enfa2.delta, 
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    33
       new_fins)
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    34
}
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    35
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    36
// star of a NFA
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    37
def NFA_STAR(enfa: NFAt) : NFAt = {
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    38
  val Q = TState()
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    39
  val new_delta : eNFAtrans = 
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    40
    { case (Q, None) => enfa.starts
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    41
      case (q, None) if enfa.fins(q) => Set(Q) }
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    42
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    43
  eNFA(Set(Q), new_delta +++ enfa.delta, Set(Q))
ffbc65112d48 updated
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    44
}