500 likes | 955 Views
COMPILER. Chapter 2. í˜•ì‹ ì–¸ì–´. ê¹€ ì˜ ê· ygkim@cespc1.kumoh.ac.kr. Contents. 1. 컴파ì¼ëŸ¬ ê°œë¡ 2. 형ì‹ì–¸ì–´ 3. ì •ê·œì–¸ì–´ 4. ì–´íœ˜ë¶„ì„ 5. Context-free 문법 6. êµ¬ë¬¸ë¶„ì„ 7. LL êµ¬ë¬¸ë¶„ì„ 8. LR 구문분ì„. 2. 형ì‹ì–¸ì–´. • 언어 (Language) • 문법 (Grammar) • ë¬¸ë²•ì˜ ë¶„ë¥˜. 2.1 언어 (Language).
E N D
COMPILER Chapter 2. 형식 언어 김 영 균 ygkim@cespc1.kumoh.ac.kr
Contents 1. 컴파일러 개론 2. 형식언어 3. 정규언어 4. 어휘분석 5. Context-free 문법 6. 구문분석 7. LL구문분석 8. LR구문분석
2. 형식언어 • 언어(Language) • 문법(Grammar) • 문법의 분류
2.1 언어(Language) • 잘 정의 된 언어(Well defined language) 필요 - 형식언어(formal language)라 하며 보통 문장의 집합으로 정의 - 언어를 형식적으로 정의하고, 언어를 표현하는 방법으로 사용되는 문법(grammar)를 정의, 이론 설명
2.1 언어(Language) • 잘 정의 된 언어(Well defined language) - 문장들의 집합으로 정의, 알파벳(alphabet)은 언어의 문장을 이루는 기본적인 심벌(symbol)로 다음과 같이 정의 [ 정의2.1] 알파벳 T는 심벌들의 유한 집합이다 예1) 다음과 같은 집합 T1, T2, T3은 알파벳이 될 수 있다. T1 = { ㄱ, ㄴ, ㄷ, ..., ㅎ, ㅏ , ㅑ, ..., ㅡ, ㅣ } T2 = { A, B, C, ..., Z } T3 = { begin, integer, ... , end}
2.1 언어(Language) [ 정의2.2] 알파벳 T에 대한 스트링(string)은 알파벳T에 속하는 심벌이나 T에 속하는 하나 이상의 심벌들을 이은 것이다. 예2) T={a,b}일때, a,b,aa,ab,ba,bb,aaa,...는 모두 T로부터 만들 수 있는 스트링이다. [ 정의2.3] 스트링의 길이는 스트링을 이루는 심벌들의 개수이며, 어떤 스트링 의 길이는 | |로 표기 한다. 예3) =a1a2a3...ak이면, | | = k 이다.
2.1 언어(Language) [ 정의2.4] 스트링의 접속(concatenation)은 스트링을 연속으로 연결한 것이다. 즉, 스트링 u,v가 각각 u=a1a2...an, v=b1b2...bm일때, uv=a1a2...anb1b2...bm이며 uv는 간단히 uv로 표기한다. uv에서 u를 prefix, v를 suffix라 한다. 접속 연산은 교환 법칙을 만족하지 않으며, 항상 | uv | = |u|+|v|가 된다.
2.1 언어(Language) [ 정의2.5] 스트링의 길이가 영인 것을 empty스트링이라 하며 (epsilon)으로 표기하고, 어떤 스트링 u,v에 대하여 다음과 같은 속성이 있다. u = u = u uv = uv • empty스트링을 (lambda)로도 표시. 만약 접속을 곱셈 연산자로 생각하면, 은 곱셈의 항등원인 1과 같은 역할 • an은 a가 n개 연결된 스트링을 표시, a0은 empty 스트링을 나타냄 즉, an=aa...a(n개), 그리고 a0= 이다 • R은 스트링의 역순이다. 예를 들어, =v1v2...vn이면, R=vn...v2v1이다.
2.1 언어(Language) [ 정의2.6] 알파벳T에 대하여 T*는 empty스트링을 포함하여 T에 속하는 심벌로 이루어질 수 있는 모든 스트링의 집합이다. 알파벳 T에 대하여 T+는 T*에서 empty스트링을 제외한 모든 스트링의 집합이다. T+ = T* - { } 예4) (1) T={0}일때, T*={ ,0,00,000,...} T+={0,00,000,...} 이다. (2) T={a,b}일때, T*={ ,a,b,aa,ab,ba,bb,aaa,aab,...} T+={a,b,aa,ab,ba,bb,aaa,aab,...} 이다. T* 는 T star로, L+는 L dagger로 읽는다.
2.1 언어(Language) 알파벳 T는 항상 유한 집합이며, 그에 해당하는 T*는 항상 무한 집합이 된다 접속 연산에 대해 T*는 다음과 같은 속성을 갖는다. 임의의 u,v T*, uv T* 이다. 결국, T*는 알파벳 T에 속하는 심벌로부터 만들 수 있는 스트링의 전체 집합(universal set)이다. [정의 2.7] 알파벳 T에 대하여 언어 L은 T*의 부분 집합이다. ( A language L over the alphabet T is a subset of T* , Or a language is any set of string over an alphabet.)
2.1 언어(Language) • T*에 속하는 스트링 중에 특정한 형태만을 모아 놓은 집합이 언어 에 속하는 스트링의 수가 유한개일 때 유한언어(finite language) 무한개일 때 무한 언어(infinite language)라 한다. 예5) T={a,b}일 때, (1) L1= T* ={,a,b,aa,ab,...}는 언어이다. (2) L2= {a,ba,aba}는 언어이다. (3) L3= {ap | p는 소수(prime number)}는 언어이다 (4) L4= {anbn | n 1}는 언어이다. • 여기서 언어는 의미의 개념은 포함하지 않는다. 언어란 단지 스트링들의 집합, 형식언어 이론은 스트링 집합의 속성에 관한 이론, 즉, 언어의 구문구조(syntactic structure)에 관해서만 다룸.
2.1 언어(Language) [정의 2.8] 두 언어 L과 L’의 곱(product) L·L’은 L에 속하는 스트링과 L’에 속하는 스트링을 접속한 것으로 간단히 LL’으로 나타낼 수 있다. 교환 법칙은 성립하지 않는다. LL’ = { xy | xL 그리고 y L’ } [예6] L2{a,b} = {aa, ab, baa, bab, abaa, abab} L3L4 = { ap+n bn | p는 소수, n 1 } [정의 2.9] 언어 L의 거듭제곱(power)은 순환적(recursive)으로 아래와 같이 정의 된다. L0 = {} Ln=LLn-1 for n1.
2.1 언어(Language) [정의 2.8] 두 언어 L과 L’의 곱(product) L·L’은 L에 속하는 스트링과 L’에 속하는 스트링을 접속한 것으로 간단히 LL’으로 나타낼 수 있다. 교환 법칙은 성립하지 않는다. LL’ = { xy | xL 그리고 y L’ } [예6] L2{a,b} = {aa, ab, baa, bab, abaa, abab} L3L4 = { ap+n bn | p는 소수, n 1 } [정의 2.9] 언어 L의 거듭제곱(power)은 순환적(recursive)으로 아래와 같이 정의 된다. L0 = {} Ln=LLn-1 for n1.
2.1 언어(Language) [예7] L = { a, ba, aab} 일때, L0 = { } L1 = { a, ba, aab } L2 = { aa,aba,aaab,baa,baba,baaab,aaba,aabba,aabaab } [정의 2.10 ] 언어 L의 L*(reflexive transitive closure)는 다음과 같이 정의 된다. L* = L0 L1 L2 ··· Ln ··· = Li i=0 [정의 2.11] 언어 L의 L+(transitive closure)는 아래와 같이 정의 된다. L+ = L1 L2 ··· Ln ··· = L* - L0
2.1 언어(Language) • 각 언어마다 고유의 알파벳 T가 존재. T로부터 만들 수 있는 스트링 전체의 집합이 T*, 어떤 규칙에 맞는 특정한 형태의 스트링을 모아 놓은 집합이 언어. 한 언어에 속하는 스트링을 그 언어의 문장(sentence)이라 함.
2.2 문법(Grammar) • 언어는 문장들을 원소로 갖는 집합 • 유한 언어 그 집합에 속하는 모든 스트링을 열거함으로써 표현 • 무한 언어 그 언어의 유한 표현(finite representation)을 찾아야 함. • 무한 언어의 유한 표현 모든 언어에 대해 항상 유한 표현이 존재하는 것은 아님. 1) 조건 제시법 2) 언어 생성 시스템인 문법 3) 언어의 인식기(recognizer)
2.2 문법(Grammar) [정의 2.12] 문법은 다음과 같이 네 가지 항목으로 정의 된다. G = (VN, VT, P, S) 1. VN : nonterminal 심벌의 유한 집합 2. VT : terminal 심벌의 유한 집합 VN VT = VN VT =V 3. P : 생성규칙(production rule)의 유한 집합 각 생성 규칙의 형태는 아래와 같다. , 여기서 V+, V*. 왼쪽 를 left-hand side(lhs)라 하고, 오른쪽를 right-hand side(rhs)라 부른다. 는 단순히 대치되는 것을 나타낸다. 4. S : VN에 속하는 심벌로서 다른 nonterminal들과 구별하여 시작 심벌(start symbol) 혹은 문장 심벌(sentence symbol)이라 한다.
2.2 문법(Grammar) • 각 생성 규칙 구조를 구조로 정의(::= )_한다는 의미, 유도 과정에서 가 나타날 때마다 로 대치할 수 있다는 의미 예8) G = ( {S,A}, {a,b}, P, S ), P : S aAS S a A SbA A ba A SS 여기서 nonterminal 집합은 {S,A} 이고, terminal 집합은 {a,b}이며, 시작심벌은 S이다. 생성 규칙의 개수는 다섯 개 이다. 생성 규칙의 왼쪽이 같은 경우에 간단히 축약하여 표기 가능 예) 1, 2가 있을 때 1 | 2로 표기. P : S aAS | a A SbA | ba | SS 문법 정의에서 P(생성 규칙의 집합)가 구문구조를 정의하는 핵심부분.
2.2 문법(Grammar) • Nonterminal심벌은 주로 A,B,C, ...등과 같이 대문자를 사용. Terminal심벌은 a,b,c,...등과 같이 주로 소문자를 사용. 시작 심벌은 대문자 S를 사용 예) P : S aA | bB | A bS B aS 와 같은 생성 규칙이 주어졌을 때, 시작 심벌은 S이고, nonterminal심벌의 집합은 {S,A,B}이고, terminal 심벌의 집합은 {a,b}이다. [정의 2.13] 는 직접 유도된다(directly derive)고 말하며, 만약 가 존재하고, , V*이면, 로 표기 한다. 즉, 한 스트링에서 생성 규칙을 한 번 적용해서 다른 스트링으로 바뀌는 것을 나타냄. *는 0번 이상의 유도(zero or more derivations)된 과정을 나타낸다.
2.2 문법(Grammar) • 즉, a1,a2,a3, ..., an이 V*에 속하고, a1a2 a3 , ... , an이 존재한다면, a1 *an으로 쓸 수 있다. 이때, an이 a1로 부터 유도될 수 있다(derivable) 고 말한다. +는 한 번 이상의 유도( one or more derivations)된 과정을 나타낸다. • 어떤 스트링 a가 V*에 속한다(aV*)는 의미는 a가 nonterminal심벌과 terminal심벌들로 구성된 스트링이라는 것이다. [정의 2.14] S * 이고 가 V*에 속하면 를 문장 형태(sentential form) 라 하고, 가 VT*에 속할 경우 를 문장(sentence)이라 한다. 즉, 문장 형태 중 nonterminal 심벌을 포함하지 않은 것이 문장이다. • 문장이라 것은, 문법 G가 주어졌을 때, 문법 G의 시작 심벌로부터 유도될 수 있고, 모두 terminal로 이루어진 스트링을 의미.
2.2 문법(Grammar) 예10) 예제9의 문법에서 시작 심벌로부터 abba를 유도하는 과정을 고려해 보자. S aA ( 생성 규칙 S aA를 적용) abS ( 생성 규칙 A bS를 적용) abbB ( 생성 규칙 S bB를 적용) abbaS ( 생성 규칙 B aS를 적용) abba ( 생성 규칙 S 을 적용) 여기서 S, aA, abS, abbB, abbaS, abba는 문장 형태 이고, 모든 심벌이 terminal로만 구성된 abba는 문장 이다. 이때, 일련의 유도과정을 S * abba로 나타낼 수 있으며, abba는 문법에 의해 생성되는 문장 이라 부른다.
2.2 문법(Grammar) [정의 2.15] 문법 G에 의해 생성되는 언어는 G에 의해 생성되는 문장의 집합이며, L(G)로 표기한다. L(G) = { | S * , VT* } 즉, 문법 G가 주어졌을 때, L(G)는 시작 심벌로부터 유도될 수 있는 모든 문장의 집합을 의미한다.
2.2 문법(Grammar) 예 11) 다음과 같은 문법 G1이 주어졌을 때, L(G1)을 구해 보자. G1 = ( { S }, { a }, P, S ), P : S a | aS 시작 심벌 S로부터 두 가지 생성 규칙을 적용할 수 있는데, 먼저 S a 를 적용할 경우, a는 terminal이기 때문에 문법 G1에 의해 생성되는 문장이고, S aS를 적용하여 길이가 짧은 순으로 유도한다면, S aS ( 생성 규칙 S aS를 적용) aa ( 생성 규칙 S a 를 적용) 가 되어 aa도 G1에 의해 생성되는 언어에 속하는 문장이다. 이와 같은 일련의 유도 과정을 살펴보면, 다음과 같다. S a aL(G1) S aS aa aaL(G1) S aS aaS aaa aaaL(G1) 즉, 문법 G1에 이해 생성되는 언어 L(G1)은 L(G1) = { an | n 1 }가 됨을 알 수 있다.
생성 문법 언어 고안 그림 2.1 문법과 언어의 관계 2.2 문법(Grammar) • 주어진 문법 G에 대해서 언어 L(G)를 찾을 수 있으며 주어진 언어 L에 대해서 문법 G를 만들 수 있다.
2.2 문법(Grammar) • 주어진 문법으로부터 생성되는 언어를 어떻게 찾을 것인가를 살펴보자. L(G)의 정의가 시작 심벌로부터 길이가 짧은 순으로 생성 규칙을 적용 하여 문장을 생성. 생성된 문장들의 형태를 고려하여 일정한 규칙을 찾아냄. 예12) G2= ( {O,E}, {a}, P, O ), P : O a O aE E aO 문법 G2가 생성하는 언어 L(G2)를 구하기 위해서는 시작 심벌로부터 주어진 생성 규칙을 적용하여 문장을 길이 순으로 유도. • 시작 심벌 O로부터 두 가지 생성 규칙을 적용, 먼저 O a 를 적용, 길이가 짧은 순으로 유도한다면, O aE aaO aaa 가 되어 aaa도 G2에 의해 생성되는 언어에 속하는 문장이다.
2.2 문법(Grammar) • 위의 내용을 일련의 과정으로 나타내면 다음과 같다. O a a L(G2) O aE aaO aaa aaa L(G2) O aE aaO aaaE aaaaO aaaaa aaaaa L(G2) 즉, 문법 G2에 의해 생성되는 언어 L(G2)는 L(G2) = { a2n+1 | n 0 } 가 된다.
2.2 문법(Grammar) 예 13) 문법 G3이 G3 = ( {A,B,C}, {a,b,c}, P,A ), P : A abc A aBbc Bb bB Bc Cbcc bC Cb aC aaB aC aa 생성되는 언어를 찾기 위해 시작 심벌 A로부터 유도되는 과정은 A abc ( 생성 규칙 A abc 적용) A aBbc ( 생성 규칙 A aBbc 적용) abBc ( 생성 규칙 Bb bB 적용) abCbcc ( 생성 규칙 Bc Cbcc 적용) aCbbcc ( 생성 규칙 bC Cb 적용) aabbcc ( 생성 규칙 aC aa 적용) A aBbc abBc abCbcc aCbbcc aaBbbcc aabBbcc aabbBcc aabbCbccc aabCbbccc aaCbbbccc aaabbbccc ...
2.2 문법(Grammar) • 여기서 생성되는 문장의 형태는 L(G3) = { anbncn | n 1} 가 됨을 알 수 있다. • 주어진 문법으로부터 생성되는 언어를 찾는 과정은 일정한 규칙이 없기 때문에, 반복적인 연습이 필요. 시작 심벌로부터 문장의 길이 순으로 문장을 생성한 후 생성된 문장들로부터 일정한 규칙을 찾아낸다. • 특정한 형태의 언어를 생성하는 문법을 만드는 일을 문법을 고안한다(grammar design)고 말한다. • 한 개의 명칭을 terminal 심벌 a라 가정하면, 명칭 리스트(identifier list) 는 a, a, ..., a의 형태를 이룬다.
2.2 문법(Grammar) • 이 형태의 특징은 a가 반복되다가 a로 끝난다. 따라서, I를 시작 심벌이라 하면, I a, I I a 가 된다. 여기서 첫번째 생성 규칙이 a,를 반복적으로 만드는 규칙. 이렇게 반복되는 부분은 생성 규칙을 순환적(recursive)으로 작성함으로써 가능. • 일반적으로 an을 생성하는 생성 규칙의 형태는 A aA • 언어 {an | n 0 }의 형태를 생성하는 문법은 A aA | 이고, • { an | n 1 }의 형태를 생성하는 문법은 A aA | a 가 된다.
2.2 문법(Grammar) 예 14) 언어 L1 = { anbn | n 1 }를 생성하는 문법을 고안해 보자. 언어 L1에 속하는 문장의 형태는 a가 먼저 나오고 b가 나오는데, a와 b의 개수가 같은 경우이다. 같은 수의 terminal 심벌을 생성해야 하기 때문에 생성 규칙의 형태가 nonterminal심벌이 terminal 심벌 사이에 내장되어 있어야 한다. 즉, S aSb 가 되어야 한다. 이와 같은 형태의 생성 규칙을 embedded 생성 규칙이라 부른다. 따라서, 언어 L1을 생성하는 문법은 S aSb | ab가 된다.
2.2 문법(Grammar) 예 15) L2 = { 0i1j | i j, i, j 1 } 인 경우를 생각해 보자. i와 j가 같지 않기 때문에 i>j인 경우와 i<j인 경우로 나누어 생각한다. (1) i>j일 때, 0이 많은 경우이므로 먼저 같은 수의 0과 1을 생성한 후에 남은 0을 생성할 수 있으면 된다. 따라서, 생성 규칙들은 다음과 같다. S 0A1 A 0A1 | 0A | 0 예를 들어, 0412의 생성 과정을 나타내면 다음과 같다. S 0A1 00A11 000A11 000011
2.2 문법(Grammar) (2) i < j인 경우 생성 규칙들은 다음과 같다. S 0B1 B 0B1 | B1 | 1 이 규칙으로 0보다 1이 많은 경우를 생성할 수 있는데, 예를 들어, 0214의 생성 과정을 적어 보면 다음과 같다. S 0B1 00B11 00B111 001111 여기서, 언어 L2는 0과 1의 개수가 다르기 때문에, (1)과 (2)를 모두 고려 하여 구하고자 하는 문법은 S 0A1 | 0B1 A 0A1 | 0A | 0 B 0B1 | B1 | 1
2.2 문법(Grammar) • 같은 언어를 생성하는 문법은 여러 형태가 될 수 있다. 주어진 문법으로부터 생성되는 언어는 유일, 주어진 언어를 생성하는 문법은 다양한 형태가 될 수 있다. 따라서, 한 언어를 생성하는 문법은 문법 고안자에 따라 달라질 수 있다. 예를 들어, an을 생성하는 생성 규칙의 형태는, A aA (right-recursive) 또는 A Aa (left-recursive) 가 될 수 있다. • 문법을 고안할 때 nonterminal의 이름은 구문 구조를 대변할 수 있는 명칭으로 쓰는 것이 전체적으로 문법을 쉽게 이해할 수 있다.
2.2 문법(Grammar) • 다음은 위에서 정의한 명칭 리스트에 대한 예이다. <identifier_list> <identifier>, <identifier_list> <identifier_list> <identifier> • 일반적으로 한 문법이 어떤 언어 L을 생성한다는 것을 증명하기 위해서는, (1) 그 문법으로부터 생성되는 모든 문장(sentence)이 L에 속한다는 것을 보인 다음, (2) 역으로 L에 속하는 모든 스트링(string)이 그 문법에 의해서 생성될 수 있다는 것을 증명. 증명의 방법 : 수학적 귀납법일 대부분 사용.
2.2 문법(Grammar) 예 16) G = ( {S} , {(, )}, { S (S)S | }, S ) L = { | 는 균형을 이룬 괄호로 구성되어 있다. } [증명] ( ) G가 생성하는 언어가 L임을 보이기 위하여, S로부터 유도되는 모든 문장은 균형을 이루는 괄호(balanced parenthesis) 되어 있다는 것을 증명해야 한다. 유도 과정의 횟수 k에 대하여 귀납적으로 증명해 보자. (1) k=1일 때, S , 여기서 은 확실히 균형을 이루기 때문에 성립. (2) k < n 인 경우, S로부터 유도 되는 모든 문장이 균형을 이룬다고 가정하자. (3) k = n인 경우의 좌측 유도 과정을 살펴보면, S (S)S * (x)S * (x) y 의 유도 과정 형태를 이룸.
2.2 문법(Grammar) • 여기서, x와 y는 S로부터 n단계 이내에 유도 되기 때문에, 가정에 의해 균형을 이루는 괄호로 구성된다. 그러므로 (x)y는 균형을 이루는 괄호로 구성된다. 따라서, S로부터 유도되는 모든 문장은 균형을 이루는 괄호로 구성되어 있다. ( ) L을 생성하는 문법이 G임을 보이기 위하여, 균형을 이루는 괄호로 구성된 모든 스트링이 S로부터 유도될 수 있다는 것을 증명해야 한다. • 균형을 이룬 스트링 의 길이에 대한 귀납법으로 증명해 보자. (1) | | = 0일 때, S 이기 때문에 성립한다. (2) | | < 2n인 경우, 모든 균형을 이룬 괄호로 구성된 스트링이 S로부터 유도될 수 있다고 가정하자.
2.2 문법(Grammar) (3) | | = 2n인 경우를 고려해 보자. 의 prefix에서 균형을 이룬 가장 짧은 스트링을 (x)라 하자. 그러면, = (x) y 형태로 표현된다. 여기서 가 균형을 이루기 때문에, 역시 x,y도 균형을 이룬 괄호로 구성되어 있다. 그런데, x와 y의 길이가 2n보다 작으므로 귀납적 가설에 의해 S로부터 유도될 수 있다. 그러므로, 다음과 같은 유도 과정이 존재한다. S (S)S * (x)S * (x) y = 따라서, 도 S로부터 유도될 수 있다.
2.2 문법(Grammar) • 문법은 언어의 구조를 간단하고 명료하게 기술할 수 있기 때문에 문법으로 설명하는 것이 훨씬 효과적 • 주어진 언어를 생성하는 문법을 찾는 일은 언어 고안자(language designer) 가 새로운 형태의 언어를 고안하는 데 이용된다. • 문법을 고안하는 데는 실제로 의미까지 포함되어야 하므로, 어려운 일이며, 프로그래밍 언어에 대한 문법은 기존 언어에 대한 연습을 통해서, 새로운 언어에 대한 문법을 고안할 수 있다.
2.3 문법의 분류 • 앞에서 정의한 문법의 개념은 Chomsky, Noam에 의해서 처음으로 소개 • 문법을 생성 규칙의 형태에 따라 네 종류로 나누었는데 그 형태는 다음과 같다. Type 0 문법(unrestricted grammar) : 생성 규칙에 어떤 제한도 두지 않는다. Type 1 문법(context-sensitive grammar ; csg) : 모든 생성 규칙 에서 의 길이가 의 길이보다 길다. 즉, | | | | Type 2 문법(context-free grammar ; cfg) : 모든 생성 규칙은 A의 형태를 갖는다. 여기서, A는 하나의 nonterminal 심벌이며, 는 V*에 속하는 스트링이다.
2.3 문법의 분류 Type 3 문법(정규문법 ; regular grammar ; rg) : 생성 규칙은 두가지 형태로 표현될 수 있는데, (1) A tB 혹은 A t, 여기서 t VT*이고, A,B VN이다. (2) A Bt 혹은 A t, 여기서 t VT*이고, A,B VN이다. 첫번째 형태를 우선형(right-linear)문법이라 하고, 두번째 형태를 좌선형(left-linear) 문법이라 한다. • 생성 규칙의 제약에 따라 문법을 분류하는 방법은 각 문법이 서로 계층적 포함 관계를 갖게 되는데, 이것을 촘스키 계층(Chomsky Hierarchy)이라 부른다. 또한, 각 문법의 종류에 따른 언어가 존재한다. 즉, unrestricted 문법에 의해서 생성되는 언어를 순환적으로 열거할 수 있는 언어(recursively enumerable)언어라 부른다.
2.3 문법의 분류 [정의 2.16] 1. 정규 문법에 의해 생성될 수 있는 언어를 정규 언어. 2. Context-free문법에 의해 생성될 수 있는 언어를 context-free언어. 3. Context-sensitive문법에 의해 생성되는 언어를 context-sensitive언어. 예17) (1) (예11)의 문법은 정규 문법이고 언어 { an | n 1 }는 정규 언어이다. (2) (예13)의 문법은 context-sensitive문법이고 언어 { anbncn | n 1 }는 context-sensitive 언어이다. • 정규문법은 context-free문법의 형태를 만족한다. 따라서 모든 정규 언어는 또한 context-free언어가 될 수 있다. 이와 같은 논법이 모든 종류의 문법에 모두 적용된다.
2.3 문법의 분류 예18) 언어 L = { anbn | n1 }이 context-free언어 임을 증명해 보자. 예14)에서 구했듯이 L을 생성하는 문법은 context-free문법의 형태를 갖는다. 따라서, L은 context-free언어이다. 언어 L(G1) = { anbncn | n1 }는 아래와 같은 context-sensitive문법에 의해 정의 된다. G1 = ( { S,B,C}, {a,b,c}, P, S), P : 1. S aSBC 4. bC bc 2. S abC 5. CB BC 3. bB bb 6. cC cc
2.3 문법의 분류 • 예를 들어, 스트링 a2b2c2을 위한 유도 과정을 나타내면 다음과 같다. S aSBC 생성 규칙 1번 적용 aabCBC 생성 규칙 2번 적용 aabBCC 생성 규칙 5번 적용 aabbCC 생성 규칙 3번 적용 aabbcC 생성 규칙 4번 적용 aabbcc 생성 규칙 6번 적용 는 i번째, 생성 규칙을 적용해서 유도되는 것을 나타낸다. i 위 유도 과정은 다음과 같이 나타낼 수 있다. S aSBC aabCBC aabBCC aabbCC aabbcC aabbcc 1 2 5 3 4 6 언어 L(G2) = { anban | n 1}를 생성하는 context-free문법은 다음과 같다. G2 = ( { S,C }, { a,b }, P, S ),
2.3 문법의 분류 • 언어 L(G2) = { anban | n 1}를 생성하는 context-free문법은 다음과 같다. G2 = ( { S,C }, { a,b }, P, S ), P : S aCa C aCa C b 예를 들어, a3ba3의 유도 과정을 적어 보면 다음과 같다. S aCa aaCaa aaaCaaa aaabaaa
2.3 문법의 분류 • context-free문법 중에서 생성 규칙의 오른쪽에 한 개 이하의 nonterminal 을 가질 수 있다는 제약을 둔 것이 정규 문법이다. L(G3) = { anbam | n, m 1 }를 생성하는 정규 문법은 다음과 같다. G3 = ( { S, B, C }, {a,b}, P, S ), P : S aS S aB B bC C aC C a 예를 들어, 스트링 a3ba2은 아래와 같은 유도 과정을 갖는다. S aS aaS aaaB aaabC aaabaC aaabaa
2.3 문법의 분류 • 형식 언어 이론에서 자주 등장하는 언어들 1. 단순 매칭 언어(simple matching language) : Lm = { anbn | n 0 } context-free 언어 2. 중복 매칭 언어(double matching languae) : Ldm = { anbncn | n 0 } context-sensitive 언어 3. 좌우 대칭 언어(mirror image language) : Lmi = { R | VT* } context-free 언어 4. 회문 언어(palindrome language) : Lr = { | = R } context-free 언어 5. 괄호 언어(parenthesis language) : Lp = {| 는 균형을 이룬 괄호로 구성되어 있다. } context-free 언어
2.3 문법의 분류 정규언어 Context-free언어 Context-sensitive언어 Unrestricted 언어 그림 2.2 언어의 포함 관계
2.3 문법의 분류 • 언어 표현의 다른 방법 인식기(recognizer) 인식기에 의해 정의되는 언어는 이 인식기(accept)가 받아들이는 스트링의 집합. • 문법의 계층적 구조에서 문법의 각 형태가 정의하는 언어와 같은 언어를 인식하는 인식기의 종류는 다음과 같다. 1. 언어 L은 정규 언어이다. 즉, 언어 L은 유한 오토마타에 의해 인식된다. 2. 언어 L은 context-free언어이다. 즉, 언어 L은 푸시다운 오토마타에 의해 인식된다. 3. 언어 L은 context-sensitive언어이다. 즉, 언어 L은 linear-bounded 오토마타에 의해 인식된다. 4. 언어 L은 type 0언어이다. 즉, 언어 L은 튜링 기계(Turing machine)에 의해 인식된다.
2.3 문법의 분류 •각 문법 형태에 따른 언어와 이를 인식하는 인식기를 요약 Grammar Language Recognizer Recursively enumerable set Turing machine Type 0(unrestricted) Context-sensitive language Linear bounded automata Type 1(context-sensitive) Pushdown automata Context-free language Type 2(context-free) Finite automata Type 3(regular) Regular language