Context-Free Languages

Download Report

Transcript Context-Free Languages

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를 문맥-자유문법(contextfree 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 인 경우
S -> AS1,
S1 -> aS1b | ,
A -> aA | a.
n < m 인 경우도 해결가능
S -> AS1|S1B,
S1 -> aS1b | ,
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의 유도과정
1
2
1
4
3
S=>AB=>aaAB=>aaB
4
5
=>aaBb=>aab
2
S=>AB=>Abb=>aaABb
5
3
=>aaAb=>aab
정의 5.2
• 유도 과정의 각 단계에서 각 문장 형태의
가장 좌측 변수가 대체되는 유도를 좌측
우선유도
• 가장 우측 변수가 대체되는 유도를 우측
우선 유도라고 함
예제 5.5
• 다음의 생성규칙을 갖는 문맥-자유 문법
을 고려해 보자.
S -> aAB,
A -> bBb,
B -> A | .
문자열 abbbb에 대한 좌/우측 우선 유도
를 고려
유도트리
• 문자열의 유도 과정을 보이는 하나의 방
법
• 유도 트리는 순서트리(ordered tree)
– 부모노드 : 생성규칙의 좌변에 있는 변수
– 자식노드 : 생성규칙의 우변에 있는 심볼
유도트리
• A->abABC
A
a
b
A
B
c
정의 5.3
•
1.
2.
3.
4.
5.
G=(V,T,S,P)가 문맥-자유 문법이라 하면, 순서 트리가
G의 유도 트리가 되기 위한 필요충분조건
루트 노드의 라벨은 시작 심볼 S
각 리프 노드의 라벨은 T {}의 심볼
각 내부 노드의 라벨은 V의 심볼
만약 라벨이 AV인 노드가 라벨이 a1, a2, …, an 인
자식 노드들을 갖는다면, P는 다음 형태의 생성규칙
을 갖고 있어야 함
A->a1a2…an
라벨이 인 자식 노드는 형제 노드가 없다. 즉, 라벨이
인 자식 노드를 갖는 노드는 다른 자식들을 가질 수
없음
부분 유도트리
2.a 모든 리프 노드의 라벨은 VT{}의 심볼
3. 각 내부 노드의 라벨은 V의 심볼
4. 만약 라벨이 AV인 노드가 라벨이 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
S -> aAB,
A -> bBb,
B -> A | 
abbbb 유도
S
B
a
A
A
b
B
b
b
B


b
파싱과 모호성
파싱
•
L(G)에 속하는 w가 유도되는 데 사용된
일련의 생성 규칙들을 찾는 과정=>파싱
파싱단계(좌측유도)
1.
2.
3.
4.
다음과 같은 시작 심볼을 좌변에 갖는 모든 생성규칙
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|
•
•
S->SS|aSb|bSa|
첫 라운드
1.
2.
3.
4.
•
•
w=aabb
S=>SS
S=>aSb
S=>bSa
S=> 
유도 3, 4는 고려대상에서 제외
두번째 라운드에서 1의 문장 형태 SS의 가
장 좌측 변수 S에 생성규칙적용
–
–
–
–
S=>SS=>SSS
S=>SS=>aSbS
S=>SS=>bSaS
S=>SS=>S
(1적용)
(2적용)
(3적용)
(4적용)
•
•
S->SS|aSb|bSa|
w=aabb
두번째 라운드에서 2의 문장 형태로부터
–
–
–
–
•
•
aSb
aSb
aSb
aSb
=>aSSb
=>aaSbb
=>abSab
=>ab
(1적용)
(2적용)
(3적용)
(4적용)
위의 새로운 문장 형태들 중 일부 제외가능
다음 라운드에서 다음과 같은 유도 생성가
능
–
•
S=>
S=>
S=>
S=>
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
• 여기서 AV, aT, xV*이고 임의의 쌍
(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
a
S
b


S
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
I
E
*
a
E
*
E
+
E
I
c
E
E
I
I
I
I
b
c
a
b
예제 5.11
• 우선순위 적용
E->I
E->T
E->E+E
T->F
E->E*E
F->I
E->(E)
E->E+T
I->a|b|c
T->T*F
F->(F)
I->a|b|c
E
E
+
T
T
T
*
F
F
I
I
I
c
a
b
F
문맥-자유 문법과
프로그래밍 언어
정규/문맥-자유 언어
• 정규언어
– 프로그래밍 언어의 어휘, 단어 등 단순한 패
턴 정의
• 문맥-자유 언어
– 정규 언어에서 해결하지 못하는 보다 복잡한
구성 모델링
프로그래밍 언어
• 기술 문법
– 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문법