NFA를 DFA로 변경
- NFA의 Simulation을 생성하기 위해 필요한 작업임.
- 주요 키 함수
- Move(si , a)
Si로 부터 a 심볼에 의해서 도달 할 수 있는 state의 set임 - ε-closure(si)
Si로 부터 ε 에 의해 도달 할 수 있는 state.
- Move(si , a)
- 알고리즘
- 시작 state는 NFA의 S0로 부터 derivate함.
- ε-closure S0 를 취함.
- NFA의 시작은 ε move를 가질 수 있기 때문에 이를 통하여 제거
- α ∈ Σ인 알파 각각에 대하여 move를 취하고 Move(S0, α)나서 ε-closure를 취함.
- 다시 말해 NFA의 요소를 모드 제거하여 Merge하는 작업임.
- 더 이상의 state가 추가 될 것이 없을 만큼 iteration.
- Pseudo code
s0 ← ε-closure({n0})
S ← { s0 }
W ← { s0 }
while ( W ≠ Ø )
select and remove s from W
for each α ∈ Σ
t ← ε-closure(Move(s,α))
T[s,α] ← t
if ( t ∉ S ) then
add t to S
add t to W
- Example
- 시작 state에 ε move가 없으므로 ε-closure 를 통해 s0의 set으로 q0를 얻음.
이에 대하여 s0라는 status로 정의하고 table에 등록한다. - a, b, c에 대한 transit을 통하여 각 심볼에서 얻어지는 ε-closure(Move(s,α))의 state set을 구한다.
- Transition 이 존재하는 a의 에 대하여 ε-closure(Move(s0,a))에 의해 얻어진 set 들을 s1의 status로 묶어 내고 정의한다.
- S0 status가 등록 되었을 때와 마찬가지로 s1에 대하여서도 Merge작업을 수행한다.
- Transition function이 존재하는 b,c 의 레코드에 대해서 각 set에 순차적인 status의 이름을 부여 하고 row에 등록함.
- 이를 반복 함으로서 결국 아래와 같은 table을 얼을 수 있다.
- DFA로 옮기기 전에 final state에 대해서 생각 해볼 필요가 있다. NFA에서 Accept를 위한 final state는 모두 DFA에서도 Final state가 되어야 하므로 NFA의 final state인 q9이 포함된 DFA의 모든 State를 final state로 등록 한다.
- 결과적으로 얻어진 DFA는 가 없으므로 NFA보다 적다
- 모든 Transition은 deterministic하다.
'Fundamental Notes > Compiler' 카테고리의 다른 글
| Lexical Analysis, Scanner #2 (0) | 2008/11/15 |
|---|---|
| Lexical Analysis, Scanner #1 (0) | 2008/11/15 |
| Lexical Analysis, Introduction (0) | 2008/11/13 |
| The Back End (0) | 2008/11/03 |
| The Front End (0) | 2008/11/03 |