Grammatiche non contestuali (1) Esempio. E E + E E E * E E (E) E id Applicandole sostituzioni a partire da E si ottengono tutte le espressioni aritmetiche con + e * e operandi rappresentati da id. Una grammatica non contestuale (context-free) è G = (V,T, P,S) con V insieme di non terminali, T insieme di terminali (V T = Ø), S simbolo di inizio o assioma, P insieme di produzioni A a con A non terminale e stringa in (V T)*. Convenzioni. A, B, … denotano non terminali a, b, … e stringhe minuscole in grassetto denotano terminali X, Y, … denotano terminali o non terminali x, y, … denotano stringhe di terminali a , b , g … denotano stringhe di terminali e non terminali
Grammatiche non contestuali (2) Data G = (V,T, P,S) la relazione di derivazione ÞG* è cosí definita: Se a,g (V T)* e A b P allora a A g ÞG abg . Se a1, a2, …, am in (V T)* e a1 ÞG a2 ÞG … ÞG am scriviamo a1 ÞGm am o anche a1 ÞG* am . Il linguaggio generato da G è L = {w | w T* e S ÞG* w}. L è un linguaggio non contestuale (CFL) se è L(G) per una grammatica non contestuale (CFG). G1 è equivalente a G2 se L(G1) = L(G2). Esempio. Sia G = ({S}, {a,b), {S aSb, S ab}, S). L(G) + { anbn | n>=1}.
Grammatiche non contestuali (3) Un albero di derivazione è un albero con vertici interni etichettati con non terminali, foglie etichettate con terminali e tale che se un vertice interno è etichettato con A e i suoi figli sono etichettati con X1, …, Xk da sinistra a destra allora A X1 … Xk è una produzione della grammatica. Le derivazioni possono essere rappresentate con alberi di derivazione. Un sottoalbero di un albero di derivazione è un vertice dell’albero con tutti i suoi discendenti, gli archi che li connettono e le etichette. Se la radice è etichettata con A lo chiamiamo A-albero.
Grammatiche non contestuali (4) Esempio.G=({E},{+,*,(,),id},{EE+E, EE*E, E(E), E id}, E) Una derivazione è E Þ E*E Þ (E)*E Þ (E)*id Þ (E+E)*id Þ (E+id)*id Þ (id+id)*id. L’albero corrispondente è E E E * ( ) id E E E + id id
Grammatiche non contestuali (5) Teorema. Sia G = (V,T, P, S) non contestuale. Allora S Þ* a se e solo se c’è un albero di derivazione di G con frontiera a. Prova. Proviamo che per ogni A V A Þ* a se e solo c’è un A-albero con frontiera a. (a) Assumiamo a frontiera di un A-albero e proviamo A Þ* a per induzione sul numero di vertici interni. Se c’è un solo vertice allora l’albero è Allora A a con a = X1 … Xk è una produzione e A Þ* a è una derivazione in un passo. Supponiamo che la tesi valga fino a k-1 vertici interni e che a sia frontiera di un A-albero con k vertici interni (k>1). Prendiamo i figli di A e siano X1 , … , Xk le etichette da sinistra. Allora A X1 … Xk è una produzione e almeno un è un non terminale. Quindi ci deve essere Xi ai. Concludendo, A Þ X1 … Xk Þ* a1 X2 … Xk Þ* … Þ* a1 a2 … ak = a. A … X1 X2 Xk
Grammatiche non contestuali (6) (b) Supponiamo di avere una derivazione A Þ* a. Dobbiamo mostrare che c’è un A-albero con frontiera a. Se A Þ* a è in un solo passo allora A a è una produzione dell’albero e l’albero è Se A Þ* a in k passi allora sia a Þ X1 … Xk il primo Passo. Per ipotesi induttiva esisteranno derivazioni in meno di k passi e Xi alberi tali che l’albero cercato è Se w L(G) per una CFG G allora w ha almeno un albero di derivazione e corrispondentemente a un albero di derivazione ha una derivazione da più a sinistra (leftmost) e un’unica derivazione da più a destra (rightmost). A … X1 Xk A … X1 X2 Xk … t1 t2 tk
Grammatiche non contestuali (7) Una grammatica non contestuale è ambigua se una parola ha più di un albero di derivazione o, equivalentemente, più di una derivazione da più a sinistra o più di una derivazione da più a destra. Esempio. Sia G = ({E},{+, *, (,), id}, P, E) dove P è E E + E E (E) E E * E E id La parola id+id*id ha due derivazioni da più a sinistra E Þ E+E Þ id+E Þ id+E*E Þ id+id*E Þ id+id*id E Þ E*E Þ E+E*E Þ id+E*E Þ id+id*E Þ id+id*id e corrispondentemente due alberi di derivazione E E E E E + E * E E E E + id id * id id id id
Grammatiche non contestuali (8) Un linguaggio non contestuale è inerentemente ambiguo se non ha una grammatica non ambigua. Esempio. Il linguaggio L= {ai bjck | i=j oppure j=k, i,j,k >= 1} Il linguaggio delle espressioni aritmetiche non è inerentemente ambiguo perché ha una grammatica non ambigua G = ({E, T, F},{+, *, (,), id}, P, E) dove P è E E + T T F E T F (E) T T * F F id
Grammatiche non contestuali (9) Teorema. Se L è un linguaggio non contestuale può esssere generato da una grammatica non contestuale con le seguenti proprietà: 1. Ogni non terminale e ogni terminale di G appaiono nella derivazione di qualche parola di L. 2. Non ci sono produzioni A B con A, B non terminali. Inoltre se e non è in L non ci sono produzioni della forma A e . Prova. 1. Si eliminano prima i simboli che non portano a nessuna stringa terminale e poi i simboli che non compaiono in nessuna forma sentenziale derivata dall’assioma. Esempio. Prendiamo la grammatica S AB S a A a Primo passo. Si ottiene S a A a Secondo passo. Si ottiene S a Nota che facendo i passi in ordine inverso si avrebbe S a A a
Grammatiche non contestuali (10) Se e non è in L, L può essere generato da una grammatica senza produzioni della forma A e. Esempio. Prendiamo la grammatica S ABc A a B b A e B e Una grammatica equivalente senza e-produzioni è la seguente: S Abc S c S Ac A a S Bc B b
Grammatiche non contestuali (11) Teorema (Forma Normale di Chomsky). Qualunque linguaggio non contestuale senza e è generato da una grammatica con sole produzioni della forma A BC A a Esempio. Prendiamo la grammatica G=({S,A,B},{a,b},P,S) con P S bA S aB A bAA A aS A a B aBB B bS B b Una prima trasformazione dà S CbA S CaA Ca a A a A CbAA A CaS Cb b B b B CaBB B CbS Una seconda trasformazione dà S CbA S CaB Ca a A CbD1 A CaS A a D1 AA B CaD2 B CbS B b D2 BB
Grammatiche non contestuali (12) Teorema (Forma Normale di Greibach). Qualunque linguaggio non contestuale senza e è generato da una grammatica con sole produzioni della forma A aa dove A è un non terminale, a è un terminale e a è una stringa (eventualmente vuota) di non terminali. Prova. Assumiamo G=(V,T, P,S) con V = {A1, …, Am} in CNF. Si modificano le produzioni in modo che se Ai Aj g allora j > i. Partendo da A1 assumiamo che per 1<= i <k sia Ai Aj g in P se e solo se j >i. Modifichiamo le Ak produzioni. Sostituendo al posto di ciascun lato destro di ciascuna Ak produzione al più k-1 volte otteniamo Ak Al g con l >= k. Per le produzioni con l = k eliminiamo la ricorsione sinistra. Sia A Aal | Aa2 | … | Aar | b1 | … | bs . Si sostituisce con A bi B ai A biB con 1<= i <= s B ai B con 1<= i <= r
Grammatiche non contestuali (13) Esempio Sia G=({A1, A2, A3 }, {a,b}, P, A1) con P Al A2A3 A2 A3A1 | b A3 A1A2 | a A3 A1A2 diventa A3 A2A3A2 diventa A3 A3A1A3A2 | bA3A2 | a A3 A3A1 A3A2 diventa A3 bA3A2B3 | aB3 B3 A1A3A2 | A1A3A2B3 Quindi abbiamo infine le produzioni A3 bA3A2B3 | aB3 | bA3A2 | a Infine sostituendo A3 nella produzione A2 A3A1, poi usando le produzioni per A2 per sostituire nella produzione per Al e quindi sostituendo il lato destro di Al nelle produzioni per B3 otteniamo la forma voluta.