![](/user_photo/2706_HbeT2.jpg)
spoPresentation2
.pdf![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ281x1.jpg)
Распознаватели без возвратов
Другие методы позволяют обойтись без рекурсии и обрабатывать входную строку в цикле
Наличие на входе S-грамматики достаточное, но не необходимое условие
Т.е. и иная произвольная КС-грамматика может задавать язык, распознаваемый методом рекурсивного спуска, однако не существует алгоритма, позволяющего это проверить
281
![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ282x1.jpg)
Распознаватели без возвратов
Кроме того, не существует и алгоритма, позволяющего проверить, преобразуется ли произвольная КС-грамматика в S- грамматику, и алгоритма, выполняющего такое преобразование
В общем случае исключение O-правил, левой
рекурсии, цепных правил, выполнение левой факторизации могут способствовать приведению грамматики к требуемому виду, но не гарантируют этого
282
![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ283x1.jpg)
Распознаватели без возвратов
Алгоритм распознавания S-грамматики просты и эффективны
Имеют ограниченную применимость, поскольку только узкий класс грамматик отвечает заданным требованиям
283
![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ284x1.jpg)
Построение распознавателя S-грамматики
Дано: S-грамматика G(T,N,P,S)
Получить: эквивалентный ей МПА M =
(Q,A,Z,G, q0, z0, F), задающий тот же язык L(G)
= L(М)
Дополнительные условия:
Вершина стека находится слева
284
![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ285x1.jpg)
Построение распознавателя S-грамматики
1. A = T { # }, Z = N { t | t T, A o tD P } {
# }, Q = { q }, q0 = q, F = , z0 = { S# } Здесь S-
аксиома, # - маркер конца строки
2. G ( q, a, X) = ( q, E ), X o aE P, a T, X N,
EV* . Эти функции позволяют замещать
нетерминал на вершине стека на цепочку
3. G ( q, t, t ) = ( q, O ), t T, A o tD P. Функции
позволяют вытолкнуть из стека терминал совпадающий с входным символом
285
![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ286x1.jpg)
Построение распознавателя S-грамматики
Алгоритм работы распознавателя:
Читается очередной символ t входной цепочки
Если на вершине стека такой же терминал, он удаляется из стека, читающая головка перемещается (функция перехода типа 3)
Если на вершине стека нетерминал Х, то для правила ХotD он замещается цепочкой D, читающая головка
перемещается (функция перехода типа 2)
286
![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ287x1.jpg)
Построение распознавателя S-грамматики
Если автомат находится в конфигурации (q, #, #), т.е. входная строка закончилась и стек пуст, строка принимается
Во всех остальных случаях цепочка не принимается
Пример. G ( { a, b, d, p, q, x, y }, { S, X, Y }, P, S)
P = { SopX | qY; XoaXb | x; YoaYd | y }
1. A = {a, b, d, p, q, x, y, #}, Z = {S, X, Y, b, d, #}, Q = { q }, q0 = q, F = , z0 = { S# }
287
![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ288x1.jpg)
Построение распознавателя S-грамматики
|
2.1. G ( q, p, S ) = ( q, X ) |
// SopX |
(1) |
|
2.2. G ( q, q, S ) = ( q, Y ) |
// SoqY |
(2) |
|
2.3. G ( q, a, X ) = ( q, Xb ) |
// XoaXb (3) |
|
|
2.4. G ( q, x, X ) = ( q, O ) |
// Xox |
(4) |
|
2.5. G ( q, a, Y ) = ( q, Yd ) |
// YoaYd (5) |
|
|
2.6. G ( q, y, Y ) = ( q, O ) |
// Yoy |
(6) |
|
3.1. G ( q, b, b ) = ( q, O ) |
// b |
(7) |
|
3.2. G ( q, d, d ) = ( q, O ) |
// d |
(8) |
288
![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ289x1.jpg)
Построение распознавателя S-грамматики
Пример разбора цепочка paaxbb
( q, paaxbb#, S# ) 1 ( q, aaxbb#, X# ) 3 ( q, axbb#, Xb# ) 3 ( q, xbb#, Xbb# ) 4 ( q, bb#, bb# ) 7 ( q, b#, b# ) 7 ( q, #, #)
Поскольку автомат перешел в конечную конфигурацию, строка принимается
Номера правил из второй части (1-6) позволяют построить дерево разбора
289
![](/html/2706/349/html_t5ntllEH4A.0VbF/htmlconvd-jsXsvJ290x1.jpg)
LL(k) - грамматики
Обозначение грамматик по Кнуту :
{L | R}{L | R}(k)
Первый символ указывает, в каком направлении читается входная цепочка символов – L – слева направо, R – справа налево
Второй символ - левосторонний (L) или правосторонний (R) вывод используется
k – число предварительно просматриваемых символов входной строки для выбора очередного правила грамматики
290