Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lects_1.pdf
Скачиваний:
25
Добавлен:
09.06.2015
Размер:
731.64 Кб
Скачать

Используя функции ВЫБОР, построим соответствующие им команды искомого автомата.

( 1 ) f( s0, x , <A>) = ( s0, $ ),

( 2 ) f( s0, ( , <A> ) = ( s0, )<B> ),

( 3 ) f*( s0, ( , <B> ) = ( s0, <C><A> ), ( 3') f*( s0, x, <B> ) = ( s0, <C><A> ), ( 4 ) f( s0, + , <C> ) = ( s0, <C><A> ), ( 5 ) f*( s0, ), <C> ) = ( s0, $ ).

Учитывая, что закрывающая скобка расположена на последнем месте правила (2), построим команду

f( s0, ), ) ) = ( s0, $ ).

Кроме того, создадим команду для перехода в заключительное состояние: f( s0, $, h0 ) = ( s1, $ ).

Работу автомата проверим на примере входной цепочки ( x + x ). Получаем следующую последовательность конфигураций:

( s0, (x+x), h0<A> ) |---

( s0, x+x ), h0)<B> ) |---

( s0, x+x), h0)<C><A> ) |---

( s0, +x ), h0)<C>) |---

( s0, x), h0)<C><A> ) |---

( s0, ), h0)<C>)|---

(s0, ), h0 )) |--- ( s0, $, h0 ) |--- ( s0, $, $ ).

 

Т.о. входная цепочка допускается построенным автоматом.

3.8. Преобразование грамматик к виду LL(1)

3.8.1. Исключение леворекурсивных правил

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

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

36

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

Допустим, что в схеме заданной грамматики имеются правила: <A> <B> | <A><B>. По первому условию определения LL(1) грамматики функции ПЕРВ для правил с одинаковой левой частью не должны иметь одинаковых элементов, но для заданной грамматики это не так, поскольку

ПЕРВ(<A><B>) = ПЕРВ(<A>) = ПЕРВ(<B>).

Следовательно, грамматика, содержащая данные правила, не является LL(1) грамматикой.

Рассмотрим другие правила, обеспечивающие получение такого же множества цепочек,

что и в первом случае: <A> <A><B> | $. Первое условие выполняется, но имеем:

СЛЕД( <A> ) = ПЕРВ(<B>) и ПЕРВ(<A>) = ПЕРВ(<B>),

поскольку из A выводима $.

Эти равенства показывают, что нарушается второе условие из определения LL(1) грамматики.

Т.о. LL(1) грамматика не должна содержать леворекурсивных правил. Лучше не использовать леворекурсивные правила на этапе построения грамматики, но если они появились, то их можно исключить, пользуясь ранее описанным приемом.

3.8.2. Выделение общих частей

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

Если заданная грамматика содержит правила

<A> → αµ1 | αµ2 | ... | αµn,

то, вводя дополнительный нетерминал <A'>, их можно преобразовать к виду:

<A> → α <A'>

<A'> µ1 | µ2 | ... | µn.

Полученные правила могут быть использованы для построения LL(1) грамматики. Третий вид преобразования предполагает исключение аннулирующих правил и построе-

37

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