LR(0)-разбор — различия между версиями
Margarita (обсуждение | вклад) (→Источники информации) |
Margarita (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | LR(0)- | + | LR(0)-разборщик это частный случай [[LR(k)-грамматики#LR-разборщик|LR(k)-разборщикa]], для которого сейчас будет рассмотрено построение автомата и управляющей таблицы. |
| − | == LR(0)- | + | == Алгоритм == |
| + | Заметим, что LR(0)-разборщик принимает решение о своих действиях только на основании содержимого стека, не учитывая символы входной цепочки. | ||
| − | === | + | === Ситауции === |
| − | + | {{Определение | |
| + | |id=def_LRk_item) | ||
| + | |definition= | ||
| + | Пусть <tex>\Gamma =\langle \Sigma, N, S, P \rangle</tex> {{---}} КС-грамматика и <tex>A \to w_1 w_2 \in P</tex>. Композицию <tex>[A \to w_1 \cdot w_2, u] </tex>, где <tex>u \in \Sigma^{k}</tex>, назовем '''LR(k)-ситуацией''' (англ. ''LR(k)-item'') | ||
| + | }} | ||
| + | LR(0)-ситуации не должны содержать терминальной цепочки, так как <tex>k=0</tex>, то есть мы можем записывать их следующим образом: <tex>[A \to w_1 \cdot w_2]</tex> | ||
| + | |||
| + | |||
| + | === Автомат для множества ситуаций === | ||
| + | |||
| + | В начале работы стек пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация <tex>[E_0 \to \cdot E]</tex>. | ||
| + | Для терминалов или нетерминалов, мы строим переходы к другим ситуациям по следующей схеме: | ||
| + | |||
| + | <tex>{[} A \to \alpha \cdot c \beta] \xrightarrow{\text{c}} {[} A \to \alpha c \cdot \beta] </tex> | ||
| + | |||
| + | <tex>{[} A \to \alpha \cdot B \beta] \xrightarrow{\text{B}} {[} A \to \alpha B \cdot \beta] </tex> | ||
| + | |||
| + | <tex>{[} A \to \alpha \cdot B \beta] \xrightarrow{\varepsilon} {[} B \to \cdot \gamma] </tex> | ||
| + | |||
| + | Получаем следующий [[Недетерминированные конечные автоматы|НКА]]: | ||
| + | |||
| + | Избавимся от <tex>\varepsilon</tex>-переходов и получим [[Детерминированные конечные автоматы|ДКА]]: | ||
| + | |||
| + | === Построение управляющей таблицы === | ||
| + | == Иллюстрация алгоритма == | ||
| + | Для иллюстрации алгоритма LR(0)-разборщика мы будем использовать грамматику: | ||
<tex> | <tex> | ||
| Строка 12: | Строка 38: | ||
T \to (E) \\ | T \to (E) \\ | ||
</tex> | </tex> | ||
| + | === Пополнение грамматики=== | ||
Для начала переходим к ''Пополненной грамматике'': | Для начала переходим к ''Пополненной грамматике'': | ||
| Строка 22: | Строка 49: | ||
T \to (E) \\ | T \to (E) \\ | ||
</tex> | </tex> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | === Построение автомата === | |
| − | В начале работы | + | В начале работы стек пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация <tex>[E_0 \to \cdot E]</tex>. |
Для терминалов или нетерминалой, мы строим переходы к другим ситуациям по следующей схеме: | Для терминалов или нетерминалой, мы строим переходы к другим ситуациям по следующей схеме: | ||
| Строка 47: | Строка 68: | ||
[[Файл:LRk_dfa.png|600px]] | [[Файл:LRk_dfa.png|600px]] | ||
| − | + | === Управляющая таблица === | |
Теперь можно построить управляющую таблицу. | Теперь можно построить управляющую таблицу. | ||
| Строка 164: | Строка 185: | ||
|} | |} | ||
| − | + | == Формальное описание == | |
| − | + | === Базовые операции === | |
Теперь опишем алгоритм формально. | Теперь опишем алгоритм формально. | ||
| Строка 197: | Строка 218: | ||
|} | |} | ||
| − | + | === Алгоритм построения конечного автомата === | |
Теперь обсудим алгоритм построения анализатора. Обозначим <tex>T</tex> множество состояний, <tex>E</tex> – множество переходов. | Теперь обсудим алгоритм построения анализатора. Обозначим <tex>T</tex> множество состояний, <tex>E</tex> – множество переходов. | ||
| Строка 219: | Строка 240: | ||
Поскольку для символа <tex>\$</tex> операция <tex>goto(I , \$)</tex> не определена , мы выполняем действие <tex>accept</tex>. | Поскольку для символа <tex>\$</tex> операция <tex>goto(I , \$)</tex> не определена , мы выполняем действие <tex>accept</tex>. | ||
| − | + | == Пример LR(0)-разбора == | |
Пример будет для строки <tex>(n_1+n_2)+n_3</tex> | Пример будет для строки <tex>(n_1+n_2)+n_3</tex> | ||
Версия 15:56, 29 августа 2015
LR(0)-разборщик это частный случай LR(k)-разборщикa, для которого сейчас будет рассмотрено построение автомата и управляющей таблицы.
Содержание
Алгоритм
Заметим, что LR(0)-разборщик принимает решение о своих действиях только на основании содержимого стека, не учитывая символы входной цепочки.
Ситауции
| Определение: |
| Пусть — КС-грамматика и . Композицию , где , назовем LR(k)-ситуацией (англ. LR(k)-item) |
LR(0)-ситуации не должны содержать терминальной цепочки, так как , то есть мы можем записывать их следующим образом:
Автомат для множества ситуаций
В начале работы стек пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация . Для терминалов или нетерминалов, мы строим переходы к другим ситуациям по следующей схеме:
Получаем следующий НКА:
Избавимся от -переходов и получим ДКА:
Построение управляющей таблицы
Иллюстрация алгоритма
Для иллюстрации алгоритма LR(0)-разборщика мы будем использовать грамматику:
Пополнение грамматики
Для начала переходим к Пополненной грамматике:
Построение автомата
В начале работы стек пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация . Для терминалов или нетерминалой, мы строим переходы к другим ситуациям по следующей схеме:
Получаем следующий НКА:
Избавимся от -переходов и получим ДКА:
Управляющая таблица
Теперь можно построить управляющую таблицу. Поступим следующим образом:
1. для каждого ребра мы поместим в позицию таблицы
- (сокр. от shift) , если — терминал,
- , если — нетерминал.
2. для состояния, содержащего ситуацию , поместим (сокр. от reduce) в позицию для каждого терминала , где — это номер правила в изначальной грамматике.
3. пустая ячейка означает ошибочную ситуацию.
Вспомним грамматику и пронумеруем правила для 2 пункта:
Управляющая таблица будет выглядеть так:
Формальное описание
Базовые операции
Теперь опишем алгоритм формально.
Для построения множества состояний определим базовые операции и , где – множество ситуаций, – символ грамматики (терминал или нетерминал). Операция добавляет ситуации к множеству ситуаций, у которых точка стоит слева от нетерминала. Добавляются те ситуации, которые получаются из правил, в левой части которого находится этот нетерминал.
|
[] 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
|
Поскольку для символа операция не определена , мы выполняем действие .
Пример LR(0)-разбора
Пример будет для строки
| Строка | Стек | Комментарий | |||
|---|---|---|---|---|---|
| Перенос | |||||
| Перенос | |||||
| Свертка: | |||||
| Свертка: | |||||
| Перенос | |||||
| Перенос | |||||
| Свертка: | |||||
| Свертка: | |||||
| Перенос | |||||
| Свертка: | |||||
| Свертка: | |||||
| Перенос | |||||
| Перенос | |||||
| Свертка: | |||||
| Свертка: | |||||
| Допуск |
См. также
Источники информации
- Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы. Принципы, технологии, инструменты. Издательство Вильямс, 2003. Стр. 301 - 326.
- Терехов Ан.А., Вояковская Н., Булычев Д., Москаль А. - Разработка компиляторов на платформе .NET - Восходящие анализаторы
- Б.К.Мартыненко. Языки и трансляции. Стр. 198 - 223
- Лекции по теории формальных языков, LR(0)-, SLR(1)-, LR(1)- и LALR(1)-анализ