Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

www.th-deg.

de

Lexical analysis II
1. From NFA to DFA
2. How lex works
3. From RE to DFA

TECHNISCHE HOCHSCHULE DEGGENDORF


2
www.th-deg.de

Subset construction –
NFA to DFA
• Algorithm 7.1 NFA2DFA (=3.20)
• Input: NFA N(r)
• Output: DFA D(r) w/ L(D(r))=L(N(r)),
defined by states Ds, transistions Dt;
each state in Ds represents a set of states of N(r)
• Help functions:
– ε-closure(T)closure(T) = set of NFA states reachable by є-transitions alone transitions alone
from some state s (including T)
– move(T,a) = set of NFA states to which there is a transition on input
symbol a from a state sєT
– Let s0 be the start state of N(r)

TECHNISCHE HOCHSCHULE DEGGENDORF


3
www.th-deg.de

Subset construction (2)


1.Ds={ε-closure({s0})}, ε-closure(s0) is unmarkedε-closure({s0})}, ε-closure(s0) is unmarkedclosure({ε-closure({s0})}, ε-closure(s0) is unmarkeds0})}, ε-closure(s0) is unmarkedε-closure({s0})}, ε-closure(s0) is unmarkedclosure(s0) ε-closure(s0) is unmarkedis ε-closure(s0) is unmarkedunmarked
2.while ε-closure(s0) is unmarkedthere ε-closure(s0) is unmarkedis ε-closure(s0) is unmarkedan ε-closure(s0) is unmarkedunmarked ε-closure(s0) is unmarkedstate ε-closure(s0) is unmarkedT ε-closure(s0) is unmarkedin ε-closure(s0) is unmarkedDs:
1. ε-closure(s0) is unmarkedmark ε-closure(s0) is unmarkedT
2. ε-closure(s0) is unmarkedfor ε-closure(s0) is unmarkedeach ε-closure(s0) is unmarkedinput ε-closure(s0) is unmarkedsymbol ε-closure(s0) is unmarkeda:
1. ε-closure(s0) is unmarkedU=ε-closure({s0})}, ε-closure(s0) is unmarkedclosure(move(T,a))
ε-closure(s0) is unmarked[U ε-closure(s0) is unmarkedis ε-closure(s0) is unmarkedaccepting, ε-closure(s0) is unmarkediff ε-closure(s0) is unmarkedU ε-closure(s0) is unmarkedcontains ε-closure(s0) is unmarkedaccepting ε-closure(s0) is unmarkedstate(s)]
2. ε-closure(s0) is unmarkedif ε-closure(s0) is unmarkedU ε-closure(s0) is unmarkedis ε-closure(s0) is unmarkednot ε-closure(s0) is unmarkedin ε-closure(s0) is unmarkedDs:
1. ε-closure(s0) is unmarkedadd ε-closure(s0) is unmarkedU ε-closure(s0) is unmarkedas ε-closure(s0) is unmarkedan ε-closure(s0) is unmarkedunmarked ε-closure(s0) is unmarkedstate ε-closure(s0) is unmarkedto ε-closure(s0) is unmarkedDs
3. ε-closure(s0) is unmarkedDt[T,a] ε-closure(s0) is unmarked= ε-closure(s0) is unmarkedU

[compute ε-transitions alone closure(s):


put s on stack S;
ε
while (S not empty){t=pop S;for all(u w/ t→u){add u to result; push u onto S}}
]
TECHNISCHE HOCHSCHULE DEGGENDORF
4
www.th-deg.de

Simulate / run a DFA


• Algorithm 7.2 RunDFA (=3.18)
• Input: DFA D with start state s0, accepting states F, transition move; input
string x, terminated by EOF
• Output: "yes", if D accepts x, otherwise "no"
• Help functions:
– move(s,a) = DFA state to which there is a transition on input symbol a
from a state s
– nextchar(): returns next input symbol
s:=s0, ε-closure(s0) is unmarkedc:=nextchar()
while ε-closure(s0) is unmarkedc≠EOF:
s:=move(s,c);c:=nextchar();
if ε-closure(s0) is unmarkedsєFF:
return ε-closure(s0) is unmarked"yes"
else
return ε-closure(s0) is unmarked"no"
TECHNISCHE HOCHSCHULE DEGGENDORF
5
www.th-deg.de

Example:
(a|b)*abb as DFA

a b b
0 1 2 3
a a
a

aaabaabba?

TECHNISCHE HOCHSCHULE DEGGENDORF


6
www.th-deg.de

Simulate / run an NFA directly


• If constructing the DFA from the NFA takes too much time, it may be worthwhile to simulate the
NFA directly

• Algorithm 7.3 RunNFA (=3.22)


• Input: input string x terminated by EOF, NFA N w/ start state S, accepting state F, transition
move
• Output: "yes", if xєL(N), otherwise "no"
1. Q ε-closure(s0) is unmarked= ε-closure(s0) is unmarkedε-closure({s0})}, ε-closure(s0) is unmarkedclosure({ε-closure({s0})}, ε-closure(s0) is unmarkedS})
2. c ε-closure(s0) is unmarked= ε-closure(s0) is unmarkednextChar()
3. while ε-closure(s0) is unmarkedc ε-closure(s0) is unmarked≠ ε-closure(s0) is unmarkedEOF:
1. ε-closure(s0) is unmarkedQ ε-closure(s0) is unmarked= ε-closure(s0) is unmarkedε-closure({s0})}, ε-closure(s0) is unmarkedclosure(move(Q,c))
2. ε-closure(s0) is unmarkedc ε-closure(s0) is unmarked= ε-closure(s0) is unmarkednextChar()
4. if ε-closure(s0) is unmarkedQ∩F ε-closure(s0) is unmarked≠ ε-closure(s0) is unmarkedØ:
1.return ε-closure(s0) is unmarked"yes"
else
2.return ε-closure(s0) is unmarked"no"
TECHNISCHE HOCHSCHULE DEGGENDORF
7
www.th-deg.de

Example:
(a|b)*abb as NFA

a b b
0 1 2 3

aaabaabb?

TECHNISCHE HOCHSCHULE DEGGENDORF


8
www.th-deg.de

Efficient implementation
• 2 stacks, each holding a set of NFA states:
– oldStates – current set of states (S on rhs of RunNFA:3.1)
– newStates – next set of states (S on lhs of RunNFA:3.1)
– newStates transferred to oldStates during looping
• boolean array alreadyOn, indexed by NFA states, indicates the states of
newStates – much faster than searching through the stack
• 2D-transitions alone array ε-closure(s0) is unmarkedmove[s,a] holds transition table of NFA (entries represented by linked
lists)
• Implement RunNFA:1, RunNFA:3.1 by function addState(s):
1. ε-closure(s0) is unmarkedpush ε-closure(s0) is unmarkeds ε-closure(s0) is unmarkedonto ε-closure(s0) is unmarkednewStates
2. ε-closure(s0) is unmarkedalreadyOn[s] ε-closure(s0) is unmarked= ε-closure(s0) is unmarkedTRUE
3. ε-closure(s0) is unmarkedfor ε-closure(s0) is unmarkedt ε-closure(s0) is unmarkedin ε-closure(s0) is unmarkedmove[s,ε]:
1. ε-closure(s0) is unmarkedif ε-closure(s0) is unmarkedNOT ε-closure(s0) is unmarkedalreadyOn[t]:
1. ε-closure(s0) is unmarkedaddState(t)
TECHNISCHE HOCHSCHULE DEGGENDORF
9

You might also like