Pumping lemma per i linguaggi Context-free

Documenti analoghi
Pumping lemma per i linguaggi Context-free

Linguaggi e Grammatiche Liberi da Contesto

Linguaggi di Programmazione Corso C. Parte n.3 Linguaggi Liberi da Contesto e Linguaggi Contestuali. Nicola Fanizzi

Esempio stringhe palindrome 1

LINGUAGGI CONTEXT FREE. Lezione Lezione

ANALISI SINTATTICA LUCIDI DI F. D'AMORE E A. MARCHETTI SPACCAMELA

Fondamenti d Informatica: Grammatiche. Barbara Re, Phd

Fondamenti dell Informatica a.a. 2017/18 Prova scritta 11 gennaio 2018

Quiz sui linguaggi CF

Linguaggi Regolari e Linguaggi Liberi

Sui Linguaggi Regolari: Teorema di Kleene - Pumping Lemm

Linguaggi Regolari e Linguaggi Liberi

Le grammatiche formali

Forme Normali. Forma normale di Chomsky. E caratterizzata da regole di due tipi. A! BC dove A, B, C $ V N A! a con a $ V T. Forma normale di Greibach

Fondamenti teorici e programmazione

Forma Normale di Chomsky

Linguaggi formali e compilazione

RISOLUZIONE IN LOGICA PROPOSIZIONALE. Giovanna D Agostino Dipartimento di Matemaica e Informatica, Università di Udine

Esercizi di Informatica Teorica

Verificare se una grammatica e LL(1) e costruirne la tabella di parsing. Verificare se una grammatica e LR(0) e costruirne la tabele ACTION e GOTO

GRAMMATICHE LIBERE DAL CONTESTO

Linguaggi Liberi dal Contesto. Linguaggi Liberi dal Contesto

Dispense del corso di Linguaggi di programmazione e laboratorio Linguaggi formali(versione non definitiva con diversi refusi) Francesco Sisini

Alberi: definizioni e dimostrazioni induttive.

Definizione di Grammatica

Automi a pila. Dipartimento di Elettronica e Informazione Politecnico di Milano. 17 marzo 2017

Dispensa 2. Data una grammatica context free esistono tre metodi diversi per costruirne la parsing table per un parser LR:

Algoritmi e Principi dell Informatica

albero sintattico parser scanner Errori sintattici

PROLOG E ANALISI SINTATTICA DEI LINGUAGGI Quando si vuole definire in modo preciso la sintassi di un linguaggio si ricorre a una grammatica G=(V n,v t

Parser Bottom UP. Giuseppe Morelli

Suffix Trees. Docente: Nicolò Cesa-Bianchi versione 21 settembre 2017

Proprieta dei Linguaggi regolari

Transcript:

Pumping lemma per i linguaggi Context-free Sia L un linguaggio context-free. E possibile determinare una costante k, dipendente da L, tale che qualunque stringa z # L con z > k si può esprimere come z= u v w x y in cui: 1. v w x # k 2. v + x > 0 3. u v i w x i y # L per i $ 0 Es1: mostrare che il linguaggio L = {a n b n c n con n $ 0 } non è context-free Es2: mostrare che il linguaggio L = {a m2 m $ 1 } non è context-free

Pumping lemma per i linguaggi Context-free Per la dimostrazione del Pumping Lemma si fa uso delle grammatiche in forma normale di Chomsky, per le grammatiche in tale forma si ha che ogni nodo interno ha due figli, ad esclusione di quelli che hanno foglie come sottoalberi. Lemma - Sia w una stringa terminale prodotta dall albero sintattico se h è l altezza dell albero si ha che w # 2 h-1 Si consideri ora una grammatica G = < VN,VT,P, S > tale che L(G) = L-{%} e sia m = VN, si sceglie k= 2 m e quindi per le condizioni poste dal pumping lemma la stringa z sarà lunga almeno k. Per il lemma precedente un albero sintattico il cui cammino più lungo sia di lunghezza m, o meno, ha un prodotto di lunghezza 2 m-1 = k/2 o meno. Un tale albero sintattico non può quindi produrre la stringa z, cioé ogni albero sintattico che produce z deve essere di altezza almeno pari a m+1. Ora, essendo m = V N, si ha che nel percorso dalla radice alle foglie ci saranno almeno due simboli non terminali uguali (per il principio della piccionaia). Supponiamo che A = Ai = Aj

Pumping lemma per i linguaggi Context-free L albero di derivazione avrà la seguente struttura dove ciascun triangolo rappresenta il sottoalbero generante le varie parti della stringa. Essendo che A = A i = A j possiamo costruire altri alberi sintattici tramite sostituzione a partire dall albero originale. A A S A S A S A u v w x y z u v A x y w v w x u x albero di derivazione per la stringa uv 2 wx 2 y albero di derivazione per la stringa uwy

Proprietà di chiusura dei linguaggi Context-free Teorema: I linguaggi context-free non sono chiusi rispetto all intersezione e alla complementazione Intersezione considerato che i due linguaggi L 1 = {a n b n c m n,m$ 0} e L 2 = {a m b n c n n,m$ 0} sono context free, il linguaggio intersezione è costituito da {a n b n c n n,m$ 0} che sappiamo non essere contextfree. Complementazione Se L 1 e L 2 sono context free allora anche L = L dovrebbe essere context free in virtù 1 ( L 2 dei risultati sulla unione, ma siccome per la legge di De Morgan L= L 1 ) L 2 questo equivarrebbe a dire che i linguaggi context-free sono chiusi rispetto all intersezione, contrariamente a quanto detto prima. Tuttavia L intersezione di un linguaggio Context-free ed un linguaggio regolare è ancora un linguaggio context-free

Determinismo e linguaggi context-free Un automa a pila è in genere non deterministico. Il non determinismo viene espresso da una o entrambe delle seguenti condizioni: 1. esistono più transizioni del tipo che iniziano con (q, a, A) 2. (q,a,a) e (q,",a) sono entrambe definite, cioè l automa può scegliere di leggere il simbolo a! oppure di non leggere niente. A differenza del caso delle grammatiche regolari in cui il non determinismo non aggiungeva potere computazionale all automa riconoscitore. L automa a Pila non deterministico è computazionalmente più potente dell automa deterministico. Ciò in virtù del seguente Teorema: Teorema: La famiglia dei linguaggi riconosciuta dagli automi a pila deterministici è contenuta strettamente in quella dei linguaggi context- free. Per dimostrarlo basta considerare la classe dei linguaggi inerentemente ambigui (cioé ogni grammatica equivalente è ambigua) per cui necessariamente l automa riconoscitore è non deterministico. Es. L = {a n b n c* n $0 } ( {a* b n c n n $0 } è un linguaggio Context free inerentemente ambiguo e quindi non riconoscibile da un automa a pila deterministico

Determinismo e linguaggi context-free Si dimostra anche che esistono linguaggi non ambigui che sono non deterministici Es1: L = L ( L = {a n b n n $1 } ( {a n b 2n n $1} è non deterministico intuitivamente l automa dovrebbe collocare nella pila i primi n caratteri a e cominciare a disimpilare un a appena trova il primo b se la stringa # L, mentre se la stringa # L sono due i b che devono essere letti prima di disimpilare un a. Es2: il linguaggio L = {w w R } è non deterministico.

Proprietà di chiusura dei linguaggi deterministici La classe dei linguaggi deterministici è chiusa rispetto alla complementazione. La classe dei linguaggi deterministici non è chiusa rispetto all unione l esempio 1 della precedente slide!! L = L ( L = {a n b n n $1 } ( {a n b 2n n $1} ne è un esempio, infatti a partire da due linguaggi deterministici si costruisce con la loro unione un linguaggio non deterministico. La classe dei linguaggi deterministici non è chiusa rispetto all intersezione. Es: L = L 1 ) L 2 = {a n b n c* n $0 } ) {a* b n c n n $0 } = {a n b n c n n $0 } dove L 1, L 2 sono certamente linguaggi deterministici

Utilità degli automi pushdown deterministici L uso di automi pushdown non deterministici come riconoscitori di grammatiche context-free è computazionalmente oneroso: O(n 3 ). Nella pratica vengono impiegati gli automi deterministici considerato anche il fatto che la maggior parte dei linguaggi di programmazione appartiene alla classe dei linguaggi deterministici.

Un cenno sui riconoscitori top-down Un riconoscitore sintattico top-down basato su grammatiche LL(k) implementa un automa a pila push-down che attua un riconoscimento per pila vuota. In genere gli automi che vengono impiegati fanno riferimento all uso di una marca di fine stringa $. Per ottenere il determinismo si sfrutta la conoscenza che proviene dall avere sotto considerazione la stringa in ingresso. In caso di indecisione di quale transizione attuare si considerano i prossimi k simboli che l automa dovrà leggere per prendere le opportune decisioni.

Analisi sintattica Obiettivi! verificare la correttezza sintattica del programma dato in ingresso! costruire l albero sintattico Strategie! top down (discendente), si parte dal simbolo distinto e si cerca di applicare in qualche! ordine le produzioni in modo da verificare se la stringa x è generabile dalla grammatica. Cioé!!! S!* x! Bottom-up, si parte dalla stringa x, si cerca una sottostringa che sia parte destra di una!! produzione e la si sostituisce con la corrispondente parte sinistra. Questa operazione viene denominata di Riduzione e viene iterata fino a quando la stringa non si riduce al simbolo distinto S.

Derivazioni Canoniche E! E + T E - T -T T T! T * F F! F! (E) i E "* a + b*c? Derivazione canonica sinistra [sostituzione del primo simbolo non terminale a sinistra] E" E +T "T + F " F + T" i + T" i + T*F " i + F*F "i+ i*f " i +i*i Derivazione canonica a destra [sostituzione del primo simbolo non terminale a destra] E " E + T" E + T*F " E +T*i " E + F*i " E + i*i "T + i*i " F + i*i" i + i*i E E + T Albero sintattico risultante T F i T F i * F i c a b

Grammatiche LL(k) Per costruire riconoscitori deterministici occorre agire sulle grammatiche in due direzioni: 1. Porre dei vincoli alla grammatica sì da renderla adatta all analisi top-down. 2. Utilizzare l informazione fornita dai simboli successivi alla parte già riconosciuta per guidare l analizzatore nella scelta della parte destra con cui espandere il simbolo non terminale corrente. Grammatiche LL(K) L - indica che la stringa in ingresso è esaminata da sinistra (Left) verso destra. L - indica che viene costruita la derivazione canonica a sinistra (Left). K - indica il numero di simboli di lookahead che l analizzatore considera per scegliere la parte! destra con cui espandere il simbolo non terminale corrente.