logo

Нормална форма на Greibach (GNF)

GNF означава нормална форма на Greibach. CFG (граматика без контекст) е в GNF (нормална форма на Грайбах), ако всички производствени правила отговарят на едно от следните условия:

  • Начален символ, генериращ ε. Например S → ε.
  • Нетерминал, генериращ терминал. Например A → a.
  • Нетерминал, генериращ терминал, който е последван от произволен брой нетерминали. Например S → aASB.

Например:

 G1 = aB, A → aA G2 = S → aAB 

Правилата за производство на Grammar G1 отговарят на правилата, определени за GNF, така че граматиката G1 е в GNF. Въпреки това, производственото правило на Grammar G2 не удовлетворява правилата, определени за GNF като A → ε и B → ε съдържа ε (само началният символ може да генерира ε). Така че граматиката G2 не е в GNF.

Стъпки за конвертиране на CFG в GNF

Етап 1: Преобразувайте граматиката в CNF.

Ако дадената граматика не е в CNF, преобразувайте я в CNF. Можете да се обърнете към следната тема, за да конвертирате CFG в CNF: Нормална форма на Чомски

Стъпка 2: Ако граматиката съществува лява рекурсия, елиминирайте я.

Ако граматиката без контекст съдържа лява рекурсия, елиминирайте я. Можете да се обърнете към следната тема, за да премахнете лявата рекурсия: Лява рекурсия

Стъпка 3: В граматиката преобразувайте даденото производствено правило в GNF форма.

Ако някое производствено правило в граматиката не е в GNF форма, преобразувайте го.

Пример:

 S → XB | AA A → a | SA B → b X → a 

Решение:

Тъй като дадената граматика G вече е в CNF и няма лява рекурсия, така че можем да пропуснем стъпка 1 и стъпка 2 и директно да преминем към стъпка 3.

Правилото за производство A → SA не е в GNF, така че заместваме S → XB | AA в производственото правило A → SA като:

 S → XB | AA A → a | XBA | AAA B → b X → a 

Правилото за производство S → XB и B → XBA не е в GNF, така че заместваме X → a в правилото за производство S → XB и B → XBA като:

 S → aB | AA A → a | aBA | AAA B → b X → a 

Сега ще премахнем лявата рекурсия (A → AAA), получаваме:

java виртуална машина
 S → aB | AA A → aC | aBAC C → AAC | ε B → b X → a 

Сега ще премахнем нулевото производство C → ε, получаваме:

 S → aB | AA A → aC | aBAC | a | aBA C → AAC | AA B → b X → a 

Правилото за производство S → AA не е в GNF, така че заместваме A → aC | aBAC | a | aBA в производственото правило S → AA като:

 S → aB | aCA | aBACA | aA | aBAA A → aC | aBAC | a | aBA C → AAC C → aCA | aBACA | aA | aBAA B → b X → a 

Правилото за производство C → AAC не е в GNF, така че заместваме A → aC | aBAC | a | aBA в производствено правило C → AAC като:

 S → aB | aCA | aBACA | aA | aBAA A → aC | aBAC | a | aBA C → aCAC | aBACAC | aAC | aBAAC C → aCA | aBACA | aA | aBAA B → b X → a 

Следователно, това е GNF формата за граматиката G.