Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпорки.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
352.68 Кб
Скачать
  1. Ll(1) - грамматики. Множество выбора.

LL = Left Leftmost означает, что решение принимается по самому левому терминалу

(1) означает, что решение принимается только по одному терминалу.

LL(1)-грамматика:

  1. <S> <A>b<B> {a,e,b,c}

  2. <S> d {d}

  3. <A> <C><A>b {a,e}

  4. <A> <B> {c,b}

  5. <B> c<S>d {c}

  6. <B> ε {d,b, }

  7. <C> a {a}

  8. <C> ed {e}

Продуктивные нетерминалы: <C>, <B>, <S>, <A>

Достижимые нетерминалы: <S>, <A>, <B>, <C>

1. <A>

3 4

<C> <B>

7 8 4,6 4,5

a e b c

ПЕРВ(<A>) = {a,e,b,c}

b получаем таким образом:

  1. пр.4: <A> <B>

  2. пр.6: <B> ε

  3. пр.1: <A> удаляется, остается b

3. ПЕРВ(<A>) = {a,e}

6.

ПЕРВ(ε) = {пустое множество}

СЛЕД(<B>) = {d,b, }

d: <B> c<S>d c<A>b<B>d

b: <S> <A>b<B> <B>b<B>

: на <B> может закончиться

ВЫБОР(пр.6) = ПЕРВ(ε) СЛЕД(<B>)

4. (такая ситуация не рекомендуется)

ПЕРВ(<B>) = {c}

СЛЕД(<A>) = {b}

ВЫБОР(пр.4) = ПЕРВ(<B>) СЛЕД(<A>)

Контекстно-свободная грамматика называется LL(1)-грамматикой тогда и только тогда, когда множества выбора правил с одинаковой левой частью не пересекаются.

Входные символы: {a,b,c,d,e, }

Магазинные символы: <S>, <A>, <B>, <C>, b, d,

a

b

c

d

e

<S>

#1

#1

#1

#2

#1

отвергнуть

<A>

#3

#4

#4

отвергнуть

#3

отвергнуть

<B>

отвергнуть

#6

#5

#6

отвергнуть

#6

<C>

#7

отвергнуть

отвергнуть

отвергнуть

#8

отвергнуть

b

отвергнуть

вытолкнуть, сдвиг

отвергнуть

отвергнуть

отвергнуть

отвергнуть

d

отвергнуть

отвергнуть

отвергнуть

вытолкнуть, сдвиг

отвергнуть

отвергнуть

отвергнуть

отвергнуть

отвергнуть

отвергнуть

отвергнуть

допустить

#1: Заменить(<B>b<A>), Держать

#2: Вытолкнуть, Сдвиг

#3: Заменить(b<A><C>), Держать

#4: Заменить(<B>), Держать

#5: Заменить(d<S>), Сдвиг

#6: Вытолкнуть, Держать

#7: Вытолкнуть, Сдвиг

#8: Заменить(d), Сдвиг

  1. Метод рекурсивного спуска.

Основная идея: каждому нетерминальному символу грамматики соответствует процедура, которая распознает все цепочки, порождаемые этими нетерминалами. Процедуры вызывают друг друга в процессе синтаксического разбора. Если в правой части стоит нетерминал, который стоит в левой части, то процедура разбора может вызывать сама себя.

Пример: <A> <S>b<A> // хорошее правило

<A> <A>b<S> // плохое правило – эффект левой рекурсии, может потенциально привести к зацикливанию

Грамматика:

  1. <S> a<A>{x}<S> {a}

  2. <S> b{z} {b}

  3. <A> c{y}<A><S>{V}b {c}

  4. <A> {w} СЛЕД(<A>)={a,b}

Символы действия, которые обрамляют первое действие в правиле, не будут заноситься в магазин.

Пример: <S> {x}c{y}<A> - здесь {x} и {y} не попадут в магазин

3 нетерминала 3 процедуры:

PM (главная процедура)

P<S>

P<A>

1. Вход=1-ая лексема цепочки

2. Вызов P<S>

3. Если Вход= , то Допустить

иначе «Отвергнуть»

1. Если Вход=a, то вызов P1

2. Если Вход=b, то вызов P2

3. Если Вход=c, то «Отвергнуть»

4. Если Вход= , то «Отвергнуть»

5. P1: Сдвиг, Вызов P<A>, Выполнить(x), Вызов P<S>, Возврат

6. P2: Сдвиг, Выполнить(z), Возврат

1. Если Вход=a, то вызов P4

2. Если Вход=b, то вызов P4

3. Если Вход=c, то вызов P3

4. Если Вход= , то «Отвергнуть»

5. P3: Сдвиг, Выполнить(y), Вызов P<A>, Вызов P<S>, Выполнить(V), Проверить, Если Вход=b, то «Сдвиг» иначе «Отвергнуть», Возврат

6. P4: Выполнить(w), Возврат

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