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

nC1DMY1V3A

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

Элементы ОТВЕРГНУТЬ отмечают те ситуации, когда текущий входной символ и верхний символ магазина несовместимы.

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

S-грамматика

Рассмотрим грамматики, которые пригодны для нисходящего анализа с помощью МП-автомата. Один из таких классов – так называемые

S-грамматики.

Определение 5.1. КС-грамматика называется S-грамматикой (разделённой или простой) тогда и только тогда, когда выполняются следующие два условия:

правая часть каждого правила начинается с терминала; если два правила имеют совпадающие левые части, то правые час-

ти должны начинаться различными терминальными символами.

Примеры:

 

 

 

 

 

Не S-грамматика

 

S-грамматика

1.

<S>

a<T>

1.

<S>

ab<R>

2.

<S>

<T>b<S>

2.

<S>

b<R>b<S>

3.

<T>

b<T>

3.

<R>

a

4.

<T>

ba

4.

<R>

b<R>

Техника построения МП-автомата с одним состоянием для S-грам- матики:

1.Множество входных символов – множество терминальных символов грамматики, расширенное концевым маркером.

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

3.Начальное содержимое магазина: <S> – маркер дна и начальный нетерминал.

4.Элементы управляющей таблицы:

4.1. Каждому правилу грамматики сопоставляется элемент таблицы. Если правило имеет вид < A > b , где < A > – нетерминал, b – тер-

минал, а – цепочка, состоящая из терминалов и нетерминалов. Этому правилу будет соответствовать элемент

в строке <A> и столбце b: ЗАМЕНИТЬ( r), СДВИГ, где r – цепочка , записанная в обратном порядке для того, чтобы удовлетворять соглашению «верхний символ справа».

Если правило вида < A > b, то вместо ЗАМЕНИТЬ( ) используется ВЫТОЛКНУТЬ.

60

4.2.Если магазинным символом является терминал b, то в таблице в строке b и столбце b будет ВЫТОЛКНУТЬ, СДВИГ.

4.3.Элемент таблицы, на пересечении маркера дна и концевого маркера является ДОПУСТИТЬ.

4.4.Элементы таблицы, не заполненные по перечисленным выше правилам, заполняются оператором ОТВЕРГНУТЬ.

Утверждение 5.1. Если язык определяется S-грамматикой, то его можно распознать с помощью МП-автомата с одним состоянием, использующим расширенную магазинную операцию ЗАМЕНИТЬ.

Применяя эти правила к S-грамматике, приведенной в примере:

1.<S> ab<R>

2.<S> b<R>b<S>

3.<R> a

4.<R> b<R>

получим управляющую таблицу (рис. 5.2).

 

 

a

 

b

 

<S>

 

ЗАМЕНИТЬ(<R>b),

 

ЗАМЕНИТЬ(<S>b<R>),

ОТВЕРГНУТЬ

 

СДВИГ

 

СДВИГ

 

 

 

 

<R>

 

ВЫТОЛКНУТЬ

 

ЗАМЕНИТЬ (<R>)

ОТВЕРГНУТЬ

 

СДВИГ

 

СДВИГ

 

 

 

 

с

 

ОТВЕРГНУТЬ

 

ВЫТОЛКНУТЬ

ОТВЕРГНУТЬ

 

 

СДВИГ

 

 

 

 

 

 

 

ОТВЕРГНУТЬ

 

ОТВЕРГНУТЬ

ОТВЕРГНУТЬ

 

 

 

 

 

 

 

Начальное содержимое магазина:

S

 

Рис. 5.2. Управляющая таблица МП-автомата для S-грамматики

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

Например, переход ЗАМЕНИТЬ(<S>b<R>), СДВИГ изменить на ВТОЛКНУТЬ(b<R>), СДВИГ или переход ЗАМЕНИТЬ(<R>), СДВИГ равносилен операции СДВИГ.

Q-грамматика

Рассмотрим следующую грамматику (где <S> начальный нетер-

минал):

 

 

1.

<S>

a <A><S>

2.

<S>

b

3.

<A>

c <A><S>

4.

<A>

 

Эта грамматика не принадлежит к классу S-грамматик, так как правило 4 начинается не с терминального символа.

61

Попытаемся использовать эту грамматику для построения МПавтомата. Рассмотри пример обработки заранее допустимой цепочки:

Пример: aacbb (рис. 5.3)

Рис. 5.3. Дерево вывода цепочки aacbb

Конфигурация памяти при обработке МП-автоматом данной цепочки:

№ шага

Содержимое магазина

Входная цепочка

1

<S>

aacbb

2

<S><A>

acbb

3

<S>

acbb

4

<S><A>

cbb

5

<S><S><A>

bb

6

<S><S>

bb

7

<S>

b

8

 

 

 

 

 

9

 

ДОПУСТИТЬ

На шаге 2 данной конфигурации верхний символ магазина <A> порождает цепочку по правилу 4, то есть пустую цепочку, а текущий символ – a – является началом цепочки, порождаемой символами магазина, которые расположены ниже <A>.

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

 

а

b

c

 

< S >

№ 1

№ 2

ОТВЕРГНУТЬ

ОТВЕРГНУТЬ

< A >

№ 4

№ 4

№ 3

№ 4

 

ОТВЕРГНУТЬ

ОТВЕРГНУТЬ

ОТВЕРГНУТЬ

ДОПУСТИТЬ

 

 

 

 

 

Начальное содержимое магазина: S

1 – ЗАМЕНИТЬ (< S >< A >), СДВИГ

2 – ВЫТОЛКНУТЬ, СДВИГ

3 – ЗАМЕНИТЬ (< S >< A >), СДВИГ

4 – ВЫТОЛКНУТЬ, ДЕРЖАТЬ

Рис. 5.4. Управляющая таблица МП-автомата для Q-грамматики

62

Элемент таблицы, соответствующий <A> и представляет собой новую ситуацию: ее можно реализовать через правило 4. Однако из цепочки <S> нельзя вывести промежуточную цепочку, в которой за вхождением <A> немедленно следует символ . Таким образом, применение правила 4 не может привести к тому, что входная цепочка будет допущена. Поэтому переход № 4 или ОТВЕРГНУТЬ имеют один результат.

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

Определение 5.2. СЛЕД (<Х>) множество входных символов, которые могут следовать за цепочкой, порожденной нетерминалом <Х> в ка- кой-либо допустимой входной цепочке.

Для рассмотренного выше примера:

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

Следовательно, бесполезно применять -правило к магазинному символу <A>, если текущий входной символ не принадлежит этому множеству (то есть если на входе символы: с или ) и наоборот.

Таким образом, можно выделить две ситуации, в которых правило должно быть применено к данным магазинному символу <A> и входному

символу b:

 

если правило имеет вид <A>

b

если правило имеет вид

<A> , а b принадлежит множеству

СЛЕД(<A>).

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

Определение 5.3. Если правило грамматики имеет вид <A > b , где

b терминал,

 

цепочка, состоящая из терминалов и нетерминалов, то

определяем множество

ВЫБОР (<A>

b ) = {b},

если правило имеет вид < A > , то определяем множество

ВЫБОР (<A>

) = СЛЕД(<A>).

Если p

номер правила <A> , то можно писать ВЫБОР (p) вместо

ВЫБОР (<A>

).

 

Множество ВЫБОР(р) называется множеством выбора правила p. Множество выбора правила содержит те входные символы, для ко-

торых соответствующий МП-автомат должен применять это правило. Пример построения множества выбора для правил рассмотренной

выше грамматики:

 

ВЫБОР (1)

= ВЫБОР (<S>

a<A><S>) = {a}

ВЫБОР (2)

= ВЫБОР (<S>

b) = {b}

ВЫБОР (3)

= ВЫБОР (<A>

c <A><S>) = {c}

ВЫБОР (4)

= ВЫБОР (<A>

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

 

 

63

Определение 5.4. КС-грамматика называется Q-грамматикой тогда и только тогда, когда выполняются следующие два условия:

правая часть каждого правила либо представляет собой , либо начинается с терминального символа;

множество выбора правил с одной и той же левой частью не пересекаются.

В рассмотренном ранее примере: ВЫБОР (1) ВЫБОР (2) = {a} {b} = ВЫБОР (3) ВЫБОР (4) = {c} {a, b} =

Следовательно, представленная грамматика является Q-грамматикой. Приведенные правила построения МП-автомата для S-грамматики можно расширить так, чтобы они оказались применимыми и к Q-грам-

матикам. Правило 4.1 нужно заменить на 2 правила:

4.1. Правило грамматики применяется всякий раз, когда магазинный символ является его левой частью, а входной символ принадлежит его

множеству выбора.

 

Для правила вида <A> b , где b терминал,

цепочка, состоящая

из терминалов и нетерминалов, используется переход: ЗАМЕНИТЬ( r), СДВИГ.

Для правила вида <A> b, вместо ЗАМЕНИТЬ( ) исполняется ВЫТОЛКНУТЬ.

Для правила <A> исполняется переход ВЫТОЛКНУТЬ, СДВИГ. 4.2. Если имеется -правило с нетерминалом <A> в левой части и элемент, соответствующий магазинному символу <A> и входному символу b, не был создан по правилу 4.1, то таким элементом может быть либо

«применение» этого -правила, либо операция ОТВЕРГНУТЬ. Утверждение 5.2. Если язык определятся Q-грамматикой, то его

можно распознать с помощью МП-автомата с одним состоянием, использующим расширенную операцию ЗАМЕНИТЬ.

LL(1)-грамматика

Обобщим понятие множества выбора таким образом, чтобы его можно было применять к КС-правилам произвольного вида. Эти обобщения позволят определять множество выбора для правил, правая часть которых начинается с нетерминала.

Допустим, нужно построить нисходящий МП-распознаватель для грамматики, которая содержит правило

<S> <A>b<B>

Предположим далее, что анализ грамматики показал, что для всех терминалов цепочка, выводимая из <A>b<B>, правой части данного правила, начинается с одного из четырех символов множества{a, b, c, e}.

64

Тогда правило должно применяться, если верхним магазинным символом является <S> и текущим входным символом один из четырех символов.

Переход будет таким: ЗАМЕНИТЬ(<B>b<A>), ДЕРЖАТЬ

Операция ЗАМЕНИТЬ означает, что требуемая цепочка, порожденная <S>, должна начинаться цепочкой, порожденной <A>, за которой следует «b», а потом цепочка, порожденная <B>.

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

Проиллюстрируем это понятие на примере грамматики.

Пример:

1.

<S>

<A>b<B>

ПЕРВ (<A>b<B>) = {a, b, c, e}

2.

<S>

d

ПЕРВ (d) = {d}

3.

<A>

<C><A> b

ПЕРВ (<C><A> b) = {a, e}

4.

<A>

<B>

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

5.

<B>

c<S>d

ПЕРВ (c<S>d) = {c}

6.

<B>

 

ПЕРВ ( ) =

7.

<C>

a

ПЕРВ (a) = {a}

8.

<C>

ed

ПЕРВ (ed) = {e}

Вычисление множеств ПЕРВ для правил 2, 5, 7, 8 тривиально, так как их правые части начинаются с терминала. Для правила 6 очевидно. Для правила 3 множество ПЕРВ состоит из терминалов, начинающих правила для нетерминала <C>, а именно из символа «а» (правило 7) и символа «е» (правило 8). Для правила 4 аналогично.

Правило 1 анализируется сложнее: нетерминал <A> может порождать цепочки, начинающейся с нетерминалов <C> и <B>, а те в свою очередь начинаются с терминалов a, e, c; a c учетом правила 6 и «b».

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

Далее проводится анализ -правила. В данном примере это правило 6, оно должно применяться к нетерминалу <B>, когда текущий входной символ принадлежит множеству

СЛЕД(<B>) = {b, d, }.

Принадлежность символов b, d, данному множеству демонстрируется следующими выводами:

65

<S>

<A> b <B>

<B> b <B>

<S>

<A> b <B>

<A> b c <S> d <A> b c <A> b <B> d

В данной грамматике имеется еще и правило 4, с помощью которого можно породить пустую цепочку:

<A> <B>

Таким образом, применение правила 4 должно осуществляться, когда на вершине магазина находится нетерминальный символ <A>, а текущий входной символ принадлежит множеству СЛЕД (<A>). Можно найти, что

СЛЕД (<A>) = {b}.

Определение 5.6. Цепочка , состоящая из символов грамматики, называется аннулирующей, тогда и только тогда, когда * . Правило грамматики называется аннулирующим тогда и только тогда, когда его правая часть является аннулирующей.

В рассмотренном выше примере это правила 4 и 6.

Объединяя все выше сказанное, определим множество выбора для

правил произвольного вида:

 

 

Для правил <A>

, где

цепочка, состоящая из терминалов и не-

терминалов, определяем

 

 

ВЫБОР(<A>

) = ПЕРВ(

), если неаннулирующая;

ВЫБОР(<A>

) = ПЕРВ(

) СЛЕД(<A>), если

аннулирующая.

В рассмотренном примере для аннулирующих правил:

ВЫБОР(4)

= ПЕРВ(<B>) СЛЕД(<A>) = {c} {b}

 

ВЫБОР(6)

= ПЕРВ( ) СЛЕД(<B>) = { } {b, d,

} = { b, d, }

Для других правил множество выбора совпадает с множествами

ПЕРВ, то есть

 

 

 

 

ВЫБОР(1)

= ПЕРВ(<A> b <B>) = {a, b, c, e} и т.д.

 

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

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

Определение 5.7. КС-грамматика называется LL(1)-грамматикой тогда и только тогда, когда множества выбора правил с одинаковой левой частью не пересекаются.

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

66

 

a

b

c

d

e

–|

<S>

№ 1

№ 1

№ 1

№ 2

№ 1

ОТВЕРГ

<A>

№ 3

№ 4

№ 4

ОТВЕРГ

№ 3

ОТВЕРГ

<B>

ОТВЕРГ

№ 6

№ 5

№ 6

ОТВЕРГ

№ 6

<C>

№ 2

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

№ 7

ОТВЕРГ

b

ОТВЕРГ

№ 2

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

d

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

№ 2

ОТВЕРГ

ОТВЕРГ

 

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

ОТВЕРГ

ДОПУСТ

 

 

 

 

 

 

 

1 ЗАМЕНИТЬ (<B> b <A>), ДЕРЖАТЬ

2 ВЫТОЛКНУТЬ, СДВИГ

3 ЗАМЕНИТЬ (b <A><C>), ДЕРЖАТЬ

4 ЗАМЕНИТЬ (<B>), ДЕРЖАТЬ

5 ЗАМЕНИТЬ (d <S>), СДВИГ

6 ВЫТОЛКНУТЬ, ДЕРЖАТЬ

7 ЗАМЕНИТЬ(d), СДВИГ

Рис. 5.5. Управляющая таблица МП-автомата для LL(1)-грамматики

Приведенные ранее правила построения МП-автомата для S-грам- матики можно расширить так, чтобы они оказались применимыми и к LL(1)-грамматикам. Правило 4.1 нужно заменить на 2 правила:

4.1 Для правила вида <A>

b

, где

произвольная цепочка, ис-

полняется переход ЗАМЕНИТЬ (

r), СДВИГ.

 

Для правила вида <A> , где

цепочка, которая состоит из тер-

миналов и нетерминалов (начинается не с терминала), исполняется переход ЗАМЕНИТЬ ( r), ДЕРЖАТЬ.

Когда равна , вместо операции ЗАМЕНИТЬ( ) применяют операцию ВЫТОЛКНУТЬ.

4.2 Если для нетерминала <A> имеется аннулирующее правило и по правилу 4.1 не было создано элемента таблицы, то можно применить аннулирующее правило или отвергнуть входную цепочку.

Утверждение 5.3. Если язык определяется LL-грамматикой, то его можно распознать с помощью МП-автомата с одним состоянием, использующим расширенную операцию ЗАМЕНИТЬ.

Метод рекурсивного спуска

Рассмотрим еще один метод распознавания и перевода языков ме-

тод рекурсивного спуска [3].

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

67

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

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

ным символом <S>.

Пример:

 

1.

<S>

a <A><S>

2.

<S>

b

3.

<A>

c <A><S> b

4.

<A>

 

Построим множества выбора правил заданной грамматики:

ВЫБОР(1) = {a} ВЫБОР(2) = {b} ВЫБОР(3) = {c}

ВЫБОР(4) = СЛЕД(<A>) = {a, b}

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

Схема главной программы:

«Начало программы» Установить ВХОД = первый входной символ Вызов S

Если ВХОД –| то ОТВЕРГНУТЬ

Иначе ДОПУСТИТЬ

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

Procedure S

Переход по символам

a– правило P1

b– правило P2 Выход по символам

c– ОТВЕРГНУТЬ

–| – ОТВЕРГНУТЬ

Procedure A

Переход по символам

a– правило P4

b– правило P4

c– правило Р3 Выход по символу

–| – ОТВЕРГНУТЬ

68

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

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

1.

Терминалу, который в данном правиле является первым симво-

лом, операция СДВИГ.

2.

Другим терминалам проверка и СДВИГ.

3.

Нетерминалам вызов соответствующей процедуры.

Описание процедур, распознающие язык, порождаемый данной грамматикой:

P1: «Код для правила 1» Вызов СДВИГ Вызов A

Вызов S

P2: «Код для правила 2» Вызов СДВИГ Возврат

P3: «Код для правила 3» Вызов СДВИГ Вызов A

Вызов S

Если ВХОД b

то ОТВЕРГНУТЬ иначе СДВИГ Возврат

P4: «Код для правила 4» Возврат

Таким образом, магазинный механизм МП-автомата заменяется механизмом вызова процедур, присущим языкам высокого уровня.

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

1.На чем основывается синтаксический анализ языка?

2.Какие методы синтаксического анализа языка существуют?

3.Что лежит в основе нисходящего подхода к синтаксическому анализу?

4.Опишите алгоритм нисходящего разбора цепочки символов языка.

5.Дайте формальное определение S-грамматики.

6.Сформулируйте правила построения нисходящего МП-распознавателя для языков, порождаемых S-грамматикой.

7.Как строятся множества СЛЕД для нетерминалов грамматики?

8.С какой целью необходимо строить множество СЛЕД?

9.Дайте формальное определение Q-грамматики.

69

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