제5 장Context-Free 문법 -...

55
9 ) 5 8 C - F r , E - 1 ı : $ 4 F @ (F B = 9 " . ( ) F . · E + (@...r)

Transcript of 제5 장Context-Free 문법 -...

제 5 장 Context-Free 문법

상지대학교 컴퓨터정보공학부

고 광 만

([email protected])

제5장 : Context-Free Grammar 2

Contents5.1 서 론

5.2 유도와 유도 트리

5.3 문법 변환

5.4 CFG 표기법

5.5 Push Down Automata; PDA

5.6 Context-free 언어와 PDA 언어

제5장 : Context-Free Grammar 3

서론

정규 문법간단한 패턴 기술에 적합

프로그래밍 언어의 구문 구조 표현에 부적합

토큰 구조

정규 표현

프로그래밍 언어 문법 구조

Context-Free Grammar; CFG

Context-Free Grammar의 장점간단하고 이해하기 용이

표현된 문법으로부터 자동적으로 인식기 구현

입력된 프로그램의 구조를 생성 규칙에 의해 분해, 번역이 유용

제5장 : Context-Free Grammar 4

Context-Free GrammarA → α 생성 규칙

A : Nonterminal, α : V*

A를 문맥에 관계없이 α로 대치

context-free(문맥-자유 또는 문맥-무관)

제5장 : Context-Free Grammar 5

표기법(Notational Convention)Terminal 심볼

알파벳 소문자(a, b, c, . . . ), 숫자( 0,1,2, ... ,9)

연산자 기호(+, - , . ..)

구분자(세미콜론, 콤마, 괄호)

' 와 ' 사이에 표기된 문법 심볼

Nonterminal 심볼알파벳 대문자

S, 시작 심볼(start symbol)

< 와 > 로 묶어서 나타낸 문법 심볼

<stmt>, <expr>

제5장 : Context-Free Grammar 6

A→α1, A→α2, ... , A→αk

생성 규칙의 왼쪽이 모두 A인 경우

A→α1|α2|...|αk, 택일(alternation) 규칙

예. E → EOE | (E) | -E | id

O → + | - | * | /

<if_statement> -> 'if' <condition> 'then' <statement>

< >안에 기술된 심볼, Nonterminal

‘ ‘사이에 기술된 심볼, Terminal

제5장 : Context-Free Grammar 7

유도 및 유도 트리

문장 생성, In Context-free Grammar문장 형태의 스트링에 생성 규칙 반복 적용

Nonterminal 확장

산술식

E → E+E | E*E | (E) | -E | id

문장을 얻기 위해 시작 심볼 E로부터 반복적으로생성 규칙 적용

E ⇒ -E ⇒ - ( E ) ⇒ - ( id )

제5장 : Context-Free Grammar 8

생성 규칙 오른쪽, Nonterminal이 존재같은 문장을 유도하는 여러 가지 방법이 가능

유도시 대치해야 할 Nonterminal을 선택 ??

여러 가지 경우가 존재

예. A ⇒ B C D

제5장 : Context-Free Grammar 9

좌측 유도 v.s 우측유도

좌측 유도(Left derivation)문장 형태의 가장 왼쪽에 있는 Nonterminal을 대치

좌문장 형태(Left-sentential form)

우측 유도(Right derivation)문장 형태의 가장 오른쪽에 있는 Nonterminal을 대치

우문장 형태(Right-sentential form)

제5장 : Context-Free Grammar 10

문장 -(id+id)가 유도되는 과정

좌측 유도

E ⇒ -E ⇒ -(E) ⇒ -(E+E) ⇒ -(id+E) ⇒ -(id+id).

우측 유도

E ⇒ -E ⇒ -(E) ⇒ -(E+E) ⇒ -(E+id) ⇒ -(id+id).

제5장 : Context-Free Grammar 11

좌파스 vs. 우파스

좌파스(left parse)좌측 유도에서 적용된 일련의 생성 규칙 순서.

top-down parsing

시작 심볼로부터 터미널 생성(확장, expansion)

우파스(right parse)우측 유도에서 적용된 생성 규칙 번호의 역순.

bottom-up parsing

터미널로부터 넌터미널로 축약하여 시작 심볼에 도착(축약, reduce)

제5장 : Context-Free Grammar 12

예, a+a*a의 좌파스와 우파스1. E → E + T 2. E → T 3. T → T * F

4. T → F 5. F → (E) 6. F → a

E ⇒ E + T E ⇒ E + T1 1

⇒ T + T ⇒ E + T * F2 3

⇒ F + T ⇒ E + T * a4 6

⇒ a + T ⇒ E + F * a6 4

⇒ a + T * F ⇒ E + a * a3 6

⇒ a + F * F ⇒ T + a * a4 2

⇒ a + a * F ⇒ F + a * a6 4

⇒ a + a * a ⇒ a + a * a6 6

좌파스 : 1 2 4 6 3 4 6 6.우파스 : 6 4 2 6 4 6 3 1.

제5장 : Context-Free Grammar 13

유도 트리(Derivation Tree)유도 트리

문장 유도 과정을 트리 형태로 표현

생성 규칙에 의해 적용되는 문장의 계층적 구조

CFG G = {VN, VT, P, S} 유도 트리노드 : 문법 심볼

루트(root) 노드 : 시작 심볼 S

Nonterminal 심볼

최소한 하나 이상의 자노드를 가지는 노드

생성 규칙 A → A1A2 ... Ak

A1A2 ... Ak 노드 : 노드 A의 자노드

제5장 : Context-Free Grammar 14

A → XYZ의 유도 트리, 순서 트리(Ordered tree)internal(nonterminal) node ∈ VN

external(terminal) node ∈ VT ∪ {ε}

예6, 교재 166

A

X Y Z

제5장 : Context-Free Grammar 15

유도 트리문장 형태에서 대치되는 심볼의 순서에 관계없이 구성

생성 규칙의 적용 순서에 따라 다른 유도 과정이 존재

두 개 이상의 유도 트리가 가능

a+a*a 에 대한 좌측 유도, 그림 5.2E ⇒ E + E E ⇒ E * E

⇒ a + E ⇒ E + E * E

⇒ a + E * E ⇒ a + E * E

⇒ a + a * E ⇒ a + a * E

⇒ a + a * a ⇒ a + a * a

제5장 : Context-Free Grammar 16

모호성(Ambiguity)모호성(Ambiguity)

문법 G에 의해 생성되는 문장이 두 개 이상의 유도 트리가 존재

모호한 문법

어떤 문장이 2개 이상의 유도 과정이 존재

예 7, 모호한 문법

S → if C then S else S

S → if C then S

S → a

C → b

제5장 : Context-Free Grammar 17

구문 분석기의 출력, 유도 트리문장의 유도 트리를 결정적으로 구성

모호하지 않은 문법(Unambiguous Grammar)

결정적 파싱(Deterministic Parsing)

모호하지 않은 문법 구성

모호한 문법을 모호하지 않은 문법으로 변환.

제5장 : Context-Free Grammar 18

모호한 문법(일반적인 경우)생성 규칙 : A → AαA

문장 형태 : AαAαA

트리 형태 :

A

A α A

A α A

A

A α A

A α A

제5장 : Context-Free Grammar 19

모호하지 않은 문법으로 변환연산 우선 순위, 결합 법칙

생성 규칙 추가

새로운 Nnonterminal 도입

제5장 : Context-Free Grammar 20

5.3 문법 변환

정의 5.6L(G1) = L(G2), 문법 G1과 G2는 동등

문법이 생성하는 언어가 같음.

예 9, CFG G1, G2는 동일.

G1 : A → 1B G2 : X → Y1

A → 1 X → 1

B → 0A Y → X0

∵ L(G1) = L(G2) = 1(01)*

제5장 : Context-Free Grammar 21

문법 변환다른 형태의 동등한 문법으로 변환

대입(substitution), 확장(expansion)

대입(substitution)특정 생성 규칙을 제거하고 그에 해당하는 생성 규칙추가.

if A → αBγ, B → β1 | β2 | β3 … | βn ∈ P,then

• P' = ( P - {A → αBγ } ) ∪• {A → αβ1γ | αβ2γ | ... | αβnγ }.

제5장 : Context-Free Grammar 22

확장(expansion)새로운 Nonterminal 심볼을 도입.

한개의 생성 규칙을 쪼개는 방법

생성 규칙 A→αβ에 대해

A→αX, X→β 혹은 A→Xβ, X→α

X, 새로운 Nonterminal 심볼

확장의 효과

유도 과정의 횟수를 한번 늘인 결과

제5장 : Context-Free Grammar 23

불필요한 생성 규칙 제거

불필요한 생성 규칙(Useless production rule)문장을 생성하는데 적용할 수 없는 생성 규칙

[정의 5.7] CFG G = (VN, VT, P, S)S ⇒ wXy ⇒ wxy (w, x, y∈VT

*) 형태의 유도 과정이존재하지 않으면, 심볼 X는 불필요(useless)

불필요한 생성 규칙

불필요한 심볼(useless symbol)을 갖고 있는 생성규칙

제거(elimination)

제5장 : Context-Free Grammar 24

불필요한 심볼, X시작 심볼로부터 도달할 수 없는 심볼

X가 스트링을 생성할 수 없는 Nonterminal 심볼

생성 규칙 A→αΑ ⇒ w, w ∈ VT

*, A :Terminating Nonterminal

S ⇒ uXw, u,w ∈ V* : X, 도달 가능한 심볼(accessible symbol)

필요한 생성 규칙

도달 가능한 심볼 + Terminating Nonterminal

제5장 : Context-Free Grammar 25

불필요한 생성 규칙 제거 방법terminating nonterminal을 구함

스트링을 생성할 수 없는 nonterminal을 포함하고있는 생성 규칙 제거

도달 가능한 심볼들을 구성

도달 불가능 심볼을 포함하고 있는 생성 규칙 제거

알고리즘 5.1

예제 11, 12, 13번 참조

제5장 : Context-Free Grammar 26

ε-생성 규칙 제거(ε-free)A → ε, ε-생성 규칙

생성 규칙의 형태가 A→ε, 제거.

CFG G=(VN, VT, P, S), ε-free.생성 규칙 P가 ε-생성 규칙을 갖지 않음

S는 ε-생성 규칙을 갖지만 다른 생성 규칙의 오른쪽에 S가 나타나지 않음.

ε-생성 규칙 제거구문 분석 시간 감소

ε-free 문법

제5장 : Context-Free Grammar 27

단일 생성 규칙 제거

단일 생성 규칙(single production rule) A→B

생성 규칙의 오른쪽에 한 개의 nonterminal만 존재

불필요한 유도 과정이 발생, 파싱 속도 증가

의미없는 단일 생성 규칙, 제거

제5장 : Context-Free Grammar 28

Proper 문법 : CFG G = ( VN, VT, P, S )Cycle-free

if there is no derivation of the form A ⇒+ A

ε-free

불필요한 심볼을 갖지 않음

제5장 : Context-Free Grammar 29

5.4 CFG 표기법

문법 표기법BNF(Backus-Naur Form)

확장된 BNF(EBNF, Extended-BNF)

문법 흐름도(Syntax diagram)

제5장 : Context-Free Grammar 30

BNF프로그래밍 언어의 형식적 정의

Nonterminal 심볼 : < 와 >

Terminal 심볼 : ‘ 문자 ’명칭(Identifier)에 대한 표현

<id> ::= <letter> | <id> <letter> | <id> <digit>

<letter> ::= a|b|c|...|y|z

<digit> ::= 0|1|2|...|8|9

::= : →

| : 택일(alternation)

교재 PP. 184, 예 17

제5장 : Context-Free Grammar 31

EBNF반복, 선택적인 부분을 간결하게 표현

특수한 의미를 갖는 메타 심볼(meta symbol) 도입

메타 심볼(Meta Symbol)

언어의 일부분이 아니라 언어를 표현하려고 사용된특수 심볼.

제5장 : Context-Free Grammar 32

반복 부분(repetitive part) 표현{ }

{a}

a가 영번 이상 반복

정규 표현 a*와 같은 의미

콤마로 구분되는 명칭 리스트 : BNF 및 EBNFBNF

<id_list> ::= <id_list> , <id> | <id>

EBNF

<id_list> ::= <id> { , <id> }

제5장 : Context-Free Grammar 33

혼합문에 대한 BNF 및 EBNF 표현BNF 표현

<compound_statement> ::=

begin <statement_list> end

<statement_list> ::=

<statement_list> ; <statement> | <statement>

EBNF 표현<compound_statement> ::=

begin <statement> { ; <statement> } end

제5장 : Context-Free Grammar 34

반복되는 최대 회수와 최소 회수 지정

<external_name> ::= <alphabet> {<alphanumeric>}7

<alphanumeric> ::= <alphabet> | <digit>

<alphabet> ::= a|b|c|…|y|z

<digit> ::= 0|1|2|…|9

중괄호 뒤의 0은 최소 회수, 7은 최대 회수

0

제5장 : Context-Free Grammar 35

선택적인 부분(optional part)[ ]

[x]

x가 나타나지 않거나 한번만 나타날 수 있음

[x]는 {x}1

<if_st> ::= if <cond> then <stat> [else <stat>]

제5장 : Context-Free Grammar 36

단순 변수, 일차원 배열 변수 BNF 및 EBNF 표현

BNF 표현 :

<variable> ::= <id> | <id> '[' <exp> ']'

EBNF 표현 :

<variable> ::= <id> [ '[' <exp> ']‘ ]

제5장 : Context-Free Grammar 37

괄호와 택일 기호 : ( | )여러개의 생성 규칙을 간단히 표현

<exp> ::= <exp> + <exp> | <exp> - <exp> |

<exp> * <exp> | <exp> / <exp>

<exp> ::= <exp> ( + | - | * | / ) <exp>

제5장 : Context-Free Grammar 38

EBNF 메타 심볼 vs. terminal 심볼terminal 심볼을 '와 '로 묶어 표현

<BNF_rule> ::= <left_part> '::=' <right_part>

<right_part> ::= <right_part_element> { '|’<right_part_element> }

제5장 : Context-Free Grammar 39

문법 흐름도(Syntax diagram)문법을 도식화하여 표현

초보자가 프로그래밍 언어의 문법을 쉽게 이해

구성

사각형 :Nonterminal

타원 : Terminal

지시선 : 문법이 움직이는 경로(path)

제5장 : Context-Free Grammar 40

Nonterminal A사각형 안을 A

terminal의 경우와 같이 지시선

사각형의 내용은 그 안의 이름에 의해 참조

A

Terminal a타원안을 a

지시선으로 연결

a

제5장 : Context-Free Grammar 41

생성 규칙 A ::= X1 X2... Xn

Xi가 Nonterminal인 경우

Xi가 terminal인 경우

X1 X3 Xn...X2

...x1 x2 xnx3

제5장 : Context-Free Grammar 42

A ::= α1|α2| . . . |αn

α1

αi

αn

A

제5장 : Context-Free Grammar 43

EBNF A ::= {α}

EBNF A ::= [ α ]

αA

αA

제5장 : Context-Free Grammar 44

EBNF A ::= ( α1 | α2 ) β

α2

A

α1

β

제5장 : Context-Free Grammar 45

푸시다운 오토마타

푸시다운 오토마타(Push-Down Automata; PDA)보조 기억장치를 가진 인식기.

Context-Free Grammar 인식기.

구성유한 상태 제어(finite state control)

전체의 행동 제어

현재의 입력 심볼, 스택의 top 심볼에 따라 행동

입력 테이프(input tape)

입력 스트링 유지

스택(stack)

보조 기억장치, 푸시다운 리스트(push-down list)

제5장 : Context-Free Grammar 46

Push Down Automata, PDA

a1 a2 . . . an

Finite statecontrol

Input tape

Z1

stack

Z2

Zn

제5장 : Context-Free Grammar 47

PDA P = (Q, Σ, Γ, δ, q0 , Z0, F)

Q : 상태의 유한 집합

Σ : 입력 알파벳의 유한 집합

Γ : 스택 심볼의 유한집합

δ : 사상 함수 Q × (Σ∪{ε} ) × Γ → Q × Γ*

q0 ∈ Q : 시작 상태(start state)

Z0 ∈ Γ : 스택의 시작 심볼

F ⊆ Q : 종결 상태(final state)의 집합

제5장 : Context-Free Grammar 48

사상 함수(전이 함수) : δ, delta

δ(q, a, Z) = { (p1,α1), (p2,α2), . . . ,(pn,αn) }

현재의 상태 : q

입력 심볼 : a

스택 Top 심볼 : Z

(pi,αi) 선택

현재의 q 상태에서 입력 a를 본 다음 상태 : pi

스택 top 심볼 Z를 αi로 대치.

제5장 : Context-Free Grammar 49

PDA 형태(configuration) : P어떤 시점에서 PDA P의 현재 상태 표현 방법

Q × Σ* × Γ* => Triple(q, ω, α)

q : 현재 상태

ω : 읽지 않은 입력 부분

α : 스택의 내용

ω = ε인 경우, 모든 입력 심볼이 읽혀졌음

P 에 의한 상태 이동(move) : |--

(q, aω, Zα) |-- (q', ω,Υα)

제5장 : Context-Free Grammar 50

a=ε; ε-이동(ε-move)현재의 입력 심볼 변화 없음

모든 입력 심볼이 읽혀졌을 때 발생

스택이 빈경우, 어떤 이동도 발생하지 않음.

* : 영번 이상, + : 한번 이상 이동

P 시작 형태Σ*에 속하는 ω, (q0,ω,Z0)

P의 종결 형태(q, ε, α), q∈F, α∈Γ*

제5장 : Context-Free Grammar 51

P의 이동(move)ː┣1) a ≠ ε : (q, aω, Zα) ┣ ( q', ω, γα)

2) a = ε : (q, ε, Z) ┣ (q', ε, γ) <===> ε-move

┣ * : zero or more moves

┣ + : one or more moves

제5장 : Context-Free Grammar 52

L(P) : PDA P에 의해 언어 인식(accept).입력 스트링 ω를 다본 상태가 종결 상태

시작 상태 : (q0, ω, Z0)

종결 상태 : (q, ε, α), where q ∈ F, α ∈ F*

L(P) = {ω|(q0, ω, Z0) ┣ * (q, ε, α), q ∈ F, α ∈ Γ* }.

제5장 : Context-Free Grammar 53

인식(accept)

시작 상태에서 입력 스트링 ω를 다본 상태가 종결 상태에 도달

"ω는 P에 의해 인식(accept)"

P에 의해 정의되는 언어

푸시다운 오토마타 언어 : L(P)

P에 의해 인식되는 스트링의 집합

L(P) = {ω|( q0,ω, Z0) |-- (q, ε, α), q∈F, α∈Γ*}

제5장 : Context-Free Grammar 54

예 26.언어 L = {0n1n|n≥1}을 인식하는 PDA

P = ( {q0, q1, q2}, {0, 1}, {Z, 0}, δ , q0, Z, {q0} )

δ(q0, 0, Z) = { (q1, 0Z) }

δ(q1, 0, 0) = { (q1, 00) }

δ(q1, 1, 0) = { (q2, ε) }

δ(q2, 1, 0) = { (q2, ε) }

δ(q2, ε, Z) = { (q0, ε) }

0에 대하여 차례로 스택에 모두 이동

1에 대하여 스택에 있는 0을 하나씩 팝(pop)

제5장 : Context-Free Grammar 55

입력 스트링 0011에 대하여 P가 인식하는 과정

(q0, 0011, Z) |-- (q1, 011, 0Z)

|-- (q1, 11, 00Z)

|-- (q2, 1, 0Z)

|-- (q2, ε, Z)

|-- (q0, ε, ε)