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