Linguaggi formali e compilazione
|
|
|
- Romeo Pinto
- 6 anni fa
- Visualizzazioni
Transcript
1 Linguaggi formali e compilazione Corso di Laurea in Informatica A.A. 2014/2015
2 Linguaggi formali e compilazione
3 quivalenza di grammatiche In Informatica (e non solo, naturalmente) esistono sempre molti modi per risolvere un problema, alcuni più efficienti altri meno. Per definire un linguaggio, ad esempio, si possono usare grammatiche equivalenti (cioè che generano lo stesso insieme di stringhe terminali) anche molto diverse. Le seguenti grammatiche definiscono L 5 =a b : S ǫ A S AB A a aa B A ǫ aa B bb b B ǫ bb Le seguenti grammatiche definiscono lo stesso semplice linguaggio per le espressioni aritmetiche: + +T T () id T T F F F id ()
4 Quale grammatica usare? Poiché l obiettivo è di costruire un riconoscitore (parser), il criterio che deve guidare il progettista è proprio quello di rendere possibile, e agevole, il parsing. Fondamentalmente un parser deve trovare una derivazione dall assioma alla stringa in input. In generale, se una stringa appartiene al linguaggio, essa può essere derivata in molti modi possibili. Tale ridondanza non è un fatto positivo e può avere ripercussioni sull interpretazione da dare alla stringa (si ricordi che le stringhe più importanti per noi sono programmi in un qualche linguaggio di programmazione). Cominceremo a lavorare proprio su questo.
5 tree) Ci sono derivazioni diverse che possono essere descritte mediante uno stesso parse tree. Ad esempio, il seguente parse tree descrive molte possibili derivazioni per la stringa id (id+id) nella grammatica G 1 : Infatti il parse tree lascia indeterminato l ordine di applicazione di tutte quelle riscritture che non coinvolgano, nell albero stesso, nodi interni su uno stesso cammino radice-foglia.
6 tree) Formalmente, un parse tree per una grammatica libera G = (N, T, P, S) è un albero radicato ed etichettato che soddisfa le seguenti proprietà: i nodi interni sono etichettati con simboli di N e, in particolare, la radice è etichettata con l assioma; le foglie sono etichettate con simboli di T o con il simbolo ǫ; se A N etichetta un nodo interno e X1,...,X k sono le etichette dei figli di (il nodo con etichetta) A, con X i V, allora deve esistere in P la produzione A X 1 X 2...X k ; Se A N etichetta un nodo interno il cui unico figlio è un nodo con etichetta ǫ, allora deve esistere in P la produzione A ǫ.
7 Un secondo esempio Un parse tree per if b then if b then a else a nella grammatica G I : S I I A, A a, B b if B then S if B then S else S è S I if B then S else S b I a if B then S b a
8 tree) I parse tree sono importanti perché impongono una struttura sintattica (gerarchica) alle frasi e ciò costituisce un primo passo per attribuire ad esse un significato. La struttura gerarchica consente di decomporre una frase in sottofrasi, corrispondenti ai sottoalberi e al simbolo non terminale che ne rappresenta la radice. Nel parse tree per id (id+id), il sottoalbero indicato con la freccia rappresenta la frase, che potremmo definire di senso compiuto, (id + id):
9 Derivazioni canoniche Le derivazioni distinte alle quali corrisponde uno stesso parse tree sono in qualche modo la stessa derivazione, proprio perché impongono alla frase derivata la stessa struttura. Per tutte queste derivazioni possiamo risolvere il problema della ridondanza considerando solo derivazioni cosiddette canoniche. S G α è una derivazione canonica sinistra/destra della frase α in G, se ad ogni passo viene riscritto il simbolo non terminale più a sinistra/destra. Ad esempio, delle due seguenti derivazioni per id+(id) in G 1 : G1 + G1 +() G1 id+() G1 id+(id) e G1 + G1 +() G1 +(id) G1 id+(id) la seconda è una derivazione (canonica) destra, mentre la prima non è una derivazione canonica.
10 Derivazioni canoniche È tuttavia possibile che, per una data frase, esistano non solo derivazioni differenti (circostanza molto probabile) bensì parse-tree differenti e quindi derivazioni (canoniche) destre o sinistre differenti. Ad esempio, in G 1 la frase id+id+id può essere derivata così G1 + G1 ++ G1 ++id G1 +id+id id+id+id o così G1 G1 + G1 +id G1 ++id G1 +id+id id+id+id G1
11 Ambiguità Il fatto che esistano più derivazioni canoniche per una frase, e quindi parse tree diversi, è un fenomeno che che viene definito con il termine di ambiguità della grammatica. Si definisce cioè ambigua una grammatica in cui almeno una frase ammetta differenti parse tree. L ambiguità è un ostacolo alla realizzazione di un parser e, prima ancora, alla attribuzione di un significato alla frase, visto che alberi diversi impongono strutture sintattiche diverse. Vediamo subito due esempi importanti.
12 sempio 1 La grammatica G I è ambigua in quanto alla frase if b then if b then a else a corrisponde un parse tree diverso da quello già visto, e precisamente S I if B then S b I if B then S else S b a a
13 sempio 2 Alla stringa id+id id corrisponde in G 1 un primo parse tree illustrato di seguito: * + id id id Si noti come esso suggerisca un interpretazione dell espressione, e precisamente (id + id) id, che non coincide con quella che universalmente si dà alla frase in Matematica.
14 sempio 2 Il secondo parse tree che corrisponde a id+id id in G 1 è: + id * id id Questa volta l albero suggerisce l interpretazione corretta id +(id id).
15 Ambiguità Come già accennato, se una grammatica è ambigua il parsing (e poi l intepretazione) diviene problematico. È quindi importante che la grammatica non sia ambigua e, nel caso lo sia, sapere come disambiguare le frasi ambigue. Per certe classi di grammatiche l eventuale ambiguità può essere stabilita (e rimossa) mediante un algoritmo. Si tratta però di un approccio che, quand anche possibile, risulta macchinoso. In certi casi si preferisce utilizzare una grammatica ambigua e implementare una regola di disambiguazione direttamenente nel parser.
16 sempio Riconsideriamo il frammento di grammatica: S I I A if B then S if B then S else S Questa grammatica è semplice ma, come sappiamo, ambigua per if b then if b then a else a. Una grammatica non ambigua che forza l interpretazione classica è: S C O O C if B then C else C A if B then S if B then C else O L unica derivazione possibile è: S O if B then S if B then C if B then if B then C else C if b then if b then a else a
17 sempio (continua) La grammatica modificata è più ostica da usare. Si preferisce quindi lasciare la sintassi ambigua e fare in modo che il parser risolva i conflitti (associando ogni else all ultimo then incontrato).
18 Altri aspetti problematici Oltre all ambiguità, esistono altre caratteristiche che, per una data grammatica libera, possono ostacolare il processo di parsing. I più importanti sono: presenza di cicli (derivazioni del tipo A + A) o comunque di left recursion (derivazioni del tipo A + Aα, con α ǫ); presenza di prefissi comuni a due o più produzioni relative allo stesso non terminale, ad esempio A αβ 1 e A αβ 2.
19 sempi La grammatica S Sa b presenta una ricorsione immediata a sinistra in quanto S Sa. La grammatica S A A b Aa Sa presenta una ricorsione a sinistra in quanto S + Sa. La grammatica G I (oltre ad essere ambigua) presenta un prefisso comune alla due produzioni che riscrivono il simbolo I.
20 sempi Nella grammatica S A SA a ǫ c è una produzione A ǫ e questa provoca il ciclo S + S.
21 Precedenza degli operatori Come sappiamo, la grammatica G 1 : + id () è ambigua In questo caso per eliminare l ambiguità è sufficiente introdurre un nuovo simbolo non terminale + id () La nuova grammatica non è più ambigua ma, come anche la stessa grammatica G 1 di partenza, presenta un problema legato alla precedenza degli operatori.
22 Precedenza degli operatori Ad esempio, per la frase id + id id l unica derivazione canonica destra possibile è: id + id + id id id+id id alla quale corrisponde l albero di derivazione erroneo : * + id id id
23 Precedenza degli operatori (continua) Le usuali precedenze di operatore possono essere forzate introducendo differenti simboli non terminali per i diversi livelli di precedenza. Ad esempio, nel caso di somma e prodotto possiamo introdurre due livelli di precedenza, rappresentati dai non terminali e T, oltre ad un simbolo (useremo F) per la catogoria delle espressioni di base (nel nostro caso identificatori ed espressioni tra parentesi): T F +T T T F F id ()
24 Precedenza degli operatori (continua) La grammatica precedente (con le ovvie estensioni) gestisce senza ambiguità anche il caso degli operatori di divisione e sottrazione, inseriti nelle giuste categorie sintattiche: T F +T T T T F T/F F id () Domanda: perché scriviamo (ad esempio) T T F e non, invece, T F T?
25 Precedenza degli operatori (continua) Volendo inserire anche l operatore di esponenziazione (che ha precedenza maggiore), è necessario prevedere un ulteriore variabile sintattica e ricordarsi che l operatore di esponenziazione (qui useremo il simboloˆ) è associativo a destra: T P F +T T T T P T/P P FˆP F id ()
26 sercizi Si consideri il linguaggio L a>b delle stringhe su {a, b} che contengono più a che b. Si dica, giustificando la risposta, se la seguente grammatica libera genera L a>b S a as Sa abs asb Sab bas bsa Sba Si fornisca una grammatica libera per il linguaggio su B contenente tutte e sole le stringhe con un diverso numero di0e1. Si dica qual è il linguaggio generato dalla grammatica S A B aa AB B b
27 Automi finiti e grammatiche lineari destre Dato un automa a stati finiti M che riconosce il linguaggio L è immediato definire una grammatica lineare destra G M che genera lo stesso linguaggio, cioè tale che L(G M ) = L. La costruzione è molto semplice: per ogni stato q dell automa la grammatica conterrà un simbolo non terminale A q ; l assioma iniziale è Aq0 ; per ogni transizione δ(q,a) = q, la grammatica conterrà la produzione A q aa q ; se q è uno stato finale, la grammatica conterrà la produzione A q ǫ.
28 sempio La grammatica corrispondente all automa M 5 : a b b 0 1 è A q0 A q1 aa q0 ba q1 ǫ ba q1 ǫ
29 sempio La grammatica corrispondente all automa M 3 : è A q0 A q1 A q2 A q3 0A q1 1A q2 0A q3 1A q2 0A q3 ǫ
30 sempio La grammatica corrispondente all automa M parity : è A q0 A q1 0A q0 1A q1 ǫ 1A q0 0A q1
31 Automi finiti e grammatiche lineari destre (continua) La costruzione appena vista è completamente reversibile. Data una grammatica lineare destra G, possiamo facilmente costruire un automa non deterministico M che riconosce il linguaggio generato da G. per ogni non terminale A della grammatica definiamo uno stato q A dell automa; per ogni produzione A ab inseriamo la transizione δ(q A,a) = q B e per ogni produzione A B inseriamo la transizione δ(q A,ǫ) = q B lo stato iniziale è qs ; si definisce uno stato finale qf, non corrispondente ad alcun simbolo non terminale; per ogni produzione A asi pone δ(qa,a) = q f e, analogamente, per ogni produzione A ǫ si pone δ(q A,ǫ) = q f.
32 sempio L automa corrispondente alla grammatica: S A B C xa yb xb zb yc x zb yc è z y q x y y S q A q B q C z x x q f
33 sempio L automa corrispondente alla grammatica: A B aa B bb ǫ è a b q A ǫ q B ǫ q f
34 Grammatiche dipendenti dal contesto La forma generale delle produzioni di una grammatica di tipo 1 (dipendente dal contesto) è: αaγ αβγ dove α,β,γ V, β ǫ e A N. La forma delle produzioni spiega il nome di queste grammatiche. Infatti, il simbolo A può essere riscritto come β solo se appare nel contesto rappresentato dalle stringhe α e γ.
35 Linguaggi dipendenti dal contesto Sono così detti i linguaggi generabili da grammatiche dipendenti dal contesto. Poiché la forma generale delle produzioni di una grammatica context-dependent sono più generali di quelle di una grammatica context-free, l insieme dei linguaggi dipendenti dal contesto contiene l insieme dei linguaggi liberi. Viceversa, ci sono linguaggi dipendenti dal contesto che non sono liberi. Un esempio è il linguaggio L 13 = {a n b n c n n 0}
36 Costrutti non liberi nei linguaggi di programmazione Alcuni aspetti della sintassi dei linguaggi di programmazione non sono catturabili da produzioni di grammatiche libere. Ad esempio, il fatto che una variabile debba essere dichiarata prima dell uso non è esprimibile mediante una grammatica libera. Tale caratteristica è catturata dal cosiddetto linguaggio delle repliche (che non è libero): L R = {αα α T }.
37 Costrutti non liberi nei linguaggi di programmazione Un altro aspetto non esprimibile con grammatiche libere è che il numero e il tipo degli argomenti di una funzione coincida ordinatamente con il numero e il tipo dei parametri formali. Anziché utilizzare grammatiche più potenti (che renderebbero difficoltoso, quando non impossibile, il parsing), l approccio consiste nell ignorare il problema a livello sintattico. La verifica di correttezza viene completata invece durante l analisi semantica
Fondamenti d Informatica: Grammatiche. Barbara Re, Phd
Fondamenti d Informatica: Grammatiche Barbara Re, Phd Grammatiche } Con il termine grammatica s intende } Un formalismo che permette di definire un insieme di stringhe mediante l imposizione di un particolare
Fondamenti teorici e programmazione
Fondamenti teorici e programmazione FTP(A) - modb Lezione 16 Grammatiche Libere da Contesto Alberi di derivazione sintattica Linguaggio generato F.Bonchi Dip.to Informatica Fondamenti teorici e programmazione
Grammatiche. Grammatiche libere da contesto Grammatiche regolari Potenza delle grammatiche libere e regolari Struttura di frase: Alberi di derivazione
Grammatiche Grammatiche libere da contesto Grammatiche regolari Potenza delle grammatiche libere e regolari Struttura di frase: Alberi di derivazione Esempio dei numeri interi Si consideri il linguaggio
Linguaggi Liberi dal Contesto. Linguaggi Liberi dal Contesto
rammatiche e Linguaggi Liberi da Contesto Abbiamo visto che molti linguaggi non sono regolari. Consideriamo allora una classe piu ampia di linguaggi, i Linguaggi Liberi da Contesto (CFL) i CFL sono stati
Grammatiche context-free
Corso di Laurea Magistrale in Ingegneria Informatica A.A. 2013-2014 Linguaggi Formali e Compilatori Grammatiche context-free Giacomo PISCITELLI Politecnico di Bari G. Piscitelli pag. 1 di 28 Grammatiche
ANALISI SINTATTICA LUCIDI DI F. D'AMORE E A. MARCHETTI SPACCAMELA
ANALISI SINTATTICA LUCIDI DI F. D'AMORE E A. MARCHETTI SPACCAMELA AUTOMI PUSHDOWN input u t w $ v x y z $ pila tabella controllo 2 ARGOMENTI Il compito dell'analisi sintattica Generazione automatica Trattamento
Espressività e limitazioni delle grammatiche regolari
Espressività e limitazioni delle grammatiche regolari Vantaggi: Le grammatiche regolari consentono di esprimere una significativa classe di linguaggi: linguaggi con un numero di sequenze infinito grazie
Linguaggi Regolari e Linguaggi Liberi
Linguaggi Regolari e Linguaggi Liberi Linguaggi regolari Potere espressivo degli automi Costruzione di una grammatica equivalente a un automa Grammatiche regolari Potere espressivo delle grammatiche 1
Grammatiche Parse trees Lezione del 17/10/2012
Fondamenti di Programmazione A.A. 2012-2013 Grammatiche Parse trees Lezione del 17/10/2012 AUTILI MARCO http://www.di.univaq.it/marco.autili/ Riassunto lezione precedente Sintassi vs Semantica Stringhe,
Pumping lemma per i linguaggi Context-free
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=
Linguaggi Regolari e Linguaggi Liberi
Linguaggi Regolari e Linguaggi Liberi Potenza espressiva degli automi Potenza espressiva delle grammatiche 9/11/2004 Programmazione - Luca Tesei 1 Linguaggi Regolari Tutti i linguaggi che possono essere
Pumping lemma per i linguaggi Context-free
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=
Dispensa 2. Data una grammatica context free esistono tre metodi diversi per costruirne la parsing table per un parser LR:
Dispensa 2 2.1 Costruzione Parsing Table LR: generalità Come tutti i parser tabellari predittivi, anche i parser LR possono essere applicati solo a parsing table senza conflitti (ossia entrate multiple)
Sui Linguaggi Regolari: Teorema di Kleene - Pumping Lemm
Sui Linguaggi Regolari: Teorema di Kleene - Pumping Lemma N.Fanizzi - V.Carofiglio 6 aprile 2016 1 Teorema di Kleene 2 3 o 1 o 3 o 8 Teorema di Kleene Vale la seguente equivalenza: L 3 L FSL L REG Dimostrazione.
albero sintattico parser scanner Errori sintattici
albero programma scanner tokens parser sintattico rrori sintattici Un parser deve riconoscere la struttura di una stringa di ingresso, la cui struttura è fornita in termini di regole di produzione di una
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
ANALISI SINTATTICA TIPO 1: Data un linguaggio scrivere una grammatica che lo generi TIPO 2: Verificare se una grammatica non contestuale è ambigua TiPO 3: Verificare se una grammatica e LL(1) e costruirne
Linguaggi di Programmazione Corso C. Parte n.3 Linguaggi Liberi da Contesto e Linguaggi Contestuali. Nicola Fanizzi
Linguaggi di Programmazione Corso C Parte n.3 Linguaggi Liberi da Contesto e Linguaggi Contestuali Nicola Fanizzi ([email protected]) Dipartimento di Informatica Università degli Studi di Bari Grammatiche
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
PROLOG E ANALISI SINTATTICA DEI LINGUAGGI Quando si vuole definire in modo preciso la sintassi di un linguaggio si ricorre a una grammatica Una grammatica permette di stabilire se una sequenza di simboli
acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1
acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1 richiami teorici sulle grammatiche di Chomsky esercizivari esercizi su grammatiche ed espressioni regolari
Linguaggi e Grammatiche Liberi da Contesto
N.Fanizzi-V.Carofiglio Dipartimento di Informatica Università degli Studi di Bari 22 aprile 2016 1 Linguaggi Liberi da Contesto 2 Grammatiche e Linguaggi Liberi da Contesto G = (X, V, S, P) è una grammatica
Traduttore diretto dalla sintassi (seconda parte) Giuseppe Morelli
Traduttore diretto dalla sintassi (seconda parte) Giuseppe Morelli Traduzione di linguaggi guidata da Grammatiche Context Free La traduzione diretta della sintassi avviene associando regole e/o frammenti
Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl
Approfondimento 2.1 Non è questo il testo dove trattare esaurientemente queste tecniche semantiche. Ci accontenteremo di dare un semplice esempio delle tecniche basate sui sistemi di transizione per dare
Quiz sui linguaggi CF
Fondamenti dell Informatica 1 semestre Quiz sui linguaggi CF Prof. Giorgio Gambosi a.a. 2018-2019 Problema 1: Si consideri la seguente grammatica context free G, dove S, NP, V P, P P, A sono i simboli
Espressioni regolari
spressioni Regolari Un FA (NFA o DFA) e una macchina a stati finiti che riconosce linguaggi regolari. Una espressione regolare e un modo dichiarativo (o algebrico) per descrivere un linguaggio regolare.
Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd
Fondamenti d Informatica: linguaggi formali Barbara Re, Phd Agenda } Introdurremo } La nozione di linguaggio } Strumenti per definire un linguaggio } Espressioni Regolari 2 Linguaggio } Da un punto di
Le grammatiche formali
Le grammatiche formali Il carattere generativo dei sistemi linguisticii i Consideriamo i la seguente frase: Un gatto rincorre il topo Non facciamo difficoltà a riconoscere che si tratta di una frase sintatticamente
LINGUAGGI CONTEXT FREE. Lezione Lezione
LINGUAGGI CONTEXT FREE Lezione 25-11-2010 Lezione 30-11-2010 2 INTRODUZIONE GERARCHIA DI CHOMSKY 3 4 DEFINIZIONE DEI LINGUAGGI CONTEXT FREE LINGUAGGI CF I linguaggi di tipo 2 sono detti context free (CF)
Parser Bottom UP. Giuseppe Morelli
Parser Bottom UP Giuseppe Morelli Parser Bottom UP Un parser Bottom Up lavora costruendo il corrispondente albero di parsing per una data stringa di input partendo dalle foglie (bottom) e risalendo via
Semantica e traduzione guidata dalla sintassi (cenni)
Corso di Laurea Magistrale in Ingegneria Informatica A.A. 2013-2014 Linguaggi Formali e Compilatori Semantica e traduzione guidata dalla sintassi (cenni) Giacomo PISCITELLI Compile-time semantic evaluation
Definizione di Grammatica
Corso di Linguaggi e Traduttori 1 AA 2004-05 GRAMMATICHE 1 Definizione di Grammatica Formalmente definiamo un grammatica G mediante una quadrupla ( VN, VT, P, S ) dove: V N e l insieme dei simboli non
Linguaggi e Traduttori: Analisi lessicale
Linguaggi e Traduttori: Analisi lessicale Armando Tacchella Sistemi e Tecnologie per il Ragionamento Automatico (STAR-La) Dipartimento di Informatica Sistemistica e Telematica (DIST) Università di Genova
Linguaggi e Ambienti di Programmazione
Linguaggi e Ambienti di Programmazione Principi e tecniche diffuse che si incontrano spesso nelle applicazioni dell informatica. Compilatori Editor di struttura: riceve in input una sequenza di comandi
Espressioni aritmetiche
Espressioni aritmetiche Consideriamo espressioni costruite a partire da variabili e costanti intere mediante applicazione delle operazioni di somma, sottrazione, prodotto e divisione (intera). Ad esempio:
Descrizione delle operazioni di calcolo. Espressioni costanti semplici
Descrizione delle operazioni di calcolo Come abbiamo detto l interprete è in grado di generare nuovi valori a partire da valori precedentemente acquisiti o generati. Il linguaggio di programmazione permette
Traduzione guidata dalla sintassi
Traduzione guidata dalla sintassi Attributi e definizioni guidate dalla sintassi Dipartimento di Matematica e Informatica [email protected] Analisi Semantica Analisi sintattica - output:
