formal_language_theory / lectures / unit_11
.pdfПример не сильной LL(2)-грамматики
Но поскольку, очевидно, что
FOLLOW |
G |
(S ) { }, |
|
||
2 |
|
то, учитывая существование выводов
S aAaa и S bAba,
заключаем, что
FOLLOW |
G |
( A) {aa, ba}. |
|
||
2 |
|
Проверка условия сильной LL(2)-грам- матики показывает, что
51
Пример не сильной LL(2)-грамматики
для S:
FIRST |
G |
|
|
2 |
(aAaa{ })
FIRST |
G |
|
|
2 |
(bAba{ }) =
{aa, ab} {bb} = ,
а для A: |
|
( {aa, ba}) = |
2 (b{aa, ba}) |
2 |
|
FIRSTG |
FIRSTG |
|
= {ba, bb} {aa, ba} = {ba} .
Таким образом, грамматика G — LL(2), но не сильная LL(2)-грамматика.
Ret 120
52
Теорема 2.3. Если G = (VN, VT, P, S) — cfg,
и G — леворекурсивна, то G — не LL(k)- грамматика ни при каком k.
Доказательство будем проводить в предположении приведённости грамматики G, поскольку, как отмечалось ранее, бесполезные нетерминалы не влияют на выполнение LL(k)-критерия.
Ret 165 Ret 167
53
Леворекурсивная грамматика — не LL(k) при любом k
Так как грамматика G леворекурсивна, |
|||||||||||
|
|
|
|
|
|
|
|
|
|
||
то существует вывод вида A |
|
A , где , |
|||||||||
G |
|||||||||||
|
|
|
|
|
|
|
|
|
|||
хотя и не исключается, |
что |
|
|
|
|
. |
|||||
|
|||||||||||
|
|
|
|
|
A |
G |
|
|
|||
Напомним, что |
A |
|
означает, что |
||||||||
G |
|
||||||||||
|
|
|
|
|
|
A . |
|||||
существует вывод вида A |
|
|
|
|
* |
||||||
|
G |
|
G |
||||||||
|
|
|
|
|
|
|
|
||||
Отметим, что независимо от того, = A |
|||||||||||
или |
A , должно существовать ещё |
||||||||||
какое-то |
правило |
для |
A, |
|
скажем, A |
( ), ибо в противном случае ничего,
|
|
i |
|
кроме A |
* |
A , |
где i 0, вывести из |
G |
нетерминала A было бы невозможно, что противоречило бы приведённости G.
54
Леворекурсивная грамматика — не LL(k) при любом k
Итак, вывод вида A состоит из шагов вида
G
A в общем случае
A |
|
A1 1 |
|
A2 2 1 |
|
G |
G |
G |
|||
|
|
Am m ... 1 = A , |
|||
|
G |
где Am = A, = m m – 1
Очевидно, что в
... |
|
|
G |
||
|
... 1.
этом
Am – 1 m – 1
выводе
... 1 |
|
|
G |
были
использованы правила
A A1 1, A1 A2 2,…, Am – 1 Am m,
где Am = A.
55
Леворекурсивная грамматика — не LL(k) при любом k
Хотя бы одно из этих правил должно иметь альтернативу, не начинающуюся ни на один из нетерминалов A1, A2, … , Am (иначе грамматика G была бы неприведённой).
Пусть, например, существует
Aj Aj+ 1 j+ 1 | , где Aj+ 1 j+ 1.
56
Леворекурсивная грамматика — не LL(k) при любом k
Так как грамматика G — приведённая, существует сентенциальная форма, в частности, левостороннего вывода, в которой участвует нетерминал A, например
в выводе S |
* |
который может быть |
|||
wA , |
|||||
|
|
|
lm |
|
|
продолжен следующим образом: |
|
||||
S wA |
wA i |
wA1 1 i … |
|||
* |
|
|
* |
|
* |
|
|
|
|
|
|
lm |
* |
|
lm |
G |
lm |
|
|
|
|
||
… |
|
|
|
|
|
wAj j … 1 i . |
|
||||
Далее |
lm |
этот вывод можно продолжить |
|||
|
двумя способами:
57
Леворекурсивная грамматика — не LL(k) при любом k
1) |
wAj+ 1 j+ 1 j… 1 i |
wAm m… 1 i = |
|
||||
|
|
|
|
* |
|
|
|
|
G |
|
|
lm |
|
|
|
= wA |
* |
wAj j… 1 |
|
|
|
||
|
|
w j… 1 |
|
||||
|
i+ 1 |
|
|
i+ 1 |
|
i + 1 |
|
|
|
lm |
|
|
G |
|
|
|
|
|
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
wzx …x r i + 1t, |
|
|
|
||
|
|
lm |
j 1 |
|
|
|
|
|
|
x |
|
|
|
|
|
|
|
|
|
|
|
|
|
2) |
|
|
* |
|
|
|
|
w j… 1 i wzxj… x1r it, |
|
|
|||||
|
G |
|
lm |
|
|
|
|
y
предполагая, что ввиду приведённости
грамматики, |
существуют выводы |
|
|||||
z, |
x , … , x , r, t, |
||||||
* |
|
* |
|
* |
|
* |
* |
lm |
j |
lm |
j |
1 lm |
1 |
lm |
lm |
где w, z, x , …, x |
, r, t V *. |
|
|
||||
|
|
j |
1 |
|
T |
|
|
58
Леворекурсивная грамматика — не LL(k) при любом k
Эти два вывода можно сопоставить с теми, которые фигурируют в определении 2.3 LL(k)-грамматик, учитывая, что
x = zxj…x1ri+ 1t, а y = zxj…x1rit.
Если r , то каким бы большим ни было k, всегда путем выбора i можно добиться,
чтобы
FIRSTGk (x) FIRSTGk ( y
при том, что в точке, где эти два вывода разошлись, были применены различные альтернативы для раскрытия нетерминала Aj:
Aj Aj+ 1 j+ 1 | , Aj+ 1 j+ 1.
59
Леворекурсивная грамматика — не LL(k) при любом k
Если r = , то имеем два разных левосторонних вывода одной и той же терминальной цепочки wzxj … x1t. То и другое означает, что грамматика G — не LL(k) ни при каком k.
Следствие 2.3. Итак, мы имеем два достаточных признака для того, чтобы считать КС-грамматику не LL-грамматикой.
Это — неоднозначность и леворекурсивность.
60