- •Построение матрицы операторного предшествования
- •Автомат с магазинной памятью (сокращенно мп-автомат)
- •Преобразователь с магазинной памятью (сокращенно мп - преобразователь)
- •Опишем lr(k)-алгоритм разбора.
- •Алгоритм построения управляющей таблицы для lr(0)-грамматики без -правил
- •Алгоритм построения управляющей таблицы для slr(1)-грамматики без -правил
- •Включение -правил в lr(0)- и slr (1)-грамматики
- •Алгоритм построения анализатора типа “перенос –свертка” для грамматик простого предшествования
- •Описание алгоритма
Описание алгоритма
1) Функция переноса f определяется по отношениям предшествования на множестве (V { }) (T { }) ( за исключением правила с), которое имеет приоритет над правилами а) и b), когда Х = S и a = ) по отношениям предшествования следующим образом:
а) f (X, а) = ПЕРЕНОС, если X <• a или X a ;
f (X, а) = СВЕРТКА, если X •> a;
f(S, ) = ДОПУСК;
2) Функция свертки g определяется так, чтобы при свертке применялось самое длинное правило из списка альтернатив.
а) g(X,) = i, если B R и имеет номер i и в R нет правила вида
A X;
g() = ОШИБКА во всех остальных случаях.
Пример
E E + T
E T
T TP
T P
P (E)
P i
|
E |
T |
P |
i |
( |
) |
+ |
* |
|
|
|
|
|
|
|
|
|
| |
T |
|
|
|
|
|
• |
• |
|
• |
P |
|
|
|
|
|
• |
• |
• |
• |
i |
|
|
|
|
|
• |
• |
• |
• |
( |
<• |
<• |
<• |
<• |
<• |
|
|
|
|
) |
|
|
|
|
|
• |
• |
• |
• |
+ |
|
<• |
<• |
<• |
<• |
|
|
|
|
* |
|
|
|
<• |
<• |
|
|
|
|
|
<• |
<• |
<• |
<• |
<• |
|
|
|
|
f(X,a) |
i |
( |
) |
+ |
* |
|
E |
|
|
П |
П |
|
|
T |
|
|
С |
С |
П |
С |
P |
|
|
С |
С |
С |
С |
i |
|
|
С |
С |
С |
С |
( |
П |
П |
|
|
|
|
) |
|
|
С |
С |
С |
С |
+ |
П |
П |
|
|
|
|
* |
П |
П |
|
|
|
|
|
П |
П |
|
|
|
|
E |
|
|
|
|
|
Д |
|
g() | ||
X |
| ||
( |
E+T |
1 | |
|
E+T |
1 | |
( |
T |
2 | |
|
T |
2 | |
( |
T*P |
3 | |
+ |
T*P |
3 | |
|
T*P |
3 | |
( |
P |
4 | |
+ |
P |
4 | |
|
P |
4 | |
( |
(E) |
5 | |
+ |
(E) |
5 | |
* |
(E) |
5 | |
|
(E) |
5 | |
( |
i |
6 | |
+ |
i |
6 | |
* |
i |
6 | |
|
i |
6 |
Последовательность тактов, которую выполнит анализатор при разборе входной цепочки i+i*i, имеет следующий вид:
(, i+i*i, ) #s (i, +i*i, ) #r (P, +i*i, 6) #r (T, +i*i, 64) #r (E, +i*i, 642) #s
(E+, i*i, 642) #s (E+i, *i, 642) #r (E+P, *i, 6426) #r (E+T, *i, 64264) #s
(E+T*, i, 64264) #s (E+T*i, , 64264) #r (E+T*P, , 642646) #r
(E+T, , 6426463) #r (E, , 64264631) #s ДОПУСК
Операторной грамматикой
называется приведенная КС-грамматика без -правил, правые части правил которой не содержат смежных нетерминалов.
Для операторной грамматики отношения предшествования можно задать на множестве (T { } ) (T { } ). Пусть C N { }. Тогда
a b, если A aCb R;
a <• b, если A aB R и B + Cb;
<• a, если S + Ca;
a •> b, если A Bb R и B + aC;
a •>, если S + aC.
пример
E E + T
E T
T TP
T P
P (E)
P i
|
( |
i |
* |
+ |
) |
|
( |
<• |
<• |
<• |
<• |
|
|
i |
|
|
•> |
•> |
•> |
•> |
* |
<• |
<• |
•> |
•> |
•> |
•> |
+ |
<• |
<• |
•> |
•> |
•> |
•> |
) |
|
|
•> |
•> |
•> |
•> |
|
<• |
<• |
<• |
<• |
|
|
Остовной грамматикой для грамматики G назовем грамматику Gs = < T, {S}, S, R' >, множество правил R'которой строится следующим образом:
1) если в R есть правило А Y1Y2 … Ym, то в R' включается правило S X1X2 … Xm, где
а) Xi = Yi, если Yi T,
б) Xi = S, если Yi N;
2) в R' не должно быть правил вида S S.
Вход. Грамматика операторного предшествования G = < T, N, S, R >.
Выход. Алгоритм разбора A = (f, g) типа “перенос – свертка” для остовной грамматики Gs.
Описание алгоритма.
Пусть С = { S, }.
1) Функция переноса f определяется по отношениям операторного предшествования следующим образом:
а) f(aC, b) = ПЕРЕНОС, если a <• b или a b;
б) f(aC, b) = СВЕРТКА, если a •> b;
в) f(S, ) = ДОПУСК;
г) f(, w) = ОШИБКА в остальных случаях.
2) Функция свертки вычисляется так:
а) g(aCb, w) = i, если а <• b, отношение выполняется для всех соседних терминалов цепочки , если они существуют, и S Cb – правило с номером i грамматики Gs.
б) g(a, w) = ОШИБКА в остальных случаях.
Пример
Остовная грамматика G0s для грамматики G0 имеет вид
E E + E
E E * E
E (E)
E i
|
( |
i |
* |
+ |
) |
|
( |
П |
П |
П |
П |
П |
|
i |
|
|
С |
С |
С |
С |
* |
П |
П |
С |
С |
С |
С |
+ |
П |
П |
П |
С |
С |
С |
) |
|
|
С |
С |
С |
С |
|
П |
П |
П |
П |
|
|
E |
П |
П |
П |
П |
|
Д |
|
g() |
(E+E |
1 |
E+E |
1 |
(E*E |
3 |
+E*E |
3 |
E*E |
3 |
((E) |
5 |
*(E) |
5 |
+(E) |
5 |
(E) |
5 |
(i |
6 |
*i |
6 |
+i |
6 |
i |
6 |
i + i * i, имеет следующий вид:
( , i+i*i, ) #s ( i, +i*i, ) #r ( E, +i*i, 6 ) #s ( E+, i*i, 6 ) #s
( E+i, i, 6 ) #r ( E+E, i, 66 ) #s ( E+E*, i, 66 ) #s ( E+E*i, , 66 ) #r
( E+E*E, , 666) #r ( E+E, , 6663) #r ( E, , 66631) #s ДОПУСК