- eliminate ε-productions (impossible to generate ε!)
- eliminate cycles (A +⇒A)
- eliminate left-recursion
먼저, eliminating ε-productions 과정부터 알아보자
S → XX | Y
X → aXb | ε
Y → aY b | Z
Z → bZa | ε
이러한 CFG가 있다 했을 때,
S,X,Y,Z 는 모두 ε을 파생할 수 있다.
따라서
Z → bZa | ε => Z → bZa | ba 와 같이 엡실론을 없애 주어야 한다.
이 과정을 거치면
S → XX | X | Y
X → aXb | ab
Y → aY b | ab | Z
Z → bZa | ba
의 결과값을 얻게 된다.
S → X | Xb | SS
X → S | a
cycles를 제거 한다면,
S → a | Xb | SS
X → Xb | SS | a
A -> Aα | β
=>
A -> βA'
A' -> αA' | ε
cf)
A-> αβ | αγ
=>
A->αA'
A'->β|γ
S -> Aa | b
A -> Ac | Sd | e
이때, A->Sd에서 S가 A보다 앞섰기 때문에 S 생성규칙을 대입할 수 있음. 모두 대입하자
A -> Ac | Aad | bd | e
대입했을 때, direct-left recursion이 나타남. 제거해주자.
A -> bdA' | eA'
A' -> cA' | adA' | ε
따라서 모두 제거된 생성 규칙은 아래와 같다.
S -> Aa | b
A -> bdA' | eA'
A' -> cA' | adA' | ε
S → SX | SSb | XS | a
X → Xb | Sa | b
S → XSS′ | aS′
S′ → XS′ | SbS′| ǫ
X → Xb | Sa | b
X → XSS′a | aS′a | Xb | b
X → bX′ | aS′aX′
X′ → SS′aX′ | bX′ | ǫ
S → XSS′ | aS′
S′ → XS′ | SbS′| ǫ
X → bX′ | aS′aX′
X′ → SS′aX′ | bX′ | ǫ
-> 'A' cannot appear n a derivation
(ex) A->AA|Ab의 경우,
A'-> AA' | bA' | ε
으로 나타낼 수 있다. (A는 존재하지 않음)
따라서
X → aX′
X′ → X′
이렇게 나타낼 수 있다.
S → X | b
X → S | a
(1) left recursion 존재 X
(2) S가 X보다 선행조건이므로, X->S를 X->X|b 로 교체한다.
따라서 X->X|b|a 가 된다
(3) 결과 값
X → bX′ | aX′
X′ → X′
이렇게 표현이 가능하다.
참고: https://lesslate.github.io/compiler/Left-recursion/