3.5. Алгоритм разбора
1) Положить в Mэлемент
0 (M← 0),i
= 1
2) Если IN
Terminalsi, то
2.1) Если Accepti
= true, то перейти к следующему символу
вIN
2.2) Если Stacki
= true, то добавить вMиндексi(M←i)
2.3) Если Returni
= true, то
2.3.1) k = M,
убратьkизM(M→k)
2.3.2) Если k
= 0, переход на шаг 4
2.3.2) i = k
+ 1
2.3.3) Переход на шаг 2
2.4) Если Jumpi
≠ 0, то
2.4.1) i = Jumpi
2.4.2) Переход на шаг 2
3) Иначе если Errori
= false, то
3.1) i = i
+ 1
3.2) Переход на шаг 2
4) Если Mне пуст, то
ошибка, иначе разбор успешен
Разбор цепочки id
+ id*id$
|
Магазин |
Вход |
i |
Действие |
|
0 |
id
+ id*id$ |
1 |
jump = 2 |
|
0 |
id
+ id*id$ |
2 |
stack, jump = 10 |
|
2 0 |
id
+ id*id$ |
10 |
jump = 11 |
|
2 0 |
id
+ id*id$ |
11 |
stack, jump = 19 |
|
11 2 0 |
id
+ id*id$ |
19 |
error
= false, i
= 20 |
|
11 2 0 |
id
+ id*id$ |
20 |
jump = 24 |
|
11 2 0 |
id
+ id*id$ |
24 |
accept, return |
|
2 0 |
+
id*id$ |
12 |
jump = 13 |
|
2 0 |
+
id*id$ |
13 |
error
= false, i
= 14 |
|
2 0 |
+
id*id$ |
14 |
jump = 18 |
|
2 0 |
+
id*id$ |
18 |
return |
|
0 |
+
id*id$ |
3 |
jump = 4 |
|
0 |
+
id*id$ |
4 |
jump = 6 |
|
0 |
+
id*id$ |
6 |
accept, jump = 7 |
|
0 |
id*id$ |
7 |
stack, jump = 10 |
|
8 0 |
id*id$ |
10 |
jump = 11 |
|
8 0 |
id*id$ |
11 |
stack, jump = 19 |
|
12 8 0 |
id*id$ |
19 |
error
= false, i
= 20 |
|
12 8 0 |
id*id$ |
20 |
jump = 24 |
|
12 8 0 |
id*id$ |
24 |
accept, return |
|
8 0 |
*id$ |
13 |
jump = 15 |
|
8 0 |
*id$ |
15 |
accept,
jump = 16 |
|
8 0 |
id$ |
16 |
stack, jump = 19 |
|
17 8 0 |
id$ |
19 |
error
= false, i
= 20 |
|
17 8 0 |
id$ |
20 |
jump = 24 |
|
17 8 0 |
id$ |
24 |
accept, return |
|
8 0 |
$ |
18 |
return |
|
0 |
$ |
9 |
return |
|
|
$ |
|
success |