
spoPresentation2
.pdf
LL(k) - грамматики
F(k,А) – множество цепочек-последователей для нетерминала А длины k, определяемое как F(k,А)={E | E T*, |E|=k, S *ZАEJ, S-
аксиома, А N, Z,J V*, А *O}
Это множество терминальных цепочек, которые следуют в сентенциальных формах непосредственно за нетерминалом А, укороченных до k символов
Множество F(k,А) участвует в объединении для построения множества направляющих цепочек, только если для нетерминала А
существует вывод А *O |
301 |

LL(k) - грамматики
Для LL(1) грамматик :
множество направляющих символов DS(А,D) для правила АoD, А N, D V* DS(А,D) = S(D) F(А)
S(D) – множество символовпредшественников S(D)={b | b T, D V+,
D *bJ, J V*}
F(А) – множество символов-последователей
F(А)={b | b T, S *ZАbJ, S- аксиома, А N, Z,J V*, А *O}
302

LL (k) - грамматики
КС-грамматика называется LL(1)
грамматикой, если множества направляющих символов для правил, определяющих один и тот же нетерминал грамматики, не пересекаются
A N: AoD1 | D2 | … |Dn P, DS(А,Di) DS(А,Dj)= , izj, i,j=1,2,..,n.
303

LL(k) - грамматики
Проверку принадлежности КС-грамматики классу LL(1)-грамматик можно выполнить на основе определения, вычисляя множества направляющих символов, и их пересечения
Имеются признаки, позволяющие установить, что КС-грамматика не является LL(1) грамматикой:
одинаковые головные символы в правых частях правил для одного и того же нетерминала: АoаD | аE…
наличие прямой либо косвенной левой
рекурсии А *AD |
304 |

LL(k) - грамматики
При вычислении множества направляющих символов при наличии в грамматике O-
правил может возникать неопределенность, проявляющаяся как отсутствие символапоследователя
Проблема решается введением вспомогательного символа – маркера конца ввода #
Все строки языка L(G) представляются в виде D#, и строки выводятся не из аксиомы
S, а из строки S#
305

Построение множества символовпредшественников
S(D) = { b | b T, АoD P, D V+, D *bJ, J V*}
Если D = dE, d T, E V*, то S(D) = {d}
Если D = ВE, В N, E V*, то S(D) = S(В)
Алгоритм построения множества S(В):
Дано: КС грамматика G(T,N,P,S)
Получить: множества символовпредшественников S(В)
Дополнительные условия:
Грамматика G не должна содержать O-
правил
306

Построение множества символовпредшественников
1. A N: S0 (A) = { X | AoXDP, X V, DV* }, i=0. Вначале вносятся все первые символы правых частей правил нетерминала А
2. A N: Si+1 (A) = Si (A) Si (B), B Si (A) N
3. Если A N: Si+1 (A) z Si (A), то i++; шаг 2
4. A N: S(A) = Si (A) \ N. В результирующее
множество не включаются нетерминалы
307

Построение множества символовпредшественников
Пример. G ( { +,-,/,*,a,b,(,) }, { S,R,T,F,E }, P, S)
P = { SoTR; RoO | +TR | -TR; ToEF; FoO | *EF | /EF; Eo (S) | a | b }
Удаляем O-правила
G’ ( { +,-,/,*,a,b ,(,) }, { S,R,T,F,E }, P, S )
P = { SoT | TR; Ro+T | -T | +TR | -TR; ToE | EF; Fo*E | /E | *EF | /EF; Eo (S) | a | b }
1. S0 (S) = { T }; |
S0 (R) = { +,- }; S0 (T) = { E }; |
S0 (F) = { *,/ }; |
S0 (E) = { (,a,b }; i=0; |
|
308 |

Построение множества символовпредшественников
2. S1 (S) = S0 (S) S0 (T) = { T,E };
S1 (T) = S0 (T) S0 (E) = { E,(,a,b };
|
S1 (R) = { +,- }; S1 (F) = { *,/ }; S1 (E) = { (,a,b }; |
|
|
2. S2 (S) = S1 |
(S) S1 (T) S1 (E) = { T,E,(,a,b }; |
|
S2 (T) = S1 |
(T) S1 (E) = { E,(,a,b }; |
|
S2 (R) = {+,-}; S2 (F) = {*,/}; S2 (E) = { (,a,b }; |
|
|
2. S3 (S) = S2 |
(S) S2 (T) S2 (E) = { T,E,(,a,b }; |
|
S3 (T) = S2 |
(T) S2 (E) = { E,(,a,b }; |
|
S3 (R) = {+,-}; S3 (F) = { *,/ }; S3 (E) = { (,a,b }; |
|
|
|
309 |

Построение множества символовпредшественников
4. S (S) = { (,a,b }; S (R) = { +,- }; S (T) = { (,a,b }; S (F) = { *,/ }; S (E) = { (,a,b };
Возвращаемся к грамматике
SoTR; S(TR) = S(T) = { (,a,b }
RoO ; S(O)=
Ro+TR; S(+TR) = { + }
Ro-TR; S(-TR) = { - }
ToEF; S(EF) = S (E) = { (,a,b }
FoO; S(O)=
310