CFG to CNF

Theorem 2.9 — pp 109-111

**** Example 2.10
S → ASA | aB
A → B | S
B → b | ε

1) add terminal S0 and S0→S (only needed if S is recursive)
S0 → S
S  → ASA | aB
A  → B | S
B  → b | ε

2) remove ε productions and move them up (which can create a new ε)
Removing B → ε           *** Step One   [ Move the ε up ...]
S0 → S
S  → ASA | aB | a        *** Added ε alternative for B (in aB) to S
A  → B | S | ε           *** Added ε alternative for B up to A
B  → b                   *** Removed B → ε

Removing A → ε           *** Step Two   [ Move the ε up ...]
S0 → S
S  → ASA | aB | a | SA | AS | S
                         *** fixing S → ASA for moving ε up
                         *** Added the many ε alteratives for A to S
A  → B | S               *** Removed A → ε
B  → b                    

3) Removing unit rules

** removing S → S (no targets to add)
S0 → S
S  → ASA | aB | a | SA | AS                 ** removed S → S
A  → B | S
B  → b                    

** removing S0 → S and adding S targets to S0
S0 → ASA | aB | a | SA | AS                 ** removed S0 → S
S  → ASA | aB | a | SA | AS                 ** removed S → S
A  → B | S
B  → b                    

** Removing A → B and adding B targets to A
S0 → ASA | aB | a | SA | AS
S  → ASA | aB | a | SA | AS
A  → S | b
B  → b                    

** Removing A → S and adding S targets to A
S0 → ASA | aB | a | SA | AS
S  → ASA | aB | a | SA | AS
A  → b | ASA | aB | a | SA | AS
B  → b                    


4) the final fixes..
** adding variable U for a (none needed for b).
S0 → ASA | UB | a | SA | AS
S  → ASA | UB | a | SA | AS
A  → b | ASA | UB | a | SA | AS
B  → b                    
U  → a

** adding variable M for SA
S0 → AM | UB | a  | SA | AS
S  → AM | UB | a  | SA | AS
A  → b  | AM | UB | a  | SA | AS
B  → b                    
U  → a
M  → SA

Examples from Adam Whitley

Example 1

S → aAS | a
A → SbA | SS | ba
h3>Example 2
S → ASA | aB
A → B | S
B → b | ε

Example 3

S → Aba
A → aab
B → Ac

Example 4

S  → ASB
A  → aAS | a | ε
B  → SbS | A | bb