I have this context-free grammar and I am trying to remove the lambda in non terminal B. How do I go about this without it recursively having a lambda in B?
S -> B
A -> λ | aAb
B -> BB | λ | C
C -> A | aCc
During λ elimination, it's possible that the same production would be added twice or more to the set of a productions. Since it is a set, it can only have at most one of any element, so adding an element which is already present does nothing. The fact that the right-hand side is empty changes nothing.
So to λ-eliminate B
, we need to find all instances of B
and add new productions with that use removed. The only uses of B
are in S
and B
itself, so we proceed to add the productions:
However, none of the new productions for B are actually added to the set. Recursive unit productions (B → B) are simply dropped, and B → λ is already present.
If we add a new λ production for a symbol other than the start symbol, we need to mark that symbol as needing λ-elimination (or call the elimination procedure recursively). But that doesn't happen here because the added production was already present.
Once we have finished λ-elimination, we remove all λ productions except for the start symbol.
In practice, there are some optimisations possible but the algorithm is probably clearer this way.