context-free languages
DESCRIPTION
Context-Free Languages. Introduction. -> -> -> -> -> laughs -> apple | girl -> red. Introduction. -> + - PowerPoint PPT PresentationTRANSCRIPT
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>
• <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-fr
ee 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 의 접두부임 }
좌측우선 / 우측우선 유도
1. S -> AB
2. A -> aaA
3. A ->
4. B -> Bb
5. 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 의 유도 트리가 되기 위한 필요충분조건
1. 루트 노드의 라벨은 시작 심볼 S2. 각 리프 노드의 라벨은 T {} 의 심볼3. 각 내부 노드의 라벨은 V 의 심볼4. 만약 라벨이 AV 인 노드가 라벨이 a1, a2, …, an 인
자식 노드들을 갖는다면 , P 는 다음 형태의 생성규칙을 갖고 있어야 함
A->a1a2…an5. 라벨이 인 자식 노드는 형제 노드가 없다 . 즉 , 라벨이
인 자식 노드를 갖는 노드는 다른 자식들을 가질 수 없음
부분 유도트리
2.a 모든 리프 노드의 라벨은 VT{} 의 심볼3. 각 내부 노드의 라벨은 V 의 심볼4. 만약 라벨이 AV 인 노드가 라벨이 a1, a2,
…, an 인 자식 노드들을 갖는다면 , P 는 다음 형태의 생성규칙을 갖고 있어야 함
A->a1,a2,…,an5. 라벨이 인 자식 노드는 형제 노드가 없다 .
즉 , 라벨이 인 자식 노드를 갖는 노드는 다른 자식들을 가질 수 없음
예제 5.6
S -> aAB,
A -> bBb,
B -> A |
S
a A B
b B b
abbbb 유도
예제 5.6
S -> aAB,
A -> bBb,
B -> A |
S
a A
b B b
abbbb 유도
B
A
b B b
파싱과 모호성
파싱
• L(G) 에 속하는 w 가 유도되는 데 사용된 일련의 생성 규칙들을 찾는 과정 => 파싱
파싱단계 ( 좌측유도 )
1. 다음과 같은 시작 심볼을 좌변에 갖는 모든 생성규칙 S->x
시작 심볼 S 로부터 한 단계에 유도될 수 있는 모든 문장 형태 x 를 찾는다 .
2. 만약 , 어떤 x 도 w 와 일치하지 않으면 , 다음 라운드에서 각 x 의 가장 왼쪽 변수에 적용될 수 있는 모든 생성 규칙들을 적용 , 새로운 문장 형태들의 집합 생성
3. 새롭게 생성된 문장 형태들 가운데 w 로 유도될 수 없는 문장 형태는 제외
4. w 와 일치되는 문장이 생성 될 때까지 2,3 번 수행
파싱단계 ( 좌측유도 )
• 철저한 탐색 파싱 (exhaustive search parsing)
• 하향식 파싱 (top-down parsing)
예제 5.7
• 다음의 생성 규칙을 갖는 문법 G 에서 문자열 w=aabb 가 유도 되는지의 여부확인
S->SS|aSb|bSa|
• S->SS|aSb|bSa|• 첫 라운드
1. S=>SS2. S=>aSb3. S=>bSa4. 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 는 주어진 문법에 의해 생성되는 언어에 속한다 .
w=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
Sa b
S
a b
S
S
S
Sa b
S
a 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*cE
E
I
E
*E E
I
+
a
b
I
c
E
E
I
E
+E E
I
*
c
a
I
b
예제 5.11
• 우선순위 적용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
E
T
T
* F
+
F I
cI
a
T
F
I
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 문법