LR(0)-разбор — различия между версиями
| Margarita (обсуждение | вклад)  (Новая страница: «== LR(0)-Разбор ==  === Иллюстрация алгоритма === Заметим, что LR(0)-анализатор принимает решение о...») | Margarita (обсуждение | вклад)  | ||
| Строка 1: | Строка 1: | ||
| + | LR(0)-разбор означает, что разборщик для принятия решения не смотрит на символы строки, а смотрит только на состояние стека и определяет переходы по нему. | ||
| + | |||
| == LR(0)-Разбор == | == LR(0)-Разбор == | ||
| Строка 23: | Строка 25: | ||
| |id=def_LRk_item)   | |id=def_LRk_item)   | ||
| |definition= | |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^{ | + | Пусть <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> | LR(0)-ситуации не должны содержать терминальной цепочки, так как <tex>k=0</tex>, то есть мы можем записывать их следующим образом: <tex>[A \to w_1 \cdot w_2]</tex> | ||
| Строка 35: | Строка 37: | ||
| <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{\text{B}}  {[} A \to \alpha  B \cdot \beta] </tex> | ||
| − | + | <tex>{[} A \to \alpha \cdot B \beta] \xrightarrow{\varepsilon}  {[} B \to \cdot \gamma] </tex> | |
| − | |||
| − | <tex>{[} A \to \alpha \cdot B \beta] \xrightarrow{\ | ||
| − | Получаем следующий  | + | Получаем следующий [[Недетерминированные конечные автоматы|НКА]]: | 
| [[Файл:eps-dfa.png|600px]] | [[Файл:eps-dfa.png|600px]] | ||
| − | Избавимся от <tex>\ | + | Избавимся от <tex>\varepsilon</tex>-переходов и получим [[Детерминированные конечные автоматы|ДКА]]: | 
| [[Файл:LRk_dfa.png|600px]] | [[Файл:LRk_dfa.png|600px]] | ||
Версия 11:35, 21 августа 2015
LR(0)-разбор означает, что разборщик для принятия решения не смотрит на символы строки, а смотрит только на состояние стека и определяет переходы по нему.
Содержание
LR(0)-Разбор
Иллюстрация алгоритма
Заметим, что LR(0)-анализатор принимает решение о своих действиях только на основании содержимого магазина, не учитывая символы входной цепочки. Для иллюстрации построения таблиц LR(0)-анализатора мы будем использовать грамматику:
Для начала переходим к Пополненной грамматике:
| Определение: | 
| Пусть — КС-грамматика и . Композицию , где , назовем LR(k)-ситуацией (англ. LR(k)-item) | 
LR(0)-ситуации не должны содержать терминальной цепочки, так как , то есть мы можем записывать их следующим образом:
Построение автомата
В начале работы магазин пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация . Для терминалов или нетерминалой, мы строим переходы к другим ситуациям по следующей схеме:
Получаем следующий НКА:
Избавимся от -переходов и получим ДКА:
Управляющая таблица
Теперь можно построить управляющую таблицу. Поступим следующим образом:
1. для каждого ребра мы поместим в позицию таблицы
- (англ. shift) , если — терминал,
- , если — нетерминал.
2. для состояния, содержащего ситуацию , поместим (англ. reduce) в позицию для каждого терминала , где n — это номер правила в изначальной грамматике.
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


