|
1 // eNFA that does not accept any string |
|
2 def eNFA_ZERO(): NFA[TState, Char] = { |
|
3 val Q = TState() |
|
4 NFA(Set(Q), { case _ => Set() }, Set()) |
|
5 } |
|
6 |
|
7 // eNFA that accepts the empty string |
|
8 def eNFA_ONE() : NFA[TState, Char] = { |
|
9 val Q = TState() |
|
10 NFA(Set(Q), { case _ => Set() }, Set(Q)) |
|
11 } |
|
12 |
|
13 // eNFA that accepts the string "c" |
|
14 def eNFA_CHAR(c: Char) : NFA[TState, Char] = { |
|
15 val Q1 = TState() |
|
16 val Q2 = TState() |
|
17 NFA(Set(Q1), { case (Q1, d) if (c == d) => Set(Q2) }, Set(Q2)) |
|
18 } |
|
19 |
|
20 // alternative of two eNFAs |
|
21 def eNFA_ALT(enfa1: NFA[TState, Char], enfa2: NFA[TState, Char]) : NFA[TState, Char] = { |
|
22 val Q = TState() |
|
23 val new_delta : eNFAtrans = |
|
24 { case (Q, None) => enfa1.starts | enfa2.starts } |
|
25 |
|
26 val new_fins = (q: TState) => enfa1.fins(q) || enfa2.fins(q) |
|
27 |
|
28 eNFA(Set(Q), |
|
29 new_delta andAlso enfa1.delta andAlso enfa2.delta, |
|
30 new_fins) |
|
31 } |
|
32 |
|
33 // sequence of two eNFAs |
|
34 def eNFA_SEQ(enfa1: NFA[TState, Char], enfa2: NFA[TState, Char]) : NFA[TState, Char] = { |
|
35 val new_delta : eNFAtrans = |
|
36 { case (q, None) if enfa1.fins(q) => enfa2.starts } |
|
37 |
|
38 eNFA(enfa1.starts, |
|
39 new_delta andAlso enfa1.delta andAlso enfa2.delta, |
|
40 enfa2.fins) |
|
41 } |
|
42 |
|
43 // star of an eNFA |
|
44 def eNFA_STAR(enfa: NFA[TState, Char]) : NFA[TState, Char] = { |
|
45 val Q = TState() |
|
46 val new_delta : eNFAtrans = |
|
47 { case (Q, None) => enfa.starts |
|
48 case (q, None) if enfa.fins(q) => Set(Q) } |
|
49 |
|
50 eNFA(Set(Q), new_delta andAlso enfa.delta, Set(Q)) |
|
51 } |