Формальные языки, грамматики и автоматы / Part342
.htmpart342 Пред.Страница След.Страница Раздел Содержание
3.4.2 Построение функции ПЕРВ(µ)
Значение функции ПЕРВ(m) можно определить пользуясь следующими правилами:
1) Если цепочка µ начинается терминальным символом и имеет вид bµ', то функция
ПЕРВ(µ) = {b},
2) Если цепочка µ является пустой цепочкой, µ = $, то функция
ПЕРВ(µ) = $,
3) Если цепочка µ начинается нетерминальным символом <B> и имеет вид <B>µ', а в схеме грамматики имеется n правил, в любой части которых находится символ <B>:
<B> ® a1 | a2 | ... | an , и, если не существует вывода <B> ==>* $, то функция ПЕРВ(<B>µ') представляет собой объединение множеств:
ПЕРВ(<B>µ') = ПЕРВ(a1) И ПЕРВ (a2) И...ИПЕРВ(an), 4) Если цепочка µ начинается нетерминальным символом и имеет вид <B>µ', в схему грамматики входят n правил вида
<B> ® a1 | a2 | ... | an , и <B> является аннулирующим нетерминалом, т.е. существует <B> ==> *$, то функция ПЕРВ(<B>µ')=ПЕРВ(µ') И ПЕРВ(a 1)И ПЕРВ(a 2) И...И ПЕРВ(a 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}.
Пред.Страница След.Страница Раздел Содержание