LR(k)-грамматики — различия между версиями
Margarita (обсуждение | вклад)  (→Перенос-свертка)  | 
				Margarita (обсуждение | вклад)   (→Управляющая программа анализатора)  | 
				||
| Строка 64: | Строка 64: | ||
           a = w[ip]  |            a = w[ip]  | ||
           '''if''' action [s, a] == shift s’    |            '''if''' action [s, a] == shift s’    | ||
| − |                push (a)  | + |                push(a)  | 
| − |                push (s’)  | + |                push(s’)  | 
               ip++  |                ip++  | ||
           '''else if''' action [s, a] == reduce A <tex> \to \beta</tex>    |            '''else if''' action [s, a] == reduce A <tex> \to \beta</tex>    | ||
               '''for''' j = 1 '''to''' <tex>|\beta |</tex>     |                '''for''' j = 1 '''to''' <tex>|\beta |</tex>     | ||
| − |                    pop ()  | + |                    pop()  | 
| − |                    pop ()  | + |                    pop()  | 
               s’ = top()  |                s’ = top()  | ||
| − |                push (A)  | + |                push(A)  | 
| − |                push (goto [s’, A])    | + |                push(goto [s’, A])    | 
               Вывод правила (A <tex> \to \beta</tex>)  |                Вывод правила (A <tex> \to \beta</tex>)  | ||
           '''else''' '''if''' action [s, a] == accept    |            '''else''' '''if''' action [s, a] == accept    | ||
Версия 11:23, 21 августа 2015
Восходящий разбор (англ. Bottom-up parsing) предназначен для построения дерево разбора. Мы можем представить себе этот процесс как "свертку" исходной строки к правилу грамматики. Каждый шаг свертки заключается в сопоставлении некоторой подстроки и правой части какого-то правила грамматики, затем происходит замена этой подстроки на нетерминал, являющийся левой частью правила. Восходящий разбор менее интуитивный, чем нисходящий, но зато позволяет разбирать большее множество грамматик.
Содержание
LR(k)-грамматика
| Определение: | 
| Пусть — контекстно-свободная грамматика. Пополненной грамматикой (англ. augmented grammar), полученной из , назовем грамматику , где | 
Использование в определении LR(k)-грамматики пополненной грамматики существенно для однозначного определения конца анализа. Действительно, если грамматика использует  в правых частях правил, то свертка основы в  не может служить сигналом приема входной цепочки. Свертка же в  в пополненной грамматике служит таким сигналом, поскольку  нигде, кроме начальной сентенциальной формы, не встречается.
// TODO сделать пример, когда нам точно нужно пополнять грамматику
// TODO написать нормальное определение LR(k)-грамматики
| Определение: | 
Пусть  — пополненная грамматика для КС-грамматики . Грамматика  явяется LR(k)-грамматикой, если для любых двух правосторонних выводов  вида:
  | 
Говоря неформально, если согласно первому выводу  — основа, сворачиваемая в нетерминал , то и во втором выводе  должна быть основой, сворачиваемой в нетерминал .
Из этого определения следует, что если имеется правовыводимая цепочка , где  — основа, полученная из , и если , то
- зная первые символы цепочки и не более, чем следующих символов цепочки , мы можем быть уверены, что правый конец основы не будет достигнут до тех пор, пока ;
 - зная цепочку и не более символов цепочки , мы можем быть уверены, что именно является основой, сворачиваемой в нетерминал ;
 - если , можно сигнализировать о выводимости исходной терминальной цепочки из и, следовательно, из .
 
// TODO end
LR(k) означает, что
- входная цепочка обрабатывается слева направо (англ. left-to-right parse);
 - выполняется правый вывод (англ. rightmost derivation);
 - не более символов цепочки (англ. k-token lookahead) используются для принятия решения.
 
Перенос-свертка
При LR(k)-анализе применяется метод перенос-свертка (англ. shift-reduce). Этот метод использует магазинный автомат. Суть метода сводится к следующему. Символы входной цепочки переносятся в магазин до тех пор, пока на вершине магазина не накопится цепочка, совпадающая с правой частью какого-нибудь из правил (операция перенос). Далее все символы этой цепочки извлекаются из магазина и на их место помещается нетерминал, находящийся в левой части этого правила (операция свертка). Входная цепочка допускается автоматом, если после переноса в автомат последнего символа входной цепочки и выполнения операции свертка, в магазине окажется только аксиома грамматики.
Управляющая программа анализатора
Для определения, какую операцию применить(перенос-свертку), используем управляющую таблицу. Управляющая программа одинакова для всех LR-анализаторов, а таблица изменяется от одного анализатора к другому. Программа анализатора читает последовательно символы входной цепочки. Программа использует магазин для запоминания строки следующего вида , где — вершина магазина. Каждый — символ грамматики, а — символ, называемый состоянием. Каждое состояние суммирует информацию, cодержащуюся в стеке перед ним.
Программа ведет себя следующим образом:
Происходит обращение к таблице: , где
- — текущее состояние на вершине магазина, каждое состояние суммирует информацию, cодержащуюся в стеке перед ним,
 - — текущий входной символ;
 
Результат может иметь одно из четырех значений:
- переход в стостояние ,
 - свертка по правилу , ,
 - допуск, ,
 - ошибка, .
 
| 
 
  bool algorithmLR(w: string)
     ip — указатель на перый символ в строке w
     while цепочка не закончилась
         s = top()
         a = w[ip]
         if action [s, a] == shift s’ 
             push(a)
             push(s’)
             ip++
         else if action [s, a] == reduce A  
             for j = 1 to   
                 pop()
                 pop()
             s’ = top()
             push(A)
             push(goto [s’, A]) 
             Вывод правила (A )
         else if action [s, a] == accept 
             return success
         else 
             return error     
  | 
Функция получает состояние и символ грамматики и выдает состояние. Функция , строящаяся по грамматике , есть функция переходов детерминированного магазинного автомата, который распознает язык, порождаемый грамматикой .
См. также
Источники информации
- Альфред Ахо, Рави Сети, Джеффри Ульман. Компиляторы. Принципы, технологии, инструменты. Издательство Вильямс, 2003. Стр. 301 - 326.
 - Терехов Ан.А., Вояковская Н., Булычев Д., Москаль А. - Разработка компиляторов на платформе .NET - Восходящие анализаторы
 - Б.К.Мартыненко. Языки и трансляции. Стр. 198 - 223