
- •2.2 Определение непроизводящих символов.
- •2.5 Исключение леворекурсивных правил.
- •3.4.2 Построение функции перв(µ)
- •Построение Магазинного автомата по кс-грамматике.
- •Построение нисходящих магазинных распознавателей.
- •Описание перевода. Су-схемы.
- •Описание перевода. Т-грамматики.
- •17.Соответствие между т-грамматики и су-схемы.
- •Определение магазинного нисходящего преобразователя и его работа.
- •Построение нисходящего преобразователя.
- •20.Атрибутные грамматики. Типы атрибутов. Правила вычисления атрибутов.
- •Грамматики простого присваивания. Построение формы простого присваивания.
- •Правила работы нисходящего атрибутного преобразователя.
- •Построение нисходящего атрибутного преобразователя.
- •Программная реализация нисходящего атрибутного преобразователя.
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 HS x H* , если М-автомат - детерминированный, иf:{P {}} x S x HM(S x H*) , если М-автомат - недетерминированный. Функцияfотображает тройки ( pi , sj , hk ) в пары ( sr ,) , гдеH* и hk- символ в вершине магазина, для детерминированного автомата или в множество пар для недетерминированного автомата. Эта функция описывает изменение состояния магазинного автомата, происходящее при чтении символа с входной ленты и премещении входной головки. В дальнейшем при построении магазинных автоматов потребуются две разновидности функций переходов, изменяющих состояние автомата без перемещения входной головки:
1) функция переходов с пустым символом в качестве входного символа: f0( s, h) = ( s', ), которая, независимо от того какой символ находится под читаюшей гловкой входной ленты, предписывает прочитать символ h из вершины магазина, изменить состояние автомата на s' и записать цепочку в магазин. 2)функция переходов с определенным входным символом:f*( s, ah) = ( s', ), которая предписывает изменение состояния и запись цепочки в магазин при условии, что символaчитается входной головкой, а в вершине магазина находится символh.