Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

metoda_2013

.pdf
Скачиваний:
54
Добавлен:
03.05.2015
Размер:
6.36 Mб
Скачать

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

R- часть основы, а S-нет (рис.1 а). Эту ситуацию мы записываем, как R· > S и говорим, что R больше S или что R предшествует S, поскольку символ R будет редуцирован раньше, чем S. Заметим, что R должен быть последним (хвостовым) символом в правой части некоторого правила U ::= …R. Заметим, что поскольку основа находится слева от S, S должен быть терминалом.

Оба символа R и S входят в основу (рис.1 b). Запишем это как R· S. У них одинаковое значение предшествования, и они должны редуцироваться одновременно. Очевидно в грамматике должно быть правило U ::=…RS…

S- часть основы, а R- нет (рис.1 с). Отношение между ними записывается как R <· S; можно говорить, что R меньше, чем S. Символ S должен быть первым (головным) в правой части некоторого правила U ::=S…

Рис.1. Примеры отношений предшествования.

Если (канонической) сентенциальной формы …RS…не существует, мы считаем, что между упорядоченной парой символов (R, S) не определено никакое отношение. Заметим, что ни одно из трех определенных выше отношений предшествования < · , · и · > не является симметричным. Например, из R<· S вовсе не следует S ·> R.

Рассмотрим в качестве примера грамматику G5(Z)

Z ::=bMb

(1) M ::=(L | a L ::=Ma)

Языку L(G5) принадлежат такие цепочки, как bab, b(aa)b, b((aa)a)b, b(((aa)a)a)b. В каждом столбце таблицы1 показана сентенциальная форма, ее синтаксическое дерево, основа дерева и отношения, которые можно из него получить.

250

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

Таблица 1.

На рис.2 представлена матрица предшествования для грамматики G5матрица, в которой указываются все отношения предшествования. Элемент этой матрицы B [i, j] содержит отношение между парой символов (Si, Sj). Пустой элемент матрицы свидетельствует о том, что между соответствующими двумя символами отношение предшествования не определено.

Рис.2. Матрица предшествования для грамматики G5.

Как же воспользоваться отношениями предшествования при разборе предложений? Если между какой – либо парой символов (R, S) определено более чем одно отношение, они бесполезны. Если же между любой парой символов определено не более одного отношения, отношения предшествования позволяют найти основу любой сентенциальной формы. Тогда можно сказать, что основой любой сентенциальной формы S1…Sn является самая левая подцепочка Sj…Si, такая, что

251

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

 

Sj-1< · Sj

(2)

Sj· Sj+1· Sj+2· · Si

 

Si· > Si+1

Из определения отношений вытекает, что основа S1…Sn удовлетворяет (2). Не столь очевидным представляется тот факт, что самая левая подцепочка, удовлетворяющая (2), является основой.

Пример. Проведем канонический разбор предложения b (aa) b грамматики G5 с использованием матрицы предшествования, изображенной на рис.2. Рисунок 3 иллюстрирует разбор. На каждом шаге показаны сентенциальная форма и отношения, определенные между символами в соответствии с рис.2.

Рис.3. разбор сентенциальной формы b (aa) b. Определение. Если задана грамматика G, то отношения предшествования между символами из словаря V определяются следующим образом:

R · S тогда и только тогда, когда в G есть правило U ::=…RS…

R< · S тогда и только тогда, когда существует правило U ::=…RV…, такое, что справедливо отношение V FIRST+ S.

R· > S тогда и только тогда, когда S- терминал, и существует правило U::=…VW…, такое., что справедливы соотношения V

LAST+ R и W FIRST* S.

Определим еще два отношения:

R <·= S тогда и только тогда, когда R · S или R <· S. R ·>= S тогда и только тогда, когда R · S или R ·> S.

Определение. Грамматику G называют грамматикой (простого) предшествования или просто грамматикой предшествования, если:

252

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

между любыми двумя символами из словаря определено не более чем одно отношение;

ни у каких двух продукций нет одинаковых правых частей. Если G- грамматика предшествования, то отношения позволяют найти основу любой сентенциальной формы; при этом соблюдение второго условия гарантирует нам то, что основу можно привести к единственному нетерминалу.

Теорема.

Грамматика предшествования однозначна. Более того, единственная основа любой сентенциальной формы S1…Snэто самая левая подцепочка Sj…Si, такая, что

Sj-1 < · Sj · Sj+1· · Si < · Si+1.

При восходящем методе разбора:

1)все правила грамматики обязательно нумеруются;

2)рассматривается пополненная грамматика (то есть грамматика, для которой из аксиомы выводится только одна альтернатива).

Пример: real A,B,C

1)S–> real<idlist>

2)<idlist>–> <id>,<idlist>

3)<idlist>–> <id>

4)

<id>–> A | B | C

1

шаг: В стек помещается первый символ предложения real.

2

шаг: В стек помещается второй символ А.

3шаг: Происходит замена символа А на нетерминал <id> по 4 правилу.

4шаг: В стек помещается следующий символ «,».

5шаг: В стек помещается символ В.

6шаг:Символ В по правилу 4 заменяется на нетерминал <id>.

7шаг: В стек помещается следующий символ.

8шаг: в стек заносится символ С.

9шаг: Символ С заменяется на нетерминал.

10шаг: В стеке происходит замена нетерминала <id> на <idlist> по правилу 3.

11шаг: В стеке происходит замена верхних символов по правилу

12шаг: Применяем правило 2.

13шаг: Используем правило 1. В стеке осталась аксиома S.

253

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ
В данном методе восходящего разбора использовались две операции:
• 1 операция – это сдвиг.
Она состоит в том, что в стек заносится символ входной цепочки, и параллельно с этим происходит сдвиг по входной цепочке.
• 2 операция – операция свертки.
Она заключается в следующем: из верхушки стека достаются символы, которые сворачиваются по некоторому правилу.
Основной проблемой восходящего разбора является детерминированность, то есть на каждом шаге алгоритма хотелось бы знать, что производит сдвиг или свертку и по какому правилу. Говорят о конфликте сдвиг-свертка, если в некоторый момент разбора для одной цепочки допустимы и сдвиг, и свертка. И говорят о конфликте свертка-свертка, если в некоторый момент разбора допустимы свертки по различным правилам.
Проблемы:
При восходящем разборе, при построении дерева снизу-вверх на каждом шаге редуцируется (прием сведения сложного к простому) основа (самая левая простая фраза) текущей сентенциальной формы и поэтому цепочка справа от основы всегда содержит только терминальные символы. Проблема восходящего разбора состоит в следующем: т.к. при восходящем разборе на каждом шаге редуцируется основа найти основу сентенциальной формы и то, к чему она должна приводиться становится сложно.
Если в процессе LR-разбора принять детерминированное решение о сдвиге/свертке удается, рассматривая только цепочку x и первые k символов непросмотренной части входной цепочки u (эти k символов называют аванцепочкой), говорят, что грамматика обладает LR(k)-свойством.
-S-- / \ /-x¬ \
--w-+--u--
Название «LR(к) - грамматика» указывает на то, что для нее существует МП автомат (автомат с магазинной памятью), который
начинает просмотр слева направо (Left),
254

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

распознает правило, когда добирается до самого правого (Rightmost) символа, выводимого из этого правила

и может обнаружить любую основу просмотром k-го количества символов, расположенных правее последнего входного символа, выводимого из основы.

На практике чаще всего к=1 (LR(1) грамматика) или к=0 (LR(0) грамматика).

Используются также промежуточные между LR(0) и LR(1) методы, известные под названиями SLR(1) и LALR

При разборе строки LR(0)-языка можно вообще не использовать аванцепочку - выбор между сдвигом и сверткой делается на основании цепочки x (см.картинку). Так как в процессе разбора она изменяется только с правого конца, ее называют стеком. Будем считать, что в грамматике нет бесполезных символов и начальный символ не встречается в правых частях правил - тогда свертка к начальному символу сигнализирует об успешном завершении разбора. В LR(0) грамматике для всех состояний стека в процессе LR-вывода нет конфликтов сдвиг-свертка или свертка-свертка.

SLR(1) и LALR(1) грамматики.В основе этих двух методов лежит одна и та же идея. Допустим, у нас есть множество канонических LR(0)-состояний грамматики. Если это множество не содержит конфликтов, то можно применить LR(0)- парсер. Иначе разрешаем возникшие конфликты, рассматривая односимвольную аванцепочку, т.е. строится LR(1) парсер с множеством LR(0)-состояний.

Отличие LR(k) грамматик от LL(k) состоит в том, что LL(k) грамматики по считанному символу определяют правую часть, а LR(k) грамматики считывают в стек всю правую часть и еще один символ. LR грамматики шире LL грамматик. Можно решить обладает ли грамматика свойством LR(k) для заданного k. Но нельзя решить существует ли k, для которого заданная грамматика, будет LR(k) грамматикой.

LR грамматики основаны на восходящем методе разбора, то есть разборе снизу-вверх, при котором промежуточные выводы перемещаются по дереву по направлению к корню.

При восходящем методе разбора все правила грамматики обязательно нумеруются. Рассматривается, как правило, пополненная грамматика, то есть грамматика, для которой из аксиомы выводится только одна альтернатива.

Суть всех методов разбора заключается в следующем: сначала в стек символ за символом помещают входную цепочку, до тех пор,

255

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

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

Рассмотрим грамматику со следующими правилами:

1.

S real<idlist>

2.

<idlist> id, <idlist>

3.

<idlist> <id>

4.

<id> A|B|C

В качестве примера разберем следующее предложение

real

A, B, C

,

где обозначает конец цепочки. Восходящий

разбор этого предложения будет состоять из 13 шагов:

 

1 шаг.

В стек

помещается первый символ предложения real.

2 шаг. В стек помещается второй символ А.

3 шаг. Происходит замена символа А на нетерминал <id> по

4правилу.

4 шаг. В стек помещается следующий символ , .

5 шаг. В стек помещается символ В.

6 шаг. Символ В по правилу 4 заменяется на нетерминал <id>.

7 шаг. В стек помещается следующий символ.

8 шаг. В стек заносится символ С

256

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

9 шаг. Символ С заменяется на нетерминал.

10 шаг. В стеке происходит замена нетерминала <id> на <idlist>

по правилу 3.

11 шаг. В стеке происходит замена верхних символов по правилу

2.

12шаг. Применяем правило 2.

13шаг. Используем правило 1. В стеке осталась аксиома S.

Разбор предложения закончен. В данном методе восходящего разбора использовались

две операции. Первая операция – это сдвиг. Она состоит в том, что в стек заносится символ входной цепочки, и параллельно с этим происходит сдвиг по входной цепочке. Вторая операция – операция свертки. Она заключается в следующем: из верхушки стека достаются символы, которые сворачиваются по некоторому правилу.

Будем считать, что в грамматике нет бесполезных символов, и начальный символ не встречается в правых частях правил - тогда свертка к начальному символу сигнализирует об успешном завершении разбора. Говорят о конфликте сдвигсвертка, если для одной цепочки u допустимы и сдвиг, и свертка. Говорят о конфликте свертка-свертка, если допустимы свертки по различным правилам.

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

257

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

друг от друга тем, как они определяют, что надо делать на каждом шаге: сдвиг или свертку.

10. Построение таблиц разбора(LR(0), SLR(1),LALR(1)).

LR грамматики основаны на восходящем методе разбора, то есть разборе снизу-вверх, при котором промежуточные выводы перемещаются по дереву по направлению к корню. При восходящем методе разбора все правила грамматики обязательно нумеруются. Рассматривается, как правило, пополненная грамматика, то есть грамматика, для которой из аксиомы выводится только одна альтернатива.

Суть всех методов разбора заключается в следующем: сначала в стек символ за символом помещают входную цепочку, до тех пор, пока в стеке не будет находиться некоторое правило. Символы этого правила извлекаются из стека, заменяются на соответствующий нетерминал, затем процесс продолжается до тех пор, пока в стеке не окажутся аксиомы, а во входной цепочке не останется символ конца.

LR(0)

Простейшим случаем LR(k)-грамматик являются LR(0)- грамматики. При k = 0 распознающий расширенный МП-автомат совсем не принимает во внимание текущий символ, обозреваемый его считывающей головкой. Решение о выполняемом действии принимается только на основании содержимого стека автомата. При этом не должно возникать конфликтов между выполняемым действием (сдвиг или свертка), а также между различными вариантами при выполнении свертки. Управляющая таблица для LR(0)-грамматики строится на основании понятия «левых контекстов» для нетерминальных символов: очевидно, что после выполнения свертки для нетерминального символа А в стеке МП-автомата ниже этого символа будут располагаться только те символы, которые могут встречаться в цепочке вывода слева от А. Эти символы и составляют «левый контекст» для А. Поскольку выбор между сдвигом или сверткой, а также между типом свертки в LR(0)- грамматиках выполняется только на основании содержимого стека, то LR(0)-грамматика должна допускать однозначный выбор на основе левого контекста для каждого символа.

Грамматика называется LR(0), если для всех состояний стека в процессе LR-вывода нет конфликтов сдвиг-свертка или свертка-свертка.

LR(0)-анализатор принимает решение о своих действиях только на основании содержимого магазина, не учитывая символы входной цепочки.

258

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

Определение. Пусть G = (VT, VN, P, S) – КС-грамматика.

Пополненной грамматикой (augmented grammar) будем называть грамматику G' = (VT, VN+{S'}, P+{S'→S}, S'), где S' – нетерминал, непринадлежащий множеству N.

В начале работы магазин пуст (на самом деле, на вершине магазина находится маркер конца $), и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация [S’→.S]. Значит, входная цепочка может начинаться с любого терминального символа, с которого начинается правая часть любого правила с левой частью S.

Построение таблицы разбора.

1.все правила грамматики пронумерованы;

2.рассматривается пополненная грамматика.

Грамматическим вхождением символа называется

позиция этого символа в правой части правила. Грамматические вхождения обозначаются индексами: номер правила, номер позиции символа в этом правиле, например:

А -> a b a <B> c e c a51, a53, b52

Основная идея.

При построении дерева разбора предложения языка, всегда однозначно можно установить соответствие вершинам дерева и грамматическим вхождениям. Например, в грамматике

1.S a <A> b

2.S c

3.A b <S>

4.A <B> b

5.a B <A>

6.c B

Разбор предложения aabcbb можно представить следующим деревом. Каждой вершине в соответствие поставлено грамматическое вхождение.

259

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]