Kontekstfrie Grammatikker¶
Beskrive | Genkende | |
---|---|---|
Regulære sprog |
Regulære udtryk | Endelige automater - NFA og DFA (ækv.) |
Kontekstfrie sprog |
Kontekstfrie grammatikker | Pushdown-automater - NDPDA og DPDA (ikke ækv.) |
Kontekstfri Grammatik - CFG¶
Definition:
En kontekstfri grammatik er en 4-tupel $$ (V,\Sigma,R,S) $$
Symbol | Betydning |
---|---|
V | Endelig mængde af variable (aka. nonterminaler) |
\Sigma | Endelig mængde af terminaler |
R | Endelig mængde af regler |
S | Startvariabel S\in V (aka. startsymbol) |
Regler i R er på formen: $$ A \longrightarrow w, \quad w \in (V\cup\Sigma)^* $$
Eksempel¶
Sprog: $$ L={a^nb^n | n \geq0} $$ CFG: $$ \text{S} \longrightarrow \varepsilon \ |\ \text{aSb} $$
svarer til:
Byggelse af en streng¶
Strengen aaabbb
Derivition¶
Definition:
Lad G være en CFG hvor G=(V,\Sigma,R,S) og lad u,v \in (V\cup\Sigma)^*
Hvis
så skriver vi
u deriverer i et skridt til v $$ u \Rightarrow^* v $$
u deriverer i 0 eller flere et skridt til v
Eksempel¶
Sprog
Eksempler: $$ aaa \in L_2 \quad abba \in L_2 \quad ab \notin L_2 $$ Regler: $$ S \longrightarrow \varepsilon \ | \ a \ | \ b \ | \ aSa \ | \ bSb $$ Derivation af abba $$ S \Rightarrow aSa \Rightarrow abSba \Rightarrow abba $$
Kontekstfrie sprog¶
Definition:
Lad G=(V,\Sigma,R,S) være en CFG
Sproget defineret af G er
Et sprog L kalder vi kontekstfrit hvis der findes en CFG G så L=L(G)
Kontekstfrie sprog vs Regulære sprog¶
Sætning
Hvis M er en DFA, kan vi konstruere en CFG G så L(G)=L(M)
Eksempel:
M:
Ide i konstruktion: Til hver tilstand svarer en variabel i vores CFG
Generelt:
Hvis \delta(q,a)=q' lav reglen:
A_q\longrightarrow aA_{q'} Hvis q'\in F: \quad A_q\longrightarrow a Hvis q\in F : \quad A_q\longrightarrow \varepsilon
Verdenskort (Venn diagram)¶
Derivitionstræer / Parsetræer¶
Et parsetræ er en trærepræsentation af en derivition.
Eksempel¶
Aritmetiske udtryk
"a+a*a"
Parsetræ¶
MEN¶
Kan også deriveres på en anden måde:
Grammatikken er tvetydig (ambigous).
Begge derivitioner er venstrederivitioner, 2 forskellige venstrederivitioner.
Tvetydighed¶
Definition:
En CFG G er tvetydig hvis der findes en w\in L(G) så S\Rightarrow^*w med to (eller flere) forskellige venstrederivitioner
Sætning:
En CFG G er tvetydig hvis og kun hvis der findes en w\in L(G) som har mindst to forskellige parsetræer.
Indbygget Tvetydighed¶
Der findes kontekstfrie sprog L så enhver CFG G så L(G)=L vil være tvetydig.
Den slags sprog kaldes indbygget tvetydig
Bestem Tvetydighed¶
Sætning
Der findes ikke nogen algoritme, der altid kan fortælle os om en CFG er tvetydig.
(umulighedsresultat)
Chomsky Normalform (CNF)¶
Definition
En CFG er på Chomsky-Normalform (CNF) hvis reglerne overholder:
- Eneste tilladte \varepsilon-regel er S\longrightarrow\varepsilon
- Alle andre regler er på formerne:
- A\longrightarrow BC
- A\longrightarrow a
- S fremkommer ikke på nogen højreside
En CFG på CNF vil altid gøre at parstræer for strenge "næsten binære træer"
Eksempel:
Sætning:
For enhver CFG G kan vi konstruere en CFG G' på CNF så L(G')=L(G)
Bevis (Algoritme):
Eksempel:
1) (ny startvariabel)
Lav ny startvariabel S_1 og regel:
$$ S_1 \longrightarrow S $$ Eksempel:
2) (fix \epsilon-regler)
Fjern reglerne A \longrightarrow \varepsilon en ad gangen (epsilonregler) og
Tilføj nye regler hvor 0 eller flere forekomster af A er blevet fjernet.
Eksempel:
Vi fjerner at S kan blive til epsilon. Dette betyder at alle steder hvor der står et S, skal vi kunne skrive epsilon $$ S \longrightarrow aSSb \ | \ aS \varepsilon b \ | \ a \varepsilon \varepsilon b\ $$ 3) (forlængelse af for korte regler)
For hver regel der sender én variabel over i én anden variabel (A\longrightarrow B): fjern reglen og erstat med A\longrightarrow w for hver regel B\longrightarrow w (der skriver B om til w)
Eksempel:
4) (forkortelse af for lange regler)
For hver regel A\longrightarrow u_1u_2...u_k,\quad k>2 (u_i kan være variabler eller terminaler), lav nye regler og nye variabler.
Eksempel:
5)
For hver terminal a som ikke er alene på en højreside: lav ny regel U_a
Eksempel: