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