formal_language_theory / lectures / unit_11
.pdfТестирование LL(k)-грамматик
Для описания алгоритма, разрешающего этот вопрос, введем вспомогательную функцию .
Определение 2.12. Пусть G = (VN, VT, P, S) —
cfg и A VN.
Определим
A) {L V |
*k |
| S wA , w V |
, |
|
|
* |
* |
|
|
T |
lm |
T |
|
|
|
|
|
|
G |
( )}. |
L FIRST |
|
k |
|
Одно L — множество локальных правых контекстов в одном выводе, в котором встречается A. А таких выводов может быть несколько и каждый даёт своё L. Так что σ(A)
есть множество множеств терминальных цепочек не
длиннее k. |
171 |
|
Тестирование LL(k)-грамматик
Алгоритм 2.4: тестирование LL(k)-грамматик.
Вход: G = (VN, VT, P, S) — контекстносвободная грамматика.
Выход: “да”, если G — LL(k)-грамматика;
“нет” — в противном случае.
Метод.
1. Для каждого нетерминала A, для которого существуют две или более альтернативы, вычисляется (A).
172
Тестирование LL(k)-грамматик
2. Пусть A и A P ( ) — два различных A-правила.
Для каждого L (A) вычисляется
f (L) (FIRST |
G |
( ) |
|
L) (FIRST |
G |
( ) |
|
L). |
|
k |
|
k |
|||||
k |
|
k |
|
|
Если f (L) , то алгоритм завершается с результатом “нет”.
Если f (L) = для всех L (A), то шаг 2 повторяется для всех остальных пар A- правил.
173
Тестирование LL(k)-грамматик
3.Повторять шаги 1 и 2 для всех нетерминалов из множества VN.
4.Завершить алгоритм с результатом “да”.
Этот шаг выполняется, если были рассмотрены все нетерминалы и алгоритм не завершился на шаге 2.
Поскольку здесь используется функция
|
G |
( ), |
то |
k |
|||
FIRST |
|
|
вычисления.
необходим алгоритм её
174
§ 2.7. Вычисление функции
FIRST |
G |
( ) |
|
||
k |
|
Алгоритм 2.5: вычисление
FIRST |
G |
( ). |
|
||
k |
|
Вход: G = (VN, VT, P, S) — cfg и
= X1X2 … Xn, Xi V (i =1, 2,…, n; n 0).
Выход:
FIRST |
G |
( ). |
|
||
k |
|
Метод. Согласно лемме 2.1
FIRSTkG ( ) FIRSTkG ( X1 ) k ... k FIRSTkG ( X n ),