Download - 제 3 장 정규 언어
제 3 장 정규 언어
컴파일러 입문컴파일러 입문
Regular Language Page 2
목 차목 차
3-1. 정규 문법과 정규 언어 3-2. 정규 표현 (Regular Expression) 3-3. 유한 오토마타 (Finite Automata:FA) 3-4. 정규 언어의 속성
Regular Language Page 3
3-1. 3-1. 정규 문법과 정규 언어정규 문법과 정규 언어 정규 문법의 형태
left-linear grammar(LLG) : nonterminal 이 terminal 왼쪽에 나타나는 문법
right-linear grammar(RLG) : nonterminal 이 terminal 오른쪽에 나타나는 문법
한 문법의 생성규칙이 LLG 와 RLG 가 혼합이 되어있으면 정규 문법이 아니다 . => context-free grammar
Regular Language Page 4
정의 3.1
AaB, Aa, 여기서 aVT 이고 A, BVN 이다 .
만약 S 이면 , S 가 다른 생성 규칙의 오른쪽에 나타나지 않아야 한다 .
정규 문법이 lexical analysis 에서 사용되는 이유
Token 의 구조는 보통 간단하므로 표현이 가능
context-free 문법보다는 정규 문법으로부터 효율적인 인식기를 쉽게 구현가능
compiler 의 front-end 를 쉽게 다룰 수 있는 크기의 프로그램으로 나누어 모듈러 하게 구성 가능
Regular Language Page 5
3-2. 3-2. 정규 표현정규 표현 (Regular (Regular Expression)Expression)
정의 3.2
정규표현의 기본요소는 ,, 그리고 terminal 심벌이다 .
는 공집합을 나타내는 정규표현 는 집합 {} 를 나타내는 정규표현 a(VT) 는 집합 {a} 를 나타내는 정규표현
만일 e1 과 e2 가 정규 언어 L1 과 L2 를 표현하는 정규표현 이라면 ,
(e1)+(e2) 는 L1L2 를 나타내는 정규표현 (union)
(e1) (e• 2) 는 L1 L• 2 를 나타내는 정규표현 (concatenation)
(e1)* 는 L1*={}L11L1
2L13L1
n…… 을 나타내는 정규표현
Regular Language Page 6
위의 정의된 것 이외에 어떠한 것도 정규 표현이 될 수 없다 . 단 (e1)•(e2) 의 정규 표현은 편의상 (e1)(e2) 로 나타내는 것이 일반적이며 , e1+ 는 e1•e1* 의 단축 표현이다 . 또한 , (e1)+(e1)
는 (e1)|(e1) 로도 표기된다 .
정리 3.1
, 가 정규 표현이고 , La 이면 , X=X+ 의 유일한 해는 X= * 이다 .
Regular Language Page 7
정규표현의 대수적 성질
+ = + (+)+ = +(+ ) () = () (+) = + ( + ) = + + = + = = = = = * = +* * = (+)* (*)* = * * + = * *++ = * (+)* = (* *)*
Regular Language Page 8
정규문법 G 가 생성하는 언어 L 를 나타내는 정규표현을 구하는 과정
정규문법으로부터 일련의 정규 표현식을 구성한다 X | | 일 때 , X = + +
구성된 정규 표현 식 중에 X=X+ 형태의 식은 X=* 로 푼다 .
위의 과정을 수행한 후 시작 심벌에 대한 정규 표현식이 있는 곳으로 식을 대입해가면 정규 표현의 공리를 이용하여 X=X+ 형태로 정리 한 후 역시 X=* 를 적용한다 .
시작 심벌에 대한 정규 표현식을 X=X+ 형태로 고친 후 식을 X=* 로 풀면 * 가 정의된 정규문법으로부터 생성 될 수 있는 정규 언어가 된다 .
Regular Language Page 9
예제 1 G = ({S, R}, {a, b}, P, S) S aS S bR S R aS
1) S aS | bR | R aS
2) S = aS + bR + R = aS
3) S = aS + b(aS) + = aS + baS + = (a+ba)S + = (a+ba)*
예제 2 G = ({S, A, B}, {a, b}, P, S) S aA | bB | b A bA | B bS
1) S = aA + bB + b A = bA + = b*
B = bS
2) S = ab*+b(bS) + b = ab* + bbS + b = bbS + ab* + b = bbS + (ab* + b)
= (bb)*(ab*+b)
Regular Language Page 10
예제 3 X1 = 0X2 + 1X1 + X2 = 0X3 + 1X2 X3 = 0X1 + 1X3
1) X3 = 1X3 + 0X1 = 1*0X1
2) X2 = 0(1*0X1) + 1X2 = 1X2 + 01*0X1 = 1*01*0X1
3) X1 = 0(1*01*0X1) + 1X1 + = 01*01*0X1 + 1X1 = (01*01*0 + 1)X1 + = (01*01*0 + 1)*
L(X1) = (01*01*0 + 1)*
Regular Language Page 11
3-3. 3-3. 유한 오토마타유한 오토마타 (Finite (Finite Automata:FA)Automata:FA)
정의 입력으로 String 을 받아 String 이 그 언어 문장이면 yes 아니면
no 라고 답하는 인식기
M = (Q, , , q0, F) Q : 상태 (State) 들의 유한 집합 : 입력 심볼의 유한 집합 : 사상 함수 (mapping function) q0: 시작 상태 (start 또는 initial state)(q0Q) F : 종결 (final state) 상태의 집합을 의미한다 .(FQ)
Regular Language Page 12
예제 M = ({q0, q1, q2}, {a, b}, , q0, {g2}) (q0, a) = q1 (q0, b) = q2 (q1, a) = q2 (q1, b) = q0 (q2, a) = q0 (q2, b) = q1
입력 : aba 라면 (q0, a) = q1 (q1, b) = q0 (q0, a) = q1 no
입력 : ababb 라면 (q0, a) = q1 (q1, b) = q0 (q0, a) = q1 (q1, b) = q1 (q0, b) = q2 yes
q0 q1
q2
a bq0 q1 q2
q1 q2 q0
q2 q0 q1
Transition diagram
Transition Table
a
aa
b
bb
Regular Language Page 13
DFA(Deterministic Finite Automata) DFA M = (Q,,, q0, F)
Q: 상태들의 유한 집합 : 입력 심벌의 유한 집합 : 전이 함수로 Q×Q, 즉 (q, a) = p 이다 . q0: 시작 상태 (q0 Q) F: 종결 상태의 집합을 의미한다 (F Q) 특징
한 상태에서 입력 Symbol 에 대해 하나의 다음 상태를 갖는다 . 에 의한 전이 (transition) 이 없다 .
FADFA(Deteministic Finite Automata)
NFA(Nondeteministic Finite Automata)
Regular Language Page 14
NFA(Nondeterministic Finite Automata)NFA M =(Q,, , q0, F)
Q: 상태들의 유한집합 : 입력 심벌의 유한 집합 : 전이 함수로 Q×2q, 즉 (q, a) = {p1,p2,···,pn} q0: 시작 상태로 q0Q 이며 F: 종결 상태의 집합을 의미하며 FQ 이다 .
예제
0 1q0
q1
q2
q3
qf
{q1, q2}{q1, q2}
{qf}
{qf}
{q1, q3}{q1, q3}
{qf}{qf}
00
q2
q1
q3
q0 qfstart 0,1
11
1
0,1 0,1
Regular Language Page 15
NFA 에서 DFA 로의 변환 NFA M = (Q,, , q0, F) DFA M´=(Q´,´,´,q0´,F´)
Q´ = 2Q(Q 의 부분 집합의 집합 : power set) Q´ 의 한 상태는 [q1, q2, ···,qi] 의 형태로 표시한다 . q0´ = [q0] F´= {qQ´ | q 는 F 의 상태들 중에 적어도 하나를 포함한다 .} ({q1, q2, ···, qi}, a) = {p1, p2, ···, pi} 이면 , ´([q1, q2, ···,qi], a) = [p1, p2, ···, pi] 이다 .
Regular Language Page 16
예제 21 NFA M = ({q0, q1}, {0, 1}, , q0, {q1}) 1) Q´= {[q0], [q1], [q0,q1]} 2) [q0] = {q0} 3) F = {[q1], [q0,q1]} 4) ´ : ´([q0], 0) = ({q0}, 0) = {q0, q1} = [q0,
q1] ´([q0], 1) = {q0} = [q0]
´([q1], 0) = ({q1}, 0) = ´([q1], 1) = ({q1}, 1) = {q0, q1} = [q0, q1]
´([q0, q1], 0) = ({q0, q1}, 0) = {q0, q1} = [q0, q1] ´([q0, q1], 1) = ({q0, q1}, 1) = {q0, q1} = [q0, q1]
0 1q0q1
{q0,q1}
{q0}{q0,q1}
´ 0 1[q0][q1]
[q0, q1]
[q0,q1]
[q0,q1]
[q0][q0, q1][q0, q1]
00
1
1
A
C
B
0,1
1
A Cstart
0,1start
Regular Language Page 17
예제 22
[0]
0 1 2 3
1. NFA 의 시작상태가 0 이므로 DFA 의 시작상태는 [0] 이 된다 .
start
a,b
a b b
start
2. 상태 [0] 에서 a 를 보고 갈 수 있는 상태 집합은 {0, 1} 이고 [0,1] 은 새로운 상태이므로 새로운 상태로 만들어 지시선을 연결한다 .
[0] [0, 1]
상태 [0] 에서 b 를 보고 갈수 있는 상태 집합은 {0} 이고 , [0] 은 기존의 상태와같으므로 지시선만 그린다 .
[0]start [0, 1]a
b
start a
Regular Language Page 18
3. 상태 [0, 1] 에서 a 를 보고 갈 수 있는 상태 집합은 {0, 1} 이므로 지시선만 그린다
[0]start [0, 1]a
b a
b 를 보고 갈 수 있는 상태 집합은 {0, 2} 이고 , [0, 2] 는 새로운 상태이므로 다음과 같이 추가하고 지시선을 연결한다 .
[0]start [0, 1]a
b a
[0, 2]b
4. [0, 2] 에서 a 를 보고 갈 수 있는 상태 집합은 {0, 1} 이므로 지시선만 그린다 .
[0]start [0, 1]a
b a
[0, 2]b
a
Regular Language Page 19
b 를 보고 갈 수 있는 상태 집합은 {0, 3} 이고 , [0, 3] 은 새로운 상태이므로 다음과 같이 추가하고 지시선을 연결한다 .
[0]start [0, 1]a
b a
[0, 2]b
a[0, 3]
b
5. [0, 3] 에서 a 를 보고 갈 수 있는 상태 집합은 {0, 1} 이고 , b 를 보고 갈 수 있는상태는 {0} 이므로 새로 만들지 않고 지시선만 만든다 .
[0]start [0, 1]a
b a
[0, 2]b
a[0, 3]
b
a
b
Regular Language Page 20
상태 전이표 표현
a b[0]
[0, 1][0, 2][0, 3]
[0, 1][0, 1][0, 1][0, 1]
[0][0, 2][0, 3]
[0]
더 이상 새로운 상태가 추가되지 않으며 NFA 의 종결 상태 3 을 포함하는상태 [0, 3] 은 DFA 의 종결 상태로 표시한다 .
[0]start [0, 1]a
b a
[0, 2]b
a[0, 3]
b
a
b
Regular Language Page 21
예제 17
NFA M = ({q0, q1, q2, q3, qf}, {0, 1}, , q0, {qf})
0 1q0
q1
q2
q3
qf
{q1, q2}{q1, q2}
{qf}
{qf}
{q1, q3}{q1, q3}
{qf}{qf}
1) 우선 NFA 중 여러 상태가 나타나는 것을 고르면 , {q1, q2} 와 {q1, q3} 를 고를 수 있다 . 나오는 집합의 원소의 입력심벌별로 모두 합집합을 취한다 .
0 1{q1, q2}{q1, q3}
{q1, q2, qf}{q1, q2}
{q1, q3}{q1, q3, qf}
2) 합집합을 구한 상태에서 새로운 상태가 있으므로 나오는 집합의 원소의 입력심벌별로 모두 합집합을 취한다 .
0 1{q1, q2, qf}{q1, q3, qf}
{q1, q2, qf}{q1, q2, qf}
{q1, q3, qf}{q1, q3, qf}
Regular Language Page 22
[q1,q3,qf]
3) 처음 종결자를 원소로 갖는 상태는 모두 종결자가 된다 .
4) 시작 상태에서 도달 할 수 없는 상태는 제거한다 .
0 1[q0]
[q1, q2][q1, q3]
[q1, q2, qf][q1, q3, qf]
[q1, q2][q1, q2, qf]
[q1, q2][q1, q2, qf][q1, q2, qf]
[q1, q3][q1, q3]
[q1, q3, qf][q1, q3, qf][q1, q3, qf]
[q0]
[q1,q2] [q1,q2,qf]
[q1,q3]1
1 1
1
0
0
0
Regular Language Page 23
-NFA => DFA -closure
S 가 하나 일 때 , -closure(S) : S 와 S 로부터 레이블이 쓰인 지시선으로 도달 할 수 있는 모든 상태 포함 S 가 하나이상의 상태 -closure(T) : -closure(q)
예제 21qT
A B C D
a
a
a
closure(A) = {A, B, D}closure(T) = closure({A, C}) = closure(A) closure(C)
= {A, B, D} {C, D} = {A, B, C, D}
Regular Language Page 24
예제
1
3
2
4
a b
c
a b cclosure(1)={1, 3, 4}
closure(2)={2}
closure(3)={3, 4}
closure(2)={2}
closure(4)= {4}
closure(3)={3, 4}
closure(3)={3, 4}
closure(4)= {4}
Regular Language Page 25
DNF 의 상태 수 최소화 초기의 동치관계
종결상태 , 미 종결상태로 구분
같은 입력에 대해서 서로 다른 동치로 가는 지시선이 존재하면 , 또 분할 하여 새로운 동치류 구성
새로운 M´ 형성
41,3,4 2
3,4
a b
c
Regular Language Page 26
예제
A
E
C
D
Ba
b b
b
a
ab b
a
a
1. 1 : {A, B, D}
2 : {C, E}
1 : {A, B, D} 2 : {C, E}ab
1 1 11 2 2
1 12 2
1:{A} 2:{B, D} 3:{C, E}ab
22
2 23 3
2 23 3
2.
1 2 3a,b
aa
b
b
Regular Language Page 27
오토마타 변환하는 방법
어떤 상태로 들어오는 지시선 없이 나가는 지시선만 갖는 도달 불가능한 상태 (inaccessible state) 는 모두 제거한다 .
동치 관계를 이용하여 구별되지 않는 상태들을 하나로 합친 후 새로운 유한 오토마타를 구성한다 .
Regular Language Page 28
3-4. 3-4. 정규 언어의 속성정규 언어의 속성 RG = G(VN, VT, P, S) => M (Q,, , q0, F)
Q : VN {f}, f : 새로 만들어진 종결상태 : VT q0 : S; F = if L(G) then {f} else {S, f} = if A aB (A,a) = B; if A a (A, a) = f
Regular Language Page 29
예제G = ({S,B}, {0, 1}, P, S)P : S 0S S 1B S 0 S 1
B 0S B 0
M : (Q, , , q0, F)Q : VN {f} = {S, B, F}
: VT = {0, 1}q0 : SF : {f}
0 1S {S, f} {B, F}B {S, f} -A - -
Regular Language Page 30
FA => RGM = (Q,, , q0, F) => G = (VN, VT, P, S) VN : Q; VT : ; S : q0; P : if (q, a) = r then q ar;
if q F then q; 예제
G = (VN, VT, P, S)
VN : Q = {p, q, r}
VT : = {0, 1}
S : q0 = p
P : p 0q, p 1p
q 0r, q 1p
r 0r, r 1r, r
p q r
10
1
0
1,0
정규문법
Regular Language Page 31
유한 오토마타와 정규 표현 유한 오토마타로 부터 정규문법을 구한다 구한 정규 문법으로부터 정규 표현을 얻는다 .
유한 오토마타로부터 정규표현을 얻는 과정 오토마타에서 상태 전이표를 구한다 . 상태 전이표로부터 정규문법으로 변환한다 정규문법을 정규식으로 쓴다 .
P = 01 + 1p ---- (1) q = 0r + 1p ---- (2) r = 0r + 1r + ---- (3)
정규표현식을 풀어서 정규 표현으로 나타낸다 . r = 0r + 1r + = (0+1)r + = (0+1)* q = 0r + 1p = 0(0+1)* + 1p p = 0q + 1p = 0(0(0+1)* + 1p) + 1p = 00(0+1)* + 01p + 1p = (01 + 1)p + 00(0+1)* = (01+1)*00(0+1)*
L(M) = (01+1)*00(0+1)*
Regular Language Page 32
정규표현 => 유한 오토마타
정규 표현 , a 에 대해 ,
정규표현 N1+N2, N1•N2, N* 에 대해 N1 + N2
i f :
i fa
a :
i f
N2
N1
N1+N2 :
Regular Language Page 33
N1•N2
N*
N2N1 fN1•N2 :
Ni f
N* :
예제
start
a
b
Regular Language Page 34
-NFA 를 간단화
A 에서 나가는 다른 지시선이 없을 때 A, B 는 같은 상태로 취급 될 수 있다 .
예
다음과 같은 형태도 하나의 상태로 줄일 수 있다 .
A B
A Ba B A C
A B Aa
a
Regular Language Page 35
두 개의 경로가 같은 곳으로 이동하는 다음의 경우도 간단화 할 수 있다 .
a* 를 인식하는 경우 다음과 같이 간단히 나타낼 수 있다 .
S
C D
A B
F S F
a
b
a,b
A B C A
a a
Regular Language Page 36
1 2
a
b
(ab)* :
3 4
b
a
(ba)* :
따라서 , (ab)*(ba)* 인식하는 -NFA
1 2 3 4
a
b
b
a
예제
(ab)*(ba)*:
Regular Language Page 37
-NFA 를 DFA 로 변환 상태 전이표를 이용하여 바꾸면
a b A=[1,3] B=[2] C=[4] D=[3]
[2]
[3]
[4][1, 3]
[4]
a
A B
C D
start
b
ba
b
상태전이도로 표현하면