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

nC1DMY1V3A

.pdf
Скачиваний:
4
Добавлен:
15.04.2023
Размер:
1.71 Mб
Скачать

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

Рассмотрим пример грамматики с начальным нетерминалом <S>:

1.<S> b <A><S><B>

2.<S> b<A>

3. <A> d <S>c a

4.<A> e

5.<B> c <A>a

6.<B> c

Построим множества ПЕРВ и СЛЕД для символов данной грамматики. Вычисление множеств первых символов тривиально, так как каждое

правило начинается терминалом. Можно заметить, что каждый символ грамматики принадлежит своему собственному множеству ПЕРВ.

ПЕРВ(<S>) = {b, <S>}

ПЕРВ(a) = {a}

ПЕРВ(d) = {d}

ПЕРВ(<A>) = {d, e, <A>}

ПЕРВ(b) = {b}

ПЕРВ(e) = {e}

ПЕРВ(<B>) = {c, <B>}

ПЕРВ(c) = {c}

 

Множество СЛЕД (<S>) содержит концевой маркер, так как он следует за <S> в цепочке (S) . Это множество содержит также символ с, так как с следует за вхождением <S> в правой части правила 3. Из того, что <S> входит в правую часть правила 1, вытекает принадлежность множеству СЛЕД (<S>) всех терминалов множества ПЕРВ(<В>), последнее, однако, состоит из единственного символа «с».

Чтобы вычислить СЛЕД (<А>), заметим, что <A> встречается в правых частях правил 1, 2 и 5. Благодаря вхождению его в правило 1, в СЛЕД (<A>) включаются терминалы из множества ПЕРВ(<S>), а именно символ b. Вхождение в правило 2 добавляет входные символы из СЛЕД(<S>), а именно с и . А вхождение в правило 5 добавляет символ а.

Остальные множества СЛЕД можно вычислить аналогичным обра-

зом.

СЛЕД(<S>) = {с,

}

СЛЕД (b) = {d, e}

 

СЛЕД (<A>) = {a, b, c, }

СЛЕД (c) = {a, c, d, e,

}

СЛЕД (<B>) = {c,

}

СЛЕД (d) = {b}

 

СЛЕД (a) = {a, b, c,

}

СЛЕД (e) = {a, b, c,

}

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

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

90

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

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

Подобные простые соображения относительно заполнения управляющей таблицы неприменимы лишь в тех случаях, когда на верху магазина находится <A> или с. Нетерминал <A> встречается один раз в крайней правой позиции (правило 2) и дважды в других позициях (правила 1 и 5). То же относится и к символу с.

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

Сначала попытаемся найти все входные символы х, такие, что элемент управляющей таблицы в строке <A> и столбце х должен содержать процедуру опознания. Это означает, что нам нужно найти все входные символы х, для которых может возникнуть ситуация, соответствующая утверждению 1 с символом <A> на верху магазина и х в качестве текущего входного символа. Ввиду того что единственным вхождением <A> в правую часть, которое может заканчивать основу, является вхождение в правило 2, мы должны найти входные символы, которые могут следовать за <А> из правила 2 в выводе, начинающемся с <S> . Поскольку левой частью правила 2 является <S>, эта задача эквивалентна отысканию множества таких х, что х может следовать в некотором выводе за любым вхождением <S>. Это следует из того, что если х следует за <S>, то после применения правила 2 х будет следовать за <А>, и, наоборот, если х следует за <А>, то соответствующая СВЕРТКА(2) помещает <S> из левой части правила перед х. Таким образом, искомое множество входных символов – это СЛЕД(<S>).

СЛЕД(<S>) = {с, }

Итак, все входные символы, для которых требуется процедура опознания, – это «с» и .

Теперь попытаемся найти все входные символы у, такие, при которых управляющая таблица в строке <А> и столбце у содержит ПЕРЕНОС. Это те входные символы, которые могут следовать за вхождениями <A> в

91

правилах 1 и 5. За вхождением в правило 5 может следовать только а, что вытекает непосредственно из вида правой части правила 5. За вхождением <А> в правило 1 следует вхождение <S>, поэтому за <А> могут следовать входные символы из множества ПЕРВ(<S>), а именно b. Объединяя эти два случая, мы заключаем, что ПЕРЕНОС требуется только для символов а и b.

Таким образом, требования переноса и опознания не противоречат друг другу. Можно также заключить, что при обработке допустимой входной цепочки элементы строки <А> для входных символов d и е не будут использоваться и каждый из этих элементов может содержать либо ОТВЕРГНУТЬ, либо ПЕРЕНОС, либо процедуру опознания.

Приведенные рассуждения иллюстрируют два принципа, которые мы назовем «принципом свертывания» и «принципом переноса».

«Принцип свертывания» Для данной грамматики управляющую таблицу типа «перенос-

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

а) существует нетерминал <L> и цепочка такие, что

<L >А

– правило грамматики и х принадлежит СЛЕД(<L>);

б) А – начальный символ грамматики, а х – концевой маркер.

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

Часто бывает удобно рассматривать принцип свертывания в терминах отношения СВЕРТЫВАЕТСЯ-ПО, определяемого следующим образом:

Если А – символ грамматики, а х – входной символ, то пишем А СВЕРТЫВАЕТСЯ-ПО х

тогда и только тогда, когда выполнено одно из условий в формулировке принципа свертывания.

«Принцип переноса» Для данной грамматики управляющую таблицу типа «перенос –

опознание» нужно строить так, чтобы она содержала ПЕРЕНОС для магазинного символа А и входного символа х в тех случаях, когда выполнено одно из следующих условий:

а) имеется символ грамматики В, такой, что в правую часть некоторого правила входит цепочка А В, и х принадлежит ПЕРВ(В);

б) А – маркер дна магазина, и х принадлежит ПEPB(<S>), где <S> – начальный символ грамматики.

Более того, управляющий механизм можно построить так, чтобы ПЕРЕНОС выбирался только в указанных выше случаях.

92

Часто бывает удобно рассматривать принцип переноса в терминах отношения ПОД, определяемого следующим образом:

Если А – магазинный символ, а х – входной символ, то пишут: А ПОД х

тогда и только тогда, когда выполняется одно из условий в формулировке принципа переноса.

Определение 7.3. Говорят, что грамматика содержит конфликты пе- реноса-опознания тогда и только тогда, когда существуют грамматический символ А и терминальный символ х, такие, что одновременно А СВЕР- ТЫВАЕТСЯ-ПО х и А ПОД х.

Грамматика с конфликтами переноса-опознания не может служить основой автомата типа «перенос-опознание», потому что принцип свертывания и принцип переноса требуют, чтобы элемент управляющей таблицы для магазинного символа А и входного символа х содержал как процедуру опознания, так и ПЕРЕНОС. Это противоречит требованию, что таблица должна указывать единственную процедуру.

Для грамматики без конфликтов переноса-опознания принципы свертывания и переноса определяют следующие требования к построению управляющей таблицы:

1)элементы для магазинного символа А и входного символа х, таких, что А СВЕРТЫВАЕТСЯ-ПО х, должны содержать процедуры опознания;

2)элементы для магазинного символа А и входного символа х, таких, что А ПОД х должны содержать ПЕРЕНОС;

3)остальные элементы могут содержать операции ОТВЕРГНУТЬ, ПЕРЕНОС или процедуры опознания. Требуется лишь, чтобы ПЕРЕНОС никогда не применялся к концевому маркеру.

Возвращаясь к примеру, рассмотрим строку управляющей таблицы для магазинного символа с. Этот символ является самым правым в правиле 6. Значит, в этой строке управляющей таблицы должны содержаться процедуры опознания для входных символов из множества СЛЕД(<В>), а

именно для с и . В правиле 3 за вхождением с следует а, поэтому для входных символов из ПЕРВ(а), т.е. для самого а, требуется ПЕРЕНОС. В правиле 5 за с следует <А>,значит, ПЕРЕНОС нужен также для входных символов из ПЕРВ(<A>), а именно для d и е. Заметим, что все входные символы, для которых нужен ПЕРЕНОС, отличны от символов, для которых требуются процедуры опознания, и, значит, при построении строки для магазинного символа с конфликтов не возникает.

Далее приведена управляющая таблица для данного примера, построенная с учетом всех приведенных соображений. Она содержит ПЕРЕНОС и ОПОЗНАНИЕ там, где это необходимо, а всюду, где есть возможность выбора, используется операция ОТВЕРГНУТЬ.

93

 

a

b

c

d

e

-|

 

 

 

 

 

 

 

<S>

ОТВЕРГ

ОТВЕРГ

ПЕРЕНОС

ОТВЕРГ

ОТВЕРГ

ОПОЗНАТЬ

 

 

 

 

 

 

 

<А>

ПЕРЕНОС

ПЕРЕНОС

ОПОЗНАТЬ

ОТВЕРГ

ОТВЕРГ

ОПОЗНАТЬ

 

 

 

 

 

 

 

<B>

ОТВЕРГ

ОТВЕРГ

ОПОЗНАТЬ

ОТВЕРГ

ОТВЕРГ

ОПОЗНАТЬ

 

 

 

 

 

 

 

a

ОПОЗНАТЬ

ОПОЗНАТЬ

ОПОЗНАТЬ

ОТВЕРГ

ОТВЕРГ

ОПОЗНАТЬ

 

 

 

 

 

 

 

b

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

ПЕРЕНОС

ПЕРЕНОС

ОТВЕРГ

 

 

 

 

 

 

 

c

ПЕРЕНОС

ОТВЕРГ

ОПОЗНАТЬ

ПЕРЕНОС

ПЕРЕНОС

ОПОЗНАТЬ

 

 

 

 

 

 

 

d

ОТВЕРГ

ПЕРЕНОС

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

 

 

 

 

 

 

 

e

ОПОЗНАТЬ

ОПОЗНАТЬ

ОПОЗНАТЬ

ОТВЕРГ

ОТВЕРГ

ОПОЗНАТЬ

 

 

 

 

 

 

 

 

ОТВЕРГ

ПЕРЕНОС

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

 

 

 

 

 

 

 

Чтобы завершить построение, осталось разработать процедуры опознания, выполняющие операцию ОПОЗНАТЬ, указанную в таблице.

Бессуффиксные ПО-грамматики

Далее подробно рассмотрим процедуры опознания.

Предположим, что имеется грамматика без конфликтов переносаопознания (в противном случае для нее не существовало бы автомата типа «перенос-опознание»). Методы предыдущего раздела указывают, когда (т.е. для каких комбинаций входного и магазинного символов) нужно вызывать процедуры опознания. Из предыдущего раздела стало известно, что обращение к процедуре опознания при обработке допустимой цепочки происходит тогда и только тогда, когда несколько верхних символов магазина представляют основу или (на заключительном шаге), если содержимым магазина является цепочка <S>.

Теперь рассмотрим автомат типа «перенос-опознание» для грамматики, приведенной выше в качестве примера. Правые части правил этой грамматики обладают следующим свойством: никакая правая часть не является суффиксом какой-либо другой правой части или цепочки <S>. По-

этому всякая цепочка магазинных символов может оканчиваться не более чем одной основой или подцепочкой <S>.

Замечание. Цепочка называется суффиксом цепочки , если оканчивается цепочкой .

Можно заметить в частности, что всякая цепочка является своим собственным суффиксом и является суффиксом любой цепочки.

Рассмотрим на примере, если цепочка символов магазина оканчивается символом с, то правило 6 является единственным правилом, чья правая часть совпадает с окончанием этой цепочки независимо от того, какие магазинные символы находятся ниже с. Если цепочка символов магазина оканчивается подцепочкой с<А>а, то независимо от остальных символов магазина единственным правилом, чья правая часть совпадает с окончани-

94

ем этой цепочки, является правило 5. Если же цепочка символов магазина оканчивается подцепочкой <S>, то ни одна правая часть не совпадает с окончанием этой цепочки.

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

<S>, само присутствие некоторой правой части на верху магазина указывает на то, что эта правая часть в действительности является основой. Таким образом, когда процедура опознания обнаруживает в верхней части магазина правую часть правила р, она должна выбрать операцию СВЕРТКА (р). Аналогично присутствие на верху магазина цепочки <S> несовместимо с наличием в магазине какой-либо основы, и в этом случае правильным действием для процедуры опознания будет выбор операции ДОПУСТИТЬ, при условии что текущим входным символом является концевой маркер –|. Короче говоря, процедура опознания должна только выяснить, какая правая часть (или цепочка <S>) совпадает с верхней частью магазина, и выбрать соответствующую операцию свертки (или операцию ДОПУСТИТЬ)

Таким образом, для грамматики рассмотренного выше примера можно построить распознаватель типа «перенос-опознание» с одной-единствен- ной процедурой опознания. Эта процедура используется во всех элементах управляющей таблицы, для которых этого требует анализ управляющей таблицы, описанный в предыдущем разделе. Процедура просто проверяет несколько верхних символов магазина на совпадение с правой частью ка- кого-либо правила или с цепочкой <S>. Если обнаружено совпадение с правой частью правила р, процедура выполняет операцию СВЕРТКА (р). Если два верхних символа магазина образуют цепочку <S>, процедура проверяет, является ли текущий входной символ концевым маркером, и если это так, то допускает входную цепочку. Если ни одна из вышеперечисленных ситуаций не имеет места, процедура отвергает вход.

Таким образом, построение управляющей таблицы можно дополнить следующей единственной процедурой опознания:

если на верху магазина b<A><S><B>, то СВЕРТКА(1) иначе если на верху магазина b<А>, то СВЕРТКА(2) иначе если на верху магазина d<S>ca, то СВЕРТКА(3) иначе если на верху магазина е, то СВЕРТКА(4) иначе если на верху магазина c<А>a, то СВЕРТКА(5) иначе если на верху магазина c, то СВЕРТКА(6) иначе если на верху магазина <S>

и текущий входной символ –|, то ДОПУСТИТЬ иначе ОТВЕРГНУТЬ

95

Описанные методы построения применимы к классу грамматик, которые называют «бессуфиксными».

Определение 7.4. Грамматику называют бессуффиксной, если правая часть ее любого правила не является суффиксом правой части какого-либо другого правила или суффиксом цепочки <S>.

Определение 7.5. Бессуффиксную грамматику, не имеющую конфликтов переноса-опознания, называют бессуффиксной ПО-грамматикой.

В частности, грамматика из рассмотренного выше примера – бессуффиксная ПО-грамматика.

Важность понятия бессуффиксной грамматики заключается в том, что для автомата типа «перенос-опознание» верхняя часть магазина совпадает с правой частью не более, чем одного правила грамматики (или с цепочкой <S>) тогда и только тогда, когда грамматика бессуффиксна.

Вопросы и задания для контроля к теме 7

1.Дайте определение основы и основывающего правила.

2.Дайте интерпретацию правого вывода цепочки в построении дерева вывода.

3.Опишите семантику операции «Перенос».

4.Опишите семантику операции «Свертка».

5.Опишите семантику операции «Опознание».

6.Введите понятие грамматик предшествования.

7.Дайте определение грамматики слабого предшествования.

8.Опишите алгоритм разбора типа «перенос-свертка».

9.Сформулируйте принцип формирования расширенного магазинного алфавита.

10.Опишите правила построения таблиц для управления МП-автоматом.

96

Литература

1.

Гордеев, А. В. Системное программное обеспечение : учебник

/

 

А. В. Гордеев, А. Ю. Молчанов. – СПб. : Питер, 2001. – 736 с.

 

2.

Карпов, Ю. Г. Теория автоматов : учебник / Ю. Г. Карпов. – СПб. : Пи-

 

тер, 2002. – 208 с.

 

3.

Льюис, Ф. Теоретические основы проектирования компиляторов

/

 

Ф. Льюис, Д. Розенкранц, Р. Стирнз. – М. : Мир, 1979. – 655 с.

 

4.Рейуорд-Смит, В. Дж. Теория формальных языков : вводный курс : пер. с англ. / В. Дж. Рейуорд-Смит. – М. : Радио и связь, 1988. – 128 с.

5.Компаниец, Р. И. Системное программирование. Основы построения трансляторов : учеб. пособие для высших и средних учебных заведений / Р. И. Компаниец, Е. В. Маньков, Н. Е. Филатов. – СПб. : Корона-Принт, 2000. – 256 с.

6.Ахо, А. Компиляторы. Принципы, технологии, инструменты / А. Ахо, Р. Сети, Дж. Ульман. – М. : Вильямс, 2003. – 768 с.

7.Братчиков, И. Л. Синтаксис языков программирования / И. Л. Братчи-

ков. – М. : Наука, 1975. – 232 с.

8.Хантер, Р. Проектирование и конструирование компиляторов : пер. с англ. / Р. Хантер. – М. : Финансы и статистика, 1984. – 232 с.

97

Лазарева Ирина Михайловна

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

Учебное пособие

Подписано в печать 30.03.2018. Формат 60×90/16. Усл. печ. л. 6,1. Тираж 300 экз.

Отпечатано в редакционно-издательском отделе (РИО) МАГУ.

Мурманский арктический государственный университет. 183038, г. Мурманск, ул. Капитана Егорова, 15.

98

99

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