Файл: Алферова З.В. Теория алгоритмов учеб. пособие.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 25.06.2024

Просмотров: 90

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

классам языков (в зависимости от того, с какими языками работа­ ет машина). Поскольку все языки программирования относятся ко второму классу по классификации Хомского, то и методы в основ­ ном ориентированы на второй класс языков.

W

X

у

j

Рис. 21

Некоторые методы контроля вносят ограничения в грамматику языка. Обычно ограничения накладываются на правую часть пра­ вил: либо по числу символов, либо по их составу.

2.8.2. Метод Эйкела, Паула, Бауера, Замелзона

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

символов: А—кг

и

А—>аВ.

 

 

 

 

 

 

 

 

Ограничение длины правой части порождений, которая равна 1

или 2, не сужает общности метода, поскольку любое

порождение

вида

А

: : = В^2Вг...

BhBk+l...

BiBi+i... Вп

возможно свести

к

множеству

порождений:

А0:

: =

BiAit

Л 4 : : = В2А2,

А2: : =

= В3А3...

 

Ап-1:

: = Вп,

где А\ = В2В3...

B^Bk+i...

Bj-Bi+i • • • В-п;

Л2

=

В3...

BkBk+i...

BiBi+i...

Вп

и т. д.

 

 

 

 

В2,

 

В этом

случае

для запоминания

начальных

символов

В ь

В3)

...,

Вп

и

сформированных

промежуточных

величин Аь

А2,

Аз,

 

 

An-i используется

специальное устройство,

которое

назы­

вают либо магазином, либо стэком. Самое распространенное

назва­

ние

этого

устройства — стэк. Стэк

устроен

так, что,

когда

в него

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

Грамматический разбор методом Бауэра-Замелзона осуществ­ ляется механизмом четырех таблиц: 1) стэк символов разбираемой строки; 2) синтаксическая таблица состояний п; 3) таблица дейст­ вий Af; 4) таблица семантических правил г.

136


Синтаксическая таблица является управляющей: состоянию п со­ ответствует определенное действие N — порождение или свертка. В момент определения состояния синтаксической таблицы и соот­

ветствующих ей действий N подключается таблица

семантических

правил. При этом применение правил семантики г^Е*

обеспечива­

ет образование кодов по входной анализируемой строке — s.

 

Осуществление

грамматического

разбора

можно

представить

последовательностью нескольких шагов:

 

 

 

 

Шаг 1. Занесение символов входной

строки

в стэк. Если

строка

имеет вид BiB2B3...

BhBh+i ...Bi...

Вп,

то в стэке символы

можно

расположить так: В^В^В^.

..Bi.

 

 

 

 

 

Шаг 2. Выявление возможного соответствия двух верхних сим­ волов BiBi-i стэка и текущего символа входной строки Si+i состоя­ нию т синтаксической таблицы. При поиске просматриваются на

соответствие только два

верхних

элемента стэка

Bi

и B j - i .

 

Шаг 3. Если поиск положительный, то происходит свертка под­

строки, т. е. замена либо Si - i на

Ai-%

либо Bi-iBi

на Л»_ь

либо

BiBi+i на А{, и занесение в стэк

Bi+i.

содержание

стэка

BiBi-i

Шаг 3. Если поиск

отрицателен, то

сдвигается вниз и заносится Bi+i.

 

 

 

 

 

Шаг 4. Производится

чтение

следующего

символа входной

строки.

 

 

 

 

 

 

2.8.3. Метод Флойда

Метод Флойда основан на использовании отношения «предшест- ^ вия» между двумя смежными терминальными символами, т. е. он применим также к языкам второго класса по классификации Хом-

ского, но с известным

ограничением: порождения не должны иметь

вид с—yxWiW2y,

где

WiW%— смежные нетерминалы — № 4 2 е

— Ут ), а х, у — строки

(возможно и пустые).

терминальных

Отношения

предшествия

определяют состояние

символов при их свертке.

Возможные отношения

предшествия по

Вирту и Веберу записываются такими знаками: =^ F,

-|>,

Пусть при грамматическом разборе пары Т(Т^У,

тогда:

1) отношение предшествия со знаком > • будет иметь место тог­

да и только тогда, если Tj,

при свертке строки s является крайне

левым символом подстроки

S ' G S , ИЛИ:

 

....T.TJ

I>-s'

2)отношение предшествия со знаком • > имеет место тогда и только тогда, если Ti является крайне правым символом в s', или:

137


3) и, наконец, предшествие со знаком ™ имеет место тогда и только тогда, если оба символа являются частью редукцируемой подстроки s':

Если между парой символов TiTj

нельзя

поставить ни одного

из отношений предшествия \Ti=Tj,

Гг -->Г3 -,

Ti<^-Tj\, то это гово­

рит о синтаксической ошибке. Знаки 1 / = ; 2/ • > ; 3/<^- между символами Тг и Tj можно поставить тогда и только тогда, если соот­ ветственно:

1)c-*xTtT}y;

 

2) c-+xTiCey и

Ce=$*TjZ;

 

 

3)

c~>xCkTjy

и Cfr^zTt, или

 

c^xCkCey

и Ck=>zTlt

Ce=>TjW,

 

где w, z, х, у — любые строки.

 

 

 

 

Отношения предшествия,

которые

могут

быть между

парой

символов в строке и которые

определяются

правилами

вывода,

представляются в виде матрицы предшествий. Рассмотрим

матри­

цу предшествий для одного примера.

 

 

 

Исходная матрица и правила вывода для некоторой грамматики

заданы в следующем виде:

 

 

 

 

 

Строка: 'if false

then

о'

 

 

 

 

Правила вывода:

Л п/п

Отношение предшествий символов

Основание

if=false 2 T h e n ~ 0

3 < state > = <[ string >

4 false • > < string >

5false • > then

6<state > < • then

7

<^state> -• if false <C string > -» then 0

<

prog > ->- <

state >

<string >

<

Pr °g >

if

false <

string >

<C P r o S !> -* if

false

then 0

<

prog -> <

state >

then 0

 

 

 

ошибка

 

138


Матрица предшествий будет иметь вид:

Символ

<prog> <state>

<string>

l_f

false

then

0

< prog

>

 

 

 

 

 

<state

>

 

 

 

< •

 

< string

>

 

 

 

 

 

if

 

 

 

 

 

 

false

 

•>

 

 

•>

 

then

 

 

 

 

 

 

0

 

 

 

 

 

 

Число элементов такой матрицы

очень

велико,

поэтому

Вирт

и Вебер обобщили метод Флойда и ввели

новое понятие — «функ­

ция предшествия». Так как в установлении

соотношения предшест­

вия принимают участие два символа, то требуется по крайней

мере

две функции — / и /, чтобы для любой

пары символов TiTj выпол­

нялись соотношения:

 

 

 

 

 

 

/(Г,.) = / ( Г ; . ) ~ 7 \ . = 7у ;

 

 

 

f(Tt)

.>1[Т,)~ТГ>Т,;

 

(14)

/ ( 7 V ) < . / ( 7 V ) ~ 7 \ . < - 7 7

Для существования функций предшествия / и / необходимым условием является перекомпоновка матрицы предшествий таким образом, чтобы выявились три независимые области, в каждой из которых определено одно и только одно отношение из отношений предшествия:

• > e l { область }; =^=е II { область }; < • €= III { область }.

Построим матрицу предшествий для грамматики с правилами вывода:

< ехрг > -* < string > < string > ;

< ехрг > -> l i i i ;

< string > -+ < state > < ехрг > d; <^ state > -> else;

<expr > < string >_if;

<expr > if < string > .

139