Formele grammatica

Een formele grammatica is in de informatica en theoretische taalkunde een beschrijving van een formele taal, een verzameling strings (in deze context ook zinnen genoemd) in een bepaald alfabet. Er zijn twee categorieën te onderscheiden: de generatieve grammatica's die beschrijven hoe een string uit de taal gegenereerd kan worden, en de analytische grammatica's die beschrijven hoe men een string uit een taal kan herkennen (analyseren).

Een generatieve grammatica bestaat uit een verzameling van regels om strings te transformeren. Om een zin uit de taal te genereren begint men een zin die alleen bestaat uit een startsymbool en men past vervolgens regels toe (een willekeurig aantal keer, in elke mogelijke volgorde) om de zin te herschrijven. De formele taal bestaat uit alle zinnen die op deze manier gegenereerd kunnen worden. Elke mogelijke manier om regels toe te passen op de zin resulteert in een zin die behoort tot de taal. Als men een zin op meerdere manier kan genereren dan spreekt men van een ambigue grammatica.

Stel we hebben een alfabet met de letters a {\displaystyle a} en b {\displaystyle b} , het startsymbool S {\displaystyle S} en de volgende regels:

1. S a S b {\displaystyle S\rightarrow aSb}
2. S b a {\displaystyle S\rightarrow ba}

dan kunnen we met S {\displaystyle S} beginnen en een regel kiezen om toe te passen. Als we regel 1 kiezen dan verkrijgen we de zin a S b {\displaystyle aSb} . Als we regel 1 opnieuw kiezen dan vervangen we S {\displaystyle S} door a S b {\displaystyle aSb} en we verkrijgen de zin a a S b b {\displaystyle aaSbb} . Dit proces wordt herhaald totdat we alleen symbolen overhouden uit het alfabet (dus: a {\displaystyle a} en b {\displaystyle b} ). Als we nu regel 2 gebruiken dan vervangen we S {\displaystyle S} door b a {\displaystyle ba} en we eindigen met de string aababb. We kunnen deze handelingen korter noteren met de volgende notatie: S a S b a a S b b a a b a b b {\displaystyle S\Rightarrow aSb\Rightarrow aaSbb\Rightarrow aababb} . De taal van de grammatica is de verzameling van alle zinnen (strings) die gegenereerd kunnen worden met dit proces: { b a , a b a b , a a b a b b , a a a b a b b b , . . . } {\displaystyle \left\{ba,abab,aababb,aaababbb,...\right\}} .

Formele definitie

In de definitie van generatieve grammatica's zoals gegeven door Noam Chomsky in de jaren 50 bestaat een grammatica G uit de volgende componenten:

  • een eindige verzameling N {\displaystyle N} van niet-terminale symbolen
  • een eindige verzameling Σ {\displaystyle \Sigma } van terminale symbolen, disjunct met N {\displaystyle N}
  • een eindige verzameling P {\displaystyle P} van productieregels, elk van de vorm:
( Σ N ) N ( Σ N ) ( Σ N ) {\displaystyle (\Sigma \cup N)^{*}N(\Sigma \cup N)^{*}\rightarrow (\Sigma \cup N)^{*}}
waarbij {\displaystyle {}^{*}} de Kleene-ster operator is en {\displaystyle \cup } de vereniging van verzamelingen. Elke productieregel beeldt een string symbolen af op een andere string symbolen waarbij de eerste string ten minste 1 niet-terminaal symbool bevat. In het geval dat de tweede string de lege string is, noteert men vaak een epsilon ( ϵ {\displaystyle \epsilon } ) om ambiguïteit te vermijden.
  • een apart symbool S N {\displaystyle S\in N} , het startsymbool

Vaak wordt een grammatica G genoteerd als een viertupel ( N , Σ , P , S ) {\displaystyle (N,\Sigma ,P,S)} .

De taal van de formele grammatica G = ( N , Σ , P , S ) {\displaystyle G=(N,\Sigma ,P,S)} , genoteerd als L ( G ) {\displaystyle {\boldsymbol {L}}(G)} , wordt gedefinieerd als alle strings met symbolen uit Σ {\displaystyle \Sigma } die gegenereerd kunnen worden vanuit het startsymbool S {\displaystyle S} door productieregels toe te passen uit P {\displaystyle P} tot er geen niet-terminale symbolen meer in de string aanwezig zijn.

Voorbeeld

We beschouwen de grammatica G = ( N , Σ , P , S ) {\displaystyle G=(N,\Sigma ,P,S)} met N = { S , B } {\displaystyle N=\left\{S,B\right\}} , Σ = { a , b , c } {\displaystyle \Sigma =\left\{a,b,c\right\}} , S {\displaystyle S} is het startsymbool en P {\displaystyle P} bevat de volgende productieregels:

1. S a B S c {\displaystyle S\rightarrow aBSc}
2. S a b c {\displaystyle S\rightarrow abc}
3. B a a B {\displaystyle Ba\rightarrow aB}
4. B b b b {\displaystyle Bb\rightarrow bb}

Enkele voorbeelden van zinnen in L ( G ) {\displaystyle {\boldsymbol {L}}(G)} :

  • S 2 a b c {\displaystyle {\boldsymbol {S}}\Rightarrow _{2}{\boldsymbol {abc}}}
  • S 1 a B S c 2 a B a b c c 3 a a B b c c 4 a a b b c c {\displaystyle {\boldsymbol {S}}\Rightarrow _{1}{\boldsymbol {aBSc}}\Rightarrow _{2}aB{\boldsymbol {abc}}c\Rightarrow _{3}a{\boldsymbol {aB}}bcc\Rightarrow _{4}aa{\boldsymbol {bb}}cc}
  • S 1 a B S c 1 a B a B S c c 2 a B a B a b c c c 3 a a B B a b c c c 3 a a B a B b c c c {\displaystyle {\boldsymbol {S}}\Rightarrow _{1}{\boldsymbol {aBSc}}\Rightarrow _{1}aB{\boldsymbol {aBSc}}c\Rightarrow _{2}aBaB{\boldsymbol {abc}}cc\Rightarrow _{3}a{\boldsymbol {aB}}Babccc\Rightarrow _{3}aaB{\boldsymbol {aB}}bccc} 3 a a a B B b c c c 4 a a a B b b c c c 4 a a a b b b c c c {\displaystyle \Rightarrow _{3}aa{\boldsymbol {aB}}Bbccc\Rightarrow _{4}aaaB{\boldsymbol {bb}}ccc\Rightarrow _{4}aaa{\boldsymbol {bb}}bccc}

Notatie: L i R {\displaystyle L\Rightarrow _{i}R} is te lezen als "L genereert R" door het toepassing van productieregel i en het gegenereerde stuk wordt vet aangeduid.

Zie ook

  • Generatieve taalkunde