Шаг 4. Для " AÎVN и для всех нетерминальных символов BÎ(FOLLOW¢i(1,A) ÇVN), для которых существует правило $(B ® l)ÎR: FOLLOW¢¢i(1,A) = FOLLOW¢i(1,A) È FOLLOW¢i(1,B).
Шаг 5. Для " AÎVN и " BÎVN, если $(B ® aA)ÎR, aÎ(VTÈVN)*: FOLLOWi+1(1,A) = FOLLOW¢¢i(1,A) È FOLLOW¢¢i(1,B).
Шаг 6. Если $ AÎVN: FOLLOWi+1(1,A) ¹ FOLLOWi(1,A) (т.е. на последнем шаге были изменения во множестве FOLLOWi(1,A)), то i:=i+1 и вернуться на шаг 3, иначе перейти на следующий шаг.
Шаг 7. Для " AÎVN: FOLLOW(1,A) = FOLLOWi(1,A)\VN – исключаем из построенных множеств все нетерминальные символы.
Пример. Рассмотрим нелеворекурсивную грамматику для построения арифметических выражений: G ({+,–,/,*,a,b,(,)}, {S,R,T,F,E}, P, S), где P:
S ® T½TR
R ® +T½–T½+TR½–TR
T ® E½EF
F ® *E½/E½*EF½/EF
E ® (S)½a½b
Очевидно, что эта грамматика не является LL(1)-грамматикой – например, для символов R и F имеется по два правила, начинающихся с одного и того же терминального символа. Но можно получить из данной грамматики эквивалентную ей LL(1)-грамматику. Если преобразовать её к грамматике G¢, добавив пустые правила, то получим P¢:
S ® TR (1)
R ® +TR (2)½–TR (3)½l (4)
T ® EF (5)
F ® *EF (6)½/EF (7)½l (8)
E ® (S) (9)½a (10)½b (11)
Полученная грамматика является LL(1)-грамматикой. Проверим это, построив для неё множества FIRST и FOLLOW. При этом для построения множества FIRST нужна грамматика без пустых правил, поэтому будем брать за основу правила P грамматики G, а для множества FOLLOW – правила P¢ грамматики G¢.
Множество FIRST («1» не будем писать для краткости):
Сначала i:=0; |
i:=1: |
i:=2: |
FIRST0(S) = {T} |
FIRST1(S) = {T,E} |
FIRST2(S) = {T,E, (,a,b} |
FIRST0(R) = {+,–} |
FIRST1(R) = {+,–} |
FIRST2(R) = {+,–} |
FIRST0(T) = {E} |
FIRST1(T) = {E, (,a,b} |
FIRST2(T) = {E, (,a,b} |
FIRST0(F) = {*, /} |
FIRST1(F) = {*, /} |
FIRST2(F) = {*, /} |
FIRST0(E) = {(, a, b} |
FIRST1(E) = {(,a,b} |
FIRST2(E) = {(,a,b} |
Поскольку на последнем шаге новых нетерминалов ни в одно множество не добавилось, последующие изменения невозможны. Формально мы должны выполнить ещё одну итерацию, получив в итоге FIRST3(F) = FIRST2(F). После удаления из построенных множеств нетерминальных символов получим:
FIRST(S) = { (, a, b }; FIRST(R) = {+, – };
FIRST(T) = { (, a, b }; FIRST(F) = {*, / };
FIRST(E) = { (, a, b }
Теперь построим множество FOLLOW (используем правила P¢):
Сначала i:=0; шаг 1 |
Шаг 2 |
Шаг 3 |
FOLLOW0(S) = {)} |
FOLLOW0(S) = {),l} |
FOLLOW¢0(S) = {),l} |
FOLLOW0(R) = {Æ} |
FOLLOW0(R) = {Æ} |
FOLLOW¢0(R) = {Æ} |
FOLLOW0(T) = {R} |
FOLLOW0(T) = {R} |
FOLLOW¢0(T) = {R,+,–} |
FOLLOW0(F) = {Æ} |
FOLLOW0(F) = {Æ} |
FOLLOW¢0(F) = {Æ} |
FOLLOW0(E) = {F} |
FOLLOW0(E) = {F} |
FOLLOW¢0(E) = {F,*,/} |
Шаг 4. В построенных множествах содержатся только нетерминалы R и F. Хотя для них и существуют пустые правила в P, но в силу того, что множества FOLLOW для R и F пустые, ничего нового не добавится и FOLLOW0¢¢= FOLLOW0¢ для всех нетерминалов.
Шаг 5. Проанализируем правила для " AÎVN на наличие (B ® aA)ÎR |
|
FOLLOW1(S) = {),l} |
Т.к. нет правил вида (B ® aS)– нет добавлений |
FOLLOW1(R) = {),l} |
Т.к. $ (S ® aR)ÎR, добавили FOLLOW¢¢0(S) |
FOLLOW1(T) = {R,+,–} |
Т.к. нет (B ® aT)ÎR – нет добавлений |
FOLLOW1(F) = {R,+,–} |
Т.к. $ (T ® aF)ÎR, добавили FOLLOW¢¢0(T) |
FOLLOW1(E) = {F,*,/ } |
Т.к. нет (B ® aE)ÎR – нет добавлений |
i:=1; Шаг 3. Для " AÎVN " BÎFOLLOW1(A) нужно добавить FIRST(B) |
|
FOLLOW¢1(S) = {),l} |
Нет нетерминалов BÎFOLLOW1(S) |
FOLLOW¢1(R) = {),l} |
Нет нетерминалов BÎFOLLOW1(R) |
FOLLOW¢1(T) = {R,+,–,} |
Нужно добавить FIRST(R) – нет изменений |
FOLLOW¢1(F) = {R,+,–} |
Нужно добавить FIRST(R) – нет изменений |
FOLLOW¢1(E) = {F,*,/ } |
Нужно добавить FIRST(F) – нет изменений |
Шаг 4. Для " AÎVN и " BÎFOLLOW¢1(A) проверим на наличие B ® l |
|
FOLLOW¢¢1(S) = {),l} |
Нет нетерминалов BÎFOLLOW1(S) |
FOLLOW¢¢1(R) = {),l} |
Нет нетерминалов BÎFOLLOW1(R) |
FOLLOW¢¢1(T) = {R,+,–, ), l} |
$ (R ® l)ÎR Þ добавили FOLLOW¢1(R) |
FOLLOW¢¢1(F) = {R,+,–, ), l} |
$ (R ® l)ÎR Þ добавили FOLLOW¢1(R) |
FOLLOW¢¢1(E) = {F,*,/, R,+,–} |
$ (F ® l)ÎR Þ добавили FOLLOW¢1(F) |
Шаг 5. Проанализируем правила для " AÎVN на наличие (B ® aA)ÎR |
|
FOLLOW2(S) = {),l} |
нет (B ® aS)ÎR |
FOLLOW2(R) = {),l} |
$ (S ® aR)ÎR Þ FOLLOW¢¢1(S) было |
FOLLOW2(T) = {R,+,–, ), l} |
нет (B ® aT)ÎR |
FOLLOW2(F) = {R,+,–, ), l} |
$ (T ® aF)ÎR, но нет изменений |
FOLLOW2(E) = {F,*,/, R,+,–} |
Т.к. нет (B ® aE)ÎR – нет добавлений |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.