Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Формальные языки и грамматики.doc
Скачиваний:
171
Добавлен:
01.05.2014
Размер:
1.51 Mб
Скачать

3.13. Построение slr(1)-распознавателя

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

Г 3. 14 : <I>  t<A1> <A>  <A2>, <B2> <A>  <B3> <B>  a <B>  b

После построения функций ВПЕРВиВПОСЛЕдля данной грамматики, получаем таблицу переходов в виде:

 

Таблица 7.6

<I> 

<A> 

<B> 

h0

t

 

 

 

<I0>

 

 

<I0>

 

 

 

 

 

 

 

<A1>

 

 

 

 

 

 

 

t

 

 

a

b

 

<A1><A2>

<B3>

<A2>

 

,

 

 

 

 

 

,

 

 

a

b

 

 

<B2>

<B2>

 

 

 

 

 

 

 

<B3>

 

 

 

 

 

 

 

a

 

 

 

 

 

 

 

b

 

 

 

 

 

 

 

 

Это недетерминированная таблица, поэтому введем обозначение <Ax> = (<A1>, <A2>)и преобразуем ее к детерминированному виду. В результате имеем:

 

Таблица 7.7

<I> 

<A> 

<B> 

h0

t

 

 

 

<I0>

 

 

<I0>

 

 

 

 

 

 

 

<Ax>

 

,

 

 

 

 

 

t

 

 

a

b

 

<Ax>

<B3>

,

 

 

a

b

 

 

<B2>

<B2>

 

 

 

 

 

 

 

<B3>

 

 

 

 

 

 

 

a

 

 

 

 

 

 

 

b

 

 

 

 

 

 

 

 

Продолжая построение в соответствии с описанной процедурой, мы столкнемся с противоречием при заполнении строк таблицы действий для строки, помеченной символом <Ax>. Поскольку<Ax>содержит грамматическое вхождение<A1>, являющееся самым правым символом правила 1, то нужно было бы записать в рассматриваемую строку таблицы действий операцию Свертка (1). Однако, в множестве<Ax>содержится также грамматическое вхождение<A2>, которое не является самым правым символом правила 2. Для такого символа данную строку таблицы действий нужно заполнить операцией Перенос. Обнаруженное противоречие показывает, что грамматикаГ 3. 14не является LR(0)-грамматикой, и что построить LR(0)-распознаватель с помощью описанной процедуры невозможно. Попробуем теперь проверить, нельзя ли построить для заданной грамматики SLR(1)-распознаватель. Построение такого распознавателя отличается от описанного выше тем, что заполнение таблицы действий выполняется не целыми строками, а каждый элемент строки строится отдельно, и при этом учитываются только те символы, которые могут следовать за рассматриваемым в выводных цепочках. В нашем примере при построении строки таблицы действий для символа<Ax>в столбец, отмеченный символом запятая запишем операцию Перенос, поскольку в таблице переходов в строке<A2>и столбце с запятой находится грамматический символ. В столбец, отмеченный символом конца строки, занесем операцию Свертка (1), поскольку за символом<A1>может следовать только символ. Последнее утверждение вытекает из того, чтоСЛЕД(<I>) = {}. Учитывая, что

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

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

получаем таблицу действий для искомого распознавателя в виде:

 

Таблица 7.8

 

 

h0

П

 

 

 

 

<I0>

 

 

 

 

Д

<Ax>

 

П

 

 

С(1)

t

 

 

П

П

 

,

 

 

П

П

 

<B2>

 

С(2)

 

 

С(2)

<B3>

 

С(3)

 

 

С(3)

a

 

С(4)

 

 

С(4)

b

 

С(5)

 

 

С(5)

 

Эта таблица вместе с таблицей 7.6задает SLR(1)–распознаватель, который работает по тем же правилам, что и LR(0)–распознаватель. Незаполненные клетки таблицы соответствуют операции Отвергнуть.

Процедура построения SLR(1)–распознавателя отличается от процедуры построения LR(0)–распознавателя содержанием только одного пункта 5, который можно описать так:

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

а) Если Q содержит начальное вхождение, то в столбец, помеченный маркером входной строки, занести операцию Допустить. б) Если Q содержит грамматическое вхождение R i j, не являющиеся самым правым вхождением никакого правила, и если элемент таблицы переходов для этого символа Ri j и некоторого символа грамматики S не является пустым, то в элемент таблицы действий соответствующей паре ( Ri j, S) заносится операция Перенос. в) Если Q содержит самое правое грамматическое вхождение p цепочкиправила<A>  с номеромk, то для каждого входного символаx  СЛЕД(<A>)в элемент таблицы действий, соответствующий паре(p,x), заносится операция Свертка (k).

Если в результате выполнения описанного выше пункта 5 удастся построить таблицу действий, то это означает, что заданная грамматика является грамматикой SLR(1), а построенный автомат SLR(1)-распознавателем. Все описанные выше процедуры построения распознавателей применимы к неукорачивающим грамматикам. Они являются также базой для построения восходящих распознавателей для укорачивающих грамматик. Однако эти процедуры должны быть дополнены правилами построения, учитывающими наличие аннулирующих правил.

Соседние файлы в предмете Теория языков программирования