Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_рекоменд-ТП-4.doc
Скачиваний:
3
Добавлен:
12.11.2019
Размер:
2.49 Mб
Скачать

2.2. Завдання для самостійної та контрольної роботи

Побудувати граматику G, яка породжує задану мову L, та довести L(G) = L для L:

  1. anbm, n>=m

  2. a*|b*| c*

  3. (a|b|c)*

  4. (a|b)*c

  5. a*ba*b

  6. a*b|b*a

  7. anbncn

  8. anbcm, m>n

  9. anb2n

  10. a*|ba*b

  11. anbn+2

  12. a*b*c*

  13. anbmcn

  14. a|b*c| cb*

  15. a*b|a|b

  16. (a|b)*a*

  17. (abc)*

  18. (ab)*|ab

  19. a*(a|b)*b*

  20. (ab)*|(a|b)*

2.3. Нормальні форми Хомського та Грейбах

Теорія: …

+ алгоритм: як позбутися ε-правил (ε-переходів) !!! + який сенс застосування (отримаємо нескорочуючі правила, ефективний синтаксичний аналіз)

Означення: Нетермінал КС-граматики називається -нетерміналом, якщо .

Алгоритм. Пошук -нетерміналів:

….

…. Пn

Тоді множина — множина -нетерміналів.

+ алгоритм: як позбутися лівої рекурсії + сенс застосування (ефективний синтаксичний аналіз – LL(k), тоді можлива однозначна (без повернень) побудова зліва-направо = лівостороння стратегія виводу)

Запропонуємо декілька прийомів, що дають можливість при побудові граматик уникнути лівої рекурсії. Розглянемо граматику зі схемою правил , яка має ліворекурсивний нетермінал . Замінимо схему правил новою схемою з трьома правилами

.

Теорія про НФ Хомського та Грейбах:

  • визначення,

  • можливо, алгоритм зведення,

    • для Хомського:

      • виключити непродуктивні і недосяжні нетермінали

      • позбутися ε-продукцій (стандартним алгоритмом підстановки та виключення), та ввести нову аксіому, якщо ε виводиться в граматиці

      • для всіх терміналів ввести допоміжні нетермінали, відповідні правила (A  a, B  b) та виконати заміни

      • всі продукції з «довшими» за 2 символи правими частинами розбиваємо на декілька (довжина – 1), вводячи допоміжні нетермінали

      • якщо в правій частині продукції залишився 1 нетермінал, виконати його «каскадні»/«ланцюжкові» заміни

    • для Грейбах:

      • виключити непродуктивні і недосяжні нетермінали

      • позбутися ε-правил (стандартним алгоритмом підстановки та виключення), та ввести нову аксіому, якщо ε виводиться в граматиці

      • позбутись лівої рекурсії

      • підставити замість нетерміналів на 1 місці в правих частинах їх праві частини згідно правил граматики

  • застосування (навіщо вони потрібні?) …

Завдання 2.7.

Звести наступну КВ-граматику до нормальної форми Хомського:

S  bS | pCD

C  aaD | CCD

D  ε

Розв’язок.

  1. Нетермінал S присутній в правих частинах продукцій, тому додаємо продукцію S0S, S0 – нова аксіома

  2. Термінал b замінюємо на B, a замінюємо на А, p – на P, тобто вводимо нові нетермінали і замінюємо входження терміналів у правила на нові, щойно введені, нетермінали.

S  BS | PCD

C  AAD | CCD

D  ε

Додаємо продукції A  a, B  b, P  p

  1. Всі продукції з правими частинами, довжина яких (l) більша за 2, «розкладаємо» на (l–1) продукції так, щоб у правих частинах було тільки по 2 нетермінальних символи, при цьому вводимо нові допоміжні нетермінали. Так, Q AA, W  PC, E  CC – нові правила, тоді:

вводимо також правила S  WD, C  QD, C  ED

виключаємо правила S  PCD, C  AAD , C  CCD

{Q, W, E}  N – нові нетермінали

Отримали:

S  BS | WD

C  QD | ED

Q  AA

W  PC

E  CC

D  ε

A  a, B  b, P  p

  1. У нас є продукція D  ε, тому позбуваємось -нетерміналу стандартним способом (виключення з правих частин), отримуючи:

виключається правило D  ε,

додаються: S  W, C  Q, C  E

  1. Маємо продукції з одним нетерміналом у правій частині: S  W, C  Q, C  E, тому проводимо відповідну «каскадну підстановку»:

S  W, W  PC,

C  Q, Q  AA,

C  E, E  CC, отже, отримуємо нові правила: S  PC, C  AA, C  CC, а старі S  W, C  Q, C  E – виключаються.

  1. Оскільки в правилі S0  S права частина теж закоротка, підставимо для S0 всі альтернативи для S. В результаті отримаємо граматику у нормальній формі Хомського, еквівалентну початковій:

S0  BS | WD | PC

S  BS | WD | PC

C  QD | ED | AA | CC

Q  AA

W  PC

E  CC

A  a, B  b, P  p

Завдання 2.8.

Звести наступну КВ-граматику до нормальної форми Хомського:

S  bC | aD

C  bCC | aS | a

D  aDD | bS | b

P  aD

Розв’язок.

  1. Відкинемо недосяжні і непродуктивні нетермінали.

Ітераційно побудуємо множини досяжних:

R0 = {S}

R1 = {C,D,S}

R2 = {C,D,S} = R1 = R

та продуктивних нетерміналів:

P0={C,D}

P1={C,D,S,P}

P2={C,D,S,P} = P1=P

Тоді недосяжні нетермінали: N\R = {P}, а непродуктивних – немає: N\P = 

Тому правило P  aD слід виключити з граматики і подальшого розгляду.

  1. Нетермінал S присутній в правих частинах продукцій тому додаємо продукцію S0  S, S0 – нова аксіома граматики

  2. Вводимо нові допоміжні нетермінали A та B, і в правилах b замінюємо на B, a замінюємо на А – отримуємо:

S  BC | AD

C  ACC | AS | A

D  ADD | BS | B

Додаємо також продукції A  a, B  b

  1. Вводимо допоміжні нетермінали для правил з довшими за 2 елементи правими частинами, а також відповідні правила для них: Q  AC, W  AD, C  QC, D  WD, виключаючи при цьому C  ACC і D  ADD ({Q, W}  N)

  2. Маємо продукції C  A, A  a, D  B, B  b, тому вводимо продукції C  a, D  b, натомість виключаємо C  A, D  B.

  3. Отримуємо еквівалентну граматику у нормальній формі Хомського, підставивши у правило S0  S всі альтернативи для S:

S0  BC | AD

S  BC | AD

C  QC | AS | a

D  WD | BS | b

Q  AC

W  AD

A  a, B  b

Завдання 2.9.

Звести наступну КВ-граматику до нормальної форми Хомського:

S  aKd

K  aKd | P | ε

P  bPc | F | ε

Розв’язок.

  1. Відкинемо недосяжні і непродуктивні нетермінали. F-непродуктивний.

  2. Позбудемось ε–правил.

Замість K  ε додаємо: K  ad, S  ad; замість P  ε – додаємо P  bc.

Отримаємо:

S  aKd | ad

K  aKd | ad | P

P  bPc | bc

  1. Замість правила K  P (із закороткою правою частиною), враховуючи P  bPc | bc, додамо нові правила: K  bPc | bc

  2. Вводимо допоміжні нетермінали та правила: A  a, B  b,D  d,C  c, отримуємо відповідно:

A  a, B  b,D  d,C  c

S  AKD | AD

K  AKD | AD | BC | BPC

P  BPC | BC

  1. Врешті, розбивши «довгі» праві частини правил шлязом введення допоміжних нетерміналів, отримаємо результуючу граматику у нормальній формі Хомського:

S  XD | AD

K  XD | AD | BC | YC

P  YC | BC

A  a, B  b,D  d,C  c

X  AK, Y  BP

Завдання 2.10.

Звести наступну КВ-граматику до нормальної форми Хомського:

S  aUbU | CCb | 

U  S | C | ba

Розв’язок.

  1. Відкинемо недосяжні і непродуктивні нетермінали: C-непродуктивний.

  2. Введемо нову аксіому S0, оскільки символ S присутній в правих частинах правил, при цьому позбудемось ε–правила S   (S і U є ε–нетерміналами). Отримаємо:

S0   | S

S  aUbU | ab | abU | aUb

U  S | ba

  1. Додамо допоміжні нетермінали і правила: Ta  a, Tb  b, отримаємо:

S0   | S

S  TaUTbU | TaTb | TaUTb | TaTbU

U  S | TbTa

Ta  a, Tb  b

  1. Для довгих правих частин введемо допоміжні нетермінали, щоб розбити їх на частини:

S0   | S

S  AB | TaTb | ATb | TaB

A  TaU

B  TbU

U  S | TbTa

Ta  a, Tb  b

  1. Закороткі правила U  S та S0  S заміняємо всіма можливими замінами S:

S0  | AB| TaTb | ATb | TaB

S  AB | TaTb | ATb | TaB

A  TaU

B  TbU

U  AB | TaTb | ATb | TaB | TbTa

Ta  a, Tb  b

Таким чином отримаємо результуючу еквівалентну граматику у нормальній формі Хомського.

Завдання 2.11.

Звести наступну КВ-граматику до нормальної форми Хомського:

S  aD | D

U  bb | Cb

D   | Db | Ua

L  UD

Розв’язок.

  1. Оскільки C – непродуктивний, а L – недосяжний нетермінали, вхідна граматика еквівалентна наступній:

S  aD | D

U  bb

D   | Db | Ua

  1. Оскільки граматика породжує, зокрема, порожнє слово, необхідно ввести нову аксіому S0 та правило S0  S | .

  2. Введемо допоміжні нетермінали і правила: A  a, B  b, отримаємо:

S0  S | ԑ

S  AD | D

U  BB

D  ԑ | DB | UA

A  a, B  b

  1. Позбавляємось -правила D  ԑ :

S0  S | ԑ

S  AD | D | A

U  BB

D  DB | UA | B

A  a, B  b

  1. Нарешті, для односимвольних правих частин робимо заміни: для S  A і D  B виконуємо заміни на відповідно термінали, а для S  D – підставляємо всі альтернативи для нетермінала D:

S0  ԑ | AD | DB | UA | b | a

S  AD | DB | UA | b | a

U  BB

D  DB | UA | b

A  a, B  b

Отримаємо результуючу еквівалентну граматику у нормальній формі Хомського.

Завдання 2.12.

Звести наступну КВ-граматику до нормальної форми Грейбах:

S  AB

A  ε | aC

B  Bb | ε

C  Cc | ε

Розв’язок.

  1. Легко перевірити, що всі нетермінали суттєві, тобто досяжні й продуктивні: R0 = {S}, R1 = {S, A, B}, R2 = {S, A, B, C} = N; P0 = {A, B, C} P1 = {S, A, B, C} = N.

  2. Позбудемось ε-переходів (ε-правил), для цього додамо правила, отримані шляхом підстановок ε-нетерміналів:

S  B, S  A, S  ε, B  b, C  c, A  a

та вилучимо ε-правила:

A  ε, B  ε, C  ε

Отримаємо еквівалентну граматику:

S  AB | A | B | ε

A  aC | a

B  Bb | b

C  Cc | c

  1. Позбудемось лівої рекурсії. Для цього правило

C  Cc | c

замінемо сукупністю еквівалентних правил (ввівши новий нетермінал D):

C  cD, D  cD, D  ε

Позбудемось отриманого ε-правила D  ε:

додамо правила C  c, D  c

і одержимо: C  cD | c, D  cD | c

Аналогічно для B  Bb | b :

B  bF | b, F  bF | b

В решті отримаємо:

S  AB | A | B | ε

A  aC | a

B  bF | b, F  bF | b

C  cD | c, D  cD | c

  1. Для всіх правил, де у правій частині перший символ – нетермінал, робимо всі можливі для нього підстановки, а саме:

S  a, S  aC для S  A

S  b, S  bF для S  B

S  aB, S  aCB для S  AB

вилучаючи при цьому самі такі правила, тобто:

S  A, S  B, S  AB

Отримаємо еквівалентну даній граматику у нормальній формі Грейбах:

S  aB | aCB | a | aC | b | bF | ε

A  aC | a

B  bF | b, F  bF | b

C  cD | c, D  cD | c

Завдання 2.13.

Звести наступну КВ-граматику до нормальної форми Грейбах:

S  aAC | BA

B  Pk | ε

A  a | aA

C  c | cC

Розв’язок.

  1. Знайдемо продуктивні нетермінали:

P0 = {A, B, C}

P1 = {S, A, B, C}

P2 = {S, A, B, C} = P1 = P

Отже, CP = {P} – непродуктивний нетермінал, тому виключаємо з граматики правило B  Pk

  1. Позбудемось ε-правила B  ε, для цього додамо правило S  A.

При цьому виключаємо продукції B  ε та S  BA, оскільки більше не залишається продукцій з нетерміналом B у лівій частині.

Отримаємо:

S  aAC | A

A  a | aA

C  c | cC

  1. У правилі S  A заміняємо перший у правій частині нетермінал на всі можливі для нього альтернативи, тобто додаємо правила S  a, S  aA

В решті отримаємо еквівалентну граматику у нормальній формі Грейбах:

S  aAC | a | aA

A  a | aA

C  c | cC

Завдання 2.14.

Звести наступну КВ-граматику до нормальної форми Грейбах:

S  AS | ε

A  aS | P | b

P  Pc | b

Розв’язок.

  1. Всі нетермінали граматики – суттєві, тобто досяжні і продуктивні.

  2. Оскільки слово ε виводиться в граматиці, вводимо окрему нову аксіому, для якої будуть лише два правила, щоб відділити вивід слова ε від усіх інших можливих виводів у граматиці: S0  ε та S0  S. Також позбудемось ε-переходу S  ε шляхом підстановки у інші правила, де S є у правих частинах, отримаємо:

S0  ε | S

S  AS | A

A  aS | P | b | a

P  Pc | b

  1. Позбудемось лівої рекурсії для нетермінала P, замінивши правила

P  Pc | b

сукупністю правил

P  bP1, P1  cP1, P1  ε

Далі позбудемось отриманого ε-правила P1  ε, для цього виконаємо можливі підстановки P1 і одержимо нові правила: P  b та P1  c замість P1  ε, тобто в решті решт одержимо такі нові правила:

P  bP1 | b

P1  cP1 | c

Отримаємо:

S0  ε | S

S  AS | A

A  aS | P | b | a

P  bP1 | b

P1  cP1 | c

  1. Підставляємо замість нетермінала P на першому місці правих частин правил слова, що безпосередньо вивдяться з P:

S0  ε | S

S  AS | A

A  aS | bP1 | b | a

P  bP1 | b

P1  cP1 | c

аналогічно – для нетермінала A:

S0  ε | S

S  aSS | bP1S | bS | aS | bP1 | b | a

A  aS | bP1 | b | a

P  bP1 | b

P1  cP1 | c

Оскільки нетермінали A та P стали в результаті перетворень недосяжними, виключимо їх з правил граматики – отримаємо граматику, еквівалентну початковій, у нормальній формі Грейбах:

S0  ε | aSS | bP1S | bS | aS | bP1 | b | a

S  aSS | bP1S | bS | aS | bP1 | b | a

P1  cP1 | c

Завдання 2.15.

Звести наступну КВ-граматику до нормальної форми Грейбах:

S  A | bD

D  Ԑ | aa | CD

A  u | ε | C

K  Bf

Розв’язок.

  1. Знайдемо недосяжні і непродуктивні нетермінали.

R0 = {S}

R1 = {S, A, D}

R2 = {S, A, D, C}

R3 = {S, A, D, C} = R2 = R

Отже, недосяжні нетермінали N\R = {K}, тобто нетермінал K виключаэмо з правил граматики. Щодо продуктивних нетерміналів:

P0 = {D, A}

P1 = {S, D, A}

P2 = {S, D, A} = P1 = P

Отже, непродуктивні нетермінали – N\P = {C} , тому виключаємо нетермінал C з граматикики також, залишиться:

S  A | bD

D  ε | aa

A  u | ε

  1. Оскільки нетермінал A – на першій позиції в правій частині правила S  A, замінимо його можливими підстановками: A  u | ε, отримаємо:

S  u | ԑ | bD

D  ε | aa

A  u | ε

Тепер нетермінал A став недосяжним, отже, виключаємо його з граматики і отрумуємо:

S  u | ԑ | bD

D  ε | aa

  1. Позбудемось ε-продукцій, замінивши входження ε-нетерміналів (S та D) у всіх правилах, а також ввівши нову аксіому S0 (для збереження можливості породження слова ε):

S0  S | ԑ

S  u | bD | b

D  aa

Отже, отримаємо еквівалентну початуовій граматику у нормальній формі Грейбах:

S0  ԑ | u | bD | b

S  u | bD | b

D  aa

Завдання 2.16.

Звести наступну КВ-граматику до нормальної форми Грейбах:

S  c | aABU | cC

A  Aa | bU | ԑ

B  aa | Cc

U  bA | BB | ԑ

M  AB

Розв’язок.

  1. Легко визначити, що C – непродуктивний, М – недосяжний нетермінали, тому виключимо їх з правил граматики:

S  c | aABU

A  Aa | bU | ԑ

B  aa

U  bA | BB | ԑ

  1. Виключимо ԑ-переходи (A  ԑ та U  ԑ) з граматики, отримаємо:

S  c | aABU | aBU | aAB | aB

A  Aa | bU | b | a

B  aa

U  bA | BB | b

  1. Позбавимось лівої рекурсії для нетермінала A:

S  c | aABU | aBU | aAB | aB

A  bUW | bW | aW

W  aW | ԑ

B  aa

U  bA | BB | b

  1. Залишилось позбутись ԑ-переходу W  ԑ та першого входження нетерміналу B у правилі U  BB (шляхом підстановки можливих виведень згідно продукцій граматики):

S  c | aABU | aBU | aAB | aB

A  bUW | bW | aW | bU | b | a

W  aW | a

B  aa

U  bA | aaB | b

і ми отримали граматику у нормальній формі Грейбах, яка еквівалентна початковій.