Автор: Пользователь скрыл имя, 19 Февраля 2012 в 14:31, реферат
Второй фазой процесса компиляции обычно является фаза синтаксического анализа или разбора. В данном реферате рассмотрен один из распространенных типов разбора – восходящий синтаксический анализ, а также родственный ему нисходящий синтаксический анализ (для сравнения), т.о. в этой работе кратко сопоставлены их возможности.
В данной части будет показано, что для каждой LR (k)-грамматики G = (N, Σ, Р, S) можно построить детерминированный правый анализатор, который ведет себя следующим образом.
Прежде всего, этот анализатор строится по пополненной грамматике G’. Ведет он себя во многом так же, как анализатор типа „перенос — свертка" за исключением того, что после каждого символа грамматики в магазин будет записываться специальный информационный символ, называемый LR (k)-таблицей. Эти LR (k)-таблицы помогут определять, что надо делать на очередном шаге — свертку или перенос, и в случае свертки — какое правило при этом применить.
Для описания поведения LR(k)-анализатора рассмотрим пример. Возьмем грамматику G с правилами 1) S→SaSb
2) S→e
которая, является LR(k)-грамматикой. Пополненная грамматика G' состоит из правил
0) S’→S
1) S→SaSb
2) S→e
LR(1)-анализатор для грамматики G приведен на рис. 3.
Рис. 3. LR (k)-анализатор для грамматики G (i — свертка, при которой применено i-e правило, S —перенос, A—допуск, X — ошибка).
LR (k)-анализатор для КС-грамматики G —это не что иное, как множество строк большой таблицы, каждая строка которой называется LR (k)-таблицей. Одна строка, здесь это T0, выделяется в качестве начальной LR (k)-таблицы. Каждая LR (k)-таблица состоит из двух функций — функции действия f и функции переходов g:
1) Аргументом функции .действия f служит цепочка u Σ*k (она называется аванцепочкой), а соответствующее значение f(u) — один из символов “действий”: перенос, свертка i, ошибка или допуск.
2) Аргументом функции переходов g служит символ X N Σ, а соответствующее значение g (X) — либо имя некоторой LR(k)- таблицы, либо ошибка.
LR-анализатор ведет себя так же, как алгоритм типа „перенос—свертка", используя в процессе работы магазин, входную и выходную ленты. Вначале магазин содержит начальную LR(k)-таблицу T0 и ничего больше. На входной ленте находится анализируемая цепочка, а выходная лента вначале пустая. Если предположить, что надо разобрать входную цепочку aabb, то начальной конфигурацией анализатора будет (T0, aabb, e). Затем разбор будет осуществляться согласно следующему алгоритму.
LR (k)-алгоритм разбора
Вход. Множество LR(k)-таблиц для LR(k)-грамматики G=(N, Σ, Р, S) с таблицей T0 выделенной в качестве начальной, и входная цепочка z Σ*, которую надо разобрать.
Выход. Если z L(G), то правый разбор цепочки z в грамматике G, в противном случае сигнал об ошибке.
Метод. Выполнять шаги 1) и 2) до тех пор, пока не будет допущена входная цепочка или не встретится сигнал об ошибке. В случае допуска цепочка на выходной ленте представляет собой правый разбор цепочки z.
1) Определяется аванцепочка u, состоящая из k очередных входных символов (или менее чем k символов, если обрабатывается конец входной цепочки).
2) Функция действия f таблицы, расположенной наверху магазина, применяется к аванцепочке u.
(а) Если f(u) = перенос, то следующий входной символ, скажем а, переносится со входа в магазин. К а применяется функция переходов g верхней таблицы магазина и определяется новая таблица, которую надо поместить наверху магазина. После этого вернуться к шагу 1). Если следующего входного символа нет или значение g (а) не определено, остановиться и выдать сигнал об ошибке.
(б) Если f(u) = свертка i и A → α—правило с номером i, то из верхней части магазина устраняются 2|α| символов) и на выходной ленте записывается номер правила i. Наверху магазина оказывается тогда новая таблица Т', и ее функция переходов применяется к A для определения следующей таблицы, которую надо поместить наверху магазина. Помещаем А и эту новую таблицу наверху магазина и переходим к шагу A).
(в) Если f(u) = ошибка, разбор прекращается (на практике надо перейти к процедуре исправления ошибок).
(г) Если f(u) = допуск, остановиться и объявить цепочку, записанную на выходной ленте, правым разбором первоначальной входной цепочки.
Рассмотрим пример использования только что рассмотренного алгоритма. Пусть алгоритм начинает работу в начальной конфигурации (T0, aabb, e). Будем пользоваться LR (1)-таблицами, приведенными на рис. 3. Здесь аванцепочкой служит а. Значением функции действия таблицы T0 на цепочке а будет свертка 2, где 2— номер правила S → е. На шаге 26) надо устранить из магазина 2|е| = 0 символов и выдать номер 2. Верхней
таблицей в магазине все еще остается T0. Так как функция переходов таблицы T0 на аргументе S принимает значение T1, то наверху магазина помещаем ST1 — это приводит к конфигурации (T0ST1, aabb, 2).
Пройдем еще раз через этот цикл. Аванцепочкой по-прежнему служит а. Значением функции действия таблицы T1 на а будет перенос, так что символ а переносим со входа в магазин. Функция переходов таблицы T1 на аргументе а принимает значение T2, так что после этого шага получится конфигурация (T0ST1aT2, abb,2).
Продолжая в том же духе, LR-анализатор сделает такую последовательность тактов: (T0, aabb ,e) |— (T0ST1, aabb, 2)
|
|— (T0ST1aT2ST3, abb, 22)
|— (T0ST1aT2ST3aT4, bb, 22)
|— (T0ST1aT2ST3aT4ST6, bb, 222)
|— (T0ST1aT2ST3aT4ST6bT7, b, 222)
|— (T0ST1aT2ST3, b, 2221)
|— (T0ST1aT2ST3bT5, e, 2221)
|— (T0ST1, e, 22211)
Заключение
Достоинства алгоритма восходящего разбора:
Недостатки алгоритма:
Поэтому в реальных системах в прямую цепочку вывода часто добавляют элементы системы продукций. Это позволяет изменить приоритеты в обработке правил, что позволяет сократить время работы программы и "отсечь" бесперспективные "ветви вывода".