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}.
 
 

Hosted by uCoz