LR(k)-грамматики — различия между версиями
Margarita (обсуждение | вклад)  | 
				Margarita (обсуждение | вклад)   (→LR(k)-грамматика)  | 
				||
| Строка 8: | Строка 8: | ||
Пусть <tex>\Gamma =\langle \Sigma, N, S, P \rangle</tex> {{---}} [[Контекстно-свободные_грамматики,_вывод,_лево-_и_правосторонний_вывод,_дерево_разбора|контекстно-свободная]] грамматика. '''Пополненной грамматикой''' (англ. ''augmented grammar''), полученной из <tex>\Gamma</tex>, назовем грамматику <tex>\Gamma' =\langle \Sigma', N', S', P' \rangle</tex>, где <tex>\Sigma' = \Sigma; N' = N \cup \{S'\}; S' \notin N; P' = P \cup \{S' \to S\}</tex>  | Пусть <tex>\Gamma =\langle \Sigma, N, S, P \rangle</tex> {{---}} [[Контекстно-свободные_грамматики,_вывод,_лево-_и_правосторонний_вывод,_дерево_разбора|контекстно-свободная]] грамматика. '''Пополненной грамматикой''' (англ. ''augmented grammar''), полученной из <tex>\Gamma</tex>, назовем грамматику <tex>\Gamma' =\langle \Sigma', N', S', P' \rangle</tex>, где <tex>\Sigma' = \Sigma; N' = N \cup \{S'\}; S' \notin N; P' = P \cup \{S' \to S\}</tex>  | ||
}}  | }}  | ||
| + | |||
| + | Использование в определении LR(k)-грамматики пополненной грамматики существенно для однозначного определения конца анализа. Действительно, если грамматика использует <tex>S</tex> в правых частях правил, то свертка основы в <tex>S</tex> не может служить сигналом приема входной цепочки. Свертка же в <tex>S'</tex> в пополненной грамматике служит таким сигналом, поскольку <tex>S'</tex> нигде, кроме начальной сентенциальной формы, не встречается.  | ||
| + | |||
| + | // TODO сделать пример, когда нам точно нужно пополнять грамматику  | ||
{{Определение  | {{Определение  | ||
|id=def_LR_K    | |id=def_LR_K    | ||
|definition=  | |definition=  | ||
| − | Пусть <tex>\Gamma' =\langle \Sigma', N', S', P' \rangle</tex> {{---}} пополненная грамматика для КС-грамматики <tex>\Gamma</tex>. Грамматика <tex>\Gamma</tex> явяется '''LR(k)-грамматикой''', если для любых двух правосторонних выводов вида:  | + | Пусть <tex>\Gamma' =\langle \Sigma', N', S', P' \rangle</tex> {{---}} пополненная грамматика для КС-грамматики <tex>\Gamma</tex>. Грамматика <tex>\Gamma</tex> явяется '''LR(k)-грамматикой''', если для любых двух [[Контекстно-свободные_грамматики,_вывод,_лево-_и_правосторонний_вывод,_дерево_разбора#Лево-_и_правосторонний_вывод_слова|правосторонних выводов]]  вида:  | 
* <tex>S' \Rightarrow^* \alpha A w \Rightarrow \alpha \beta w </tex>,  | * <tex>S' \Rightarrow^* \alpha A w \Rightarrow \alpha \beta w </tex>,  | ||
* <tex>S' \Rightarrow^* \gamma B x \Rightarrow \alpha \beta y </tex>,  | * <tex>S' \Rightarrow^* \gamma B x \Rightarrow \alpha \beta y </tex>,  | ||
| Строка 23: | Строка 27: | ||
* зная цепочку <tex>\alpha \beta = X_1 X_2 ... X_r</tex> и не более <tex>k</tex> символов цепочки <tex>w</tex>, мы можем быть уверены, что именно <tex>\beta</tex> является основой, сворачиваемой в нетерминал <tex>A</tex>;  | * зная цепочку <tex>\alpha \beta = X_1 X_2 ... X_r</tex> и не более <tex>k</tex> символов цепочки <tex>w</tex>, мы можем быть уверены, что именно <tex>\beta</tex> является основой, сворачиваемой в нетерминал <tex>A</tex>;  | ||
* если <tex>\alpha_{i-1} = S'</tex>, можно сигнализировать о выводимости исходной терминальной цепочки из <tex>S'</tex> и, следовательно, из <tex>S</tex>.  | * если <tex>\alpha_{i-1} = S'</tex>, можно сигнализировать о выводимости исходной терминальной цепочки из <tex>S'</tex> и, следовательно, из <tex>S</tex>.  | ||
| − | |||
== LR(k)-Разбор ==  | == LR(k)-Разбор ==  | ||
Версия 11:05, 21 августа 2015
Восходящий разбор (англ. Bottom-up parsing) предназначен для построения дерево разбора. Мы можем представить себе этот процесс как "свертку" исходной строки к правилу грамматики. Каждый шаг свертки заключается в сопоставлении некоторой подстроки и правой части какого-то правила грамматики, затем происходит замена этой подстроки на нетерминал, являющийся левой частью правила. Восходящий разбор менее интуитивный, чем нисходящий, но зато позволяет разбирать большее множество грамматик.
Содержание
LR(k)-грамматика
| Определение: | 
| Пусть — контекстно-свободная грамматика. Пополненной грамматикой (англ. augmented grammar), полученной из , назовем грамматику , где | 
Использование в определении LR(k)-грамматики пополненной грамматики существенно для однозначного определения конца анализа. Действительно, если грамматика использует  в правых частях правил, то свертка основы в  не может служить сигналом приема входной цепочки. Свертка же в  в пополненной грамматике служит таким сигналом, поскольку  нигде, кроме начальной сентенциальной формы, не встречается.
// TODO сделать пример, когда нам точно нужно пополнять грамматику
| Определение: | 
Пусть  — пополненная грамматика для КС-грамматики . Грамматика  явяется LR(k)-грамматикой, если для любых двух правосторонних выводов  вида:
  | 
Говоря неформально, если согласно первому выводу  — основа, сворачиваемая в нетерминал , то и во втором выводе  должна быть основой, сворачиваемой в нетерминал .
Из этого определения следует, что если имеется правовыводимая цепочка , где  — основа, полученная из , и если , то
- зная первые символы цепочки и не более, чем следующих символов цепочки , мы можем быть уверены, что правый конец основы не будет достигнут до тех пор, пока ;
 - зная цепочку и не более символов цепочки , мы можем быть уверены, что именно является основой, сворачиваемой в нетерминал ;
 - если , можно сигнализировать о выводимости исходной терминальной цепочки из и, следовательно, из .
 
LR(k)-Разбор
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