1. LFC
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi
Linguaggi formali e compilazione
Corso di Laurea in Informatica
A.A. 2008/2009
2. LFC
Linguaggi formali e compilazione
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e compilazione
Alfabeti, stringhe e linguaggi
3. LFC
Linguaggi formali e compilazione
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e compilazione
Alfabeti, stringhe e linguaggi
4. LFC
Informazioni generali sul corso
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi
Sito web:
http://algo.ing.unimo.it/people/mauro/dida/2008-
09_LFC/
Ricevimento (nel semestre di lezione): Mercoledì h
14.30-16.00, ufficio del docente
Materiale didattico: si veda il sito web
Modalità d’esame: scritto (orale solo su richiesta)
CFU assegnati: 6
5. LFC
Obiettivi formativi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
Due obiettivi principali (che si riflettono nel titolo linguaggi
stesso dell’insegnamento).
Acquisizione di nozioni di base sulla teoria dei
linguaggi formali e degli automi:
una delle prime teorie “solide” sulle quali si è
sviluppata l’Informatica come disciplina scientifica;
fornisce basi per la costruzione di traduttori;
è utile in svariati altri campi dell’Informatica.
Sviluppo di conoscenze sui compilatori e della
capacità di realizzare semplici parser e traduttori.
6. LFC
Argomenti trattati
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi
Alfabeti, stringhe e linguaggi formali
Grammatiche e automi
Analisi lessicale e analisi sintatica (parsing)
Traduzione e compilazione
7. LFC
Linguaggi formali e compilazione
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e compilazione
Alfabeti, stringhe e linguaggi
8. LFC
Parsing
Un parser (analizzatore sintattico) è uno strumento Nozioni introduttive
che, in termini generali, consente di dare struttura ad Informazioni generali
Parsing, traduzione e
compilazione
una descrizione lineare. Alfabeti, stringhe e
linguaggi
La struttura viene conferita in accordo a regole
espresse generalmente da una grammatica.
Alcuni esempi:
passare dalla descrizione testuale di un grafo ad una
sua rappresentazione in liste di adiacenze;
dato un insieme di pagine web, creare un grafo che
ne descriva la struttura dei collegamenti;
dato un documento XML, creare una
rappresentazione dell’informazione in esso
contenuta (detta information set) da rendere
disponibile all’applicazione client.
In tutti i casi, il parsing include un’analisi della
correttezza formale (well-formedness) delle stringhe
da analizzare.
9. LFC
Traduzione
Nozioni introduttive
Informazioni generali
Il parsing opera esclusivamente al livello di sintassi Parsing, traduzione e
compilazione
(cioè della corretta formazione delle frasi). Alfabeti, stringhe e
linguaggi
Un traduttore è un programma che effettua la
traduzione automatica da un linguaggio ad un altro.
Nella traduzione (e quindi nella compilazione) è
importante che venga mantenuto il significato
(semantica) delle frasi.
Che cosa sia il “significato” di una frase dipende però
pesantemente dall’ambito applicativo:
per un’espressione aritmetica/logica il significato è
un valore numerico/di verità;
per un programma il significato è il “comportamento
indotto” nella macchina (semantica operazionale);
esempi da altri campi (Musica, Chimica, ...).
10. LFC
Linguaggi formali
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
Pur esistendo “tentativi” di applicazione di metodi compilazione
Alfabeti, stringhe e
informatici alla traduzione di scritti in linguaggio linguaggi
naturale, il successo della traduzione automatica è
limitato all’ambito dei linguaggi formali.
Esempi di linguaggi formali sono
linguaggi di programmazione, come C, C++ e Java;
linguaggi di descrizione e/o manipolazione di dati,
come XML e SQL;
in ambito non informatico, il linguaggio della Musica
e quello della Chimica (genericamente intesi).
È formale un linguaggio che obbedisce a precise
regole formali (formalismi) di composizione delle
frasi.
11. LFC
Compilazione ed interpretazione
Nozioni introduttive
Il più importante caso di traduzione in ambito Informazioni generali
Parsing, traduzione e
informatico è la compilazione di linguaggi di alto compilazione
Alfabeti, stringhe e
livello in linguaggi macchina (o comunque linguaggi linguaggi
molto più vicini alla macchina).
Un compilatore per un linguaggio L e una macchina
M è un traduttore che, data una stringa
(programma) in linguaggio L, produce un programma
equivalente nel linguaggio macchina di M.
Un’alternativa alla compilazione è l’interpretazione
diretta dei programmi.
Nel caso dell’interpretazione di L su M, un
programma in esecuzione su M prende direttamente
in input frasi in linguaggio L e le “esegue”,
producendo in output il risultato dell’esecuzione.
12. LFC
Compilazione ed ed interpretazione
Nozioni introduttive
Informazioni generali
Compilazione ed esecuzione Parsing, traduzione e
compilazione
Alfabeti, stringhe e
Programma P in
Compilatore linguaggi
Programma
codice eseguibile
di L per il
P in linguaggio L
sul computer M
computer M
CPU di M Risultati
Input per P
Interpretazione pura
Programma
P in linguaggio L
Interprete del
Risultati
linguaggio L
Input per P
13. LFC
Soluzioni “miste”
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi
Compilazione ed intepretazione in Java
Programma P in
Programma Compilatore codice intermedio
P in Java Java (bytecode)
JRE per
Risultati
computer M
Input per P
In tutti i casi (anche nell’interpretazione “pura”), le
tecniche di compilazione giocano un ruolo
fondamentale.
14. LFC
Linguaggi compilati e linguaggi interpretati
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
In linea di principio, di uno stesso linguaggio L Alfabeti, stringhe e
linguaggi
potrebbero esistere implementazioni compilate ed
implementazioni interpretate.
Nella pratica, i linguaggi “si specializzano” in una
sola delle due alternative, anche (o forse soprattutto)
perché compilazione ed interpretazione offrono
vantaggi e svantaggi complementari, che sono poi
riflessi nei linguaggi stessi.
C, C++, Fortran e Pascal sono linguaggi compilati.
I linguaggi dinamici sono linguaggi interpretati.
Il caso di Java.
15. LFC
Schema organizzativo di un compilatore
Programma sorgente
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Analisi lessicale Alfabeti, stringhe e
linguaggi
Analisi sintattica (parsing)
Gestione della
Generazione del codice intermedio Gestione degli errori
Symbol table
Ottimizzazione del codice
Generazione del codice
Codice oggetto
Schema tratto dal quot;Dragon bookquot; (1977)
16. LFC
Breve descrizione delle fasi
Nozioni introduttive
Analisi lessicale Un analizzatore lessicale, detto anche Informazioni generali
Parsing, traduzione e
scanner, raggruppa i caratteri della compilazione
Alfabeti, stringhe e
descrizione lineare in token, cioè “oggetti” linguaggi
significativi per la successiva analisi
sintattica. Esempi di token sono i numeri, gli
identificatori e le parole chiave di un
linguaggio di programmazione.
Analisi sintattica Un analizzatore sintattico, detto anche
parser, organizza gruppi di token in strutture
sintattiche. Un semplice esempio di tale
organizzazione è il passaggio da una
sequenza di numeri, operatori aritmetici e
parentesi (che sono token) ad una
espressione (che è una struttura sintattica)
rappresentata come albero.
17. LFC
Breve descrizione delle fasi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
Generazione del codice intermedio A partire dalla compilazione
Alfabeti, stringhe e
struttura prodotta dal parser, un generatore linguaggi
di codice intermedio produce una sequenza
di istruzioni in una sorta di linguaggio
intermedio che, pur molto semplice, non
coincide con il linguaggio macchina.
Ottimizzazione del codice In questa fase operano
algoritmi che manipolano il programma
scritto in codice intermedio in modo da
ottenere un programma equivalente che (in
genere) utilizza una minore quantità di
spazio e/o che “gira” più velocemente .
18. LFC
Breve descrizione delle fasi
Nozioni introduttive
Informazioni generali
Generazione del codice In questa fase il programma in Parsing, traduzione e
compilazione
codice intermedio (eventualmente Alfabeti, stringhe e
linguaggi
ottimizzato) viene trasformato in codice
macchina. Qui vengono prese le decisioni
sull’allocazione dei dati in memoria, il codice
di accesso e l’utilizzo dei registri.
Gestione della tabella dei simboli È un’attività che
accompagna tutte le fasi della compilazione.
La tabella dei simboli è essenzialmente un
dizionario che registra tutti i nomi usati nel
programma e le informazioni ad esso
associate (esempio, un identificatore e il suo
tipo).
19. LFC
Breve descrizione delle fasi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Gestione degli errori Durante una qualunque delle fasi si Alfabeti, stringhe e
linguaggi
possono verificare degli errori, che devono
essere individuati e segnalati con opportuni
messaggi diagnostici. Gli esempi più
facilmente comprensibili di errore riguardano
le fasi di analisi lessicale (ad esempio, un
identificatore che contiene un carattere non
ammesso) e di analisi sintattica (ad esempio
un’espressione aritmetica mal formata). In
generale se vengono rilevati errori non viene
prodotto il codice oggetto.
20. LFC
Linguaggi formali e compilazione
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e compilazione
Alfabeti, stringhe e linguaggi
21. LFC
Nozione di alfabeto
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Un alfabeto è un insieme finito di simboli, detti anche Alfabeti, stringhe e
linguaggi
caratteri.
I simboli di un alfabeto verranno scriti usando il font
typewriter.
Esempi di alfabeti importanti:
I set di caratteri ASCII e UNICODE;
B = {0, 1}, l’alfabeto binario;
D = {A, C, G, T}, l’alfabeto del DNA.
La lettera greca Σ indicherà un generico alfabeto.
Le lettere finali dell’alfabeto latino (x, y e z)
indicheranno simboli generici di un alfabeto.
22. LFC
Stringhe
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Una stringa, su un dato alfabeto Σ, è una sequenza Alfabeti, stringhe e
linguaggi
di simboli (giustapposti) di Σ.
010110 e 1111 sono esempi di stringhe sull’alfabeto
binario.
AACGTCCTA è una stringa sull’alfabeto D.
Linguaggi formali e compilazione è una
stringa sull’alfabeto ASCII.
Conviene considerare anche la stringa vuota, cioè
una stringa composta da nessun carattere.
La stringa vuota è definita su qualsiasi alfabeto.
23. LFC
Stringhe
Nozioni introduttive
Informazioni generali
Per indicare stringhe generiche si utilizzeranno (a Parsing, traduzione e
compilazione
seconda dei casi) sia le ultime lettere dell’alfabeto Alfabeti, stringhe e
linguaggi
latino (X , Y , Z ), in maiuscolo, sia le prime lettere
dell’alfabeto greco (α, β, γ), in minuscolo.
La lettera verrà riservata per denotare la stringa
vuota.
Una stringa formata da un solo carattere è un
oggetto diverso dal carattere stesso.
In tutti i casi nei quali possano sorgere ambiguità, ad
esempio nel caso di stringhe composte da un solo
carattere, le stringhe verranno rinchiuse fra doppi
apici.
“0” è quindi un oggetto diverso da 0.
24. LFC
Stringhe
Nozioni introduttive
Il numero di caratteri che compongono una stringa X Informazioni generali
Parsing, traduzione e
compilazione
è detto lunghezza di X . Alfabeti, stringhe e
linguaggi
La lunghezza di una stringa X si indica spesso con
|X | (si noti che consideriamo solo stringhe di
lunghezza finita).
Se |X | = n, i singoli caratteri della stringa verranno
individuati da Xi , i = 1, . . . , n.
Date due stringhe X e Y , la stringa Z ottenuta
giustapponendo i caratteri di Y a quelli di X è detta
concatenazione di X e Y .
Ad esempio se X = Linguaggi e Y = formali,
risulta XY = Linguaggiformali.
Se |X | = n e |Y | = m, risulta |XY | = n + m.
25. LFC
Stringhe
Nozioni introduttive
La concatenzione è associativa, ovvero Informazioni generali
Parsing, traduzione e
compilazione
(XY )Z = X (YZ ). Alfabeti, stringhe e
linguaggi
La concatenazione non è commutativa: posto
X = mela e Y = verde, risulta
XY = melaverde = verdemela = YX .
La potenza k -esima di una stringa X , indicata con
X k , è la stringa ottenuta concatenando X con se
k
stessa k ≥ 0 volte: X k =XX . . . X .
Si pone poi X 0 = .
La riflessione di una stringa X = X1 X2 . . . Xn è la
stringa X R = Xn Xn−1 . . . X0 ottenuta rovesciando i
caratteri di X .
26. LFC
Stringhe
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
X è sottostringa di Y se esistono Z e W linguaggi
(eventualmente vuote) tali che: Y = ZXW .
Se almeno una fra Z e W è diversa dalla stringa
vuota, allora X è sottostringa propria di Y .
Se Z è vuota, X è un prefisso di Y .
Se W è vuota, X è un suffisso di Y .
La notazione Xi..j verrà utilizzata per indicare la
sottostringa di X formata dai caratteri dall’i-esimo al
j-esimo.
27. LFC
Esempi
Nozioni introduttive
Informazioni generali
Se X = 01, risulta X 3 = 010101, se
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
X = Linguaggi, allora linguaggi
X 2 = LinguaggiLinguaggi
Se X = Linguaggi formali e compilatori,
allora
Y = formali è una sottostringa propria di X ,
Z = Linguaggi è un prefisso di X ,
W = compilatori è un suffisso di X ,
X10..17 =“ formali”.
Si noti, nell’ultimo esempio, l’uso degli apici,
necessario per evitare le possibili ambiguità dovute
alla presenza di un spazio ad inizio stringa.
Se X = Roma, allora X R = amoR.
28. LFC
Linguaggi
Nozioni introduttive
Un linguaggio su un dato alfabeto Σ è un insieme di Informazioni generali
Parsing, traduzione e
stringhe su Σ. compilazione
Alfabeti, stringhe e
linguaggi
Un linguaggio può essere specificato in molti modi
(ne vedremo almeno 4).
Per enumerazione: consiste semplicemente
nell’elencare le stringhe che fanno parte del
linguaggio.
Mediante regole della teoria degli insiemi: consiste
nel descrivere matematicamente come sono fatti gli
elementi dell’insieme (in questo caso le stringhe).
Mediante un formalismo generativo.
Mediante algoritmi di riconoscimento.
Gran parte di questo corso sarà dedicato alle
grammatiche e agli automi riconoscitori, che
rappresentano gli ultimi due modi di specifica.
29. LFC
Esempi
Nozioni introduttive
Dato Σ, l’insieme vuoto Φ e l’insieme di tutte le Informazioni generali
possibili stringhe su Σ (denotato da Σ∗ ) sono Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi che rivestiranno particolare importanza. linguaggi
I seguenti sono esempi di linguaggi definiti su B:
L1 = {00, 01, 10, 11};
L2 = { , 0, 1, 00, 01, 10, 11, 000, 001,
010, 011, 100, 101, 110, 111};
L3 = {00, 010, 0110, 01110, . . .};
L4 = {0, 1, 00, 11, 000, 010, 101, 111, . . .}.
Gli stessi linguaggi, sopra definiti per enumerazione,
possono essere specificati in modo più sintetico
mediante il “linguaggio” della teoria degli insiemi:
∈ B∗
= {X : |X | = 2};
L1
∈ B∗
= {X : |X | ≤ 3};
L2
∈ B∗ : ∃k ≥ 0 t.c. X = 01k 0};
= {X
L3
∈ B∗ : X = X R }.
= {X
L4
30. LFC
Esempi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
L1 ed L2 sono esempi di linguaggi finiti, mentre L3 ed Alfabeti, stringhe e
linguaggi
L4 sono linguaggi infiniti.
Naturalmente i linguaggi infiniti rivestono maggior
interesse sia dal punto di vista teorico sia da quello
applicativo.
Vediamo ora alcuni linguaggi sull’alfabeto
Σ = {a, b, c} che ci saranno utili nel seguito:
∈ Σ∗ = an bm , n, m ≥ 0};
= {X
L5 :X
∈ Σ∗ = an bn , n ≥ 0};
= {X
L6 :X
∈ Σ∗ = bn c n , n ≥ 0};
= {X
L7 :X
∈ Σ∗ = an bn c m , n, m ≥ 0};
= {X
L8 :X
∈ Σ∗ = an bm c m , n, m ≥ 0}.
= {X
L9 :X
31. LFC
Operazioni con i linguaggi
Nozioni introduttive
Innanzitutto, poiché i linguaggi sono insiemi (di Informazioni generali
Parsing, traduzione e
stringhe), sono definite su di essi tutte le operazioni compilazione
Alfabeti, stringhe e
insiemistiche: unione, intersezione, differenza, ecc. linguaggi
Si definisce concatenamento (o concatenazione) di
due linguaggi L ed L , definiti su un alfabeto Σ, il
linguaggio L = L L le cui stringhe sono il
concatenamento di una stringa di L e una di L :
L = {X ∈ Σ∗ : ∃Y ∈ L , ∃Z ∈ L t.c. X = YZ }
La seguente ricorrenza permette di definire, per ogni
m ≥ 0, la potenza n-esima di un linguaggio L:
L0 = { }
Ln = Ln−1 L, n > 0.
32. LFC
Operazioni con i linguaggi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
La chiusura (riflessiva) di L è il linguaggio compilazione
Alfabeti, stringhe e
linguaggi
∞
∗
Ln = L0 ∪ L1 ∪ L2 ∪ . . .
L=
n=0
Inciso: è ora chiaro perché l’insieme di tutte le
possibili stringhe su un alfabeto Σ viene indicato con
Σ∗ . Per ogni intero i, Σ∗ contiene infatti tutte le
stringhe di lunghezza i costituite dalla
concatenazione di caratteri di Σ; tale insieme
coincide proprio con l’insieme di tutte le possibili
stringhe su Σ.
33. LFC
Operazioni con i linguaggi
Nozioni introduttive
La chiusura (non riflessiva) di L è definita come Informazioni generali
Parsing, traduzione e
L+ = LL∗ , ovvero: compilazione
Alfabeti, stringhe e
linguaggi
∞
Ln = L1 ∪ L2 ∪ . . .
+
L=
n=1
La riflessione di un linguaggio L su un alfabeto Σ è il
linguaggio:
LR = {X ∈ Σ∗ : ∃Y ∈ L t.c. X = Y R }.
Il numero di stringhe di un linguaggio finito verrà
indicato con la notazione |L|. Se L è infinito risulta
|L| = N, con ciò intendendo che L ha la stessa
cardinalità dell’insieme dei numeri naturali.
34. LFC
Esempi
Nozioni introduttive
Informazioni generali
Parsing, traduzione e
compilazione
Alfabeti, stringhe e
linguaggi
L5 L6 = {X ∈ Σ∗ : X = an bm , n, m ≥ 0, n = m}
L5 ∪ L6 = L5
L5 ∩ L6 = L6
L6 {c}∗ = L8
L6 L7 = {X ∈ Σ∗ : X = an bm c k , n, k ≥ 0, m = n + k }
L{ } = { }L = L
|L1 | = 4, |L2 | = 15, |L5 | = |L6 | = |L7 | = |L8 | = N