본문 바로가기

23년 2학기 학교공부/컴파일러개론

[CP] FIRST in LL Parsing

목차

    728x90
    반응형
    SMALL

    LL파싱은 결정적 파싱이 되는 문법을 선별하여, 각 입력 문자당 적용될 생성규칙을 미리 뽑아두고 시작한다.

     

    이를 위해 규칙으로부터 필요한 정보들에는 FIRST 집합이 있다.

     

     

     

     

    📁 FIRST

    FIRST란 Nonterminal A로부터 유도되어 첫번째로 나타날 수 있는 terminal들의 집합을 말한다.

     

     

    예를 들어, 다음 문법의 FIRST(S), FIRST(A), FIRST(B)는 다음과 같다.

     

     

     

     

    📁 FIRST(X)를 계산하는 방법

     

     

    정의 1. X가 terminal이면 FIRST(X)는 자기 자신이 된다.

    이때 X는 Nonterminal이어야하지만, 위 규칙은 계산의 편의를 위해 확장한 개념이다.

     

     

    정의 2. X-> aα 와 같이 맨 처음이 terminal인 생성규칙이 존재하면 해당 terminal a가 FIRST(X)에 포함된다.

     

    정의 3. X -> ε와 같이 X가 null생성규칙을 가지는 경우 FIRST(X)에 ε이 포함된다.

     

     

    정의 4. X -> Y1Y2Y3..Yk인 생성규칙이 있을 때, FIRST(X)는 FIRST(X)와 FIRST(Y1Y2,...Yk)의 합집합이다.

     

    위 정의를 기반으로, 아래 과정을 따라 FIRST 집합을 계산할 수 있다.

     

    - 초기에, 모든 Nonterminal의 FIRST는 공집합으로 시작한다.

    -  RHS에 첫번째로 terminal이 나오는 생성규칙(null생성규칙 포함)에서 먼저 FIRST를 구한 후, 이 형태의 생성규칙은 다시 고려할 필요가 없기 때문에 제거한다.

    - 남은 생성규칙의 RHS는 모두 Nonterminal로 시작하므로, Ringsum 연산을 이용해 모든 Nonterminal의 FIRST가 변하지 않을 때 까지 반복한다.

     

     

    참고로, 일반적으로 A의 생성 규칙이 A->a | b | c | ... | z와 같은 형태일 때, FIRST(A)는 다음과 같이 계산된다.

     

     

     

    예를 들어 다음과 같은 문법이 주어졌을때, FIRST(S), FIRST(A), FIRST(B)를 구해보자.

     

    먼저 FIRST(S), FIRST(A), FIRST(B) 모두 {}, 공집합으로 시작한다.

     

    다음으로 RHS에 terminal이 먼저 나오는 경우를 찾아보면

    A -> dB | aS | c

    B -> b

    해당 규칙들을 찾을 수 있다.

     

    위 규칙들에 대해 FIRST의 정의 중 (1), (2), (3) 을 따라 FIRST를 구하면 아래와 같다.

     

    위 규칙들은 더이상 고려할 필요가 없으므로 제거하면 남은 규칙들은

    S -> ABe

    B -> AS 와 같다.

     

    위 규칙들에 대해 FIRST 정의 (4)를 따라 계산하면 아래와 같다.

     

     

    위 과정으로 계산한 결과 FIRST(S) = {a, c, d}, FIRST(B) = {a, b, c, d}가 도출되었는데,

    최종 결과를 도출하기 위해서는 이렇게 도출된 결과를 위 계산에 적용시켜서 한번 더 반복해야한다.

     

     

    반복하여 계산한 결과 이전의 결과와 같으면, 해당 결과가 최종이 된다.

     

     

     

     

    🌱 ε-생성규칙(null 생성규칙)

     

    ε -생성규칙이란 아래와 같은 형태의 생성규칙을 말한다.

     

    Nonterminal A가 ε을 유도할 수 있으면 A를 nullable nonterminal이라고 부른다.

    즉, A부터 전개되는 유도과정 안에 null생성규칙이 존재하면 nullable한것이다.

     

     

     

     

    🌱 LHS, RHS

    생성규칙 A -> XXX에서,

     

    LHS(Left Hand Side) : A

    RHS(Right Hand Side) : XXX

     

     

     

     

    🌱 ⊕ (Ringsum)

    ringsum ⊕은 두 개의 집합에 대한 연산자로, 다음과 같이 정의된다.

    A에 ε이 없는 경우 ringsum의 결과는 A이고,

    A에 ε이 있는 경우 ringsum의 결과는 A에서 ε을 제외한 나머지와 B의 합집합이다.

     

     

    예를 들면 다음과 같다.

     

    728x90
    반응형
    LIST