LR(0)-разбор — различия между версиями
Margarita (обсуждение | вклад) (→LR(0)-разбора конкретной строки) |
Margarita (обсуждение | вклад) (→Построение автомата и управляющей таблицы) |
||
| Строка 2: | Строка 2: | ||
== Построение автомата и управляющей таблицы == | == Построение автомата и управляющей таблицы == | ||
| − | + | В статье про LR(k)-разборщик, управляющая программа одинакова для всех LR-анализаторов, а таблица и автомат изменяются от одного анализатора к другому. | |
Надо заметить, что алгоритм LR-разбора похож на [[Алгоритм Эрли]]. | Надо заметить, что алгоритм LR-разбора похож на [[Алгоритм Эрли]]. | ||
Версия 12:02, 3 сентября 2015
LR(0)-разборщик это частный случай LR(k)-разборщикa. Заметим, что в данном случае , то есть решение о своих действиях принимается только на основании содержимого стека, не учитывая символы входной цепочки.
Содержание
Построение автомата и управляющей таблицы
В статье про LR(k)-разборщик, управляющая программа одинакова для всех LR-анализаторов, а таблица и автомат изменяются от одного анализатора к другому. Надо заметить, что алгоритм LR-разбора похож на Алгоритм Эрли.
Автомат
Каждое состояние автомата будет состоять из LR(0)-ситуации.
| Определение: |
| Пусть — КС-грамматика и . Композицию назовем LR(0)-ситуацией (англ. LR(0)-item) |
В начале работы стек пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация , где — нетерминал, добавленный при пополнении грамматики, — стартовый нетерминал. Назовем это состояние . Входная цепочка может начинаться с любого терминального символа, с которого начинается правая часть любого правила с левой частью . Построим соответствующий переход по следующей схеме:
Теперь мы должны выяснить, что произойдет, если анализатор выполнит перенос. Предположим, что мы выполним перенос или перенос :
Таким образом, мы определяем новые состояния, в которое автомат перейдет после переноса того или иного терминала или нетерминала.
Заметим, что хранить в каждом состоянии только по одной ситуации не имеет смысла, поэтому пусть в каждое стостояние будет представлять множество ситуаций, а переходы — термилалы и нетермилалы. Для этого определим базовые операции и , где – множество ситуаций, – символ грамматики (терминал или нетерминал). Операция добавляет ситуации к множеству ситуаций, у которых точка стоит слева от нетерминала. Добавляются те ситуации, которые получаются из правил, в левой части которого находится этот нетерминал.
|
[] closure (I)
do
for каждой ситуации [A w.Xv] из I
for каждого правила грамматики X u
I += [X .u] // Операция += добавляет элемент к множеству
while I изменилось
return I
|
Операция "переносит" точку после символа . Это означает переход из одного состояния в другое под воздействием символа .
|
[] goto (I, X)
J={} // {} обозначает пустое множество
for каждой ситуации [A w.Xv] из I
J += [A wX.v]
return closure (J)
|
Теперь обсудим алгоритм построения конечного автомата. Обозначим множество состояний, – множество переходов.
|
E, T build()
E = {}
T = {closure ([S' .S])}
do
for каждого состояния I из T
for каждой ситуации [A w.Xv] из I
J = goto(I, X)
T += {J} // ко множеству состояний добавляется новое состояние
E += (I J) // ко множеству ребер добавляется ребро, идущее из состояния I в состояние J. Этот переход осуществляется по символу X
while E или T изменились
return E, T
|
Управляющая таблица
После того, как автомат построен, можно построить управляющую таблицу.
Обращение к таблице происходит следующим образом , где
- — состояние автомата,
- — входной символ;
В соответствии со структурой управляющей таблицы будем действовать следующим образом:
- Для каждого ребра (из состояния в состояние по ) мы поместим в позицию
- (сокр. от shift) , если — терминал,
- , если — нетерминал.
- Для состояния , содержащего ситуацию в позицию для каждого терминала
- Поместим (сокр. от reduce), где — это номер правила в изначальной грамматике.
- Запись означает допуск.
- Пустая ячейка означает ошибочную ситуацию.
Пример
Для иллюстрации алгоритма LR(0)-разборщика мы будем использовать грамматику:
Обратим внимание, что данная грамматика является леворекурсивной, поэтому нисходящий разборщик не сможет осуществить разбор слова из этой грамматики.
Пополнение грамматики
Для начала переходим к Пополненной грамматике:
Построение автомата
состоянию будет соответствует ситуация . Добавляем остальные состояния и получаем следующий НКА:
Теперь в одно состояние перемещаем все ситуации, в которые идут -переходы. Получаем ДКА:
Заполнение управляющей таблицы
Пронумеруем правила для выполнения свертки:
Управляющая таблица будет выглядеть так:
LR(0)-разбора конкретной строки
Пример будет для строки
| Строка | Стек | Комментарий | |||
|---|---|---|---|---|---|
| Перенос . Переход в состояние. | |||||
| Перенос . Переход в состояние. | |||||
| Свертка: . Удаление из стека . Переход в состояние. Добавление в стек . Переход в состояние. | |||||
| Свертка: . Удаление из стека . Переход в состояние. Добавление в стек . Переход в состояние. | |||||
| Перенос . Переход в состояние. | |||||
| Перенос . Переход в состояние. | |||||
| Свертка: . Удаление из стека . Переход в состояние. Добавление в стек . Переход в состояние. | |||||
| Свертка: . Удаление из стека . Переход в состояние. Добавление в стек . Переход в состояние. | |||||
| Перенос . Переход в состояние. | |||||
| Свертка: . Удаление из стека . Переход в состояние. Добавление в стек . Переход в состояние. | |||||
| Свертка: . Удаление из стека . Переход в состояние. Добавление в стек . Переход в состояние. | |||||
| Перенос . Переход в состояние. | |||||
| Перенос . Переход в состояние. | |||||
| Свертка: . Удаление из стека . Переход в состояние. Добавление в стек . Переход в состояние. | |||||
| Свертка: . Удаление из стека . Переход в состояние. Добавление в стек . Переход в состояние. | |||||
| Так как свертка по нулевому правилу — осуществляем допуск. |
См. также
Источники информации
- Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы. Принципы, технологии, инструменты. Издательство Вильямс, 2003. Стр. 301 - 326.
- Терехов Ан.А., Вояковская Н., Булычев Д., Москаль А. - Разработка компиляторов на платформе .NET - Восходящие анализаторы
- Б.К.Мартыненко. Языки и трансляции. Стр. 198 - 223
- Лекции по теории формальных языков, LR(0)-, SLR(1)-, LR(1)- и LALR(1)-анализ