Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

spoPresentation2

.pdf
Скачиваний:
6
Добавлен:
11.05.2015
Размер:
4.74 Mб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]