Скачиваний:
48
Добавлен:
01.05.2014
Размер:
263.68 Кб
Скачать

4.2.2. Алгоритм разбора для lr(k)-грамматики

Для любой LR(k)-грамматики G = < T, N, S, R > можно по­строить детерминированный анализатор, который выдает правый разбор входной цепочки.

Анализатор состоит из мага­зина, входной ленты, выходной ленты и управляющего устройства (см. рис. 4.5).

М

Входная лента

Рис. 4.5

Магазин

Выходная лента

агазинный алфавитVp представляет собой множество специальных символов, соответствующих грамматическим вхождениям или их множествам. Грамматическое вхождение – это символы полного словаря грамматики, снабженные двумя индексами. Первый индекс задает номер i правила грамматики, в правую часть которого входит данный символ, а второй индекс j – номер позициии символа в этой правой части

Например, для грамматики G2 (рис. 4.3) грамматическое вхожде­ние A5,2 представляет собой нетерминал А из второй позиции правой части пятого правила вывода. Если символ входит в пра­вую часть i-го правила только один раз, то второй индекс бу­дем опускать. Например. А1 – это грамматическое вхождение не­терминала А в первое правило, а А5 грамматическое вхождение нетерминала А в пятое правило. Перед началом работы алгоритма магазин пуст (содержит маркер дна).

Управляющее устройство анализатора представляет собой таб­лицу Ʈ, строки которой отмечены символами Т Vp {}. Од­на строка такой таблицы называется LR(k)-таблицей. Каждая LR(k)-таблица задает две функции: функцию действия f и функцию переходов g.

Функция действия f, аргументом которой служит цепочка u T*, принимает значения из множества { ДОПУСК, ОШИБКА, ПЕРЕНОС, (СВЕРТКА, i) }.

Аргументом функции переходов g является символ Х V, а ее значениями – элементы множества { ОШИБКА } Vp.

Опишем LК(k)-алгоритм разбора.

Вход

  1. Анализируемая цепочка z = t1 t2 … tj tn T*, где j – номер текущего символа входной цепочки, находящегося под читающей головкой.

  2. Управляющая таблица Ʈ (множество LR(k)-таблиц) для LR(k)-грамматики

G = < T, N, S, R >.

Выход

Если z L(G), то правый разбор цепочки z, в противном случае – сигнал об ошибке

Описание алгоритма

  1. j :=0.

  2. j := j + 1. Если j > n, то выдать сообщение об ошибке и перейти к п. 5.

  3. Определить цепочку u следукщим образом:

а) если k = 0, то u = tj ;

б) если k 1 и j+k-1 n, то u = tj tj+1 … tj+k-1 – первые k символов цепочки

tj, tj+1, …, tn ;

в) если k 1 и j+k-1 > n, то u = tj tj+1 … tn– остаток входной цепочки.

  1. Применить функцию действия f из строки таблицы Ʈ, отмеченной верхним cимволом магазина T, к цепочке u.

а) f(u) =ПЕРЕНОС. Определить функцию переходов g(tj) из строки таблицы Ʈ, отмеченной символом Т из верхушки ма­газина. Если g(tj) = Tи T Vp {}, то записать Т в ма­газин и перейти к п.2. Если g(tj) = ОШИБКА, то выдать сиг­нал об ошибке и перейти к п. 5.

б) f(u) = (СВЕРТКА, i) и A – правило вывода с но­мером i грамматики G. Удалить из верхней части магазина  символов, в результате чего в верхушке магазина ока­жется символ T Vp {}, и выдать номер правила i на вы­ходную ленту. Определить символ T = g(A) из cтроки таблицы Ʈ, отмеченной символом T, записать его в магазин и перейти к п. 3.

в) f(u) = ОШИБКА.Выдать сообщение об ошибке и перейти к п. 5.

г) f(u) = ДОПУСК. Объявить цепочку, записанную на вы­ходной ленте, правым разбором входной цепочки z.

5) Останов.

Рассмотрим работу LR(k) -анализатора на примере.

Пример 4.1.

На рис. 4.6 изображена управляющая таб­лица для LR(0)-грамматики G2, правила вывода которой при­ведены на рис. 4.3.

Буквы С, П и Д в этой таблице (и во всех следующих таблицах) служат условными обозначениями значений функции f(u): ПЕРЕНОС, СВЕРТКА и ДОПУСК соответственно, а пустые элементы таблицы имеют значение ОШИБКА.

Заметим, что в данном примере магазинный алфавит Vp пред­ставляет собой множество грамматических вхождений символов грамматики в правила вывода. Первая строка управляющей табли­цы отмечена грамматическим вхождением So начального символа грамматики S в правую часть нулевого правила вывода S S пополненной грамматики G2, полученной из исходной граммати­ки G2.

T

f(u)

g(X)

a

b

c

a

b

c

S

A

B

S0

Д

a1

П

П

П

a5

b3

c6

A1

B4

A1

П

П

П

b1

b1

С,1

С,1

С,1

С,1

c2

С,2

С,2

С,2

С,2

b3

П

П

П

a1

c2

S3

S3

С,3

С,3

С,3

С,3

B4

П

П

П

b4

b4

С,4

С,4

С,4

С,4

a5

П

П

П

a5

b3

c6

A5

B4

A5

С,5

С,5

С,5

С,5

c6

С,6

С,6

С,6

С,6

П

П

П

a1

c2

S0

Рис. 4.6

Работу алгоритма опишем в терминах конфигураций, представляющих собой тройки вида (T, ax, ), где T – цепочка магазинных символов (Т - верхний символ магазина), ax – не­обработанная часть входной цепочки, начинающаяся символом a (для k = 0 длина цепочки u равна 1), выход, построенный к настоящему моменту времени.

Рассмотрим последовательность тактов, которую выполнит LR(k)-алгоритм при

анализе входной цепочки abcb.

Начальная конфигурация алгоритма – (, abcb, ) (в вер­шине магазина находится маркер дна магазина, а текущим вход­ным символом является символ а). Для строки управляющей таб­лицы, отмеченной символом , f(A) = ПЕРЕНОС, а g(A)=a1, по­этому в магазин записывается символ a1 (грамматическое вхож­дение символа a в правую часть первого правила), входная головка сдвигается на один символ вправо, а алгоритм перехо­дит в конфигурацию (a1, bcb, ). Для строки таблицы, от­меченной символом a1, f(b) = ПЕРЕНОС, а g(b) = b3, следова­тельно, алгоритм перейдет в конфигурацию (a1b3, cb, ). Аналогично для магазинного символа b3 и текущего символа входной цепочки с магазин перейдет в конфигурацию (a1b3c2, b, ).

Рассмотрим теперь строку управляющей таблицы Ʈ, поме­ченную грамматическим вхождением с2. В этом случае f(b) = (С. 2), значит, необходимо выполнить свертку с использованием правила (2) S c. Правая часть этого правила содержит только один сим­вол, поэтому удаляем из магазина символ с2 и определяем зна­чение функции переходов для символа S из левой части правила (2) в отроке управляющей таблицы Ʈ, отмеченной символом b3, который стал верхним символом магазина. Теперь g(S)=S3 и, следовательно, алгоритм перейдет в конфигурацию

(a1b3 S3, b, 2), и в выходную цепочку запишется 2 (номер использованного правила).

Поступая дальше подобным образом, получим следующую после­довательность тактов работы анализатора (символ ÷ используется для перехода из одной конфигурации в другую):

(a1b3 S3, b, 2) ÷ (a1A1, b, 23) ÷ (a1A1b1, , 23) ÷ (S0, , 231),

где конфигурация (S0, , 231) является заключительной, а цепочка 231 правым разбором цепочки abcb.

Приведем последовательность тактов, которую выполнит алго­ритм при анализе входной цепочки aabc, содержащей синтакси­ческую ошибку.

(, aabc, ) ÷ (, aabc, ) ÷ (a1, abc, ) ÷ (a1a5, bc, ) ÷ (a1a5b3, c, ) ÷

(a1a5b3c2, , ) ÷ (a1a5b3S3, , 2) ÷ (a1a5A5, , 23) ÷ (a1B4, , 235)

В последней конфигурации f() = ОШИБКА. Алгоритм выдает со­общение об ошибке и заканчивает работу.

Продемонстрировав работу LR(k)-анализатора для конкретных входных цепочек, рассмотрим построение управляющей таблицы Ʈ LR(k)-анализатора для k=0 и некоторо­го подмножества LR(1)-грамматик (алгоритм проверки принадлежности грамматики классу LR(k)-грамматик для произвольного k предполагает построение большого числа вспомогательных множеств, поэтому его использование для k>1 для решения практических задач не оправдано).

Соседние файлы в папке ВОСХОДЯЩИЕ МЕТОДЫ ОБРАБОТКИ ЯЗЫКОВ
  • #
    01.05.2014263.68 Кб48LR_K_GR.DOC
  • #
    01.05.2014222 б8Методы _восходящие методы обработки языков_ .log