Transforming a Grammar to Chomsky Form
We show how to make a grammar:
- without unproductive symbols
- without unreachable symbols
-free (no non-start nullable symbols)
- without single productions X::=Y (X,Y non-terminals)
- without productions of arity more than two
- with terminals occurring alone on right-hand side
Elimination of Non-Productive Non-Terminals
Non-terminal is non-productive if it cannot generate any string of terminals
- if X::=w and w has only terminals, then X is productive
- if X:=p and p has only productive symbols, then X is productive
Start from empty set, apply these rules to compute productive symbols
- remaining symbols are non-productive
- delete them and all rules that contain them
Elimination of Unreachable Non-Terminals
Non-terminal is unreachable if no derivation from start symbol contains it
- S is reachable
- if X is reachable and X::=p, then every symbol in p is reachable
Start from empty set, apply these rules to compute productive symbols
- remaining symbols are non-productive
- delete them and all rules that contain them
Making Non-Terminals Non-Nullable
A grammar where is -free if
- no-non terminal is nullable, or
- only S is nullable and S does not appear on right-hand side
First, compute nullable nonterminals.
Then, for each production
create all productions of form
where
is
(as before), or,
is nullable and
is empty string (so it disappears)
Remove all right-hand sides that are “”
If S is nullable, introduce new initial symbol S' and add
Eliminating Single Productions
Construct a directed graph of non-terminals between X,Y such that is production
Compute as the transitive closure of this graph
If X Y and Y ::= p is a rule, then add rule
X ::= p
Then remove single productions.
Eliminating Non-Binary Productions
becomes
Making Terminals Alone on Right-Hand Side
Just introduce a fresh non-terminal for terminal t
Use on RHS instead of t
Add rule
Summary of Parsing General Context-Free Grammars
To check if :
- Convert
to equivalent Chomsky normal form
- Use CYK Parsing Algorithm to check if