logo

Контекстно-вільна граматика (CFG)

CFG розшифровується як контекстно-вільна граматика. Це формальна граматика, яка використовується для створення всіх можливих шаблонів рядків у даній формальній мові. Безконтекстна граматика G може бути визначена чотирма кортежами як:

 G = (V, T, P, S) 

Де,

Г - це граматика, яка складається з набору правил виробництва. Він використовується для створення рядка мови.

Т є остаточним набором термінального символу. Позначається малими літерами.

IN є остаточним набором нетермінального символу. Позначається великими літерами.

П це набір правил виробництва, який використовується для заміни нетермінальних символів (у лівій частині виробництва) у рядку на інші термінальні або нетермінальні символи (у правій стороні виробництва).

у регулярному виразі Java

С це початковий символ, який використовується для отримання рядка. Ми можемо вивести рядок, багаторазово замінюючи нетермінали правою частиною продукту, доки всі нетермінали не будуть замінені термінальними символами.

приклад 1:

Побудуйте CFG для мови, яка має будь-яку кількість а над набором ∑= {a}.

рішення:

Як ми знаємо, регулярний вираз для наведеної вище мови такий

 r.e. = a* 

Правило створення регулярного виразу таке:

 S → aS rule 1 S → ε rule 2 

Тепер, якщо ми хочемо вивести рядок 'aaaaaa', ми можемо почати з початкових символів.

 S aS aaS rule 1 aaaS rule 1 aaaaS rule 1 aaaaaS rule 1 aaaaaaS rule 1 aaaaaaε rule 2 aaaaaa 

р.е. = a* може генерувати набір рядків {ε, a, aa, aaa,.....}. Ми можемо мати нульовий рядок, оскільки S є початковим символом, а правило 2 дає S → ε.

приклад 2:

Побудуйте CFG для регулярного виразу (0+1)*

рішення:

pothineni ram

CFG може бути надано,

 Production rule (P): S → 0S | 1S S → ε 

Правила складаються з комбінації 0 і 1 із символом старту. Оскільки (0+1)* вказує на {ε, 0, 1, 01, 10, 00, 11, ....}. У цьому наборі ε є рядком, тому в правилі ми можемо встановити правило S → ε.

приклад 3:

Побудуйте CFG для мови L = де w € (a, b)*.

рішення:

Рядок, який можна створити для даної мови, це {aacaa, bcb, abcba, bacab, abbcbba, ....}

Граматика може бути:

 S → aSa rule 1 S → bSb rule 2 S → c rule 3 

Тепер, якщо ми хочемо вивести рядок 'abbcbba', ми можемо почати з початкових символів.

 S → aSa S → abSba from rule 2 S → abbSbba from rule 2 S → abbcbba from rule 3 

Таким чином, будь-який рядок цього типу може бути отриманий із заданих правил виробництва.

java hashmap

Приклад 4:

Побудуйте CFG для мови L = aпbде n>=1.

рішення:

Рядок, який можна згенерувати для даної мови, це {abb, aabbbb, aaabbbbbb....}.

Граматика може бути:

 S → aSbb | abb 

Тепер, якщо ми хочемо вивести рядок 'aabbbb', ми можемо почати з початкових символів.

 S → aSbb S → aabbbb