// Grammar G
E : T '+' E | T ;
T : int | int '*' T | '(' E ')' ;
int '+' int
E
T '+' E
int '+' E
int '+' T
int '+' int
int '*' '(' int '+' int ')'
E
T
int '*' T
int '*' '(' E ')'
int '*' '(' T '+' E ')'
int '*' '(' int '+' E ')'
int '*' '(' int '+' T ')'
int '*' '(' int '+' int ')'
The leftmost nonterminal is replaced.
The rightmost nonterminal is replaced.
// Grammar G1
E : T '+' E | T ;
T : int | int '*' T | '(' E ')' ;
// Grammar G2
E : E '+' E | E '*' T | '(' E ')' | int;
int '+' int
// Grammar G1
E : T '+' E | T ;
T : int | int '*' T | '(' E ')' ;
// Grammar G2
E : E '+' E | E '*' T | '(' E ')' | int;
int '+' int
E
E '+' E
E '+' E '+' E
// Grammar G2
E : E '+' E | E '*' T | '(' E ')' | int;
int '+' int
E
E '+' E
E '+' E '+' E
// Grammar G2
E : E '+' E | E '*' T | '(' E ')' | int;
// Grammar G2
E : E '+' E | E '*' T | '(' E ')' | int;
// Grammar G3
E : T '+' T ;
T : E | int ;
// Grammar G3
E : T '+' T ;
T : E | int ;
E
T '+' T
E '+' T
Consider the following left-recursive grammar
The above strings can be expressed with the following grammar
-- transform -->
-- transform -->
-- transform (eliminate indirect left recursion) -->
-- transform (eliminate immediate left recursion) -->
-- transform (eliminate indirect left recursion) -->
-- transform (eliminate immediate left recursion) -->