440 likes | 833 Views
Context-Free Languages. Introduction. <sentence> -> <noun phrase><verb phrase> <noun phrase> -> <adjective><noun phrase> <noun phrase> -> <noun> <verb phrase> -> <verb> <verb> -> laughs <noun> -> apple | girl <adjective> -> red. Introduction. <expression> -> <expression> + <expression>
E N D
Introduction • <sentence> -> <noun phrase><verb phrase> • <noun phrase> -> <adjective><noun phrase> • <noun phrase> -> <noun> • <verb phrase> -> <verb> • <verb> -> laughs • <noun> -> apple | girl • <adjective> -> red
Introduction • <expression> -> <expression> + <expression> • <expression> -> <expression> * <expression> • <expression> -> (<expression>) • <expression> -> id
Introduction <expression> => <expression> * <expression> => (<expression>)*<expression> => (<expression>)*id =>(<expression>+<expression>)*id =>(<expression> + id) * id =>(id + id) * id
문맥자유언어 • 문맥자유언어 • 프로그래밍 언어 설계에 이용됨 • 효율적인 컴파일러 작성에 사용됨
문법 제약 완화 • 제약 • 생성규칙의 좌변은 반드시 하나의 변수 • 생성규칙의 우변은 특별한 형태(좌선형, 우선형 문법) • 완화 • 우변에 어떤 문자열이든 허용(문맥자유문법)
정의 5.1 • 문법 G = (V,T,S,P) 에서 모든 생성규칙이 A -> x. 의 형태를 가지면 G를 문맥-자유문법(context-free grammar:CFG)라고 한다. 여기서 A V 이고, x (V T)*이다. • 또한 언어 L이 L = L(G)를 만족하는 문맥-자유 문법 G가 존재하고 오직 그럴 때에만 L을 문맥-자유 언어(context-free language:CFL)라고 한다.
예제 5.1 • 생성규칙으로 문법 G = ({S}, {a,b}, S, P), S -> aSa, S -> bSb, S -> , 는 문맥-자유 문법이다. • 유도과정 • S=>aSa=>aaSaa=>aabSbaa=>aabbaa • L(G) = {wwR : w {a,b}*}.
예제 5.2 • 문법 G = ({S, A, B}, {a,b}, S, P)는 문맥-자유 문법이다. S -> abB, A -> aaBb, B -> bbAa, A -> • L(G) = {ab(bbaa)nbba(ba)n : n 0}
문법 • 선형문법 • 정규문법 • 문맥-자유 문법
예제 5.3 • 언어 L = {anbm : n m} 는 문맥-자유 언어이다. n > m 인 경우 n < m 인 경우도 해결가능 S -> AS1, S -> AS1|S1B, S1 -> aS1b | , S1 -> aS1b | , A -> aA | a. A -> aA | a, B -> bB | b.
예제 5.4 • 다음의 생성규칙을 갖는 문맥-자유 문법 G를 고려해보자 S -> aSb | SS | . • abaabb, aababb, ababab, … • L = {w {a, b}* : na(w) = nb(w) and na(v) nb(v), 단 v는 w의 접두부임}
S -> AB A -> aaA A -> B -> Bb B -> aab의 유도과정 S=>AB=>aaAB=>aaB =>aaBb=>aab S=>AB=>Abb=>aaABb=>aaAb=>aab 좌측우선/우측우선 유도 1 2 3 4 5 1 4 2 5 3
정의 5.2 • 유도 과정의 각 단계에서 각 문장 형태의 가장 좌측 변수가 대체되는 유도를 좌측우선유도 • 가장 우측 변수가 대체되는 유도를 우측우선 유도라고 함
예제 5.5 • 다음의 생성규칙을 갖는 문맥-자유 문법을 고려해 보자. S -> aAB, A -> bBb, B -> A | . 문자열 abbbb에 대한 좌/우측 우선 유도를 고려
유도트리 • 문자열의 유도 과정을 보이는 하나의 방법 • 유도 트리는 순서트리(ordered tree) • 부모노드 : 생성규칙의 좌변에 있는 변수 • 자식노드 : 생성규칙의 우변에 있는 심볼
유도트리 • A->abABC A a b A B c
정의 5.3 • G=(V,T,S,P)가 문맥-자유 문법이라 하면, 순서 트리가 G의 유도 트리가 되기 위한 필요충분조건 • 루트 노드의 라벨은 시작 심볼 S • 각 리프 노드의 라벨은 T {}의 심볼 • 각 내부 노드의 라벨은 V의 심볼 • 만약 라벨이 AV인 노드가 라벨이 a1, a2, …, an 인 자식 노드들을 갖는다면, P는 다음 형태의 생성규칙을 갖고 있어야 함 A->a1a2…an • 라벨이 인 자식 노드는 형제 노드가 없다. 즉, 라벨이 인 자식 노드를 갖는 노드는 다른 자식들을 가질 수 없음
부분 유도트리 2.a 모든 리프 노드의 라벨은 VT{}의 심볼 3. 각 내부 노드의 라벨은 V의 심볼 4. 만약 라벨이 AV인 노드가 라벨이 a1, a2, …, an 인 자식 노드들을 갖는다면, P는 다음 형태의 생성규칙을 갖고 있어야 함 A->a1,a2,…,an 5. 라벨이 인 자식 노드는 형제 노드가 없다. 즉, 라벨이 인 자식 노드를 갖는 노드는 다른 자식들을 가질 수 없음
예제 5.6 abbbb 유도 S -> aAB, A -> bBb, B -> A | S a A B b B b
예제 5.6 abbbb 유도 S -> aAB, A -> bBb, B -> A | S B a A A b B b b B b
파싱 • L(G)에 속하는 w가 유도되는 데 사용된 일련의 생성 규칙들을 찾는 과정=>파싱
파싱단계(좌측유도) • 다음과 같은 시작 심볼을 좌변에 갖는 모든 생성규칙 S->x 시작 심볼 S로부터 한 단계에 유도될 수 있는 모든 문장 형태 x를 찾는다. • 만약, 어떤 x도 w와 일치하지 않으면, 다음 라운드에서 각 x의 가장 왼쪽 변수에 적용될 수 있는 모든 생성 규칙들을 적용, 새로운 문장 형태들의 집합 생성 • 새롭게 생성된 문장 형태들 가운데 w로 유도될 수 없는 문장 형태는 제외 • w와 일치되는 문장이 생성 될 때까지 2,3번 수행
파싱단계(좌측유도) • 철저한 탐색 파싱(exhaustive search parsing) • 하향식 파싱(top-down parsing)
예제 5.7 • 다음의 생성 규칙을 갖는 문법 G에서 문자열 w=aabb가 유도 되는지의 여부확인 S->SS|aSb|bSa|
w=aabb • S->SS|aSb|bSa| • 첫 라운드 • S=>SS • S=>aSb • S=>bSa • S=> • 유도 3, 4는 고려대상에서 제외 • 두번째 라운드에서 1의 문장 형태 SS의 가장 좌측 변수 S에 생성규칙적용 • S=>SS=>SSS (1적용) • S=>SS=>aSbS (2적용) • S=>SS=>bSaS (3적용) • S=>SS=>S (4적용)
w=aabb • S->SS|aSb|bSa| • 두번째 라운드에서 2의 문장 형태로부터 • S=> aSb =>aSSb (1적용) • S=> aSb =>aaSbb (2적용) • S=> aSb =>abSab (3적용) • S=> aSb =>ab (4적용) • 위의 새로운 문장 형태들 중 일부 제외가능 • 다음 라운드에서 다음과 같은 유도 생성가능 • S=> aSb(2) =>aaSbb(2) => aabb(4) • 그러므로 aabb는 주어진 문법에 의해 생성되는 언어에 속한다.
철저한 탐색 파싱 • 문제점 • Exhaustive search 로 인한 효율성 저하 • w가 L(G)에 속하지 않을경우 종료되지 않을 수도 있음 => 종료조건 추가 • 바람직하지 않은 생성규칙 배제 • A => • A => B
예제 5.8 • S->SS|aSb|bSa| => S->SS|aSb|bSa|ab|ba • 모든 문자열 w{a,b}+에 대하여 철저한 탐색 파싱 방법은, 항상 |w|단계 이내에 모든 파싱 과정이 종료하게 됨 • 이는 각 유도 단계에서 나타나는 문장 형태가 최소한 한 개의 심볼이 증가 되기 때문 • 따라서, |w| 단계 후에는, w가 L(G)에 속하는지 여부를 알게 됨
정리 5.3 • 모든 문맥-자유 문법에 대하여 임의의 w L(G)를 |w|3에 비례하는 수의 단계 내에 파싱하는 알고리즘이 존재한다. • Harrison 1987, Hopcroft and Ullman 1979
정의 5.4 • 문맥-자유 문법 G=(V,T,S,P)의 모든 생성규칙들이 다음과 같은 형태이면 단순 문법 혹은 s-문법 이라 불린다. A->ax • 여기서 AV, aT, xV*이고 임의의 쌍(A,a)는 P에서 많아야 한 번 나타난다.
예제 5.9 • 문법 S->aS|bSS|c 는 s-문법이다. • 문법 S->aS|bSS|aSS|c 는 s-문법이 아니다. 그 이유는 쌍(S,a)가 두 생성규칙 S->aS와 S->aSS에서 나타나기 때문이다.
s-문법 • 만일 G가 s-문법이면, L(G)에 속한 모든 문자열 w가 |w|에 비례하는 노력으로 파싱 될 수 있다. • 문자열 w=a1a2…an에 대한 탐색, 좌변에 S가 있고 우변이 a1으로 시작하는 생성규칙은 많아야 하나 존재 S=>a1A1A2…Am • 그 다음에 변수 A1을 치환, 역시 많아야 하나의 선택 S=>a1a2B1B2…A2…Am
정의 5.5 • 문맥-자유 문법 G에서 두 개 이상의 서로 다른 유도 트리를 갖는 문자열 w가 존재하면, 문법 G는 모호하다(ambiguous)고 한다. • 즉 모호성은 어떤 문자열 w에 대해 두 개 이상의 좌측우선 혹은 우측우선 유도가 존재하는 것을 의미한다.
예제 5.10 • 생성규칙 S->aSb|SS|를 갖는 문법 G는 모호 함 • 문자열 aabb에 대해 S S a S b S S a S b a S b a S b
예제 5.11 • 문법 G=({E,I},{a,b,c,+,*,(,)},E,P)의 생성규칙 E-> I E->E+E E->E*E E->(E) I->a|b|c • (a+b)*c, a*b+c L(G)
예제 5.11 • a+b*c E E E + E E * E I E * E E + E I a I I I I c b c a b
예제 5.11 • 우선순위 적용 E E->I E->E+E E->E*E E->(E) I->a|b|c E->T T->F F->I E->E+T T->T*F F->(F) I->a|b|c E + T T T * F F F I I I c a b
정규/문맥-자유 언어 • 정규언어 • 프로그래밍 언어의 어휘, 단어 등 단순한 패턴 정의 • 문맥-자유 언어 • 정규 언어에서 해결하지 못하는 보다 복잡한 구성 모델링
프로그래밍 언어 • 기술 문법 • Backus-Naur 형(BNF) • BNF 표기의 예 <expression> ::=<term>|<expression>+<term> <term> ::=<factor>|<term>*<factor> • 단말심볼 : +, * • ::= 는 ->의 의미 • 변수 : 처음은 ‘<‘로 끝은 ‘>’로 표기
프로그래밍 언어 • Pascal에서 if-then-else 문장 <if_statement>::=if<expression<then_clause><else_clause> • s-문법에서 요구하는 규칙과 유사 • 프로그래밍 언어에서 왜 키워드를 쓰는가? • 여러 생성규칙 중 어떤 생성규칙을 적용해야 하는가를 알려줄 수 있는 하나의 방법
프로그래밍 언어 • 프로그래밍 언어의 모든 기능들이 s-문법에 의해서 정의 될 수는 없다. • 컴파일러 • LL문법 • LR문법