1 / 55

COMPILER

COMPILER. Chapter 5. Context-free 문법. 김 영 균 ygkim@cespc1.kumoh.ac.kr. Contents. 1. 서론 2. 유도와 유도 트리 3. 문법 변환 4. CFG 표기법 5. 푸시다운 오토마타 6. Context-free 언어와 PDA 언어. 5.4 CFG 표기법. - BNF(Backus-Naur Form) 와 EBNF(Extended BNF), 문법 흐름도 (Syntax diagram) - BNF(Backus-Naur Form)

brook
Download Presentation

COMPILER

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. COMPILER Chapter 5. Context-free문법 김 영 균 ygkim@cespc1.kumoh.ac.kr

  2. Contents 1. 서론 2. 유도와 유도 트리 3. 문법 변환 4. CFG 표기법 5. 푸시다운 오토마타 6. Context-free 언어와 PDA언어

  3. 5.4 CFG표기법 - BNF(Backus-Naur Form)와 EBNF(Extended BNF), 문법 흐름도(Syntax diagram) - BNF(Backus-Naur Form) 프로그래밍 언어의 형식적 정의(formal definition)를 위해 널리 사용. BNF에서 nonterminal 심벌은 <와 >로 묶어 나타냄, 문자 스트링은 terminal심벌을 의미. 예) 명칭(identifier)을 정의하면 <id> ::= <letter> | <id><letter> | <id><digit> <letter> ::= a | b | c | ... | y | z <digit> ::= 0 | 1 | 2 | ... | 8 | 9

  4. 5.4 CFG표기법 ::=는 문법 표기법에서 와 동일, |는 택일(alternation)을 나타냄. - BNF표기법으로 모든 프로그래밍 언어의 문법을 기술할 수 있지만, 이보다 읽기 쉽고 간결하게 프로그래밍 언어를 나타내기 위해 확장된 BNF(EBNF)를 도입하게 됨. - EBNF는 반복되는 부분, 선택적인 부분을 간결하게 표현할 수 있는 방법. 이를 위해 특수한 의미를 갖는 메타 심벌(meta symbol)을 사용. 메타 심벌은 표현하려는 언어의 일부분이 아님, 그 언어를 표현하려고 사용된 특수 심벌.

  5. 5.4 CFG표기법 - 반복 되는 부분(repetitive part)을 기술하기 위해, 메타 심벌 { }를 사용. 즉, {a}는 a가 0번 이상 반복될 수 있다는 것을 나타냄. 또한, 이것은 정규 표현 a*와 같은 의미. 예) 콤마로 구분되는 명칭들의 리스트를 위한 BNF는 <id_list> ::= <id_list>, <id> | <id> 가 되고, EBNF로 표현하면 다음과 같이 된다. <id_list> ::= <id> {, <id> }

  6. 5.4 CFG표기법 [ 예 16 ] BNF로 표현된 혼합문(compound statement)을 EBNF로 나타내면 다음과 같다. • BNF표현 : <compound_statement> ::= begin <statement_list> end <statement_list> ::= <statement_list>; <statement> | <statement> • EBNF표현 : <compound_statement> ::= begin <statement> {;<statement>} end

  7. 5.4 CFG표기법 - EBNF는 반복되는 최대 횟수와 최소 횟수를 나타낼 수있음, 예) 알파벳으로 시작하여 최고 여덟 개의 문자를 가질 수 있는 external name을 표현하면 다음과 같다. <external_name> ::= <alphabet>{<alphanumeric>}07 <alphanumeric> ::= <alphabet> | <digit> <alphabet> ::= a | b | c | ... | y | z <digit> ::= 0 | 1 | 2 | ... | 9 중괄호 뒤의 0은 최소 횟수, 7은 최대 횟수를 나타냄, BNF로 정의한다면 길이가 길어짐.

  8. 5.4 CFG표기법 - 선택적인 부분(optional part)을 기술할 때에는 메타 심벌 [ ]로 나타낸다. 즉, [x]는 x가 나타나지 않거나 한 번만 나타날 수 있음을 의미. 따라서 [x]는 {x }01과 같은 의미로 생각할 수 있다. 예를 들어, if문장에서 else부분이 선택적으로 나타날 수 있다면 다음과 같이 EBNF로 표현할 수 있다. <if_st> ::= if <condition> then <statement> [else <statement>]

  9. 5.4 CFG표기법 예17) 변수(variable)가 단순 변수와 1차원 배열 변수로 한정되어 있다면, 그에 대한 BNF와 EBNF는 다음과 같다. • BNF표현 : <variable> ::= <id> | <id> ‘[‘ <exp> ‘]’ • EBNF표현 : <variable> ::= <id> [ ‘[‘ <exp> ‘]’ ] 그리고 괄호와 택일 기호(|)를 사용하여 여러 개의 생성 규칙들을 묶어서 간단히 표현할 수 있다. <exp> ::= <exp> + <exp> | <exp> - <exp> <exp> * <exp> | <exp> / <exp> 를 <exp> ::= <exp> ( + | - | * | / ) <exp> 로 간단히 나타냄.

  10. 5.4 CFG표기법 - EBNF에 사용되는 메타 심벌들을 terminal심벌로 사용하는 경우 혼돈이 생기는데, 이를 피하기 위해 terminal심벌은 ‘과 ‘으로 묶어 표현한다. 예18) <BNF_rule>::=<left_part> ‘::=‘ <right_part> <right_part>::=<right_part_element> { ‘|’ <right_part_element>} - BNF를 EBNF로 표현함으로써 필요한 nonterminal의 개수를 줄일 수 있을 뿐만 아니라 간결하게 표현할 수 있다. 그런데, BNF와 동등한 EBNF로 표현하는 형태는 문법을 고안 하는 사람에 따라 여러 가지 있을 수 있음. 부록 A의 미니 파스칼 문법을 EBNF로 나타낸 것(교재 pp164참조)

  11. 5.4 CFG표기법 - 문법 흐름도(syntax diagram) 초보자가 언어의 구문 구조를 쉽게 이해할 수 있도록 문법을 도식화 하는 방법. 사각형(square box)과 타원(ellipse), 그리고 이들 사이를 연결한 지시선(arc)으로 이루어져 있음. - 사각형 안에 기술되는 고유 이름은 nonterminal심벌의 이름과 같고, 타원 안에는 terminal이 표기 된다. 지시선을 따라 움직이는 경로(path)는 문법적으로 올바른 구문 형태를 정의하고 있다.

  12. B 5.4 CFG표기법 - 다음은 문법 흐름도를 그리는 방법. 1. Terminal x는 원 안에 x로 표기하고 다음 심벌을 보기 위해 나가는 지시선을 그린다. x 2. Nonterminal B는 사각형 안을 B로 쓰고, terminal의 경우와 같이 지시선을 긋는다. 사각형의 내용은 그 안의 이름에 의해 참조될 수 있다.

  13. 5.4 CFG표기법 3. 생성 규칙 A::=X1X2 ... Xn은 아래와 같은 방법으로 그린다. (1) Xi가 nonterminal인 경우: X1 X2 ... Xn (2) Xi가 terminal인 경우: X1 X2 ... Xn 4. 택일 생성 규칙 A::= 12 ... n은 여러 개의 경로를 갖는다. 1 여기서 i는 1부터 3까지의 방법을 적용하여 얻은 구조 2 A ... n

  14. A  5.4 CFG표기법 5. EBNF A::={}는 다음과 같이 표현 된다. 6. EBNF A::= [ ]는 아래와 같이 표현 된다. A 

  15. 5.4 CFG표기법 7. EBNF A::=(1 | 2)는 다음과 같이 표현 된다. 1 A  2

  16. 5.4 CFG표기법 예19) 다음 EBNF를 문법 흐름도로 바꾸어 보자. A::= a | (B) B::= AC C::= {+A} 여기서, a, +, (, )는 terminal심벌이며 A,B,C는 nonterminal심벌을 나타낸다. 각 nonterminal에 대한 문법 흐름도를 그리면 다음과 같다. A a ) ( B

  17. 5.4 CFG표기법 B A C C A + - 문법 흐름도는 EBNF표기법의 사고 방식과 유사하므로, 문법이 EBNF로 쓰여져 있을 경우에는 쉽게 문법 흐름도로 바꿀 수 있다.

  18. 5.4 CFG표기법 - 한 BNF표현을 다양한 형태의 EBNF로 표현할 수 있는 것과 마찬가지로 같은 문법을 여러 형태의 문법 흐름도로 표현 가능. - Nonterminal을 표시하고 있는 사각형을 참조하지 않고 직접 그 내용을 문법 흐름도에 대입 가능. 따라서, 예19)는 다음과 같이 통합하여 나타낼 수 있음. a A ( A ) A +

  19. letter letter - - digit 5.4 CFG표기법 예20) 다음은 C언어에서 명칭의 구조를 나타내는 문법 흐름도 이다. - 명칭의 형태는 영문자 또는 밑줄 문자로 시작하여, 그 다음은 영문자, 밑줄 문자, 숫자 중 어느 것이든지 반복해서 나올 수 있는 구조.

  20. 5.4 CFG표기법 예21) C언어에서 정수 변수 선언에 대한 문법을 BNF, EBNF, 그리고 문법 흐름도로 표현해 보자. 그 형태는 먼지 지정어 int가 나오고, 변수들의 리스트 다음에 세미콜론으로 끝난다. • BNF표현: <int_dcl> ::= int <id_list>; <id_list> ::= <id_list>, <id> | <id> • EBNF표현: <int_dcl> ::= int <id> { , <id> } ; • 문법 흐름도 int_dcl int id ; ,

  21. 5.5 푸시다운 오토마타 - 유한 오토마타(FA)는 보조 기억장치를 갖고 있지 않기 때문에 지나간 입력의 유래를 알 수 없음. 따라서, 입력 심벌의 일정한 개수를 셀 수 있는 능력이 없음. - 푸시다운 오토마타(PDA)는 보조 기억장치를 포함하고 있다. 푸시다운 오토마타(push-down automata; PDA)는 유한 상태 제어(finite state control),입력 테이프(input tape), 그리고 스택(stack)으로 구성된 인식기의 한 종류 . 입력 테이프는 입력 스트링을 유지하고 있으며, 스택은 보조 기억 장치로 보통 푸시다운 리스트(push-down list)라고 부른다. 입력 테이프는 입력 스트링을 유지, 스택은 보조 기억 장치로 보통 푸시 다운 리스트(push-down list) 라고 함.

  22. 5.5 푸시다운 오토마타 - 유한 상태 제어는 전체의 행동을 제어하는 기능을 하며, 현재의 입력 심벌과 스택의 top 심벌에 따라 행동. 입력테이프 a1 a2 ... an 스택 유한 상태 제어 Z1 Zn 그림 5.3 푸시다운 오토마타

  23. 5.5 푸시다운 오토마타 [정의 5.13] 푸시 다운 오토마타는 7개의 요소로 구성 된다. P = ( Q, , , , q0, Z0, F) 여기서, Q : 상태들의 유한 집합,  : 입력 알파벳의 유한 집합,  : 스택 심벌의 유한 집합,  : 사상 함수 Q  (  {},)    Q  * , q0Q : 시작 상태(start state) Z0 : 스택의 시작 심벌, FQ : 종결 상태(final state)의 집합.

  24. 5.5 푸시다운 오토마타 - 사상 함수 는 보통 전이 함수라고 함, 일반적으로, (q,a,Z) = { (p1,1), (p2, 2), (p3, 3), ..., (pn, n) }의 형태를 갖는다. 이것은 현재의 상태가 q이고 입력 심벌이 a이며, 스택의 top심벌이 Z일 때, 다음의 전이 상태는 n개 중에 하나이며, 만약 (pi, i)가 선택 되었다면, 그 의미는 다음과 같다. (1) 현재의 q상태에서 입력 a를 본 다음 상태는 pi이다. (2) 스택 top 심벌 Z를 i로 대치 한다. (1)번 행동은 유한 오토마타와 같으며, (2)번과 같이 스택의 내용을 변화 시켜 주면 PDA의 행동이 됨.

  25. 5.5 푸시다운 오토마타 - 푸시다운 오토마타에 의해서 인식되는 언어를 정의하기 위해 전이 함수를 적용하여 이동하는 관계를 나타낼 때, 필요한 P의 형태(configuration)는 다음과 같이 정의. [정의 5.14] P의 형태는 Q**의 트리플( q, ,  )로 나타낸다. 여기서, q는 현재의 상태이며, 는 읽지 않은 입력 부분, 그리고 는 스택의 내용을 나타낸다. 또한 =인 경우는 모든 입력 심벌이 읽혀 졌음을 의미하고, 의 왼쪽 첫번째 심벌이 스택 top에 있는 심벌에 해당된다. P에 의해 한 상태에서 다른 상태로의 이동(move)은 (혹은 p )로 표기 한다. 만약 qQ, a  { }, Z, *,  *에 대하여, (q,a,Z)가 (q’, )를 가지면, 다음과 같은 이동이 있게 됨.

  26. 5.5 푸시다운 오토마타 P에 의해 한 상태에서 다른 상태로의 이동(move)은 (혹은 p )로 표기 한다. 만약 qQ, a  { }, Z, *,  *에 대하여, (q,a,Z)가 (q’, )를 가지면, 다음과 같은 이동이 있게 된다. (q, a, Z) (q’, ,  ) 만일 a인 경우, 유한 제어가 q상태에 있고, 현재의 입력 심벌이 a, 스택의 top이 Z인 경우P의 형태에서 유한 제어가 q’상태로 되고, 입력 헤드(input head)가 다음으로 한 칸 이동하고, 스택의 top에 있는 Z가 로 대치된 형태로 이동됨을 나타낸다. 가 인 경우,스택에서 pop되었다고 말한다.

  27. 5.5 푸시다운 오토마타 - 만약 a= 인 경우, -이동(-move)이라고 하는데, 현재의 입력 심벌에 대해서는 고려되지 않고, 입력 헤드도 움직이지 않는다. 그러나, 유한 제어의 상태가 변하고, 스택의 내용도 바뀐다. -이동(-move)은 모든 입력 심벌이 읽혀졌을 때에도 발생할 수 있는 행동이다. 그러나 스택이 비었을 경우에는 어떠한 이동도 가능하지 않다. *는 0번 이상, +는 한 번 이상의 의미를 나타냈듯이 * 는 0번이상의 이동을, + 는 한 번 이상의 이동을 나타냄. P의 시작 형태는 *에 속하는 에 대해 (q0, , Z0)의 형태를 가지며, 종결 형태는(q, , ), qF, *의 형태를 이룸.

  28. 5.5 푸시다운 오토마타 [정의 5.15] 시작 상태에서 입력 스트링를 다본 상태가 종결 상태에 속하면 스트링 는 P에 의해 인식(accept)된다고 말한다. 그리고 P에 의해 정의되는 언어, 즉 푸시다운 오토마타언어는 L(P)로 표기하며, P에 의해 인식되는 스트링의 집합으로 다음과 같은 의미를 갖는다. L(P) = { | (q0, , Z0) * (q, , ), qF, * }. - 일반적으로 PDA가 인식하는 언어와 CFG가 생성하는 언어의 종류는 같다.

  29. 5.5 푸시다운 오토마타 [예 22] 언어 L = { 0n1n | n  1 }을 인식하는 PDA는 다음과 같다. P= ( {q0, q1, q2 }, {0,1}, {Z,0}, , q0, Z, {q0} ), (q0, 0, Z) = { (q1, 0Z)} (q1, 0, 0) = { (q1, 00) } (q1, 1, 0) = { (q2,  ) } (q2, 1, 0) = { (q2,  ) } (q2, , Z) = { (q0,  ) } - 입력에 있는 처음 0에 대하여 차례로 스택에 모두 이동시키고, 그 다음에 나타나는 각 1에 대하여 스택에 있는 0을 하나씩 pop 한다. 그리고, 입력을 전부 읽고, 스택이 비게 되면 종결 상태로 간다.

  30. 5.5 푸시다운 오토마타 - 입력 스트링 0011에 대하여 P가 인식하는 과정을 살펴 보자. (q0, 0011, Z) (q1, 011, 0Z ) (q1 , 11, 00Z ) (q2, 1, 0Z ) (q2, , Z ) (q0, ,  ) - 그러면, 스트링 0n1n(n1) 에 대해서는 다음과 같은 과정을 거쳐, 인식을 하게 된다. (q0, 0011, Z) (q1, 0n-1 1n, 0Z ) n-1 (q1 , 1n, 0nZ ) (q2, 1n-1, 0n-1 Z ) n-1 (q2, , Z ) (q0, ,  )

  31. 5.5 푸시다운 오토마타 - 따라서, L  L(P)임을 알 수 있다. 이제 L  L(P)만 보이면 된다. 즉, P가 오직 0n1n형태의 스트링만을 인식한다는 것을 보여야 한다. 일반적으로 인식기가 한 개의 특정한 스트링에 대한 인식 과정을 보이는 것은 쉽지만, 특정한 형태의 스트링만을 인식한다는 것을 보이는 것은 어려운 일이다.

  32. 5.5 푸시다운 오토마타 - [예22]에서 정의된 P가 어떤 입력 스트링을 인식한다면 q0,q1, q2, q0상태로 순환되면서 인식 된다. 처음에 어떤 i1에 대하여, (q0, , Z) i (q2, , )가 존재하면 =0i이고, =0iZ이다. 이와 유사하게 (q2, , ) i (q2,  , )가 존재하면, =1i, = 0i 형태 이다. 또한, =1이고, =0일 때, (q1, , ) (q2,  , )가 되며, =  이면, (q2, , Z ) (q0,  ,  )이 된다. 따라서, P가 인식하는 스트링은 오직 0n1n의 형태이다. 그러므로 L  L(P) 이다.

  33. 5.5 푸시다운 오토마타 - 푸시다운 오토마타는 앞에서도 설명 했듯이 입력 스트링을 모두 읽은 후에도 이동이 일어나며, 스택이 빈 경우에는 이동이 발생하지 않는다. - 만약, (q, , A) n (q’, , )과 같은 형태의 이동이 존재하면, 모든 A와 *에 대하여 (q, , A) n (q’, , )가 성립한다. 즉, 한번의 이동으로 스택 top에 있는 심벌뿐만 아니라, 스택 top부분에 있는 유한 길이의 스트링도 다른 스트링으로 대치할 수 있다는 의미이다. 지금까지의 PDA는 한 번의 이동으로스택의 top에 있는 심벌만으로 대치될 수 있었다. 이와 같은 사실을 이용하여 PDA를 다음과 같이 확장할 수 있다.

  34. 5.5 푸시다운 오토마타 [정의 5.16] 확장된 PDA: P = ( Q, , ,  , q0, Z0, F) 여기서, 는 Q  (   {} )  *에서 Q  * 의 유한 부분 집합 으로 사상되는 전이 함수, 다른 요소는 앞과 동일한 의미를 갖는다. - 이동함수 (q, a, )가 a{},   *에 대해 (q’, )를 가질 경우에는 (q, a,  ) (q’, ,  ) 로 나타낸다. q상태에서 입력 심벌 a를 보고 입력 헤드를 오른쪽으로 한 심벌 이동하고 스택의 top부분의 를 로 대치 한다. 일반적인 PDA와는 달리 확장된 PDA는 스택이 비었을 때도 이동이 발생할 수 있다.

  35. 5.5 푸시다운 오토마타 [예 23] L={ R |  {a,b}+ }를 인식하는 확장된 PDA를 정의 해 보자. P = ( {q, p} , {a, b}, { a, b, S, Z},  , q , Z, {p} ), (q, a, ) = { (q, a) } (q, b, ) = { (q, b) } (q, , ) = { (q, S) } (q, , aSa) = { (q, S) } (q, , bSb) = { (q, S) } (q, , SZ) = { (p, ) } 입력 aabbaa에 대하여 P는 아래와 같은 연속된 이동으로 인식.

  36. 5.5 푸시다운 오토마타 입력 aabbaa에 대하여 P는 아래와 같은 연속된 이동으로 인식 되게 된다. (q, aabbaa, Z) (q, abbaa, aZ ) (q, bbaa, aaZ ) (q, baa, baaZ ) (q, baa, SbaaZ ) (q, aa, bSbaaZ ) (q, aa, SaaZ ) (q, a, SaZ ) (q, a, SaZ ) (q, , aSaZ ) (q, , SZ ) (q, ,  )

  37. 5.5 푸시다운 오토마타 - P는 먼저 스택에 입력의 prefix를 저장하고, 스택의 top에 center mark S를 놓는다. 그 후 스택에 다음 입력 심벌을 넣어 스택의 aSa 혹은 bSb를 S로 대치. 이런 방법으로 모든 입력에 대하여, 행동 한다. SZ가 스택에 있다면, P는 SZ를 pop하고, 종결 상태로 간다. 다음 정의는 PDA에서 입력이 인식 되었을 경우에는 그때의 스택이 empty가 되게 만들 수 있음을 보여 준다.

  38. 5.5 푸시다운 오토마타 [정의 5.17] P = (Q , , , , q0, Z0, F)를 확장된 PDA라 하자. 어떤 qQ에 대해 (q0, , Z0) + (q,  , )일 경우에   *는 스택을 empty로 만드는 P에 의해서 인식된다고 한다. 스택을 empty로 만드는 P에 의해 인식되는 스트링의 집합을 Le(P)로 표기 한다. 즉, Le(P)는 입력 심벌을 모두 보고 스택이 비었을 때만 인식되는 스트링의 집합으로 다음과 같이 표시할 수 있다. Le(P) = {  | (q0, , Z0) + ( q,  , ), q  Q }.

  39. 5.5 푸시다운 오토마타 [정의 5.1] PDA P = (Q , , , , q0, Z0, F)에 대한 L(P)를 L이라 한다면, Le(P’)=L인 PDA P’을 만들 수 있다. [증명] P’이 P를 모사함으로써 증명한다. P가 종결 상태에 이르렀을 때, P’은 P를 계속 모사할 것인지 아니면 스택을 비우는 어떤 특정한 상태 qe로 갈 것인가를 결정해야 한다. 그러나 P가 종결 상태에 있지 않더라도 입력 스트링 에 대해 스택을 비우는 일련의 이동을 할 수 있다. 따라서 P가 종결 상태에 이르렀을 때, P’의 행동을 결정하는 일은 어려운 일이다.따라서 P’이 를 인식하지 않아야 할 때 를 인식하지 않도록 하기 위하여 P’에 스택의 끝을 나타내는 특정한 심벌을(bottom marker) 첨가해야 한다.

  40. 5.5 푸시다운 오토마타 P’이 상태 qe에 있을 때만 스택에서 제거할 수 있다. 이 사실을 이용하여, P로부터 P’을 구성 해 보자. P’ = ( Q  { qe , q’ },  ,   { Z’ } , ’ , ’ ,  ). 여기서, ’은 다음과 같이 정의 된다. : (1) 모든 qQ, a  {  }, 그리고 Z에 대하여 ’( q, a, Z) = ( q, a, Z). (2) ’( q’, , Z’ ) = { (q0 , Z0Z’) }. 즉, P’의 첫번째 이동은 스택에 Z0Z’을 넣고 P의 시작 상태로 간다. Z’은 스택의 끝을 나타 내는 bottom marker이다.

  41. 5.5 푸시다운 오토마타 (2) ’( q’, , Z’ ) = { (q0 , Z0Z’) }. 즉, P’의 첫번째 이동은 스택에 Z0Z’을 넣고 P의 시작 상태로 간다. Z’은 스택의 끝을 나타 내는 bottom marker이다. (3) 모든 qF, Z{Z’}에 대하여, ’( q, , Z ) 에 (qe, )을 포함 시킨다. (4) 모든 Z{Z’}에 대하여, ’( qe, , Z ) = { (qe, ) }. 이렇게 P’을 만든 후에 서로 필요 충분 조건임을 다음과 같이 쉽게 보일 수 있다. ( q’, , Z’) P’ (q0, , Z0Z’) np’ (q , , Y1 ... Yn) P’ (qe, , Y2 ... Yn) r-1P’ (qe, , )  (q0, , Z0) np ( q, , Y1...Yr-1 )

  42. 5.5 푸시다운 오토마타 여기서 qF이고 Y1...Yr-1*이다. 즉, P’에 의해서 인식되는 는 P에 의해서도 인식되며, 그 역도 성립 한다. Le(P’) = L(P)이다.

  43. 5.6 Context-free언어와 PDA언어 - PDA언어가 정확히 context-free언어라는 것을 보았음. - CFG가 주어졌을 때, 그에 해당하는 PDA를 구성할 수 있고, 역으로, PDA가 주어졌을 때, PDA가 인식하는 언어와 같은 언어를 생성하는 CFG를 만들 수 있다. [정리5.2] 문법 G=(VN,VT,P,S)가 CFG일때, G로부터 Le(R)=L(G) 인 PDA R를 만들 수 있다. [증명] G의 좌측 유도를 모사하는 PDA R를 다음과 같이 구성. R = { {q}, VT, VN  VT, , q, S,  ) 여기서, 는 다음과 같이 정의 된다.

  44. 5.6 Context-free언어와 PDA언어 (1) A P이면, (q, , A)에 (q, )를 포함 시킨다. (2) 모든 aVT에 대하여, (q, a, a)={ (q, ) } 이제 어떤 m,n 1 에 대하여, Am 와 (q, , A) (q, , )은 서로 필요 충분 조건임을 보이면 된다. () 먼저 A m 일때, (q, , A) n (q, , )이 됨을 유도 횟수 m에 대하여 귀납적으로 증명 한다.  m=1인 경우, =a1...ak, k  0 이면, ( q, a1...ak, A) (q, a1...ak, a1...ak) k (q, , ) 이므로 성립 한다.

  45. 5.6 Context-free언어와 PDA언어  m > 1에 대하여, Am 를 가정하면, 유도 과정의 첫번째 단계는 A  X1X2...Xk의 형태를 갖는다. 여기서, Xi  mi xi이고, x1x2...xk= 이다. 그러면 (q, , A) (q, , X1X2...Xk)가 된다. 만약 Xi VN이면, 가설에 의해 (q, xi, Xi) * (q, , )이고, 만일 Xi VT이고, Xi=xi이면 (q, xi, Xi) (q, , ) 이다. 그러므로 (q, , A) + (q, , ) 이 성립 된다. () (q, , A) n (q, , ) 이면, A+ 임을 n에 대해 귀납적으로 증명 한다.  n=1인 경우, = 이 되고 A 이 P에 있으므로 성립한다.

  46. 5.6 Context-free언어와 PDA언어  n<n’에 대하여 성립한다고 가정하면, R에 의해서 만들어지는 첫번째 이동은 (q, , A) (q, , X1X2...Xk)의 형태가 된다. 그리고 1 i k에 대하여, (q, xi, Xi) ni (q, , )이 된다. 여기서, =x1x2...xk이다. 이때, AX1...Xk가 P에 존재하는 생성 규칙이고, XiVN이면, 귀납적 가설로부터 Xi xi이다. 따라서 다음과 같은 유도 과정이 존재하게 된다. A  X1...Xk * xiX2...Xk ... * x1x2...xkXk * x1x2...xk-1xk= 

  47. 5.6 Context-free언어와 PDA언어 위 유도 과정은 A로부터 의 좌측 유도 과정이다. 이와 유사하게, 시작 심벌 S인 경우도 S + 과 ( q, , S) + (q, , )은 서로 필요 충분 조건이 된다. 즉, S로부터 유도 될 수 있는 문장은 모두 PDA에 의해 인식된다. 그러므로 Le(R)=L(G)이다. 위 정리로부터 CFG가 주어졌을 때, 그 언어를 인식할 수 있는 인식기인 PDA를 구성할 수 있다.

  48. 5.6 Context-free언어와 PDA언어 [예 24] 연산식을 위한 문법 G에 대하여 Le(R)=L(G)인 PDA R를 구성 해 보자. G = ( {E,T,F}, { a, *, +, (, ) }, P, E), P: E  E + T | T T  T*F | F F  (E) | a R = ( {q}, , , , q, E,  ), 여기서 는 다음과 같이 정의 된다. (1) (q, , E) = { (q, E+T), (q, T) } (2) (q, , T) = { (q, T*F), (q,F) } (3) (q, , F) = { (q, (E)), (q,a) } (4) (q, x, x) = { (q, ) }, 여기서 x{ a, +, *, (, ) }.

  49. 5.6 Context-free언어와 PDA언어 입력 a+a*a에 대하여 R는 다음과 같은 이동을 할 수 있다. (q, a+a*a, E) (q, a+a*a, E+T) (q, a+a*a, T+T) (q, a+a*a, F+T) (q, a+a*a, a+T) (q, +a*a, +T) (q, a*a, T) (q, a*a, T*F) (q, a*a, F*F) (q, a*a, a*F) (q, *a, *F) (q, a, F) (q, a, a) (q, , )

  50. 5.6 Context-free언어와 PDA언어 - 이상과 같은 일련의 이동은 R가 G에서 E로부터 a+a*a의 좌측유도에 대응되게 규칙을 적용한 것과 같은 순서이다. - 시작 심벌로부터 아래로 내려가면서 스트링을 만들기 때문에 이와 같은 방법을 top-down구문 분석 방법이라 한다. - CFG에서 역으로 우측 유도를 적용함으로써bottom-up파서로 작동하는 확장된 PDA를 만들 수 있다. - P의 형태에서 스택의 top위치는 top-down인 경우에는 왼쪽이며 bottom-up인 경우에는 오른쪽이다.

More Related