It's really just a matter of following the algorithm. Let's look at the general case. According to the algorithm a rule of the form:
A => A a1 | ... | A aN | b1 | .. | bN
where A a1, ..., A aN
are nonzero left recursive sequences of terminals and nonterminals and b1, ..., bN
are sequences of terminals and nonterminals that does not start with the terminal A
.
The algorithm says we need to replace this by
A => b1 A' | ... | bN A'
A' => a1 A' | ... | aN A' | epsilon
Let's look at your case. Here we have
E => E + T | T
So you can think of a1
is the sequence + T
since E + T
is a left recursive sequence of terminals and nonterminals. Likewise you can think of B1
as T
since this is a nonleft recursive sequence. We now use this to define the new nonterminal E
as:
E => b1 E'
And since b1
is T
this becomes
E => T E'
Defining E'
we get
E' => a1 E' | epsilon
And since a1
is + T
this becomes
E' => + T E' | epsilon
Thus you end up with the grammar
E => T E'
E' => + T E' | epsilon