Pojednostavljenje gramatike

Izvor: testwiki
Prijeđi na navigaciju Prijeđi na pretraživanje

Pojednostavljenje gramatike je skupni naziv za postupke odbacivanja beskorisnih znakova i produkcija, odnosno za postupke transformacije zapisa gramatike u neki oblik pogodniji za obradu. Za danu formalnu gramatiku gradimo istovjetnu gramatiku (tj. gramatiku koja generira isti jezik) bez zalihosnih znakova i produkcija.

Odbacivanje znakova

Ako se znak X gramatike G=(V,T,P,S) koristi u postupku generiranja SαXβw, gdje su α,β(VT)* i wT*, onda je znak x koristan. U suprotnom, znak je beskoristan.

Dva su vida beskorisnosti: znak može biti mrtav ili nedohvatljiv, Ako iz znaka X nije moguće generirati niz završnih znakova, tj. ne postoji postupak generiranja XwX, gdje je wXT*, tada je znak X mrtav. Nije li znak mrtav, kaže se da je živ. Ako se znak X ne nalazi ni u jednom nizu koji se generira iz početnog nezavršnog znaka, tj. ne postoji postupak generiranja SαXβ, tada je znak X nedohvatljiv.

Odbacivanje mrtvih znakova

Neka dana kontekstno neovisna gramatika G=(V,T,P,S) generira neprazni jezik, tj. L(G). Moguće je izgraditi istovjetnu gramatiku G=(V,T,P,S) koja nema mrtvih znakova, odnosno za bilo koji AV vrijedi Aw,wT*.

Algoritam traženja živih znakova zasniva se na sljedećem svojstvu: Ako su živi svi znakovi X1,X2,...,Xn desne strane produkcije

AX1X2...Xn

onda je živ i nezavršni znak A lijeve strane produkcije.

Algoritam traženja živih znakova izvodi se u tri koraka:

  1. U listu živih znakova stave se lijeve strane produkcija koje na desnoj strani nemaju nezavršnih znakova.
  2. Ako su na desnoj strani produkcije isključivo živi znakovi, onda se nezavršni znak lijeve strane produkcije doda u listu živih znakova.
  3. Ako nije moguće proširiti listu živih znakova, algoritam se zaustavlja. Svi znakovi koji nisu u listi živih znakova su mrtvi znakovi.

Pseudokod opisanog algoritma jest sljedeći:

StaraListaŽivih = ;
NovaListaŽivih = {A|Aw,i wT*};
dok (StaraListaŽivih NovaListaŽivih) { StaraListaŽivih = NovaListaŽivih; NovaListaŽivih = NovaListaŽivih {A|Aα,α(TStaraListaZivih)*}; }
ListaŽivih = NovaListaŽivih;

Odbacivanje nedohvatljivih znakova

Moguće je izraditi gramatiku G=(V,T,P,S) koja je istovjetna kontekstno neovisnoj gramatici G=(V,T,P,S) i koja nema nedohvatljivih znakova, tj. za bilo koji XVT vrijedi SαXβ, gdje je α,β(VT)*.

Algoritam traženja dohvatljivih znakova zasniva se na sljedećem svojstvu:
Ako je dohvatljiv nezavršni znak A lijeve strane produkcije:

Aα1|α2|...|αn

tada su dohvatljivi svi završni i nezavršni znakovi u nizovima α1, α2 ... i αn desne strane produkcije.

Algoritam traženja dohvatljivih znakova izvodi se u tri koraka:

  1. U listu dohvatljivih znakova stavi se početni nezavršni znak gramatike.
  2. Ako je znak lijeve strane produkcije u listi dohvatljivih znakova, onda se svi znakovi desne strane produkcije dodaju u listu dohvatljivih znakova.
  3. Ako listu dohvatljivih znakova nije moguće proširiti, algoritam se zaustavlja. Svi znakovi koji nisu u listi dohvatljivih znakova su nedohvatljivi.

Pseudokod opisanog algoritma jest sljedeći:

StaraListaDohvatljivih = ;
NovaListaDohvatljivih = {S|S je pocetni nezavrsni znak };
dok (StaraListaDohvatljivih NovaListaNedohvatljivih) { StaraListaDohvatljivih = NovaListaDohvatljivih; NovaListaDohvatljivih = StaraListaDohvatljivih {X|X je u nizu αi,AαiAStaraListaDohvatljivih}; }
ListaDohvatljivih = NovaListaDohvatljivih;

Odbacivanje beskorisnih znakova

Primjenom algoritma odbacivanja mrtvih znakova, a potom algoritma odbacivanja nedohvatljivih znakova, iz gramatike se odbacuju svi beskorisni znakovi. Primjena algoritma obrnutim redoslijedom neće nužno odbaciti sve beskorisne znakove, s obzirom na to da tad neki znakovi mogu ostati dohvatljivi primjenom mrtvih znakova.

Odbacivanje produkcija

Produkcije oblika AB su jedinične produkcije. Sve ostale produkcije, uključujući i produkcije oblika Aa i Aϵ, nazivaju se nejedinične produkcije.

Produkcije oblika Aϵ nazivaju se ϵ-produkcije. Njihovo korištenje je moguće izbjeći ako prazni niz nije element jezika kojeg gramatika generira.

Odbacivanje ϵ-produkcija

Neka gramatika G=(V,T,P,S) generira kontekstno neovisni jezik L(G){ε}. Tada je moguće izgraditi istovjetnu gramatiku G=(V,T,P,S) koja nema ϵ-produkcija.

Algoritam odbacivanja ϵ-produkcija se izvodi u dva osnovna koraka:

  1. Pronađu se svi nezavršni znakovi koji generiraju prazni niz. Prazni znakovi su oni znakovi za koje vrijedi Aϵ. Prazni se znakovi traže sljedećim iterativnim algoritmom:
    1. U listu prazni znakova se stave lijeve strane svih ϵ-produkcija.
    2. Ako su svi znakovi desne strane neke od produkcija zapisani u listu praznih znakova, tada se lista praznih znakova nadopuni lijevom stranom te produkcije.
    3. Ako više nije moguće proširiti listu praznih znakova, algoritam se zaustavlja.

  2. Skup produkcija gramatike G se gradi na sljedeći način. Ako je:
    AX1X2...Xn
    produkcija gramatike G, tada se u skup produkcija gramatike G dodaju produkcije oblika:
    Aξ1ξ2...ξn
    Oznake ξi poprimaju sljedeće vrijednosti:
    a) Ako znak Xi nije prazni znak, onda je oznaka ξi jednaka Xi.
    b) Ako je znak Xi prazni znak, onda je oznaka ξi jednaka ϵ ili Xi.
    Produkcije se grade na temelju svih mogućih kombinacija oznaka ξ1ξ2...ξn. Ako sve oznake ξi poprime vrijednost ϵ, tada nastaje ϵ-produkcija i ona se ne dodaje u skup produkcija gramatike G. Time se odbace sve ϵ-produkcije iz zadane gramatike G.

Općenito će ovim algoritmom, ako produkcija na desnoj strani ima k praznih znakova, biti potrebno izgraditi najviše 2k novih produkcija. Ako je na desnoj strani barem jedan znak koji nije prazan, tada je potrebno dodati točno 2k novih produkcija. Ako su na desnoj strani svi znakovi prazni, tada je potrebno dodati 2k1 novih produkcija (produkcija Aϵϵ...ϵ se ne dodaje u skup produkcija).

Odbacivanje jediničnih produkcija

Neka gramatika G=(V,T,P,S) generira kontekstno neovisni jezik L(G){ε}. Moguće je izgraditi istovjetnu gramatiku G=(V,T,P,S) koja nema jediničnih produkcija oblika AB.

Istovjetna gramatika G koja nema jediničnih produkcija gradi se na sljedeći način:

  1. U skup produkcija gramatike G stave se sve produkcije gramatike G koje nisu jedinične.
  2. Neka se postupkom generiranja iz nezavršnog znaka A dobije nezavršni znak B, tj. AB, gdje su A i B nezavršni znakovi gramatike G. Za sve produkcije Bα koje nisu jedinične grade se nove produkcije Aα.