leesangwon0114

I am Research Engineer. Currently working in KT.

Compiler 5. 문법자유 문법과 푸시다운 오토마타

22 Apr 2018 » Compiler

문맥 자유문법(Context-free grammar)

잘 설계된 문법은 소스 프로그램을 정확한 목적 코드로 번역할 때 유용한 구조를 제공

문맥자유 문법은 프로그래밍 언어의 설계에서 뿐만 아니라 효율적인 컴파일러 작성 시에도 중요하게 사용됨

모든 생성규칙이 A->b 형태일 때, 문맥자유문법

  • A가 b로 치환: A는 b로 유도(derivation)
  • b가 A로 치환: b는 A로 감축(reduce)

leftmost derivation, rightmost derivation

좌단 유도는 유도 과정의 각 단계에서 가장 왼쪽에 있는 논터미널 기호를 계속해서 대체하는 경우

우단 유도는 유도 과정의 각 단계에서 가장 오른쪽에 있는 논터미널 기호를 계속해서 대체하는 경우

Example

Alt text


좌파스, 우파스

좌파스 - 좌단유도에 의해서 적용된 생성규칙 순서

우파스 - 우단 유도에 의해서 적용된 생성규칙 순서의 역순

Alt text


파스 트리의 정의

구문 분석 방법은 크게 두 종류가 존재

  • 하향식(top-down) 구문 분석 (좌파스를 생성)
  • 상향식(bottom-up) 구문 분석 (우파스를 생성)

파스트리는 올바른 문장에 대해 그 문장의 구조를 트리 형태로 나타낸 것


파스트리 만들기

좌단유도

Alt text

Alt text


우단유도

Alt text

Alt text

-> 좌단유도, 우단유도로 만든 파스트리는 같음


모호한 문법

모호한 문법이란?

하나의 문장이 서로 다른 두 개 이상의 파스 트리를 갖는다면 문법 G는 모호하다고 함

Alt text


모호한 문법 파스 트리를 하나로 만든느 방법

산술식의 경우 연산자의 우선순위와 결합법칙을 이용하여 모호하지 않은 문법으로 변환

연산자의 결합법칙은 연산자의 우선순위가 같을 때, 좌측 결합(가장 왼쪽에 있는 연산자 부터 계산) -> 대부분 프로그래밍 언어에서 좌측 결합 방식을 취함


문법 변환

문법 변환 - 주어진 문법을 동등한 언어를 생성하는 문법으로 변환

어떤 문법이 구분 분석을 하는데 있어서 효율을 상당히 떨어뜨리는 경우에 효율적인 구문분석이 이루어지도록 변환

변환방법

  • 불필요한 생성규칙의 제거
  • ε-생성규칙의제거
  • 단일생성규칙의 제거
  • 좌인수분해
  • 자재귀의 제거 등

불필요한 생성규칙의 제거

불필요한 생성 규칙이란 불필요한 기호를 갖고 있는 생성 규칙을말함

불필요한 기호 - 시작 기호로 부터 도달 불가능하거나 터미널 기호들을 생성하지 못하는 기호

[5-1 알고리즘] 터미널 문자열을 생성할 수 있는 논터미널 기호

-> 더 이상 새로운 논 터미널이 생성되지 않을 때까지 반복해서 구한 논터미널 기호들의 집합ㅇ르 구하면 이 논터미널 기호들은 터미널 기호들을 생성하는 기호


터미널 문자열을 생성하지 못하는 논터미널을 가진 생성 규칙 제거

Alt text


Alt text


단일 생성 규칙의 제거

단일 생성 규칙이란 생성 규칙 중 A->B와 같이 생성 슈칙의 오른쪽이 단 하나의 논터미널 기호로만 구성된 생성규칙이 존재하는 경우를 말함


좌인수분해

하향식 구문분석 방법에서 사용

좌인수 분해 - 같은 기호들을 접두사로 갖는 2개 이상의 생성 규칙이 있을 때 인수분해 함

백트래킹 - 하향식 구문 분석에서 생성규칙이 A-> aab 에서 접두사가 똑같이 a 이기 때문에 생김

-> 공통된 접두사 a를 인수분해 함으로써 이 문제를 해결

Example

S -> cAd

A -> aab

일 경우

S -> cAd A -> aA’ A’ -> ε | b

로 인수분해 하면 됨


좌재귀

하향식 구문 분석 시에 같은 생성규칙이 반복적으로 적용되 무한루프에 빠지게 되 구문 분석을 어렵게 함

좌재귀를 우재귀로 변환 시킨다

즉 A=>Aa 같은 과정을 A=>aA로 변환

Alt text


푸시다운 오토마타

Alt text


푸시다운 오토마타에 의한 인식

Alt text


확장(입력을 모두 집어 넣음)

Alt text