티스토리 뷰

 

형식언어의 기초

문법의 예(식별자)

ABC := E * 3.14 + ABC / E;

식별자 : ABC, E

문법 : 식별자의 첫 글자는 영문자 + 숫자, 8자 이내

 

BNF 표기

<식별자> ::= <영문자> {<영문자> | <숫자>}07

 

 

알파벳 : 기호들의 유한 집합

T = {a, b, c}

문자열 : 기호들이 0, 1개 이상나열

w = ε, a, ca, abc, ...

ε 공문자열 : 기호들이 0개 나열. 이론적으로 정의한 내용.

aε = εa = a

 

T*(ε를 포함한 T로 만들 수 있는 모든 문자열) = (ε, a, aa, aaa, abc, abbbc, ...)

T+(ε를 포함하지 않는 T로 만들 수 있는 모든 문자열) = (a, aa, aaa, abc, abbbc, ...)

 

형식언어 : 문자열들의 집합

 

 

형식문법

G : Grammer, 문법, G = (Vn, Vt, P, S)

Vt : 터미널 기호. 더이상 유도할 수 없는 기호 ex) 0, 1

Vn : 논터미널 기호. 유도 할 수 있는 기호 ex) S, A

S : Start, 시작기호

P : Production Rule, 규칙

 

예)

G = ({S, A}, {0, 1}, P, S)

P : S -> 0 | 0AS

     A -> SS | 10 | S1A

 

S -> 0

S -> 0AS -> 0SSS -> 0000  (터미널 기호까지 와서 종료됨

S -> 0AS -> 0S1AS -> 0S110S -> 001100

S -> 0,0000,001100 (S가 될 수 있는 터미널 기호의 모음)

 

 

문법의 4종류

type0 : a -> b

모든 문법을 의미함.

위축형도 포함한다.

type1 : a -> b, | a | ≤ | b |

type0에서 b는 a보다 크다는 규칙을 추가함.(비위축형)

ex)

G1 = ({S,A,B,C}, {a,b,c}, P, S)
P: S -> A, A -> abC | aABC, bB -> bb, CB -> BC, bC -> bb

S -> abC -> abb
S -> aABC -> aabCBC -> aabbbb
S -> abb, aabbbb

∴ S = a^n * b^2n

 

type2(CFG, Context Free Grammar, 구문분석) : A -> c, A ∈ Vn 

type1을 만족하면서 왼쪽은 논터미널, 오른쪽은 제약이 없다.

ex)

G2 = ({S,C}, {a,b}, P, S)
P: S-> aCa, C-> b, C -> aCa

S -> aCa -> aba
S -> aaCaa -> aabaa
S -> aba, aabaa

∴ S = a^n * b * a^n

type3(Regular Grammar, 어휘분석)

type2를 만족하면서 오른쪽은 우선형 또는 좌선형이다.

우선형 : A -> tB, 터미널 기호가 왼쪽에 나옴. B가 오른쪽으로 확장되기 때문에 우선형

자선형 : A -> Bt, 터미널 기호가 오른쪽에 나옴. B가 왼쪽으로 확장되기 때문에 좌선형

 

ex)

G3 = ({S,B,C}, {a,b}, P, S)
P: S -> aS | aB, B -> bC, C -> a | aC

S -> aB -> abC -> aba
S -> aB -> abC -> abaC -> abaaC -> ... -> aba^m
S -> aS -> aaS -> aaaS -> ... -> a^nS
S -> a^nS -> a^nba
S -> a^nS -> a^nba^m

∴S -> a^nba^m

문법의 표현 방법

P : V₀ -> aV₁, V₁ -> bV₀ | a

V₀ -> (ab)^m * aa

정규문법과 정규표현

정규표현

1. 공집합 : ⏀

2. 공문자열 : ε

3. 터미널 기호로 이루어짐 : a ∈ Vt

4. P+Q : a+b

     P∙Q : ab

     P* : a*, (ab)*, (a+b)*

5. 이 밖의 정규표현은 없다.

 

정규문법을 정규표현으로 변환

a, b : 정규표현 a는 ε을 포함하지 않음.

X = aX + b의 유일해는 X = a*b 이다.

 

X -> aX
X -> b

X -> aX | b -> aX + b    ( | 를 + 로 표현)

X -> b
X -> aX -> ab
X -> aaX -> aab
...

 

∴ X = a*b

a*인 이유는 εb의 경우도 포함하기 때문이다.

 

ex1)

G = ({S}, {a,b}, P,S)

S = aS | bS | b

   = (a+b)S + b

   = (a+b)*b

 

ex2)

G = ({S,A}, {a,b}, P,S)

S -> aA | bS

A -> aA | bA | b

 

A = (a+b)A + b

     = (a+b)*b

 

S = aA + bS

   = a(a+b)*b + bS

   = bS + a(a+b)*b

   = b*a(a+b)*b

 

ex3)

G = ({S,A,B}, {a,b}, P,S)

S -> aA | bS

A -> aS | bB

B -> aB | bB | ε

 

S = aA + bS

 

B = aB + bB + ε = (a+b)B + ε = (a+b)*

A = aS + bB = aS + b(a+b)*

S = aA + bS

   = aaS + bS+ ab(a+b)*

   = (aa+b)S + ab(a+b)*

   = (aa+b)*ab(a+b)*

 

 

와우..

'방송대 > 컴파일러구성' 카테고리의 다른 글

1장 컴파일러구성  (0) 2022.08.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함