E : E '+' E | int
E : T '+' T ;
T : E | int ;
E
T '+' T
E '+' T
Consider the following left-recursive grammar
A non-left-recursive grammar that can express the above?
The above strings can be expressed with the following grammar
E: E + E | E * E | (E) | int
int + int * int
? E E
/ | \ / | \
E * E OR E + E
/|\ | | /|\
E + E int int E * E
| | | |
int int int int
E: E + E | E * E | (E) | int
==> ...
E
/ | \
E + E ==>
| /|\
int E * E
| |
int int
E: E + E | E * E | (E) | int
==> ...
E E
/ | \ / | \
E + E ==> E + E
| /|\ |
int E * E T
| | /|\
int int T * T
| |
F F
| |
int int
E: E + E | E * E | (E) | int
==>
E: E + E | T
T: T * T | F
F: (E) | int
E E
/ | \ / | \
E + E ==> E + E
| /|\ |
int E * E T
| | /|\
int int T * T
| |
F F
| |
int int
E: E + E | T
T: T * T | F
F: (E) | int
Consider: int + int + int
E E
/ | \ / | \
E + E OR E + E
/ | \ | | / | \
E + E int int E + E
| | | |
int int int int
E: E + E | T
T: T * T | F ==> ...
F: (E) | int
E
/ | \
E + E ==> ...
/ | \ |
E + E int
| |
int int
E: E + E | T
T: T * T | F ==> ...
F: (E) | int
E E
/ | \ / | \
E + E ==> E + T
/ | \ | / | \ |
E + E int E + T F
| | | | |
int int T F int
| |
F int
|
int
E: E + E | T E: E + T | T
T: T * T | F ==> ... T: T * F | F
F: (E) | int F: (E) | int
E E
/ | \ / | \
E + E ==> E + T
/ | \ | / | \ |
E + E int E + T F
| | | | |
int int T F int
| |
F int
|
int
// Grammar
S: c A d
A: a b | a
cad