LR(0)-разбор — различия между версиями
Margarita (обсуждение | вклад) |
Margarita (обсуждение | вклад) (→Алгоритм) |
||
Строка 1: | Строка 1: | ||
LR(0)-разборщик это частный случай [[LR(k)-грамматики#LR-разборщик|LR(k)-разборщикa]], для которого сейчас будет рассмотрено построение автомата и управляющей таблицы. | LR(0)-разборщик это частный случай [[LR(k)-грамматики#LR-разборщик|LR(k)-разборщикa]], для которого сейчас будет рассмотрено построение автомата и управляющей таблицы. | ||
− | == | + | == Формальное описаное 2 == |
Заметим, что LR(0)-разборщик принимает решение о своих действиях только на основании содержимого стека, не учитывая символы входной цепочки. | Заметим, что LR(0)-разборщик принимает решение о своих действиях только на основании содержимого стека, не учитывая символы входной цепочки. | ||
Строка 11: | Строка 11: | ||
}} | }} | ||
LR(0)-ситуации не должны содержать терминальной цепочки, так как <tex>k=0</tex>, то есть мы можем записывать их следующим образом: <tex>[A \to w_1 \cdot w_2]</tex> | LR(0)-ситуации не должны содержать терминальной цепочки, так как <tex>k=0</tex>, то есть мы можем записывать их следующим образом: <tex>[A \to w_1 \cdot w_2]</tex> | ||
− | |||
=== Автомат для множества ситуаций === | === Автомат для множества ситуаций === | ||
− | В начале работы стек пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация <tex>[E_0 \to \cdot E]</tex>. | + | В начале работы стек пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация <tex>[E_0 \to \cdot E]</tex>, где <tex>E_0</tex> {{---}} нетерминал, добавленный при пополнении грамматики, <tex>E</tex> {{---}} стартовый нетерминал. |
Для терминалов или нетерминалов, мы строим переходы к другим ситуациям по следующей схеме: | Для терминалов или нетерминалов, мы строим переходы к другим ситуациям по следующей схеме: | ||
Строка 24: | Строка 23: | ||
<tex>{[} A \to \alpha \cdot B \beta] \xrightarrow{\varepsilon} {[} B \to \cdot \gamma] </tex> | <tex>{[} A \to \alpha \cdot B \beta] \xrightarrow{\varepsilon} {[} B \to \cdot \gamma] </tex> | ||
− | Получаем | + | Получаем [[Недетерминированные конечные автоматы|НКА]]. |
− | + | Далее избавимся от <tex>\varepsilon</tex>-переходов и получаем [[Детерминированные конечные автоматы|ДКА]]. | |
=== Построение управляющей таблицы === | === Построение управляющей таблицы === | ||
+ | |||
== Иллюстрация алгоритма == | == Иллюстрация алгоритма == | ||
Для иллюстрации алгоритма LR(0)-разборщика мы будем использовать грамматику: | Для иллюстрации алгоритма LR(0)-разборщика мы будем использовать грамматику: |
Версия 16:05, 29 августа 2015
LR(0)-разборщик это частный случай LR(k)-разборщикa, для которого сейчас будет рассмотрено построение автомата и управляющей таблицы.
Содержание
Формальное описаное 2
Заметим, что LR(0)-разборщик принимает решение о своих действиях только на основании содержимого стека, не учитывая символы входной цепочки.
Ситауции
Определение: |
Пусть | — КС-грамматика и . Композицию , где , назовем LR(k)-ситуацией (англ. LR(k)-item)
LR(0)-ситуации не должны содержать терминальной цепочки, так как
, то есть мы можем записывать их следующим образом:Автомат для множества ситуаций
В начале работы стек пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация
, где — нетерминал, добавленный при пополнении грамматики, — стартовый нетерминал. Для терминалов или нетерминалов, мы строим переходы к другим ситуациям по следующей схеме:
Получаем НКА.
Далее избавимся от ДКА.
-переходов и получаемПостроение управляющей таблицы
Иллюстрация алгоритма
Для иллюстрации алгоритма LR(0)-разборщика мы будем использовать грамматику:
Пополнение грамматики
Для начала переходим к Пополненной грамматике:
Построение автомата
В начале работы стек пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация
. Для терминалов или нетерминалой, мы строим переходы к другим ситуациям по следующей схеме:
Получаем следующий НКА:
Избавимся от ДКА:
-переходов и получимУправляющая таблица
Теперь можно построить управляющую таблицу. Поступим следующим образом:
1. для каждого ребра
мы поместим в позицию таблицы- (сокр. от shift) , если — терминал,
- , если — нетерминал.
2. для состояния, содержащего ситуацию
, поместим (сокр. от reduce) в позицию для каждого терминала , где — это номер правила в изначальной грамматике.3. пустая ячейка означает ошибочную ситуацию.
Вспомним грамматику и пронумеруем правила для 2 пункта:
Управляющая таблица будет выглядеть так:
Формальное описание
Базовые операции
Теперь опишем алгоритм формально.
Для построения множества состояний определим базовые операции
и , где – множество ситуаций, – символ грамматики (терминал или нетерминал). Операция добавляет ситуации к множеству ситуаций, у которых точка стоит слева от нетерминала. Добавляются те ситуации, которые получаются из правил, в левой части которого находится этот нетерминал.
[] closure (I) do for каждой ситуации [Aw.Xv] из I for каждого правила грамматики X u I += [X .u] // Операция += добавляет элемент к множеству while I изменилось return I
|
Операция "переносит" точку после символа . Это означает переход из одного состояния в другое под воздействием символа .
[] goto (I, X) J={} // {} обозначает пустое множество for каждой ситуации [Aw.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
|
Поскольку для символа
операция не определена , мы выполняем действие .Пример LR(0)-разбора
Пример будет для строки
Строка | Стек | Комментарий | |||
---|---|---|---|---|---|
Перенос | |||||
Перенос | |||||
Свертка: | |||||
Свертка: | |||||
Перенос | |||||
Перенос | |||||
Свертка: | |||||
Свертка: | |||||
Перенос | |||||
Свертка: | |||||
Свертка: | |||||
Перенос | |||||
Перенос | |||||
Свертка: | |||||
Свертка: | |||||
Допуск |
См. также
Источники информации
- Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы. Принципы, технологии, инструменты. Издательство Вильямс, 2003. Стр. 301 - 326.
- Терехов Ан.А., Вояковская Н., Булычев Д., Москаль А. - Разработка компиляторов на платформе .NET - Восходящие анализаторы
- Б.К.Мартыненко. Языки и трансляции. Стр. 198 - 223
- Лекции по теории формальных языков, LR(0)-, SLR(1)-, LR(1)- и LALR(1)-анализ