Изменения

Перейти к: навигация, поиск

LR(k)-грамматики

203 байта убрано, 13:12, 15 августа 2016
Источники информации
'''Восходящий разбор '''(англ. ''Bottom-up parsing)'' предназначен для построения [[Контекстно-свободные_грамматики,_вывод,_лево-_и_правосторонний_вывод,_дерево_разбора#Дерево_разбора|дерева разбора]]. Мы можем представить себе этот процесс как "свертку" исходной строки <tex>w</tex> к стартовому нетерминалу грамматики по правилам. Каждый шаг свертки заключается в сопоставлении некоторой подстроки <tex>w</tex> и правой части какого-то правила грамматики, затем происходит замена этой подстроки на нетерминал, являющийся левой частью правила. Восходящий разбор менее интуитивныйинтуитивно понятный, чем нисходящий, но зато позволяет разбирать большее множество больше грамматик.
== LR(k)-грамматика ==
следует, что <tex>\beta \alpha = \gamma \xi</tex>,
тогда <tex>\beta = \gamma</tex> и <tex>A = B</tex>.
}}
Говоря неформально, мы делаем правостороннюю свёртку нашей строки в стартовый нетерминал. Если по не более чем <tex>k</tex> символам неразобранной части строки мы можем однозначно определить, во что сворачивается хвост выведенного правила, то грамматика будет LR(k).
LR(k) означает, что :
* входная цепочка обрабатывается слева направо (англ. ''left-to-right parse''),
* выполняется правый вывод (англ. ''rightmost derivation''),
* для принятия решения используется не более <tex>k</tex> символов цепочки (англ. ''k-token lookahead'') используются для принятия решения.
===Замечание о пополненной грамматике===
Использование Существенность использования пополненной грамматики в определении LR(k)-грамматики пополненной грамматики существенно для однозначного определения конца анализаграмматик продемонстрируем на следующем конкретном примере. Действительно, если грамматика использует <tex>E</tex> в правых частях правил, то свертка основы в <tex>E</tex> не может служить сигналом приема входной цепочки. Свертка же в <tex>E_0</tex> в пополненной грамматике служит таким сигналом, поскольку <tex>E_0</tex> нигде, кроме начальной сентенциальной формы, не встречается.
Существенность использования пополненной грамматики в определении LR(k)-грамматик продемонстрируем на следующем конкретном примере. Пусть пополненная грамматика имеет следующие правила:
</tex>
Если игнорировать <tex>0</tex>-е правило, то, не заглядывая в правый контекст основы <tex>Ea</tex>, можно сказать, что она должна сворачиваться в <tex>E</tex>. Аналогично основа <tex>a</tex> безусловно должна сворачиваться в <tex>E</tex>. Создается впечатление, что данная грамматика без <tex>0</tex>-го правила есть LR(0)-грамматика. Но Что на самом деле это не такневерно, в этом чём можно убедиться , рассмотрев процесс [[LR(0)-разбор|LR(0)-разбора]].
== LR-разборщик ==
* входная строка,
* стек (для запоминания рассмотренных символов),
* управляющая таблица (для определения, какое действие применить выбора следующего действия {{---}} '''перенос ''' или свертку'''свертка'''),
* автомат (для запоминания информации о текущем состоянии стека).
*<tex>\mathtt{state}</tex> {{---}} состояние автомата,
*<tex>\mathtt{token}</tex> {{---}} входной символ.
Полученное значение в таблице должно информировать о текущем действии, то есть о переносе или свертке. В этих двух случаях, необходима дополнительная информация: к какому состоянию происходит переход (при переносе) и по какому правилу происходит свертка. В случае некорректного входного символа Если входной символ некорректен, то происходит ошибка, а свертка в стартовое состояние идентифицируется как допуск: '''struct''' Cell enum: Shift Reduce Error <font color="green">// ошибка</font> Accept <font color="green">// допуск </font> '''struct''' Shift { state: '''int''' } <font color="green">// переход в стостояние состояние с номером state</font> '''struct''' Reduce { rule: '''int''' } <font color="green">// свертка по правилу с номером rule</font> Рузультатом работы управляющей программы будет: '''structenum''' Result enum: = Accept <font color="green">// допуск </font> | Error <font color="green">// ошибка</font> '''enum''' Cell = Shift | Reduce | Result
=== Алгоритм ===
# Возвращается к первому пункту, пока входная цепочка не закончится.
{| border="0"
|align="left" colspan="4"|
<font size=2>
'''Result''' algorithmLR(w: '''string''')
<font color=green>// curToken {{---}} указатель на первый символ в строке w</font> '''while''' haveTokenhasTokens()
curState = top()
'''ifwhen''' (<tex>\mathtt{T}</tex>[curState, curToken] == ) Shift (s ) '''->''' push(curToken) push(s) nextToken() '''else if''' <tex>\mathtt{T}</tex>[curState, curToken] == Reduce (<tex> A \to \beta</tex> ) '''->''' '''for''' j = 1 '''to''' <tex>|\beta |</tex> pop() pop() s = top() push(<tex>A</tex>) push(goto [(s, <tex>A]</tex>)) Вывод правила (: <tex> A \to \beta</tex>) Accept '''else->''' '''ifreturn''' <tex>\mathtt{T}</tex>[curState, curToken] == Accept Error '''return''' Accept '''else->''' '''return''' Error </font>|}
Функция <tex>goto</tex> получает состояние и символ грамматики и выдает состояние. Функция <tex>goto</tex>, строящаяся по грамматике <tex>\Gamma</tex>, есть функция переходов детерминированного магазинного автомата, который распознает язык,
* [http://ict.edu.ru/ft/005128//ch7.pdf Терехов Ан.А., Вояковская Н., Булычев Д., Москаль А. Разработка компиляторов на платформе .NET {{---}} Восходящие анализаторы]
* [http://window.edu.ru/resource/974/69974/files/lang_trans.pdf Б.К.Мартыненко. Языки и трансляции. Стр. 198-223]
* [http://www.cs.bham.ac.uk/~hxt/2015/mgs-ll-lr/LL-LR-MGS.pdf Nice slides]
[[Категория: Методы трансляции]]
[[Категория: Восходящий разбор]]

Навигация