L | → | E |
L | → | E , L |
Here is a parse tree for n, n, n.
L /|\ / | \ E , L | /|\ n / | \ E , L | | n E | n
The right-hand side of a production can be an empty string, which we make visible as symbol ε. The following grammar takes advantage of that.
L | → | ε |
L | → | E L |
The first production, L → ε, is called an erasing production, or an epsilon-production.
Erasing productions present no difficulties to derivations. Here is a leftmost derivation of n n from L.
L | ⇒ | E L |
⇒ | n L | |
⇒ | n E L | |
⇒ | n n L | |
⇒ | n n |
A parse tree needs a way to show that a nonterminal was erased. Do that by showing ε below a nonterminal.
L / \ / \ E L | / \ n E L | | n ε
L | → | ε |
L | → | N |
N | → | E |
N | → | E , N |
Suppose that nonterminal S derives a statement and I derives an if-statement.
One of the productions would be S → I, so that a statement can be an if-statement. Productions for I might be as follows, where if and else are tokens.
I | → | if ( E ) S |
I | → | if ( E ) S else S |
There are a lot of choices that you can make. One is to factor out the shared parts of the two productions for if-statements, as follows. Nonterminal R derives the rest of an if-statement, after the common part.
I | → | if ( E ) S R |
R | → | ε |
R | → | else S |