Nullable Non-terminals
In general, a non-terminal can expand to empty string
- example: statement sequence in while language grammar
A sequence of non-terminals is nullable if it can derive an empty string
- this is case iff each non-terminal is nullable
Computing nullable non-terminals:
- empty string is nullable
- if one right-hand side of non-terminal is nullable, so is the non-terminal
Algorithm:
nullable = {} changed = true while (changed) { changed = false for each non-terminal X if X is not nullable and either 1) grammar contains rule X ::= "" | ... or 2) grammar contains rule X ::= Y1 ... Yn | ... and {Y1,...,Yn} is contained in nullable then nullable = nullable union {X} changed = true }
Computing First Given Nullable
Computing first(X), given rule X = … …
- if ,…, are all nullable, then add first() to first(X)
Then repeat until no change, as before.