Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК по СПО.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.79 Mб
Скачать

6.11.Распознаватели для lr(0) и lr(1) грамматик

6.11.1.Распознаватель для lr(0)-грамматики

Простейшим случаем LR(k) -грамматик являются LR(0) -грамматики. При k =0 распознающий расширенный МП-автомат совсем не принимает во внимание те­кущий символ, обозреваемый его считывающей головкой. Решение о выполняе­мом действии принимается только на основании содержимого стека автомата. При этом не должно возникать конфликтов между выполняемым действием (сдвиг или свертка), а также между различными вариантами при выполнении свертки.

Управляющая таблица для LR(0)-грамматики строится на основании понятия «левых контекстов» для нетерминальных символов: очевидно, что после выпол­нения свертки для нетерминального символа А и стеке МП-автомата ниже этого символа будут располагаться только те символы, которые могут встречаться и цепочке вывода слева от A. Эти символы н составляют «левый контекст» для A. Поскольку выбор между сдвигом или сверткой, а также между типом свертки в LR(0) -грамматиках выполняется только на основании содержимого стека, то LR(0) -грамматика должна допускать однозначный выбор на основе левого кон­текста для каждого символа.

Рассмотрим простую КС-грамматику G({a,b}, {S}, {S→aSS|b}, S). Пополненная грамматика для нее будет иметь вид G({a.b}, {S, S'}, (S'→S. S →aSS|b), S'). Эта грамматика является LR(0)-грамматикой. Управляющая таблица для нее приведена и табл. 6.1.

Таблица 6.1. Пример управляющей таблицы для LR(0)-грамматики

Стек

Действие

Переход

S

а

b

^и

сдвиг

1

2

3

S

успех, 1

а

сдвиг

4

2

3

b

свертка, 3

aS

сдвиг

5

2

3

aSS

свертка, 2

Колонка «Стек», присутствующая в таблице, в принципе не нужна для распозна­вателя. Она введена исключительно для пояснения каждого состояния стека автомата. Пустые клетки в таблице соответствуют состоянию «ошибка». Прави­ла в грамматике пронумерованы от 1 до 3 (при этом будем считать, что состоя­нию «успех» — свертке к нулевому символу — в пополненной грамматике всегда соответствует первое правило). Распознаватель работает, невзирая на текущий символ, обозреваемый считывающей головкой расширенного МП-автомата, по­этому колонка «Действие» в таблице имеет только один столбец, не помеченный никаким символом, — указанное в ней данное действие выполняется всегда для каждой строки таблицы.

Рассмотрим примеры распознавания цепочек этой грамматики. Работу распозна­вателя будем отображать по шагам. Конфигурацию расширенного МП-автомата будем отображать в виде трех компонентов: не прочитанная еще часть входной цепочки символов, содержимое стека МП-автомата, последовательность номеров примененных правил грамматики (поскольку автомат имеет только одно состоя­ние, его можно не учитывать). В стеке МП-автомата вместе с помещенными туда символами показаны и номера строк управляющей таблицы, соответствующие этим символам в формате {символ, номер строки).

Разбор цепочки abababb.

1. (abababb^к, {^и,0}, )

2. (bababb^к {^и,0},{a,2}, )

3. (аbаbb^к, {^и ,0}{а,2}{b,3}, )

4. (аbаbb^к, {^и,0){а,2}{S,4), 3)

5. (bаbb^к, {^и ,0}{а,2}{S,4}{а,2}, 3)

6. (аbb^к, (^и ,0}{а,2}{S,4}{а,2}{b,3}, 3)

7. (abb^к. {^и ,0){a,2}{S,4){a,2}{S,4}, 3,3)

8. (bb^к, {^и ,0}{а,2}{S,4}{а,2}{S,4}{а,2}, 3,3)

9. (b^к, {^и ,0}{a,2}{S,4}{a,2}{S,4}{a,2}{b,3}, 3,3)

10. (b^к.. {^и ,0}{a,2}{S,4}{a,2}{S,4}{a,2}{S,4}, 3,3,3)

11. (^к , {^и ,0}{a,2}{S,4}{a,2}{S,4}{a,2}{S,4}{b,3} 3,3,3)

12. (^к , {^и ,0}{a,2}{S,4}{a,2}{S,4}{a,2}{S,4}{S,5}, 3,3,3,3)

13. (^к , {^и,0}{a,2}{S,4}{a,2}{S,4}{S,5}, 3,3,3,3,2)

14. (^к , {^и,0}{а,2}{S,4}{S,5}, 3,3,3,3,2,2)

15. (^к , {^и,0}{S,1}, 3,3,3,3,2,2,2)

16. (^к , {^и,0}{S',*}, 3,3,3,3,2,2,2,1) - разбор завершен.

Соответствующая цепочка вывода будет иметь вид (используется правосторон­ний вывод): S'  S  aSS  aSaSS  aSaSaSS  aSaSaSb  aSaSabb  aSababb  abababb.

Разбор цепочки aabbb:

1. (aabbb^к, {^и,0}, )

2. (аbbb^и, {^и ,0}{а,2}, )

3. (bbb^к, {^и ,0}{a,2}{a,2}{b,3},)

4. (bb^к, {^и,0}{а,2}{а,2}{b,3}, )

5. (bb^к, {^и ,0}{a,2}{a,2}{S,4},3) .

6. (b^к , {^и,0}{а,2}{а,2}{S,4}{b,3}, 3)

7. (b^к, {^и ,0}{а,2}{а,2}{S,4}{S,5}, 3,3)

8. (b^к, {^и ,0}{а,2}{S,4}, 3,3,2)

9. (^к, {^и,0}{а,2){S,4){b,З}, 3,3,2)

10. (^к, {^и ,0}{а,2}{S,4}{S,5}, 3,3,2,3)

11. (^к, {^и ,0}{S,1}, 3,3,2,3,2)

12. (^к, {^и,0}{S',*}, 3,3,2,3,2,1) - разбор завершен.

Соответствующая цепочка вывода будет иметь вид (используется правосторон­ний вывод): S'  S  aSS  aSb  aaSSb  aaSbb  aabbb.

Разбор цепочки aabb:

1. (ааbb^к, {^и,0},)

2. (abb^к, {^и ,0}{а,2}, )

3. (bb^к, {^и,0}{а,2}{а,2}, )

4. (b^к, {^и,0}{а,2}{а,2}{b,3}, )

5. (b^к, {^и,0}{a,2}{a,2}{S,4}, 3)

6. (^к, {^и,0}{а,2}{а,2}{S,4}{b,3},3)

7. (^к, {^и,0}{а,2}{а,2}{S,4}{S,5}, 3,3)

8. (^к, {^и ,0}{а,2}{S,4}, 3,3,2)

9. Ошибка, невозможно выполнить сдвиг.

Распознаватель для LR(0) -грамматики достаточно прост. Приведенный выше пример можно сравнить с методом рекурсивного спуска или с распознавателем для LL(1)-грамматики — оба эти метода применимы к описанной выше грамма­тике. По количеству шагов работы распознавателя эти методы сопоставимы, но по реализации нисходящие распознаватели в данном случае немного проще.