Laboratorio di Ingegneria Informatica
Transcript
Laboratorio di Ingegneria Informatica
Linguaggi formali e modelli per l’informatica Laboratorio di Ingegneria Informatica n n n Corso di laurea specialistica in Ingegneria Informatica Linguaggi formali n Definizione n n Definizioni Linguaggi formali e Grammatiche Classificazione dei linguaggi di Chomsky Automi e linguaggi formali La traduzione automatica Linguaggio § Linguaggio è un insieme generalmente infinito di stringhe caratterizzate da qualche particolare proprietà § Tipi di Linguaggi q q Linguaggio naturale Linguaggi artificiali Ø Linguaggi formali Ø Linguaggi di programmazione q q q Linguaggi formali n n Linguaggio formale è un linguaggio in cui la forma delle frasi (sintassi) e il loro significato (semantica) sono definiti in modo preciso e algoritmico Linguaggio formale è un linguaggio per cui risulta possibile progettare una procedura algoritmica che verifichi la correttezza grammaticale delle frasi e ne calcoli il significato Ø Definizione formale: Linguaggio formale è una struttura matematica, costruita a partire da un alfabeto mediante regole assiomatiche (grammatiche formali) o modelli matematici (automi o macchine di Turing) Linguaggi per descrizione di ipertesti (HTML) Linguaggi per la descrizione di dati (XML) Linguaggi per la descrizione di pagine (Postscript) Definizioni Alfabeto A: un insieme finito e non vuoto di simboli atomici Esempio: A={a,b} Stringa dell’alfabeto: e’ una sequenza di simboli dell’alfabeto Esempio: a, b, ab, aba, bb, bbaaa,… Linguaggio Linguaggio L su un alfabeto A è un insieme di stringhe di A*, sottoinsieme di tutte le stringhe di lunghezza arbitraria ma finite possibili su A. Esiste la stringa vuota. q Frase di un linguaggio: stringa finita appartenente a quel linguaggio 1 Definizioni Definizioni Esempio: linguaggio naturale Il linguaggio delle frasi in italiano q A={a,b,...,z,<spazio>} alfabeto q Stringhe dell’alfabeto: “casa”, “la porta”, “agsdh asg dh” q Frasi della lingua italiana: “il cane dorme”,... Esempio :linguaggio di programmazione Alfabeto di un linguaggio di programmazione n A={if, else, = A, 0,=,+,1,2,(,)} E alcune sue stringhe: n A*={if(A==0)=A:==A+1 else A=a+2,if (A==0)A=A+2,A=A+A, if else A, do=A,…} E frasi n A =A+A, A=A+2, if (A==0) A=A+2 Definizioni Specifiche dato l’alfabeto ü Cardinalità di un linguaggio: il numero di frasi di quel linguaggio ü linguaggio finito: cardinalità finita ü linguaggio infinito: cardinalità infinita n n ü Chiusura dell’alfabeto A: linguaggio piu’ grande dell’alfabeto A, quello che contiene tutte le stringhe dell’alfabeto Se il linguaggio è finito q basta elencare le sue frasi Se il linguaggio è infinito q non possiamo elencare le frasi q bisogna trovare una notazione per descriverne tutte e sole le frasi del linguaggio q e ovviamente, tale notazione deve essere finita Problema: Elencare tutte le frasi valide che sono in numero infinito [ Rappresentare un numero infinito di casi mediante una descrizione finita Ø Soluzione: algoritmo di enumerazione Linguaggi formali n Grammatiche Le grammatiche formali Ø Consentono di descrivere linguaggi infiniti in modo finito Ø quindi l’insieme delle frasi sarà numerabile n n Una grammatica definisce delle “frasi” lecite: q data una frase F, questa soddisfa la grammatica G? Definisce una sorta di linguaggio q l’insieme delle frasi che soddisfano la grammatica ØLe grammatiche formali caratterizzano un linguaggio di programmazione come l’insieme di tutte le stringhe (programmi) derivabili dalla grammatica 2 Le grammatiche formali n Una grammatica è formata da un insieme di regole di trasformazione q n Le grammatiche formali n Es.: G= {X àYY, Yà a, Y à bc } q Applicandole in tutte le loro possibili combinazioni si identificano tutte e sole le frasi del linguaggio di interesse q q q Es.: X à YYà aY à aa • X à YY àaY àabc • X à YY àbcY à bca • X à YY àbcY à bcbc Ø Il linguaggio di G ha 4 frasi: • L(G)={aa,abc,bca,bcbc} Es.: G={X à b, X à aXc} q • Le grammatiche formali n Definizione matematica Una grammatica è definita come una quadrupla formata dall’insieme dei simboli terminali di un linguaggio, simboli non terminali, simbolo iniziale, regole di produzione q ØL(G)={b,abc,aabcc,aaabccc,...} § L(G) ha cardinalità infinita: (nb:X è definito in termini di X) Le grammatiche formali Simboli terminali e non n VT insieme finito di simboli terminali q n n q q q VN, insieme finito di simboli non terminali VT insieme finito di simboli terminali P, insieme di regole di riscrittura S, simbolo iniziale, detto “scopo” q n è l’insieme delle sequenze dell’alfabeto A che possono comparire nella grammatica VN, insieme finito di simboli non terminali q E’ formata da 4 elementi q X àb X àaXc àabc Xà aXc à aaXcc àaabcc X à aXc à aaXcc à aaaXccc àaaabccc ... sono meta-simboli di “appoggio” rappresentano categorie sintattiche Nell’esempio: q A = {a,b,c} ØVT = {a,bc}, e X à YY, Y à a, Yà bc VN = {X,Y} Le grammatiche formali Le grammatiche formali Regole di Produzione e Scopo n P, insieme di regole di riscrittura Trasformazioni n Si parte dal simbolo non terminale S n Si applica una regola di produzione aàß q q n S ?VN, simbolo iniziale, detto “scopo” q n ognuna è del tipo aàß q dove a e ß sono sequenze nell’insieme VT ? VN è il simbolo non terminale da cui si iniziano le trasformazioni Nell’esempio: X à YY, Y à a, Y àbc Ø P={X à YY, Y àa, Y àbc}, S=X q q si cerca la presenza della sotto-sequenza a la si sostituisce con ß a e ß sono chiamate “forme di frase” n Si procede finchè non si ottiene una stringa con soli simboli terminali n Tutte le frasi del linguaggio si ottengono con questo procedimento q q tale stringa è una frase del linguaggio scegliendo via via regole di produzione diverse 3 Le grammatiche formali Le grammatiche formali Esempio n Una grammatica <VT,VN,P,S> su A={0,1} Esempio n A={a,b}, L= {ab,aabb,aaabbb,...} q q q q n simboli terminali simboli non terminali produzioni scopo L= {0,10,110,1110,11110,...} Come si ottengono queste frasi: q q q S = X à0 S = X à1X à 10 S = X à 1X à11X à 110 Le grammatiche formali Albero delle frasi n E’ una struttura visuale ad albero per rappresentare (una porzione finita) delle frasi di una grammatica n La radice specifica lo scopo della grammatica n Ogni nodo ha tanti figli q q n n q q q Quale linguaggio? q n VT={0,1} VN={X} P = { Xà0, Xà1X} S=X uno per ogni produzione applicabile il figlio è ciò che si ottiene applicando la produzione al padre Ogni nodo specifica una forma di frase Le foglie sono frasi della grammatica q n VT={a,b} simboli terminali VN={F} simboli non terminali P={Fàab, FàaFb} produzioni S=F scopo della grammatica Frasi: q q q Es1: Fà ab Es2: FàaFb àaabb Es3: FàaFbà aaFbb àaaabbb Le grammatiche formali Esempio n VT={a,b} simboli terminali n VN={F} simboli non terminali n P={F à ab, FàaFb} produzioni n S=F scopo della grammatica n L={ab,aabb,aaabbb,..} Le grammatiche formali Backus Naur Form (BNF) Esempio q Sono una notazione un po’ più conveniente per rappresentare grammatiche formali (anni ’60) VT={a,b} simboli terminali VN={F,G} simboli non terminali n P={F à ab, FàaG, Gà Fb} produzioni S=F scopo della grammatica n n Ø Stesso linguaggio di prima, diversa grammatica q Sono in grado di descrivere grammatiche libere da contesto secondo la classificazione di Chomsky q Una BNF definisce un linguaggio sull’alfabeto terminale mediante un meccanismo di derivazione o riscrittura 4 Backus Naur Form q Simbologia di BNF q Le regole di produzione sono della forma a::=ß invece di aàß q Il meta-simbolo speciale | è usato per l’alternativa Ø Ø q da: aàß1, aàß2, …,aàßn a: a::=ß1 |ß2| ... | ßn si può leggere: Ø a produce ß1 oppure ß2 oppure ... oppure ßn BNF per un programma C <Programma>::= main()<sequenza istruzioni> <sequenza istruzioni>::=<istruzione><sequenza istruzioni> <istruzione>::=<istruzione semplice>|<istruzione composta> <istruzione semplice>::=<istruzioneIO>|<istruzione assegnazione> <istruzioneIO>::=<istruzione lettura>|<istruzione scrittura> <istruzione lettura>::=scanf(<indentificatore di variabile>); <istruzione scrittura>::=printf(<identificatore di variabile>); <istruzione assegnazione>::=<identificatore di variabile>=<Espressione>; <istruzione composta>::=<istruzione condizionale>|<istruzione iterativa> <istruzione condizionale>::=…… Backus Naur Form Esempio n BNF per definire l’identificatore di variabile <identificatore >::= <lettera> <identificatore >::= <lettera><sequenza caratteri> <lettera>::= a|b|…|z|_ <sequenza caratteri>::=<carattere><sequenza caratteri> <carattere>::=<lettera> <cifra> <cifra>::=0|1|2|3|4|5|6|7|8|9 Esempio: numero naturale n BNF per definire un numero naturale <naturale>::=0|<cifra_non_ nulla>{<cifra>} <cifra_non_nulla>::=1|2|3|4|5|6|7|8|9 <cifra>::=0|<cifra_non_nulla> Backus Naur Form Esempio con più categorie sintattiche: n A=VT={il,gatto,topo,sasso,mangia,beve} n P={ <frase>::=<soggetto><verbo><comple-ogg> <soggetto>::=<articolo><nome> <articolo>::=il <nome>::=gatto|topo|sasso <verbo>::=mangia|beve <compl-ogg>::=<articolo><nome> n } es.: “il gatto mangia il topo” e’ una frase del linguaggio L Backus Naur Form Backus Naur Form Albero di derivazione n E’ usato per comprendere come si deriva una frase! Esempio: espressioni n A={0,1,and,or,not} n X ::= X and X | X or X | not X | 0 | 1 q q q q radice, lo scopo foglie, simboli terminali nodi, simboli non terminali Le frasi del linguaggio si leggono nelle foglie, da sx a dx Ø Quale derivazione per: 0 and 1 or 0 ? Per una frase potrebbero esistere due alberi è grammatica ambigua! 5 Extended Backus Naur Form (EBNF) n n Sono usate per avere ancora più espressività! Usano dei simboli aggiuntivi rispetto alle BNF q q permettono di racchiudere forme di frase tra parentesi tonde, graffe o quadrate Non sono del tutto standard, spesso qualcuno potrebbe usare simboli diversi... Chomsky n La teoria generativista Classificazione di Chomsky dei Linguaggi n n Backus Naur Form Uso di grammatiche “a precedenza” n Un modo per garantire che ogni stringa del linguaggio sia interpretata in modo univoco e’ quello di introdurre una gerarchia di priorita’ tra gli operatori. q Ad esempio, seguendo la convenzione standard, possiamo stabilire che in una espressione il * ha maggiore priorit a’ del +. n E’ possibile formalizzare questa regola di precedenza introducendo altri non terminali e strutturando le produzioni in base alle priorita’. n Questa tecnica complica notevolmente la grammatica n Nella pratica si usa spesso distinguere due grammatiche per un L. di P., una ambigua accompagnata da regole di precedenza definite a parte ed una non ambigua equivalente che viene utilizzata unicamente in fase di parsing. Teoria generativista di Chomsky (anni ’50) Esiste una sintassi comune a tutte le lingue naturali che viene adattata con pochi parametri per diventare una lingua concreta n quindi e’ la sintassi è la parte veramente importante nella lingua n ovvero le regole con cui produrre tutte le frasi di una lingua naturale attraverso la manipolazione di simboli, e chiamò questo meccanismo grammatica generativa Ø Questa teoria ha contribuito a creare i linguaggi formali alla base dei linguaggi di programmazione. n Classificazione di Chomsky dei Linguaggi È una classificazione dei linguaggi basata sulla complessità delle produzioni delle grammatiche che li generano. n Introduzione di alcune restrizioni sulle produzioni basate sulla sintassi n q q q q I linguaggi di tipo 0 sono generati da grammatiche a struttura di frase I linguaggi di tipo 1 sono generati da grammatiche dipendenti dal contesto. I linguaggi di tipo 2 sono generati da grammatiche libere dal contesto. I linguaggi di tipo 3 sono generati da grammatiche lineari (o regolari). Tipo 0 grammatiche a struttura di frase q Tipo 1 grammatiche dipendenti dal contesto. q n sono le grammatiche in cui non viene posto alcun vincolo sulle produzioni è possibile sostituire al non terminale A il simbolo (terminale o no) ? solo quando A si trova nel contesto di a alla propria sinistra e ß a destra Tipo 2 grammatiche libere del contesto q q è sempre possibile sostituire al non terminale A il simbolo (terminale o non terminale) ß Sono di questo tipo le grammatiche che generano i linguaggi di programmazione 6 Classificazione di Chomsky dei Linguaggi n Tipo 3: grammatiche lineari sono le grammatiche le cui produzioni hanno la Forma A àß, dove A simbolo non terminale, ß simbolo terminale o no, ma ß contiene al piu’un simbolo non terminale. q Le grammatiche lineari si distinguono in q lineari destre o regolari, quando le produzioni sono di uno dei due tipi seguenti q n n q AàaB, dove a A, B simboli non terminali, a terminale Aà a n Riconoscibilità n Il problema di stabilire se una stringa è frase di un linguaggio n è decidibile (risolubile in tempo finito) solo per le grammatiche di tipo 1 non è dedicibile, in generale, per le grammatiche di tipo 0 Per i linguaggi di programmazione, si usano in genere grammatiche di tipo 2! q q q q Ogni grammatica di tipo n e’ anche una grammatica di tipo n-1. Un linguaggio generato da una grammatica di tipo 3 e’ anche generabile da una tipo 2,1,0 Un linguaggio generato da una grammatica di tipo 2 e’ anche generabile da una tipo 1,0 AàBa, dove a A, B simboli non terminali, a terminale Aà a Classificazione di Chomsky dei Linguaggi q Gerarchia delle grammatiche: Lineari sinistre, quando le produzioni sono di uno dei due tipi seguenti n q Classificazione di Chomsky dei Linguaggi Specifiche dei Linguaggi di Programmazione Esempio - Le espressioni n Esempio di sintassi per i numeri interi e le principali operazioni: q n es.: 3+4*(6/2), (3-4)*21 I numeri: <cifra-non-nulla> ::= 1|2|3|4|5|6|7|8|9 <cifra>::= 0 | <cifra-non-nulla> <num>::= 0 | <cifra-non-nulla>{<cifra>} hanno algoritmi di riconoscimento efficienti Specifiche dei Linguaggi di Programmazione Specifiche dei Linguaggi di Programmazione Le espressioni n Esempio di sintassi per i numeri interi e le principali operazioni: Derivazione es.: 3+4*(6/2), (3-4)*21 <exp>::=<num> <exp>::=<exp><op><exp> <exp>::=“(”<exp>“)” <op>::=+|-|*|/ q 7 Specifiche dei Linguaggi di Programmazione Specifiche dei Linguaggi di Programmazione n Vocabolario: L’insieme delle parole o simboli che possono essere utilizzate per formare frasi del linguaggio n Specifiche dei Linguaggi di Programmazione n Sara’ poi necessario conoscere la semantica cioe’ il significato delle frasi del linguaggio Specifiche dei Linguaggi di Programmazione Specifiche dei Linguaggi di Programmazione Infine, per utilizzare correttamente un linguaggio occorre conoscerne anche la pragmatica cioe’ come usare il linguaggio (ad esempio quali frasi e’ opportuno usare a seconda del contesto). n Specifiche dei Linguaggi di Programmazione n n Per un Linguaggio di Programmazione e’ necessario dare: q la sintassi q e la semantica. Noto il vocabolario, non e’ detto che tutte le frasi composte con parole del vocabolario siano corrette; a questo punto infatti intervengono le regole grammaticali, cioe’ la sintassi. In realta’ la specifica dell’insieme dei programmi del Linguaggio e’ data in due fasi: q q A) si definisce, attraverso una grammatica libera da contesto, un soprainsieme dei programmi del Linguaggio, B) all’interno di questo insieme si definiscono alcuni vincoli contestuali che solo i programmi corretti o ben formati verificano. 8 Specifiche dei Linguaggi di Programmazione n Allora dividiamo in Specifiche dei Linguaggi di Programmazione Commenti: sintassi del linguaggio la descrizione fornita nella prima fase (ossia le regole della grammatica), q semantica statica del linguaggio la descrizione dei vincoli contestuali fornita nella seconda fase in quanto si descrivono proprieta’ dei programmi osservabili staticamente, cioe’ prima dell’esecuzione; q semantica dinamica del linguaggio la descrizione dell’effetto dell’esecuzione q q Specifiche dei Linguaggi di Programmazione Commenti n Esistono tre principali tipi di descrizione di un L. di P., di cui solo i primi due forniti in genere per tutti i linguaggi: n I tutorial, che cercano di presentare efficacemente le varie caratteristiche del linguaggio anche attraverso esempi. n I reference manual, tipicamente organizzati sulla sintassi, che contengono la sintassi formale data tramite BNF piu’ una descrizione a parole il piu’ possibile precisa e non ambigua della semantica. n Le definizioni formali, in genere indirizzate agli specialisti. Automi n n n Sono l’altro principale modello per generare linguaggi formali Sono esempi di elaboratori semplici ma espressivi, realizzano “molte” computazioni Schema di computazione q q q q Ø Ø Un programma non ha difficoltà ad usare regole così formali per generare frasi. Analogamente un programma potrebbe analizzare una frase per ricostruire la sua struttura e verificare se essa è tra quelle ammesse dalla grammatica. Un parser è un programma che ha questa funzioni di analizzatore sintattico Operazioni di parser sono comuni nei compilatori e negli interpreti Linguaggi Formali n Automi (l’altro modello) Automi a stati finiti (ASF) n n ASF puo’ trovarsi in un numero finito di stati diversi come conseguenza di qualche ingresso, che puo’ variare su un insieme finito di valori. Esegue una transizione da uno stato all’altro attraverso una funzione di cambiamento di stato input: in In con I insieme finito output: in Om con O insieme finito algoritmo: consuma gli input e produce gli output 9 Automi a stati finiti n Schematizzando: q q q Ø Ø Ø Ø Input: sequenza (finita) di simboli Output: sequenza (finita) di simboli Computazione: si parte da uno stato iniziale si consuma un simbolo di input sulla base di input e stato corrente si produce un simbolo di output e ci si muove su un nuovo stato si procede finchè non si raggiunge uno stato finale Automi a stati finiti Commenti q q Commenti n Si riescono a rappresentare q semplici trasformazioni di sequenze q riconoscitori di linguaggi regolari (Tipo 3) Non si riesce a rappresentare q se in una espressione, le parentesi sono bilanciate q riconoscitori di linguaggi context-free (Tipo 2) n Perche’? n Automi a pila (PDA:Push Down Automata) n Perche’ il numero di stati è fissato a priori non consente di trattare quei problemi che richiedono un “conteggio” di elementi senza limite fissato es.: dipendetemente dal numero degli stati, un ASF può riconoscere n n q Automi a stati finiti un insieme finito di stati (possibili configurazioni interne) q input ed output: sequenze (finita) di simboli q una struttura dati di supporto dove scrivere e leggere informazioni temporanee, detta a pila q L={c,acb,aacbb,aaacbbb} ma poi non riconosce “aaaacbbbb”... rendere il numero degli stati infinito non è praticabile Automi a pila (PDA:Push Down Automata) Automi a pila (PDA:Push Down Automata) n n E’ un elaboratore con Struttura a pila q q q detta anche stack o lista FILO (First in Last Out) si inseriscono dei simboli (operazione PUSH) si leggono in ordine inverso (operazione POP) Funzionamento: q si parte da uno stato iniziale si accetta un simbolo di input sulla base di q si ottiene q usando una funzione di transizione di stato si procede finchè non si raggiunge uno stato finale q q n n q (input, stato, elementi in testa della pila) (output,nuovo stato,nuova testa della pila) 10 Automi a pila (PDA:Push Down Automata) n La pila come struttura d’appoggio per memorizzare informazioni parziali q es.: per contare il numero dei simboli Automi a pila (PDA:Push Down Automata) Commenti: n Si riesce a rappresentare n trasformazioni di sequenze tenendo traccia dei simboli q q Automi a pila (PDA:Push Down Automata) Commenti: n Non si riesce a rappresentare q n La macchina di Turing n E’ un elaboratore con q riconoscitori di linguaggi context-dependent (Tipo 1) q Perche’? q q q Principio di funzionamento q q q q q si parte da uno stato iniziale sul nastro è scritto il valore dell’input si legge il simbolo sotto la testina sulla base di (input,stato) si ottiene (valore da scrivere sul nastro,nuovo stato,movimento LEFT/RIGHT) si procede finchè non si raggiunge uno stato finale un insieme finito di stati (possibili configurazioni interne) una nastro illimitato con testina: n la struttura dati di supporto, la pila, ha un accesso limitato, che si limita alla testa della pila es.: come accedere al primo degli elementi inseriti? bisogna disporre di una struttura dati più flessibile La macchina di Turing invertire una sequenza di simboli riconoscitori di linguaggi context-free (Tipo 2) n read/write dell’elemento sotto la testina, spostamento testina LEFT/RIGHT La macchina di Turing n Il nastro come luogo dove q q trasformare l’input in output scrivere valori d’appoggio, risultati intermedi 11 La macchina di Turing La macchina di Turing Commenti n si ha sufficiente espressività per agire sul nastro in ogni modo Commenti q q q n copiare pezzi di nastro da una parte all’altra sovrascrivere pezzi di nastro “cercare” sotto-sequenze di simboli su e giù per il nastro ma in linea di principio è ottenibile... Automi: commenti n La macchina di Turing è un formalismo potente (si riconoscono frasi di linguaggio di tipo 1) ma non semplicemente utilizzabile per algoritmi complessi tuttavia la funzione di cambiamento di stato diventa brevemente molto complessa! q n n Ogni automa realizza una funzione F che parte da un dato input per arrivare ad un output finale Esiste una gerarchia tra gli automi q q Automi: commenti n ogni FSA è anche un PDA (che non usa la pila) ogni PDA è anche una TM (usa il nastro come pila) Gli automi a stati finiti sono ragionevolmente semplici da gestire q n Sono in effetti uno strumenti usato nell’ingegneria del S/W q Automi: commenti n Al contrario i PDA sono in genere un po’ complicati q n produrre, leggere, analizzare per specificare e progettare semplici sistemi come interfacce grafiche, piccoli agenti, etc.. Linguaggi formali n La traduzione sono importanti per la loro rilevanza concettuale Turing ha notevoli relazioni con gli H/W moderni q q q lettura/scrittura simboli vs. l/O da RAM/ROM transitare stato vs. cambiare stato CPU agire sul nastro vs. accedere alla memori 12 La traduzione n n La traduzione Un traduttore e’ un programma che effettua la traduzione automatica da un linguaggio ad un altro L’automazione di tale processo richiede la conoscenza della grammatica formale che definisce il linguaggio di programmazione: q n data una frase f1 nel linguaggio formale L1 (linguaggio sorgente), il traduttore costruisce una frase f2 del linguaggio formale L2 (linguaggio destinazione) la frase f2 deve “corrispondere” a f1 La traduzione: compilatori perche’ La traduzione: compilatori perche’ comprendere i linguaggi esistenti q comprendere cosa significa progettare un linguaggio q comprendere come interagiscono i linguaggi e i calcolatori q comprendere metodi e tecniche molto note q La traduzione: compilatori perche’ q Perchè studiare l’implementazione di compilatori, visto che pochissima gente scrive compilatori? i compilatori sono un esempio di sistemi complessi n che possono essere specificati formalmente n che possono essere implementati efficientemente soltanto combinando teoria e pratica n che richiedono una elevata ingegnerizzazione q molti formati di dati sono dei linguaggi formali (XML) e le tecniche di compilazione sono usate per leggerli/scriverli/elaborarli La traduzione-fine n n La traduzione automatica dipende sia dalla sintassi che dalla semantica dei linguaggi sorgente e destinazione La teoria dei linguaggi formali si occupa di definire la sintassi di un linguaggio, ma non la sua semantica q n stabilisce quali stringhe appartengono al linguaggio e quali stringhe non appartengono A volte e’ opportuno distinguere il lessico dalla sintassi complessiva del linguaggio 13 La traduzione n Lessico: elementi lessicali di un linguaggio = le parole ammesse dal linguaggio esempio: lessico del linguaggio Java = tutti gli identificatori, le costanti intere, le costanti reali, le parole chiave, stringhe tra doppi apici, ecc. le parole ammesse sono chiamate token con questa distinzione, il lessico stabilisce le regole di costruzione dei token (ognuno dei quali e’ una sequenza di caratteri), mentre la restante parte della sintassi stabilisce le regole di costruzione delle frasi del linguaggio (ogni frase e’ una sequenza di token) q q q La traduzione La traduzione n n Specifica dei token lessicali: le espresisoni regolari Una espressione regolare e’ un insieme di stringhe su un certo alfabeto che e’ possibile definire attraverso alcune regole q q Simbolo: per ogni simbolo a dell’alfabeto, l’espressione regolare a rappresenta la stringa a del linguaggio Alternativa date due espressioni regolari M ed N, l’espressione regolare M | N rappresenta l’unione delle stringhe rappresentate da M e da N Struttura di un traduttore n q q q Concatenazione date due espressioni regolari M ed N, l’espressione regolare MN rappresenta il linguaggio le cui stringhe sono concatenazioni di stringhe rappresentate da M e da N Epsilon l’espressione regolare e rappresenta il linguaggio la cui unica stringa è la stringa vuota “ “ Ripetizione data una espressione regolare M, l’espressione regolare M* rappresenta il linguaggio le cui stringhe sono la concatenazioni di zero o più stringhe di M Analisi lessicale (scanner) n Identificatori delle variabili e delle costanti, parole chiave del linguaggio, operatori, commenti Verifica se sono rispettate le regole di aggregazione dei caratteri dell’alfabeto in simboli del linguaggio q n q q q n analisi lessicale analisi sintattica analisi semantica sintesi dell’output n n Analisi lessicale (scanner) Si riconoscono gli elementi del linguaggio: q n Due fasi : analisi dell’input, n L’analisi lessicale e sintattica dipendono soltanto dalla sintassi del linguaggio sorgente L’analisi semantica dipende sia dalla sintassi che dalla semantica del linguaggio sorgente La sintesi dell’output dipende sia da sintassi e semantica del linguaggio sorgente che da quelle del linguaggio destinazione n in genere si utilizzano dei programmi chiamati generatori di analizzatori lessicali che, a partire dalla specifica formale del lessico, generano automaticamente l’analizzatore lessicale corrispondente Il sorgente è convertito da una sequenza non strutturata di caratteri in una sequenza di token Esempio q printf è una parola chiave rintf non ha senso 14 Analisi sintattica (parser) n n n n n Esamina la struttura sintattica del programma, cioe’ lo riconosce come stringa del linguaggio di programmazione Individua una sequenza di regole di produzione la cui applicazione permette di generare il programma. n Riconosce le stringhe del linguaggio, considerando come simboli dell’alfabeto terminale, i token individuati prima Individua eventuali errori sintattici. Costruisce un albero sintattico che rappresenta la struttura del programma. Analisi semantica e sintesi dell’output n Analisi sintattica (parser) Data la complessita’ della definizione della semantica di un linguaggio, le fasi di analisi semantica dell’input e di sintesi dell’output non possono essere automatizzate, come invece avviene per le fasi di analisi lessicale e analisi sintattica q pertanto, i moduli che realizzano le fasi di analisi semantica e sintesi dell’output devono essere realizzati manualmente (non esistono strumenti di generazione automatica ) In genere si utilizzano dei programmi (generatori di analizzatori sintattici) che, a partire dalla specifica della sintassi, generano automaticamente l’analizzatore sintattico corrispondente. Analisi semantica e sintesi dell’output n Analisi semantica: Effettua controlli ed assegna una interpretazione alle frasi individuate nel precedente livello di analisi q n Controllo di compatibilità di tipi ecc. Sintesi dell’output puo’ essere guidata dalla sintassi, cioe’ la decomposizione del processo di traduzione delle frasi del linguaggio sorgente sulla base della struttura sintattica di tali frasi Analisi semantica e sintesi dell’output n n n Per la sintesi dell’output e’ possibile estendere i formalismi di specifica della sintassi al fine di catturare alcuni aspetti “semantici” in particolare, vengono utilizzate le grammatiche ad attributi, che estendono le grammatiche non contestuali mediante azioni semantiche, collegate alle regole di produzione della grammatica tramite le azioni semantiche, e’ possibile specificare la fase di traduzione in parallelo alla specifica della sintassi del linguaggio sorgente 15