int * int + int
int * int + int
↑
scanner
position
int * int + int
T
|
int * int + int
↑
int * int + int
E
|
T
|
int * int + int
↑
int * int + int
E
|
T
|
int * int + int
↑
int * int + int
E
|
T
|
int * int + int
↑
int * int + int
int * int + int
↑
int * int + int
T
|
int * int + int
↑
int * int + int
T
/ | \
T | | T
| -> | | |
int * int + int int * int + int
↑ ↑
int * int + int
T T E
/ | \ / | \ |
T | | T | | T T
| -> | | | -> | | | |
int * int + int int * int + int int * int + int
↑ ↑ ↑
int * int + int
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
E E E E
/|\ -> /|\ -> / | \ -> / | \
T + E T + E T + E T + E
/|\ /|\ /|\ |
int * T int * T int * T T
| | |
int int int
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
lookahead
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
int
to T
int * T
to T
T
to E
T + E
to E
int
to T
int * T
to T
T
to E
T + E
to E
// Specify how to handle addition
E : T '+' E { $$ = $1 + $3; }
// Specify how to handle addition
E : T '+' E { $$ = $1 + $3; }
// Difficult to work with the converted grammar
E : T X { ??? }
X : '+' E { ??? }
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
Input
□□□□□□□□
↓
|---------| Stack
| Control | ⇔ |__|
| Unit | |__|
|---------| |__|
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
top of the stack
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
int
to T
int * T
to T
T
to E
T + E
to E
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
Stack | Input | Operation (Action) |
---|---|---|
int * int + int$ | Shift | |
int | * int + int$ | Shift |
int * | int + int$ | Shift |
int * int | + int$ | Reduce |
int * T | + int$ | Reduce |
T | + int$ | Shift |
T + | int$ | Shift |
T + int | $ | Reduce |
T + T | $ | Reduce |
T + E | $ | Reduce |
E | $ | Accept |
int
and reduce for the second int
? E
/ | \
T T E T | E
/ | \ / | \ | / | \ | |
T | | T | | T T | | T | T
| -> | | | -> | | | | -> | | | | |
int * int + int int * int + int int * int + int int * int + int
↑ ↑ ↑ ↑
Input
□□□□□□□□
↓
|---------| Stack
| Control | ⇔ |__|
| Unit | |__|
|---------| |__|