Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпаргалки по ТЯПу.doc
Скачиваний:
66
Добавлен:
01.05.2014
Размер:
498.18 Кб
Скачать

3.4.2 Построение функции перв(µ)

Значение функции ПЕРВ() можно определить пользуясь следующими правилами: 1) Если цепочкаµначинается терминальным символом и имеет видbµ', то функцияПЕРВ(µ) = {b},2) Если цепочкаµявляется пустой цепочкой, µ = $, то функцияПЕРВ(µ) = $,

3) Если цепочка µначинается нетерминальным символом<B>и имеет вид<B>µ', а в схеме грамматики имеется n правил, в любой части которых находится символ<B>:<B> 1 | 2 | ... | n ,

и, если не существует вывода <B> ==>* $,то функцияПЕРВ(<B>µ')представляет собой объединение множеств:ПЕРВ(<B>µ') = ПЕРВ(1) ПЕРВ (2) ...ПЕРВ(n),

4) Если цепочка µ начинается нетерминальным символом и имеет вид <B>µ', в схему грамматики входят n правил вида<B> 1 | 2 | ... | n , и<B>является аннулирующим нетерминалом, т.е. существует<B> ==> *$, то функцияПЕРВ(<B>µ')=ПЕРВ(µ') ПЕРВ( 1) ПЕРВ( 2) ... ПЕРВ( n).

В качестве примера выполним вычисление функции ПЕРВ для правил следующей грамматики:

 Г3. 2 : R = { (1) <A> <B><C>c,(2) <A> g<D><B>,(3) <B> $,(4) <B> b<C><D><E>,(5) <C> <D>a<B>,(6) <C> ca,(7) <D> $,(8) <D> d<D>,(9) <E> g<A>f,(10) <E> c }.

Вначале найдем значения функции для правых частей правил (2), (4), (6), (8), (9) , (10) , начинающихся терминальными символами: ПЕРВ(g,<D>,<B>) = {g} ПЕРВ(b<C><D><E>) = {b} ПЕРВ(ca) = {c} ПЕРВ(d<D>) = {d} ПЕРВ(g<A>f) {g} ПЕРВ(c) = {c} Затем вычислим функцию для правил (5) и (6) :

ПЕРВ (<C>) = ПЕРВ (<D>a<B>) ПЕРВ (ca).

Учитывая, что <D> является аннулирующим нетерминалом, получаем:

ПЕРВ(<C>) = ПЕРВ(a<B>) ПЕРВ(<D>){c} = {a}{d}{c}={a,d,c}.

При вычислении функции для правил (1) и (2) также необходимо иметь в виду то, что <B> является аннулирующим терминалом, поэтому имеем:

ПЕРВ(<A>) = ПЕРВ(<B><C>c) ПЕРВ(g<D><B>) = ПЕРВ(<C>c)ПЕРВ(<B>)ПЕРВ(g<D><B>) =

{a,d,c} {b}{g} = {a,b,c,d,g}.

9.Определение и правила вычисления функции СЛЕД. Использование функции.

3.4.3 Построение функции СЛЕД(<B>)

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

<X1>  µ1<B>1,<X2>  µ2<B>2, ... , <Xn>  µn<B>n,

и все цепочки i/$ , то

СЛЕД(<B>) = ПЕРВ( 1)  ПЕРВ( 2)  ...  ПЕРВ( n).

2) Если же среди приведенных выше правил имеется хотя бы одна цепочка i= $, например пусть1= $, то функция вычисляется так:

СЛЕД(<B>) = СЛЕД(<X1>)  ПЕРВ( 2)  ...  ПЕРВ( n).

Выполним вычисление функции СЛЕД для нетерминалов грамматики Г3.2. Вначале определим функцию для нетерминала <A>, который встречается в правой части правила (9). СЛЕД(<A>) = ПЕРВ(f) = {f}. Нетерминал <C> входит в правые части правил (1) и (4), учитывая также, что нетерминал <D> являетя анулирующим, получаем:

СЛЕД(<C>) = ПЕРВ(<D>) ПЕРВ(<E>)ПЕРВ(c) = {c,d,g}.

Нетерминал <B> входит в правые части правил (1), (2), (5), поэтому имеем:

СЛЕД(<B>) =ПЕРВ(<C>c) СЛЕД(<A>) СЛЕД(<C>),

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

СЛЕД(<B>) = { a, c, d, }{ f }U { c, d, g, } = { a, c, d, g, f }.

Для нетерминала <D> , который входит в правила (2), (4) , (5) и (8), с учетом того, что нетерминал <B> является аннулирующим, получаем:

СЛЕД(<D>) =ПЕРВ(<B>) СЛЕД(<A>)ПЕРВ(<E>)ПЕРВ(a<B>),

учитывая, что , для нетерминала <E>, входящего в правило (4) СЛЕД(<E>) = СЛЕД(<B>) = {a,d,c,g,f}, окончательно имеем: СЛЕД(<D>) = ПЕРВ(<B>)СЛЕД(<A>)ПЕРВ(<E>){a} =

= {b}{f}{c,g}{a} = {a,b,c,g,f}.

10.Определение и правила вычисления функции ВЫБОР. Использование функции.

3.4.4 Построение множества ВЫБОР.

Множество ВЫБОР, которое потребуется нам для построения переходов магазинных автоматов,можно определить с помощью функций ПЕРВ и СЛЕД следующим образом:

1) Если правило грамматики имеет вид <B> - > и  не является аннулирующей цепочкой, другими словами не существует вывод ==>*$, тоВЫБОР(<B>   ) = ПЕРВ(  ).2) Для аннулирующих правил грамматики вида<B> $,множество выбора определяется такВЫБОР(<B>  $) = СЛЕД(<B>).3) Если правило грамматики имеет вид<B>  µ иµявляется аннулирующей цепочкой, тоВЫБОР(<B>  µ) = ПЕРВ(µ)  СЛЕД(<B>).

Для рассматриваемой грамматики Г3.2множества ВЫБОР для каждого из правил, построенные описанным выше способом, имеют вид:

ВЫБОР(<A> <B><C>c) = ПЕРВ(<B><C>c) = {a,b,c,d}, ВЫБОР(<A>g<D><B>) = ПЕРВ(g<D><B>) = {g}, ВЫБОР(<B>$) = ПЕРВ($)СЛЕД(<B>) = {a,c,d,g,f}, ВЫБОР(<B>b<C><D><E>) = ПЕРВ(b<C><D><E>) = {b}, ВЫБОР(<C><D>a<B>) = ПЕРВ(<D>a<B>) = {a,d}, ВЫБОР(<C>ca) = ПЕРВ(ca) = {a}, ВЫБОР(<D>$) = ПЕРВ($)СЛЕД(<D>) = {a,b,c,g,f}, ВЫБОР(<D>d<D>) = ПЕРВ(d<D>) = {d}, ВЫБОР(<E>g<A>f) = ПЕРВ(g<A>f) = {g}, ВЫБОР(<E>c) = ПЕРВ(c) = {c}.

11.КС-грамматики и LL1 грамматики.

3.5 Слаборазделенные грамматики

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

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

 правая часть каждого правила представляет собой либо пустую цепочку $, либо начинается с терминального символа,

 если два правила имеют одинаковые левые части, то правые части правил должны начинаться разными символами,

 для каждого нетерминала A, такого что A ==>* $ множество начальных символов не должно пересекаться с множеством символов, следующих за A.:

ПЕРВ(A)  СЛЕД(A) = $

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

Г3. 3 : R = {(1) <I>  a<A> , (2) <I>  b , (3) <A>  c<I>a , (4) <A>  $ }.

Эта грамматика не содержит правил с одинаковой левой частью, начинающихся одинаковыми терминалами, поэтому нужно проверить только условие (3) для правила (4). Вычисляя функции ПЕРВ(<A>) = {c} и СЛЕД(<A>) = СЛЕД(<I>) = {a}, находим, что множество значений функции ПЕРВ(<A>) и множество значений функции СЛЕД(<A>) не имеют общих элементов. Следовательно, грамматика Г3.3является слаборазделенной. Проверка выполнения условия (3) для грамматикиГ3. 4: R = { <I>  a<I><A> | $,<A>  a | b }

дает следующие результаты: ПЕРВ(<I>) = {a} и СЛЕД(<I>) = ПЕРВ(<A>) = {a,b}, которые показывают, что пересечение множеств ПЕРВ(<I>) и СЛЕД(<I>) не пусто. Следовательно грамматика Г3.4не является слаборазделенной.

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

Разделенные и слаборазделенные грамматики представляют собой подклассы грамматик более общего вида, которые называются LL(1) грамматиками, и которые определяются следующим образом.

Определение. КС-грамматика является LL(1) грамматикой тогда и только тогда, когда выполняются следующие два условия: 1 . Для каждого нетерминала, являющегося левой частью нескольких правил: <A>  1 |  2 | ... | n, необходимо, чтобы пересечение функцийПЕРВ(i) и ПЕРВ( j) было пусто для всех i =/= j. 2 . Для каждого аннулирующего нетерминала<A>,такого что<A> ==>* $,необходимо, чтобы пересечение множеств ПЕРВ(<A>) и СЛЕД(<A>) было пустым.

Из определения следует, что грамматики LL(1), в отличие от разделенных грамматик и слаборазделенных, могут содержать правила, начинающиеся нетерминальными символами. Проверим относится ли рассмотренная ранее грамматика Г43к классу LL(1). Для этого необходимо вначале проверить наличие одинаковых значений функций ПЕРВ для правил с одинаковой левой частью. Для правил (1) и (2) имеем

ПЕРВ(<B><C>a) = ПЕРВ(<B>) ПЕРВ(<C>) = {a,b,d,c}, ПЕРВ(g<D><B>) = {g}, а для правил (5) и (6) имеем ПЕРВ(<D>a<B>) = ПЕРВ(<D>)ПЕРВ(a<B>) = {a,d}, ПЕРВ(ca) = {c}.

Полученные результаты показывают, что первое условие LL(1) грамматики выполняется. Второе условие необходимо проверить для правил (3) и (7) рассматриваемой грамматики. Вычисляя функции ПЕРВ и СЛЕД для правила (8), имеем:

ПЕРВ(<B>) = {b} и СЛЕД(<B>) = {a,c,d,g,f}.

Эти функции не имеют одинаковых значений, следовательно грамматика Г43является грамматикой LL(1). Рассматриваемый класс грамматик можно определить также с помощью множеств выбора следующим образом:

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

12. Магазинные автоматы.

КС-грамматика определяет структуру цепочек и позволяет строить цепочки определенного языка. Магазинные автоматы, подобно рассмотренным ранее конечным автоматам, позволяют решать для контекстно-свободных языков задачу распознавания, которая заключается в том, что по заданной цепочке необходимо определить принадлежит ли она заданному языку. В работах, связанных с формальными языками и грамматиками,используется модель магазинного автомата, состоящая из входной ленты,устройствауправленияи вспомогательной ленты, называемоймагазиномилистеком.Входная лентаразделяется на клетки (позиции) , в каждой из которых может быть записан символ входного алфавита. При этом предполагается, что в неиспользуемых клетках входной ленты расположены пустые символы. Вспомогательная лента также разделена на клетки, в которых могут располагаться символы магазинного алфавита. Начало вспомогательной ленты называетсядноммагазина. Связь устройства управления с лентами осуществляется двумяголовками, которые могут перемещаться вдоль лент.

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

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

семи объектов: M={P , S , sо , f , F , H , hо },

гдеP - входной алфавит,S - алфавит состояний, sо- начальное состояние,sо  S ,F- множество конечных состояний ,F является подмножеством S,H- алфавит магазинных символов, записываемых на вспомогательную ленту,hо- маркер дна, он всегда записывается на дно магазина , hо  H,f - функция переходов f : {P {}} x S x HS x H* , если М-автомат - детерминированный, иf:{P {}} x S x HM(S x H*) , если М-автомат - недетерминированный. Функцияfотображает тройки ( pi , sj , hk ) в пары ( sr ,) , гдеH* и hk- символ в вершине магазина, для детерминированного автомата или в множество пар для недетерминированного автомата. Эта функция описывает изменение состояния магазинного автомата, происходящее при чтении символа с входной ленты и премещении входной головки. В дальнейшем при построении магазинных автоматов потребуются две разновидности функций переходов, изменяющих состояние автомата без перемещения входной головки:

1) функция переходов с пустым символом в качестве входного символа: f0( s, h) = ( s', ), которая, независимо от того какой символ находится под читаюшей гловкой входной ленты, предписывает прочитать символ h из вершины магазина, изменить состояние автомата на s' и записать цепочку в магазин. 2)функция переходов с определенным входным символом:f*( s, ah) = ( s', ), которая предписывает изменение состояния и запись цепочки в магазин при условии, что символaчитается входной головкой, а в вершине магазина находится символh.

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