| 487 |      1 | // Thompson Construction (Part 1)
 | 
| 491 |      2 | // (needs  :load dfa.scala
 | 
|  |      3 | //         :load nfa.scala
 | 
| 487 |      4 | //         :load enfa.scala)
 | 
|  |      5 | 
 | 
|  |      6 | 
 | 
|  |      7 | // states for Thompson construction
 | 
|  |      8 | case class TState(i: Int) extends State
 | 
|  |      9 | 
 | 
|  |     10 | object TState {
 | 
|  |     11 |   var counter = 0
 | 
|  |     12 |   
 | 
|  |     13 |   def apply() : TState = {
 | 
|  |     14 |     counter += 1;
 | 
|  |     15 |     new TState(counter - 1)
 | 
|  |     16 |   }
 | 
|  |     17 | }
 | 
|  |     18 | 
 | 
|  |     19 | 
 | 
| 488 |     20 | // a type abbreviation
 | 
| 487 |     21 | type NFAt = NFA[TState, Char]
 | 
|  |     22 | 
 | 
|  |     23 | 
 | 
| 488 |     24 | // a NFA that does not accept any string
 | 
| 487 |     25 | def NFA_ZERO(): NFAt = {
 | 
|  |     26 |   val Q = TState()
 | 
|  |     27 |   NFA(Set(Q), { case _ => Set() }, Set())
 | 
|  |     28 | }
 | 
|  |     29 | 
 | 
| 488 |     30 | // a NFA that accepts the empty string
 | 
| 487 |     31 | def NFA_ONE() : NFAt = {
 | 
|  |     32 |   val Q = TState()
 | 
|  |     33 |   NFA(Set(Q), { case _ => Set() }, Set(Q))
 | 
|  |     34 | }
 | 
|  |     35 | 
 | 
| 488 |     36 | // a NFA that accepts the string "c"
 | 
| 487 |     37 | def NFA_CHAR(c: Char) : NFAt = {
 | 
|  |     38 |   val Q1 = TState()
 | 
|  |     39 |   val Q2 = TState()
 | 
|  |     40 |   NFA(Set(Q1), { case (Q1, d) if (c == d) => Set(Q2) }, Set(Q2))
 | 
|  |     41 | }
 |