730 likes | 1.3k Vues
COMPILER. Chapter 5. Context-free 문법. 김 영 균 ygkim@cespc1.kumoh.ac.kr. Contents. 1. 서론 2. 유도와 유도 트리 3. 문법 변환 4. CFG 표기법 5. 푸시다운 오토마타 6. Context-free 언어와 PDA 언어. 5.1 서론. • 프로그래밍 언어의 구문 구조를 명시하는데 , context-free 문법이 널리 사용 됨 .
E N D
COMPILER Chapter 5. Context-free문법 김 영 균 ygkim@cespc1.kumoh.ac.kr
Contents 1. 서론 2. 유도와 유도 트리 3. 문법 변환 4. CFG 표기법 5. 푸시다운 오토마타 6. Context-free 언어와 PDA언어
5.1 서론 • 프로그래밍 언어의 구문 구조를 명시하는데, context-free 문법이 널리 사용 됨. - context-free문법은 효율적, 잘 정의된 구문 분석 알고리즘을 가짐. - 프로그래밍 언어의 문법적인 표현이나 번역에 매우 중요. • 정규 문법은 간단한 패턴을 기술하기에는 적합, 프로그래밍 언어의 구문구조를 표현하기에는 너무 제약이 많아 부적합.
5.1 서론 • 대부분의 경우, 토큰의 구조는 정규 표현으로 나타냄, 프로그래밍 언어의 구조는 context-free문법을 사용. - 프로그래밍 언어의 구조를 context-free문법으로 표현하면, 장점은 1) 간단하고 이해하기가 쉽다. 2) 표현된 문법으로부터 자동적으로 인식기를 구현 가능. 3) 입력된 프로그램의 구조를 생성 규칙에 의해분해 할 수 있으므로, 번역에 유용. - context-free문법은 촘스키 분류에 따르면 형태 2에 해당. 모든 생성 규칙은 A의 형태를 갖음. A는 하나의 nonterminal이며 는 V*에 속하는 스트링.
5.1 서론 - 유도 과정의 문장 형태(sentential form)에서 A를 문맥에 관계없이 로 대치할 수 있기 때문에 context-free(문맥 자유 또는 문맥 무관)라 부름. • 문법 표기에서 사용하는 문법 심벌들의 일반적인 표기법 1. Terminal 심벌 : (1) a,b,c와 같은 알파벳 시작 부분의 소문자와 숫자 0,1,2,..., 9 ; (2) +,-와 같은 연산자 기호와 세미콜론, 콤마, 괄호와 같은 구분자; (3) ‘if’ 또는 ‘then’과 같이 ‘과 ‘사이에 표기된 문법 심벌.
5.1 서론 2. Nonterminal 심벌: (1) A,B,C와 같은 알파벳 시작 부분의 대문자; (2) S는 보통 시작 심벌(start symbol)을 나타냄. (3) <stmt>나 <expr>과 같이 <와 >로 묶어서 나타낸 문법 심벌. 3. 다른 언급이 없으면, 첫번째 생성 규칙의 왼쪽에 있는 것이 시작 심벌. 4. A1, A2, ..., Ak와 같이 생성 규칙의 왼쪽이 모두 A인 경우에, A1 | 2 | ... |k 로 간단히 표기. 이것을 A에 대한 택일(alternation)규칙 이라 함.
5.1 서론 • 형식 언어 이론(formal language theory)에서 사용하는 각 심벌의 의미. 1. X,Y,Z와 같은 알파벳 끝부분의 대문자는 보통 문법 심벌, 즉, nonterminal 혹은 terminal심벌을 나타냄. ( X, Y, Z V). 2. 알파벳 끝부분의 소문자, 주로 u,v,...,z는 terminal들로 이루어진 스트링을 나타냄. (omega) 역시 terminal스트링을 나타내는 대표적인 문자. ( VT* ) 3. , , 와 같은 그리스체 소문자는 문법 심벌로 구성된 스트링을 나타냄.(, , V*).
5.1 서론 예1) 다음에서 일반적인 표기법에 따라 문법 심벌을 분류 해 보자. E EOE | (E) | -E | id O + | - | * | / - 여기서 E와 O는 nonterminal심벌이고, E는 시작 심벌이며, 그 외의 심벌은 terminal심벌. - 생성규칙의 개수는 여덟 개.
5.1 서론 예2) <if_statement> ->’if’ <condition> ‘then’ <statement>에서 < > 안에 기술된 심벌은 nonterminal symbol. ‘과 ‘사이에 기술된 심벌은 terminal symbol.
5.2 유도와 유도 트리(Derivation Tree) • 유도(Derivation) - Context-free 문법에서 문장의 생성은 문장 형태(sentential form)의 스트링에서 생성 규칙을 반복적으로 적용, nonterminal을 확장함으로써 얻을 수 있음. E E+E | E*E | (E) | -E | id E는 식(expression)을 나타냄, 생성 규칙 E -E는-가 식 앞에 나오는 경우도 식이 될 수 있다는 것을 의미. E -E - (E) - (id). 위 유도과정에서 대치의 결과, E로부터 -(id)가 유도됨. -(id)가 식의 한 경우라는 것을 보여 줌.
5.2 유도와 유도 트리(Derivation Tree) • Context-free문법에서는 생성 규칙의 오른쪽에 non-terminal이 여러 개 나올 수 있기 때문에, 같은 문장을 유도하는 여러 가지 방법이 있을 수 있음. 즉, 문장 형태에서 유도시 대치해야 할 nonterminal을 선택 하는데 여러 가지 경우가 있을 수 있음.
5.2 유도와 유도 트리(Derivation Tree) [정의 5.1] 유도 과정의 각 단계에서 문장 형태의 가장 왼쪽에 있는 nonterminal을 대치하는 경우, 이를 좌측 유도(leftmost derivation)라 하며 lm으로 표기. 이와 유사하게 가장 오른쪽에 있는 nonterminal심벌을 대치 하는 경우를 우측 유도(rightmost derivation)라 하며 rm으로 표기. - 좌측 유도에서 나타난 문장 형태를 좌문장 형태(left-sentential form)하고, 우측 유도에서 나타난 문장 형태를 우문장 형태 (right-sentential form)라 한다.
5.2 유도와 유도 트리(Derivation Tree) [ 예 3] 문장 -(id + id)가 문법 5.1에 의해 유도되는 과정을 살펴 보자. (1) 좌측 유도의 경우 E lm -E lm -(E) lm -(E+E) lm -(id + E) lm -(id + id). (2) 우측 유도의 경우 E rm -E rm -(E) rm -(E+E) rm -(E + id) rm -(id + id). 보통, lm이나 rm대신, 로 표기 가능, 대치되는 nonterminal을 보아 좌측 유도, 우측 유도임을 알 수 있음.
5.2 유도와 유도 트리(Derivation Tree) [ 정의 5.2 ] 좌측 유도에서 적용된 일련의 생성 규칙 순서를 좌파스(left parse)라 하며, 우측 유도의 경우, 적용된 생성 규칙 번호의 역순을 우파스(right parse)라 한다.
5.2 유도와 유도 트리(Derivation Tree) [예 4] 다음과 같은 문법이 주어졌을 때 문장 a+a*a의 좌파스와 우파스를 구해 보자. 1. E E + T 2. E T 3. T T * F 4. T F 5. F ( E ) 6. F a E 1 E + T E 1 E + T 2 T + T 3 E + T*F 4 F + T 6 E + T*a 6 a + T 4 E + F*a 3 a + T*F 6 E + a*a 4 a + F*F 2 T + a*a 6 a + a*F 4 F + a*a 6 a + a*a 6 a + a*a 좌파스 : 1 2 4 6 3 4 6 6. 우파스 : 6 4 2 6 4 6 3 1.
5.2 유도와 유도 트리(Derivation Tree) • 유도 트리(Derivation Tree) - 문장이 유도되는 과정을 트리 형태로 표시. 이를 유도 트리라 함. - 유도 트리는 생성 규칙에 의해 적용되는 문장의 계층적 구조를 나타냄, 다음과 같이 정의 됨. [정의 5.3] context-free 문법 G={VN, VT, P,S }에 대한 유도 트리 1. 각 노드는 문법 심벌을 레이블(label)로 갖는다; 2. 루트(root)의 레이블은 시작 심벌 S이다; 3. 만약 어떤 노드가 최소한 하나 이상의 자노드를 가진다면, 이 노드는 nonterminal 심벌을 레이블로 갖는다. 4. 왼쪽부터 순서적으로 레이블이 A1A2 ... Ak인 노드들이 어떤 노드 A의 자노드(children node)라면, 생성 규칙 AA1A2 ... Ak가 존재 한다.
5.2 유도와 유도 트리(Derivation Tree) • 유도 트리(Derivation Tree) AXYZ가 어떤 유도 과정에서 적용된 생성 규칙이라면, 유도 트리는 다음과 같은 부트리(subtree)를 갖는다. A X Y Z - 구성된 유도 트리는 자노드의 위치 순서가 생성 규칙의 오른쪽에 나타난 심벌의 순서와 반드시 일치 한다. 따라서, 유도 트리는 순서 트리(ordered tree)가 된다.
5.2 유도와 유도 트리(Derivation Tree) [ 예5 ] 예3)에서 (1)의 유도 과정의 각 단계에 따라 유도 트리를 만들어 보자. 시작 심벌인 E가 루트 노드이며, 생성 규칙 E -E로부터 두 개의 자노드, 즉, -와 E의 노드가 만들어 진다. E - E
5.2 유도와 유도 트리(Derivation Tree) - 생성 규칙 E(E)로부터 -E -(E)가 유도되므로 다음과 같은 유도 트리가 구성된다. E - E ( E ) 이와 같은 방법으로, -(id+id)에 대한 유도 트리를 구성하면 그림 5.1과 같다.
5.2 유도와 유도 트리(Derivation Tree) - 그림 5.1 -(id+id)에 대한 유도 트리( 교재. pp. 145) E - E ( E ) E + E id id
5.2 유도와 유도 트리(Derivation Tree) - 유도 트리는 문장 형태에서 대치되는 심벌의 순서에 관계없이 그릴 수 있음. 예4)에서 좌측 유도 과정과우측 유도 과정을 유도 트리로 나타내면, 그림 5.1과 같이 모두 같은 유도 트리로 표현됨. 생성 규칙의 적용순서에 따라 달라지는 유도과정은, 어떤 특종한 유도과정을 사용, 고정 시킬 수 있음. 어느 한 가지 유도 방법을 이용하더라도 구성되는 유도 트리가 유일하다는 것을 확증하지는 못함. 실제로, 두 개 이상의 유도 트리가 만들어지는 경우도 존재.
5.2 유도와 유도 트리(Derivation Tree) - 예) 문장 id+ id * id를 문법 (5.1)에 의해서, 좌측 유도를 해보면, E E + E E E * E id + E E + E * E id + E * E id + E * E id + id * E id + id * E id + id * id id + id * id 와 같이 두 가지의 유도 과정이 생긴다. 이에 대응되는 유도 트리를 구성하면 그림 5.2와 같다.
5.2 유도와 유도 트리(Derivation Tree) - 그림 5.2 id + id * id를 위한 유도 트리. E E * E E + E id id id E E + E id E * E id id (b) (a) - 어떤 문법은 주어진 스트링에 대한 유도 트리를두 개 이상 그릴 수 있다. 이런 문법을 모호하다고 말한다.
5.2 유도와 유도 트리(Derivation Tree) • 모호성(Ambiguity) [정의 5.4] 문법 G에 의해 생성되는 어떤 문장이 두 개 이상의 유도 트리를 갖는다면, 문법 G는 모호하다(ambiguous)고 한다. - 모호한 문법은 어떤 문장에 대해 좌측 유도나 우측 유도 어느 한 가지 방법을 이용하더라도 두 개 이상의 유도 과정이 존재하는 경우. - 한 문법이 모호하다는 것을 증명하는 방법은 그 문법에 속하는 임의의 문장을 선택하여 두 개 이상의 유도 트리를 그리면 된다.
5.2 유도와 유도 트리(Derivation Tree) [예 6] 다음 문법은 모호한 문법이다. S if C then S else S S if C then S S a C b 왜냐하면, 문장 if b then if b then a else a에 대해 다음과 같은 두 개의 유도 트리를 갖기 때문. S S if C then S b if C then S else S b a a if C then S else S b if C then S a b a
5.2 유도와 유도 트리(Derivation Tree) - 구문 분석기의 출력으로 유도 트리를 낼 경우, 문장의 유도 트리를 결정적으로 구성하기가 힘들기 때문에, 모호하지 않은(unambiguous)문법이 필요. - 결정적인 파싱을 하기 위해서는 일반적으로 모호하지 않은 문법으로 변환해야 함. 모호하다는 것은 문법의 속성, 언어의 속성은 아님. 모호한 문법을 모호하지 않은 동등한 문법으로 바꿀 수 있다. 모든 문법을 모호하지 않은 문법으로 바꿀 수 있는 것은 아님. - 연산 순위나 결합 법칙의 정보를 이용, 생성 규칙을 추가, 모호성을 제거함. 이때 새로운 nonterminal을 도입함.
5.2 유도와 유도 트리(Derivation Tree) - 문법 (5.1)에 연산자 -, / , 의 기능을 추가하여 확장한 생성 규칙들이다. E E+E | E-E | E*E | E/E | EE | -E | (E) | id - 연산자의 연산 순위가 낮은 것부터 나타내면, + - * / - (unary minus) 는 우측 결합(right-associative, 즉 a b c는 a ( b c)를 의미함.
5.2 유도와 유도 트리(Derivation Tree) - 그 외의 연산자는 좌측 결합(left-associative, 즉 a+b+c는 (a+b)+c를 의미함)을 만족한다고 가정하자. - 연산 순위를 고려하여 동등한 문법으로 바꾸는 과정은 1) 가장 기초적인 피연산자를 element라 두면, 이것은 괄호로 묶인 산술식이나 id가 될 수 있다. element (expression) | id 2) 다음으로, 순위가 가장 높은 단일 -(unary minus)를 갖는 element를 위해 primary를 도입 한다. 이를 위한 생성 규칙은 element -primary | element 이다.
5.2 유도와 유도 트리(Derivation Tree) 3) 하나 이상의 primary가 에 의해 구성되는 부분식(subexpression)을 위해 factor를 도입하여 구성. 여기서, factor가 우측 순환 구조를 갖기 때문에 ab c가 a (b c)이다. 즉, 우측 결합에 합당함을 알 수 있다. 4) *와 /에 의해 연결된 하나 이상의 factor들의 부분식을 위하여 term을 도입, +와 -에 의해 연결된 하나 이상의 산술식을 expression으로 하여 만들어진 모호하지 않은 문법은 다음과 같다.
5.2 유도와 유도 트리(Derivation Tree) expression expression + term | expression - term | term term term * factor | term / factor | factor factor primary factor | primary primary -primary | element element ( expression ) | id
5.2 유도와 유도 트리(Derivation Tree) • 일반적으로, 생성 규칙의 형태가 AAA인 경우 모호성이 나타남. 왜냐하면, AAA와 같은 문장 형태에 대해 두 가지 형태의 트리를 만들 수 있기 때문이다. A A A A 또는 A A A A A A - 한 문법이 모호하다는 것을 증명하기 위해서는, 그 문법으로부터 생성할 수 있는 어떤 스트링을 선택해서 두 개의 유도트리를 그릴 수 있다는 것을 보이면 된다.
5.2 유도와 유도 트리(Derivation Tree) [정의 5.5] 한 context-free언어를 생성하는 모든 문법이 모호하다면, 이 언어를 본질적으로 모호하다.(inherently ambiguous)고 한다. 예7) L = { aibjck | i=j 또는 j=k }는 본질적으로 모호한 context-free언어이다. 그 이유는 i=j인 스트링을 생성하기 위해서는 j=k인 스트링을 생성하기 위한 유도 과정과다른 과정을 거쳐야 한다. 마찬가지로, j=k인 스트링을 생성하기 위해서는 i=j인 스트링을 생성하기 위한 유도 과정과 다른 과정을 거쳐야 한다. 그런데, i=j=k인 스트링은 두 과정 모두 가능.
5.2 유도와 유도 트리(Derivation Tree) • 언어 L을 위한 context-free문법 하나를 적어 보면, S AB S DC AaA | a C cC | c B bBC | bc D aDb | ab 처음에 S AB를 적용하면 j=k인 스트링을 생성할 수 있고, S DC를 적용하면, i=j인 스트링을 만들 수 있다. 따라서, i=j=k인 스트링 aabbcc에 대한 유도 트리는
5.2 유도와 유도 트리(Derivation Tree) S S A B D C a A b B c a D b c C a b c a b c - 위와 같이 두 개를 만들 수 있다. 따라서, 위 문법은 모호한 문법이다. 그런데 L이 본질적으로, 모호하기 때문에, 위 문법과 동등한 모호하지 않은 문법은 존재하지 않는다. - 일반적으로 한 문법이 모호하다는 것을 형식적으로 증명할 수 있는 방법이 존재하지 않으며, 모호하지 않게 바꾸는 알고리즘도 존재하지 않는다.
5.3 문법 변환(Transformations on Context-free Grammar) - 주어진 문법에 대해 효율적인 구문 분석을 하기에 적합한 형태로 바꾸는데, 이용되는 여러가지 기법을 소개. [정의 5.6] 만약 L(G1) = L(G2) 이면 문법 G1과 G2는 동등하다고 말한다. - 두 개의 문법이 동등하다는 의미는 두 개의 문법이 생성하는 언어가 같을 때이다. [예 8] 다음 CFG G1과 G2는 동등하다. G1 : A 1B G2 : X Y1 A 1 X 1 B 0A Y X0 L(G1) = L(G2) = 1(01)*
5.3 문법 변환(Transformations on Context-free Grammar) - 한 문법을 다른 형태의 동등한 문법으로 변환하는데 사용되는 기법. 1) 대입(substitution) 2) 확장(expansion) 1) 대입(substitution) 특정한 생성 규칙을 제거하고, 그에 해당하는 생성 규칙들을 추가하는 방법으로, 제거된 생성 규칙의 오른쪽 부분에 있는 nonterminal 심벌 대신에 그 생성 규칙들의 오른쪽을 대입함으로써 문법을 변환하는 방법. 생성 규칙 AB, BVN, ,V*와 B1 | ... | n 이 존재할 경우, AB의 B자리에 1, 2 ... , n 을 대입한 새로운 생성 규칙 A 1 | 2 |... |n 로 대치.
5.3 문법 변환(Transformations on Context-free Grammar) - 즉, P로부터 대입하여 얻은 새로운 생성 규칙 P’은 다음과 같이 표현할 수 있다. P’ = ( P - { A B } ) { A 1 | 2 | ... | n }. 생성 규칙 AB를 제거하고, 그 대신에 A1 | 2 | ... | n를 추가하여 동등한 문법을 만듬. [예9] P = { S aT | bT , TS | Sb | c }에서 생성 규칙 SaT를 제거하고, 그에 해당하는 생성 규칙들을 추가 한다. 생성 규칙 SaT에서, T대신에 T-생성 규칙을 대입하면, 새로운 생성 규칙 S aS | aSb | ac가 만들어 진다. 따라서, 구하는 P’은 다음과 같이 된다.
5.3 문법 변환(Transformations on Context-free Grammar) P’ = { S aS | aSb | ac | bT, TS | Sb | c }. - 유도 과정에서 대입한 효과는 유도 과정의 횟수를한 번 줄인 결과가 됨. - 한 번 거쳐서 유도 되는 문장 형태가 직접 생성됨. 2) 확장(expansion) 새로운 nonterminal심벌을 도입하여 한 개의 생성 규칙을 쪼개는 방법. 즉, 생성 규칙 A가 존재 할 때, AX, X 혹은 AX, X로 변환 하는 방법. 여기서, X는 새로운 nonterminal심벌이다.
5.3 문법 변환(Transformations on Context-free Grammar) - 유도 과정에서 생성 규칙을 확장한 효과는 유도 과정의 횟수를 한번 늘인 결과가 된다. - 직접 유도 되는 문장 형태가 한 번 거쳐서 생성 되게 된다. - 모든 문법은 대입과 확장 기법을 통하여 동등한 문법으로 바꿀 수 있다.
5.3 문법 변환(Transformations on Context-free Grammar) • 불필요한 생성 규칙 제거 - 한 문법이 생성하는 언어는 시작 심벌로부터 유도 할 수 있으며, 모두 terminal심벌들로 이루어진 스트링의 집합. - 문장을 생성하는 데 적용할 수 없는 생성 규칙들은 모두 제거 가능, 이를 불필요한 생성 규칙(useless production)이라 함. [정의 5.7] 만약 CFG G=(VN, VT, P, S)의 문법 심벌에 대하여, S* wXy * wxy, w, x, y VT*형태와 같은 유도 과정이 존재 하지 않는다면, 심벌 X는 불필요(useless)하다고 한다. - 불필요한 심벌(useless symbol)을 갖고 있는 생성 규칙이 바로 불필요한 생성 규칙이 된다.
5.3 문법 변환(Transformations on Context-free Grammar) [정의 5.8] 생성 규칙 A에 대하여, *이고, VT*일 때, A를 terminating nonterminal이라 하고, S*uX, u, V*이면, X를 도달 가능한 심벌(accessible symbol)이라 한다. - X가 불필요한 심벌이라는 의미는 X가 terminal스트링을 생성할 수 없는 nonterminal심벌이거나, 또는 시작 심벌로부터 도달할 수 없는 심벌이라는 것이다. - 역으로, 필요한 생성 규칙들은 모두 terminating nonterminal과 도달 가능한 심벌들만으로 이루어져 있다고 말할 수 있다.
5.3 문법 변환(Transformations on Context-free Grammar) • 불필요한 생성 규칙을 제거하는 방법 1) terminating nonterminal을 구하여, terminal 스트링을 생성할 수 없는 nonterminal들을 구별해 내서 이 심벌들을 갖고 있는 모든 생성 규칙들을 제거한다. 2) 다음으로 도달 가능한 심벌들을 구하여, 도달 불가능한 심벌들을 구별해 내서 이 심벌들을 갖고 있는 모든 생성 규칙들을 제거해야 한다.
5.3 문법 변환(Transformations on Context-free Grammar) • terminating nonterminal을 구하는 알고리즘은 [알고리즘5.1] Terminating nonterminal을 구하는 방법: Algorithm terminating; begin VN’ := { A | AP, VT* }; repeat VN’ := VN’ { A | A P, (VN’ VT)* } until no change end. - 생성 규칙의 오른쪽이 모두 terminal만으로 이루어진 생성 규칙의 lhs는 당연히 terminal스트링을 유도하는 nonterminal이다.
5.3 문법 변환(Transformations on Context-free Grammar) - 또한, 이 nonterminal들과 terminal들로 이루어진 생성 규칙의 lhs(left-hand side)가 terminal을 생성할 수 있는 nonterminal에 속함. - 앞의 과정을 새로운 nonterminal이 더 추가되지 않을 때까지 반복, terminal을 생성할 수 있는 모든 nonterminal의 집합을 구함.
5.3 문법 변환(Transformations on Context-free Grammar) [예 10] P = { SA, SB, Ba } 다음과 같은 순서로 VN’이 변하지 않을 때까지 구함. VN’ = { B } VN’ = { B, S } 따라서, terminal 스트링을 생성할 수 없는 nonterminal은 VN - VN’ = { S, A, B } - { B, S } = { A } 그러므로, A를 갖고 있는 모든 생성 규칙을 제거하면, P’ = { S B, B a }가 된다.
5.3 문법 변환(Transformations on Context-free Grammar) • 도달 가능한 심벌을 구하는 방법 시작 심벌로부터 도달할 수 있는 심벌을 차례로 마크(mark)해 나가고, 또 마크된 심벌로부터 유도할 수 있는 심벌은 도달할 수 있기 때문에 마크 한다. 더 이상 마크 되는 심벌이 나타나지 않을 때 마크 된 모든 심벌들이 도달 가능한 심벌들의 집합이다. 이 과정은 알고리즘 [5.2]와 같다.
5.3 문법 변환(Transformations on Context-free Grammar) •[알고리즘 5.2]도달 가능한 심벌을 구하는 방법: Algorithm accessible; begin V’ := { S }; repeat V’ := V’ { X | some A X P, A V’ } until no change end. - V’은 도달 가능한 심벌의 집합, 이것으로부터 도달 불가능한 심벌을 구별해 내고, 도달 불가능한 심벌을 갖는 생성 규칙을 모두 제거.
5.3 문법 변환(Transformations on Context-free Grammar) •[예11] 다음 문법으로 [알고리즘 5.2]를 적용해 보면, G : S aB A aB A aC B C C b 다음과 같이 V’이 변하지 않을 때 까지 반복. V’ = { S } V’ = { S, a, B } V’ = { S, a, B, C } V’ = { S, a, B, C, b } 따라서, 도달 불가능한 심벌은, V - V’ = { S, A, B, C, a, b } - { S, a, B, C, b } = { A } 그러므로, 도달 불가능한 심벌을 갖고 있는 모든 생성 규칙을 제거하면, P’ = { S aB, BC, C b }. - 주어진 문법으로부터 불필요한 생성 규칙을 제거하기 위해서는, [알고리즘 5.1]을 적용하고, 다음에 [알고리즘 5.2]를 적용.
5.3 문법 변환(Transformations on Context-free Grammar) •[예12] P = { SaS, SA, SB, AaA, Ba, Caa }일때, 불필요한 생성 규칙을 제거하는 방법은 다음과 같다. [알고리즘 5.1]을 적용하여 terminal스트링을 유도할 수 있는 nonterminal을 구하면, VN’ = { B, C } VN’ = { B, C } { S } = { B, C, S } VN’ = { B, C, S } = { B, C, S } 이다. 따라서, A가 terminal스트링을 생성할 수 없는 nonterminal이므로 P’ = { S aS, SB, Ba, Caa }가 된다.
5.3 문법 변환(Transformations on Context-free Grammar) - [알고리즘 5.2]를 적용하면, V’ = {S} V’ = {S} { a, B } = { S, a, B } V’ = {S, a, B} = { S, a, B } 이다. 그러므로, C가 도달할 수 없는 심벌이기 때문에, P” = { SaS, SB, Ba } 가 된다. P”이 P로부터 구해진 유용한 생성 규칙만으로 이루어진 집합이다.