![]() |
![]() |
---|
![]() |
![]() |
---|
![]() |
![]() |
---|
Ambiguous Grammar | Unambiguous Grammar | Non-Left-Recursive Grammar |
---|---|---|
![]() |
![]() |
![]() |
Grammar | Step | Parse Tree | Lexing Position ( |
Remark |
---|---|---|---|---|
![]() |
1 | ![]() |
||
2 | ![]() |
Grammar | Step | Parse Tree | Lexing Position ( |
Remark |
---|---|---|---|---|
![]() |
1 | ![]() |
||
2 | ![]() |
|||
3 | ![]() |
Backtracked | ||
4 | ![]() |
Done |
How to perform top-down parsing without backtracking?
Grammar | Step | Lookahead Tokens | Parse Tree | Lexing Position ( |
Remark |
---|---|---|---|---|---|
![]() |
1 | ![]() |
|||
2 | ![]() |
Done |
Input
□□□□□□□□
↓
|---------| Stack
| Control | ⇔ |__|
| Unit | |__|
|---------| |__|
Input
□□□□□□□□
↓
|----------| Stack
| Decision | ⇔ |__|
| Table | |__|
|---------=| |__|
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | T X | T X | ||||
X | + E | ||||||
T | int Y | (E) | |||||
Y | * T |
int | * | + | ( | ) | $ | |
---|---|---|---|---|---|---|
E | T X | T X | ||||
X | + E | |||||
T | int Y | (E) | ||||
Y | * T |
int * int $
E$
to the stack (stack top: E
, bottom: $
).
E
: the starting nonterminal.int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | |||||||||
T | int Y | (E) | ||||||||
Y | * T |
int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | T X$ | int * int $ | int Y | ||||||
T | int Y | (E) | ||||||||
Y | * T |
int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | T X$ | int * int $ | int Y | ||||||
T | int Y | (E) | int Y X$ | int * int $ | match int | |||||
Y | * T |
int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | T X$ | int * int $ | int Y | ||||||
T | int Y | (E) | int Y X$ | int * int $ | match int | |||||
Y | * T | Y X$ | int * int $ | * T |
int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | T X$ | int * int $ | int Y | ||||||
T | int Y | (E) | int Y X$ | int * int $ | match int | |||||
Y | * T | Y X$ | int * int $ | * T | ||||||
* T X$ | int * int $ | match * |
int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | T X$ | int * int $ | int Y | ||||||
T | int Y | (E) | int Y X$ | int * int $ | match int | |||||
Y | * T | Y X$ | int * int $ | * T | ||||||
* T X$ | int * int $ | match * | ||||||||
T X$ | int * int $ | int Y |
int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | T X$ | int * int $ | int Y | ||||||
T | int Y | (E) | int Y X$ | int * int $ | match int | |||||
Y | * T | Y X$ | int * int $ | * T | ||||||
* T X$ | int * int $ | match * | ||||||||
T X$ | int * int $ | int Y | ||||||||
int Y X$ | int * int $ | match int |
int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | T X$ | int * int $ | int Y | ||||||
T | int Y | (E) | int Y X$ | int * int $ | match int | |||||
Y | * T | Y X$ | int * int $ | * T | ||||||
* T X$ | int * int $ | match * | ||||||||
T X$ | int * int $ | int Y | ||||||||
int Y X$ | int * int $ | match int | ||||||||
Y X$ | int * int $ |
int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | T X$ | int * int $ | int Y | ||||||
T | int Y | (E) | int Y X$ | int * int $ | match int | |||||
Y | * T | Y X$ | int * int $ | * T | ||||||
* T X$ | int * int $ | match * | ||||||||
T X$ | int * int $ | int Y | ||||||||
int Y X$ | int * int $ | match int | ||||||||
Y X$ | int * int $ | |||||||||
X$ | int * int $ |
int | * | + | ( | ) | $ | Stack | Input | Action | ||
---|---|---|---|---|---|---|---|---|---|---|
E | T X | T X | E$ | int * int $ | T X | |||||
X | + E | T X$ | int * int $ | int Y | ||||||
T | int Y | (E) | int Y X$ | int * int $ | match int | |||||
Y | * T | Y X$ | int * int $ | * T | ||||||
* T X$ | int * int $ | match * | ||||||||
T X$ | int * int $ | int Y | ||||||||
int Y X$ | int * int $ | match int | ||||||||
Y X$ | int * int $ | |||||||||
X$ | int * int $ | |||||||||
$ | int * int $ | Accept |
Compare the obtained grammar with the previous example.
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | T X | T X | ||||
X | + E | ||||||
T | int Y | (E) | |||||
Y | * T |
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | T X | T X | ||||
X | + E | ||||||
T | int Y | (E) | |||||
Y | * T |
int
and (
Table[E][int] = T X
and Table[E][(] = T X
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | T X | T X | ||||
X | + E | ||||||
T | int Y | (E) | |||||
Y | * T |
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | T X | T X | ||||
X | + E | ||||||
T | int Y | (E) | |||||
Y | * T |
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | ||||||
X | + E | ||||||
T | int Y | (E) | |||||
Y | * T |
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | ||||||
X | + E | ||||||
T | |||||||
Y | * T |
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | ||||||
X | |||||||
T | |||||||
Y |
(int)
whose partial derivation steps are shown as follows:
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | ||||||
X | |||||||
T | |||||||
Y |
(int)
whose partial derivation steps are shown as follows:
)
, we should use Table[Y][)] = ε
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | ||||||
X | |||||||
T | |||||||
Y |
(int)
whose partial derivation steps are shown as follows:
)
, we should use Table[Y][)] = ε
)
.)
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | ||||||
X | |||||||
T | |||||||
Y |
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | ||||||
X | |||||||
T | |||||||
Y |
int | * | + | ( | ) | $ | ||
---|---|---|---|---|---|---|---|
![]() |
E | ||||||
X | |||||||
T | |||||||
Y |
FIRST | FOLLOW | ||
---|---|---|---|
![]() |
E | ||
T | |||
X | |||
Y |
FIRST | FOLLOW | ||
---|---|---|---|
![]() |
E | {(, int} | |
T | {(, int} | ||
X | {+, |
||
Y | {*, |