LR(k)-грамматики — различия между версиями
Margarita (обсуждение | вклад) (Новая страница: «'''Восходящий разбор '''(англ. ''Bottom-up parsing)'' предназначен для построения дерева разбора, нач...») |
(нет различий)
|
Версия 14:16, 12 августа 2015
Восходящий разбор (англ. Bottom-up parsing) предназначен для построения дерева разбора, начиная с листьев и двигаясь вверх к корню дерева разбора. Мы можем представить себе этот процесс как "свертку" исходной строки
к аксиоме грамматики. Каждый шаг свертки заключается в сопоставлении некоторой подстроки и правой части какого-то правила грамматики и замене этой подстроки на нетерминал, являющийся левой частью правила. Если на каждом шаге подстрока выбирается правильно, то в результате мы получим правый вывод строки .Содержание
LR(k)-Грамматика
Определение: |
Пусть | — КС-грамматика. Пополненной грамматикой (англ. augmented grammar), полученной из , назовем грамматику , где
Определение: |
Пусть
| — пополненная грамматика для КС-грамматики . Грамматика явяется LR(k)-грамматикой, если для любых двух правосторонних выводов вида:
Говоря неформально, если согласно первому выводу — основа, сворачиваемая в нетерминал , то и во втором выводе должна быть основой, сворачиваемой в нетерминал .
Из этого определения следует, что если имеется правовыводимая цепочка , где — основа, полученная из , и если , то
- зная первые символы цепочки и не более, чем следующих символов цепочки , мы можем быть уверены, что правый конец основы не будет достигнут до тех пор, пока ;
- зная цепочку и не более символов цепочки , мы можем быть уверены, что именно является основой, сворачиваемой в нетерминал ;
- если , можно сигнализировать о выводимости исходной терминальной цепочки из и, следовательно, из .
Использование в определении 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 Afor 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