ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari

Pagina creata da Filippo Raimondi
 
CONTINUA A LEGGERE
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
ITIS-LS “Francesco Giordani” Caserta

 prof. Ennio Ranucci
 a.s. 2019-2020

 Linguaggi ed espressioni regolari
 Javascript

 Linguaggi formali

Espressione regolare un esempio di grammatica

 Automi ed espressioni regolari

 -1-
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
ITIS-LS “Francesco Giordani” Caserta
Anno scolastico: 2019/2020
Classe 3^ sez.B spec. Informatica e telecomunicazioni
Data:
Numero progressivo dell’esercizio: es1 (espressioneRegolareData.html)
Versione: 1.0
Programmatore/i:
Sistema Operativo: Windows 10
Compilatore/Interprete: Browser - Javascript
Obiettivo didattico:
 Espressioni regolari
Obiettivo del programma:
 Validare la data
File espressioneRegolareData.html

 function validate(val)
 { var expr = /^\d{2}\/\d{2}\/\d{4}$/;
 if (! expr.test(val)) {
 window.alert("Formato data non valida");
 return false;
 }
 return true;
 }

Date (dd/mm/yyyy): 

 -2-
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
ITIS-LS “Francesco Giordani” Caserta
Anno scolastico: 2019/2020
Classe 3^ sez.B spec. Informatica e telecomunicazioni
Data:
Numero progressivo dell’esercizio: es2 (espressioneRegolareMail.html)
Versione: 1.0
Programmatore/i:
Sistema Operativo: Windows 10
Compilatore/Interprete: Browser - Javascript
Obiettivo didattico:
 Espressioni regolari
Obiettivo del programma:
 Validare la mail
File espressioneRegolareMail.html

 function validate(val)
 { var expr =/^[\w\-\.]+@[\w\-\.]+\.[a-z]+$/;
 if (! expr.test(val)) {
 window.alert("Formato mail non valida");
 return false;
 }
 return true;
 }

Mail (prova@dominioII.dominioI): 

 -3-
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
Un tipo diverso di algebra: le espressioni regolari. (fonte lidimatematici)
Immaginiamo di avere a disposizione un insieme di simboli a nostra scelta, ad esempio:
A = {a, b, c}
lo chiameremo alfabeto.
L’idea è di costruire un modello formale che ci consenta di generare sequenze di questi simboli,
come ad esempio “aaa” oppure “aabb” o ancora, “acac“.
Le sequenze di simboli sono dette stringhe.
Per fare ciò, abbiamo bisogno di definire un insieme di operazioni ammesse, in modo tale da
costruire stringhe a partire dai singoli simboli dell’insieme A dell’alfabeto. Queste operazioni
saranno anch’esse rappresentate da simboli. Simboli speciali, però, perché indicano azioni.
I simboli delle operazioni ammesse, che chiameremo operatori, sono quindi diversi dai simboli
degli elementi dell’alfabeto.
E’ una distinzione importante, perché il nostro processo di costruzione non ha alcun vincolo, siamo
perfettamente liberi di inventare i simboli e di attribuirli ai vari operatori o elementi dell’alfabeto.
E’ una nostra scelta.
La prima operazione che vogliamo è sicuramente di poter scrivere serie di simboli, la chiameremo
concatenazione, e la indichiamo con un punto ‘.’:
a.a = aa
decidiamo anche che, per comodità, questo operatore può essere omesso, in modo da rendere più
leggibile l’operazione.
La seconda operazione che vogliamo è la possibilità di scegliere alternativamente un simbolo
oppure l’altro, chiameremo questo operatore unione, e lo indicheremo con il +. Quindi, ad
esempio, usando concatenazione ed unione otteniamo:
a(a+b) = aa oppure ab
Infine, definiamo un terzo operatore che consente di concatenare zero o più volte, a nostra scelta,
una stringa, lo indichiamo con *:
a* = aaaaaaaa …
E’ un operatore molto particolare, che va sotto il nome di Stella di Kleene.
Manca ancora un elemento importantissimo, la stringa vuota, che di norma viene indicata con la
lettera greca ε (epsilon). La stella di Kleene ammette infatti anche nessuna ripetizione del simbolo,
quindi la stringa vuota ε è un risultato ammesso dell’espressione a*.
a* = ε, a, aa, aaa, …
Soffermiamoci per ora a giocare con le espressioni regolari, per costruire insiemi di stringhe a
partire dai simboli dell’alfabeto e gli operatori che abbiamo definito.
Ad esempio, l’espressione regolare:
a(b+c)b*
ammette come soluzione questo insieme di stringhe:
{ab, ac, abb, abbb…., acb, acbbb …}
Le espressioni regolari sono una vera e propria algebra, detta Algebra di Kleene.
E’ grazie al matematico americano Stephen Kleene se, oggi, abbiamo gli strumenti matematici che
ci consentono di comunicare con i calcolatori elettronici attraverso strutture di linguaggio
specifiche, dette linguaggi formali.

 -4-
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
Le espressioni regolari sono strumenti che consentono di rappresentare, in modo estremamente
sintetico, intere famiglie di stringhe dalla struttura anche piuttosto complessa.
E’ possibile costruire un’automa in grado di riconoscere stringhe aventi struttura specifica.
Teorema:
Per ogni espressione regolare esiste un automa a stati finiti in grado di riconoscere il linguaggio
generato.
Un automa è un insieme di stati, archi e simboli che etichettano gli archi. Gli automi hanno due
stati speciali, lo stato iniziale e lo stato finale. A partire da una espressione regolare, si costruisce
un automa a stati finiti che ne riconosce il linguaggio applicando pochissime regole.
Lo stato iniziale si distingue per essere l’una con una freccia entrante e nessuno stato precedente,
e quello finale per una doppia bordatura.

La stringa vuota è riconosciuta da uno stato che è, contemporaneamente, iniziale e finale. Quindi ε
è riconosciuta da:

La concatenazione di due porzioni di espressione regolare si costruisce connettendo gli automi che
le riconoscono con un arco, su cui è stato posto l’elemento corrispondente del vocabolario.
Quindi, ad esempio, la stringa ab è riconosciuta da:

La Stella di Kleene si realizza ponendo un arco che rientra all’ingresso stesso della porzione di
espressione da ripetere indefinitamente, ad esempio, questo automa riconosce la stringa (ab)*:

 -5-
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
Notate che, siccome l’espressione (ab)* è soddisfatta anche dalla stringa vuota ε, l’automa ha uno
stato iniziale che è anche finale.
Infine, l’unione si riconosce ponendo due archi uscenti con il corrispondente elemento
dell’alfabeto. Ad esempio, a+b è riconosciuta da questo automa:

L’automa che riconosce l’espressione regolare a(b+c)b* è quindi:

L’insieme di stringhe generato dalle espressioni regolari e riconosciuto dai relativi automi a stati
finiti è anche detto linguaggio. Automi ed espressioni regolari sono oggetti matematici dotati di un
formalismo ben preciso e di potenzialità espressive caratteristiche.
Il matematico inglese Alan Turing, oggi è ritenuto a buon diritto uno dei padri, se non il padre e
fondatore della scienza dell’informazione.
Come tanti geni è stato incompreso in vita e, per il fatto di essere gay, addirittura osteggiato.
Turing nasce il 23 giugno 1912 a Paddington nei dintorni di Londra.
Si laurea nel 1934 a Cambridge, distinguendosi già per i propri solidissimi contributi in meccanica
quantistica, probabilità e logica.
Nel 1936 inventa una astrazione matematica del moderno calcolatore: la Macchina di Turing.
Il genio inglese supera le limitazioni degli automi a stati finiti intuendo che il problema sta nella
mancanza di memoria.
Immagina una macchina astratta che, come gli automi a stati finiti, è dotata di un alfabeto di
simboli, un insieme di stati e una funzione di transizione ma, per la prima volta in assoluto, a
questi elementi aggiunge una memoria interna, un nastro, da cui legge e scrive simboli
dell’alfabeto. Le operazioni condotte dalla macchina di Turing sono assimilabili, a tutti gli effetti,
alle istruzioni dei microprocessori moderni.
Nel suo lavoro di dottorato (1938) in Logica, Teoria dei numeri e Algebra, Turing dimostra che la
sua macchina è universale, cioé equivalente a tutti i possibili tipi di macchina calcolatrice. In altri
termini, qualsiasi programma di computer scritto in passato, presente o futuro, è convertibile in
un suo equivalente eseguibile con la Macchina di Turing.
Turing si distingue durante la seconda guerra mondiale per aver saputo svelare il segreto di
Enigma, il codice di crittografia usato dai nazisti per le proprie comunicazioni. Il suo contributo si
rivela determinante per la vittoria degli alleati. Alla fine della seconda guerra mondiale Turing si
dedica a tempo pieno allo sviluppo della moderna scienza dei calcolatori, e svolge un ruolo di

 -6-
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
primissimo piano nella definizione dei principi teorici sottostanti la programmazione, le reti
neurali, e l’intelligenza artificiale.
ITIS-LS “Francesco Giordani” Caserta
Anno scolastico: 2019/2020
Classe 3^ sez.B spec. Informatica e telecomunicazioni
Data:
Numero progressivo dell’esercizio: es3 (GeneraStringhe.html)
Versione: 1.0
Programmatore/i:
Sistema Operativo: Windows 10
Compilatore/Interprete: Browser - Javascript
Obiettivo didattico:
 Espressioni regolari, generare stringhe in modo casuale e validarle
Obiettivo del programma:
 genera e valida stringa
File GeneraStringhe.html

/*
 Funzione in puro Javascript per generare una stringa random
*/
var stringaDavalidare;
function generateRandomString(iLen)
{
 var stringaRandom = '';
 var sChrs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
 for (var i = 0; i < iLen; i++)
 {
 var randomPoz = Math.floor(Math.random() * sChrs.length);
 stringaRandom += sChrs.substring(randomPoz, randomPoz + 1);
 }
 document.getElementById("result").innerHTML = stringaRandom;
 stringaDaValidare=stringaRandom
 }
function validate()
 { var expr = /a+\w*/i;

 -7-
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
if (! expr.test(stringaDaValidare))
 {
 window.alert("Formato stringa non valida");
 }
 else
 {
 window.alert("Formato stringa valida");
 }
 }

 Stringa random generata:
 
Nota:
var expr = /a(b+c)b*/;
ammette questo insieme di stringhe valide:
{ab, ac, abb, abbb…., acb, acbbb …}

 -8-
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
Informatica e Laboratorio di Programmazione
 linguaggi
 Alberto Ferrari

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
ITIS-LS "Francesco Giordani" Caserta prof. Ennio Ranucci a.s. 2019-2020 - Linguaggi ed espressioni regolari
Ingegneria dei
 linguaggi formali Sistemi Informativi

o linguaggi formali
 o linguaggi di programmazione
 o linguaggi di marcatura (es. HTML, Latex)
 o interazione uomo macchina (es. ricerca Google)
 o linguaggi nel software di sistema
 o compilatori
 o interpreti …

 http://www.ce.unipr.it/~aferrari/codowood

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 descrizione di un linguaggio Sistemi Informativi

o grammatica
 o quali frasi sono corrette?
 o lessico
 o analisi lessicale (sequenze corrette di simboli dell’alfabeto (token))
 o sintassi
 o analisi sintattica (sequenze corrette di token)
o semantica
 o cosa significa una frase corretta?
 o attribuzione del significato
o pragmatica
 o come usare una frase corretta?
o implementazione
 o come eseguire una frase corretta rispettando la semantica?

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 Sistemi Informativi

linguaggi formali

GRAMMATICA

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 alfabeti e stringhe Sistemi Informativi

o alfabeto Σ: insieme di simboli
o stringa s: sequenza di simboli di Σ
 o s ∈ Σ*, insieme di tutte le stringhe
 o ε: stringa vuota
 o |s|: lunghezza della stringa s
o linguaggio L ⊆ Σ*
 o sottoinsieme di tutte le stringhe possibili
 o grammatica: regole formali per definire le “stringhe ben formate” di L
o esempio: numeri romani da 1 a 1000
 o alfabeto {I, V, X, L, C, D, M} + regole ...

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 concatenazione di stringhe Sistemi Informativi

o operazione di concatenazione •
 o proprietà associativa: (x • y) • z = x • (y • z)
 o non commutativa: x • y ≠ y • x
 o Σ* chiuso rispetto alla concatenazione: Σ* • Σ* → Σ*
o potenza
 o xn = x • x • x • x … (n volte)
o elemento neutro ε
 o stringa vuota, ∀ x ∈ Σ*, ε • x = x • ε = x

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 operazioni sui linguaggi Sistemi Informativi

o L1 ed L2 linguaggi su Σ* (due insiemi di stringhe)
o unione: L1 ∪ L2 = {x ∈ Σ* : x ∈ L1 ∨ x ∈ L2}
o intersezione: L1 ∩ L2 = {x ∈ Σ* : x ∈ L1 ∧ x ∈ L2}
o complementazione: = {x ∈ Σ* : x ∉ L1}
o concatenazione o prodotto: L1 • L2 = {x ∈ Σ* : x = x1 • x2, x1 ∈ L1, x2 ∈ L2}
o potenza: Ln = L • Ln-1, n≥1; L0 = {ε} per convenzione
 o concatenazione di n stringhe qualsiasi di L
o stella di Kleene: L* = ∪ Ln, n = 0..∞
 o concatenazione arbitraria di stringhe di L

L*: chiusura riflessiva e transitiva di L rispetto a •

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 definizione dei linguaggi Sistemi Informativi

o approccio algebrico
 o linguaggio costruito a partire da linguaggi più elementari, con operazioni su
 linguaggi
o approccio generativo
 o grammatica, regole per la generazione di stringhe appartenenti al linguaggio
o approccio riconoscitivo
 o macchina astratta o algoritmo di riconoscimento, per decidere se una stringa
 appartiene o no al linguaggio

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 Sistemi Informativi

un esempio di grammatica

espressioni regolari - regex

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 espressioni regolari Sistemi Informativi

o dato un alfabeto Σ, chiamiamo espressione regolare
 una stringa r sull'alfabeto Σ ∪ {+, *, (, ), •, Ø} tale che:
 o r = Ø: linguaggio vuoto; oppure
 o r ∈ Σ: linguaggio con un solo simbolo; oppure
 o r = s + t: unione dei linguaggi L(s), L(t); oppure
 o r = s • t: concatenazione dei linguaggi L(s), L(t); oppure
 o r = s*: chiusura del linguaggio L(s)
 o (con s e t espressioni regolari; simbolo • spesso implicito)

 esempio Σ = {a, b}: a • (a + b)* • b

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 espressioni regolari Sistemi Informativi

o una espressione regolare (regular expression) è una sequenza di simboli
 che identifica un insieme di stringhe
o esistono regole condivise fra i vari linguaggi relative alle regex ☺
o i vari linguaggi utilizzano notazioni diverse per rappresentare le stesse
 espressioni regolari 
o le espressioni regolari possono definire tutti e soli i linguaggi regolari
 o nella gerarchia di Chomsky la classe dei linguaggi generati da grammatiche di tipo 3
 o riconosciuti da automi a stati finiti
o espressioni regolari nei linguaggi di programmazione
 o prima implementazione PERL '80

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 regex – classi di caratteri Sistemi Informativi

o [...] per includere uno qualsiasi dei caratteri in parentesi
o singoli caratteri o intervalli di caratteri adiacenti
 o [A-Z] = qualsiasi lettera maiuscola
 o [a-zABC] = qualsiasi lettera minuscola oppure A, B, o C
o [^...] per escludere uno qualsiasi dei caratteri in parentesi
 o [^0-9] = qualsiasi carattere non numerico
o simboli speciali per identificare classi di caratteri
 o \d = numerico, equivale a [0-9]
 o \s = [ \t\r\n\f]
 o \w = [0-9a-zA-Z_]
 o \D = non numerico, equivale a [^0-9]

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 regex – caratteri speciali Sistemi Informativi

o . per un carattere qualsiasi
 o A.B riconosce la stringa AoB, AwB, AOB ecc.
o \ escape, per sequenze speciali o caratteri speciali
 o \? cerca il ?
o ^ corrisponde all'inizio del testo
o $ corrisponde alla fine del testo
o | per alternativa tra due espressioni (unione)
 o A|B = carattere A o carattere B
o (...) per raggruppare sotto-espressioni
 o ga(zz|tt)a trova sia gazza che gatta

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 regex - ripetizioni Sistemi Informativi

o {...} per specificare il numero di ripetizioni
 o \d{3,5} sequenze di almeno tre cifre, al massimo cinque
o * zero o più occorrenze di un’espressione
 o (ab)* riconosce ab, abab, la stringa vuota, ma non riconosce abba
o + una o più occorrenze
 o (ab)+ non riconosce la stringa vuota
o ? zero o al più una occorrenza (parte opzionale)
 o (ab)? riconosce ab ma non abab

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 regex - esempi Sistemi Informativi

o codice fiscale:
 o ^[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]$
 o dominio:
 o ^[\w\-]+\.(it|com|org|net|eu|mobi)$
o e-mail:
 o ^[\w\-\.]+@[\w\-\.]+\.[a-z]+$
o file: ^.+\.zip$
o data: ^\d{2}/\d{2}/\d{4}$

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 html & JavaScript - regex Sistemi Informativi

function validate(val) {
 var expr = /^\d{2}\/\d{2}\/\d{4}$/;
 if (! expr.test(val)) {
 window.alert("Wrong date format");
 return false;
 }
 return true;
}

 Date (dd/mm/yyyy): 
 
 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 regex in Python Sistemi Informativi

o modulo standard re
o le espressioni regolari vengono compilate in oggetti RegexObject
 o gli oggetti RegexObject contengono metodi per varie operazioni
 o match()
 o determina se la RE corrisponde all'inizio della stringa (None se non trovata)
 o search()
 o ricerca tutte le posizioni corrispondenti alla RE all'interno di una stringa (None se non trovata)
 o findall()
 o trova tutte le sottostringhe corrispondenti alla RE, e le restituisce in una lista
 o…

 >>> import re
 >>> p = re.compile('ab*')

 https://docs.python.it/html/lib/re-syntax.html

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 regex - esempio Sistemi Informativi

import re
ro = re.compile('[a-z]+') # uno o più caratteri alfabetici minuscolo

#f = ro.match('sistemi09informativi')
f = ro.search('09sistemi09informativi')

if f:
 #group() restituisce la stringa corrispondente alla RE
 print('f.group()',f.group())
 #start() restituisce la posizione iniziale della corrispondenza
 print('f.start()',f.start())
 #end() restituisce la posizione finale della corrispondenza
 print('f.end()',f.end())
 #span() restituisce una tupla contenente la (start, end) posizione della corrispondenza
 print('f.span()',f.span())
else:
 print('no match')

l = ro.findall('09sistemi09informativi')
print(l)

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 regex - esempio Sistemi Informativi

import re

# Remove anything other than digits
phone = 'Phone: +39 0521 905708'
num = re.sub(r'\D', "", phone)
print("Phone Num : ", num)

# Hide password
string = 'Password: mypwd'
hidden = re.sub(r'^(Password:\s*).+$', r'\1(******)', string)
print(hidden)

# part of a match
address = 'Please mail it to alberto.ferrari@unipr.it.com'
match = re.search(r'([\w.-]+)@([\w-]+).([\w]+)',address)
print(match.group(0))
print(match.group(1))
print(match.group(2))
print(match.group(3)) https://docs.python.org/3/library/re.html

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 Python - regex Sistemi Informativi

import re

print('match only upper and lowercase letters, numbers, and underscores')
patterns = r'^[a-zA-Z0-9_]*$'
text1 = 'sistemi_informativi'
if re.search(patterns,text1):
 print('ok')

print('minimum eight characters, at least one uppercase letter, one lowercase letter and
one number')
patterns = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$'
pwd = input('password ')
while not re.search(patterns,pwd):
 pwd = input('password ')

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 regex - esempi Sistemi Informativi

def is_alphanumeric(string):
 characherRegex = re.compile(r'[^a-zA-Z0-9.]')
 string = characherRegex.search(string)
 return bool(string)

def is_mailAddress(string):
 characherRegex = re.compile(r'^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$')
 string = characherRegex.search(string)
 return bool(string)

def is_CF(string):
 # characherRegex = re.compile(r'^[a-z]{6}[0-9]{2}[a-z][0-9]{2}[a-z][0-9]{3}[a-z]$')
 characherRegex = re.compile(r'^[A-Z]{6}'
 r'[0-9LMNPQRSTUV]{2}[ABCDEHLMPRST]{1}[0-9LMNPQRSTUV]{2}'
 r'[A-Z]{1}[0-9LMNPQRSTUV]{3}[A-Z]{1}$')
 string = characherRegex.search(string)
 return bool(string)

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 Sistemi Informativi

approccio generativo

grammatiche di Chomsky

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 grammatiche di Chomsky Sistemi Informativi

o grammatica G = < VT, VN, P, S >
o VT : alfabeto finito di simboli terminali
o VN : alfabeto finito di simboli non terminali
 o (variabili, categorie sintattiche)
o V = VT ∪ VN
o P: insieme di produzioni
 o ∈ P si indica con α → β
 o α ∈ V
 o β ∈ V
o S ∈ VN: assioma
o L(G): insieme delle stringhe di simboli terminali ottenibili con finite operazioni di
 riscrittura

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 albero delle frasi Sistemi Informativi

• la radice dell'albero è l'assioma
• ogni nodo ha tanti figli, quante sono le
 produzioni applicabili
• ogni figlio è una forma di frase
• le foglie sono stringhe del linguaggio
• primo esempio:
 – G1 = 
 – P1 = {F → ab, F → aFb}
• secondo esempio:
 – G2 = 
 – P2 = {F → ab, F → aG, G → Fb}

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 esempio grammatica context-free Sistemi Informativi

o G = 
 (1) E → I
 (2) E → E + E
 (3) E → E * E
 (4) E → E - E
 (5) E → -E
 (6) E → (E)
 (7) I → a
 (8) I → b
 (9) I → Ia
 (10)I → Ia
o … genera espressioni aritmetiche con operatori +,*,- unario e binario e simboli a b

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
esempio grammatica context- Ingegneria dei
 Sistemi Informativi
 sensitive

o G = 
 (1) S → aSBC
 (2) S → aBC
 (3) CB → BC
 (4) aB → ab
 (5) bB → bb
 (6) bC → bc
 (7) cC → cc
o … genera il linguaggio {anbncn : n≥1}
o per generare aaabbbccc:
 o applicare 1-1-2-3-3-3-4-5-5-6-7-7

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 classificazione di Chomsky Sistemi Informativi

o tipo 0: grammatiche ricorsivamente enumerabili (RE)
 o αAβ → γ (non limitate)
o tipo 1: grammatiche contestuali (CS)
 o αAβ → αγβ
o tipo 2: grammatiche non contestuali (CF)
 o A → γ
o tipo 3: grammatiche regolari (REG)
 o A → aB, oppure A → b, oppure A → ε
 o coincide con classe dei linguaggi definiti da regex

 A, B ∈ VN; a, b ∈ VT; α, β, γ ∈ V*

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 Sistemi Informativi

linguaggi di programmazione

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 linguaggio di programmazione Sistemi Informativi

o notazione formale per definire algoritmi
 o algoritmo: sequenza di istruzioni per risolvere un dato problema in un tempo finito
o ogni linguaggio è caratterizzato da:
 o sintassi
 o semantica

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 sintassi Sistemi Informativi

• insieme di regole formali per
 scrivere frasi ben formate
 (programmi)
• lessico
 – parole riservate, operatori, variabili,
 costanti ecc. (token)
• grammatiche non contestuali (...)
 espresse con notazioni formali:
 – Backus-Naur Form
 – Extended BNF
 – Diagrammi sintattici

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 semantica Sistemi Informativi

o attribuisce un significato alle frasi (sintatticamente corrette) costruite
 nel linguaggio
o una frase può essere sintatticamente corretta ma non aver alcun
 significato
 o soggetto – predicato – complemento
 o “La mela mangia il bambino”
 o “Il bambino mangia la mela”
o avere un significato diverso da quello previsto...
 o GREEK_PI = 345

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
semantica Ingegneria dei
 Sistemi Informativi
 nei linguaggi di programmazione

o correttezza sui tipi
 o quali tipi di dato possono essere elaborati?
 o quali operatori applicabili ad ogni dato?
 o quali regole per definire nuovi tipi e operatori?
o semantica operazionale
 o qual è l'effetto di ogni azione elementare?
 o qual è l’effetto dell’aggregazione delle azioni?
 o qual è l’effetto dell’esecuzione di un certo programma?

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 linguaggi di basso livello Sistemi Informativi

• più orientati alla macchina
 che ai problemi da trattare
• linguaggi macchina
 – solo operazioni eseguibili
 direttamente dall'elaboratore
 – Op. molto elementari, diverse per
 ogni processore, in formato binario
• linguaggi assembly
 – prima evoluzione
 – codici binari → mnemonici

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 linguaggi di alto livello Sistemi Informativi

• introdotti per facilitare la
 scrittura dei programmi
• definizione della soluzione in
 modo intuitivo
• astrazione rispetto al calcolatore
 su cui verranno eseguiti
• necessaria traduzione in
 linguaggio macchina

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
storia ed evoluzione Ingegneria dei
 Sistemi Informativi
 dei linguaggi di programmazione

https://www.cs.toronto.edu/~gpenn/csc324/PLhistory.pdf
http://www.levenez.com/lang/history.html
http://www.cs.brown.edu/~adf/programming_languages.html

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 paradigmi di programmazione Sistemi Informativi

o definiscono la filosofia e la metodologia con cui si scrivono i programmi
o definiscono il concetto (astratto) di computazione
o ogni linguaggio consente (o spinge verso) l'adozione di un particolare
 paradigma
 o imperativo / procedurale
 o orientato agli oggetti
 o scripting (tipizzazione dinamica, principio DRY - Don't Repeat Yourself)
 o funzionale (funzioni come “cittadini di prima classe”)
 o logico (base di conoscenza + regole di inferenza)

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 linguaggi e paradigmi Sistemi Informativi

o imperativi / procedurali
 o Cobol, Fortran, Algol, C, Pascal
o orientati agli oggetti
 o Simula, Smalltalk, Eiffel, C++, Delphi, Java, C#, VB.NET
o scripting
 o Basic, Perl, PHP, Javascript, Python
o funzionali
 o Lisp, Scheme, ML, Haskell, Erlang
o logici
 o Prolog...

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 paradigma logico - prolog Sistemi Informativi

o il paradigma logico utilizza la logica del primo ordine (clausole di
 Horn) sia per rappresentare sia per elaborare l'informazione
 o assiomi e regole di inferenza
o si descrive la struttura logica del problema piuttosto che il modo di
 risolverlo
 o focus sugli aspetti logici del problema e sul modo migliore per rappresentarli
o prolog (programmation en logique)
 o ideato da Alain Colmerauer negli anni '70
 o linguaggio di programmazione di tipo dichiarativo
 o il programmatore dice cosa fare e non come farlo

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 prolog Sistemi Informativi

o un programma prolog è composto da
 o fatti (affermazioni sempre vere)
 padre(aldo,giovanni).
 padre(aldo,lucia).
 madre(giulia,giovanni).
 madre(giulia,lucia).
 o regole
 genitore(X,Y) :- padre(X,Y).
 genitore(X,Y) :- madre(X,Y).
 fratello_sorella(X,Y) :-
 padre(Z,X), padre(Z,Y), madre(W,X), madre(W,Y), X \= Y.
 o domande (goal)
 ?- padre(luca,pippo) -- YES
 ?- fratello_sorella(X,giovanni) -- X=lucia

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 prolog - query Sistemi Informativi

o per soddisfare un goal (rispondere a una domanda)
 o cerca un fatto che unifica il goal
 o identificare una sostituzione delle variabili che rende identici il fatto e il goal
 o se un fatto viene trovato, il goal è soddisfatto
 o cerca una regola la cui testa (parte sinistra) unifica il goal
 o se la trova, cerca di soddisfare tutti i sotto-goal di cui è composta la regola (parte
 destra)
 o usa una stessa sostituzione delle variabili per tutti i sotto-goal

 https://swish.swi-prolog.org/

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 example: mortal philosophers Sistemi Informativi

consider the following argument:
 all men are mortal.
 Socrates is a man.
 -------------------------
 hence, Socrates is mortal. the two premises can be expressed as a little
it has two premises and a conclusion prolog program:
 mortal(X) :- man(X).
 man(socrates).
 the conclusion can then be formulated as a
 query:
 ?- mortal(socrates).
 Yes

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 paradigma funzionale Sistemi Informativi

o paradigma di programmazione in cui l’operazione fondamentale è l’applicazione di
 funzioni ai loro argomenti
o un programma è una funzione, definita in termini di altre funzioni, che elaborano
 l’input e restituiscono il risultato finale
o le funzioni sono prive di effetti collaterali (no side effects)
 o  funzioni pure
o le funzioni sono trattate come un qualsiasi altro tipo di dato
 o  first class objects
o la ricorsione è la principale struttura di controllo
 o non esistono costrutti iterativi
o high order functions: funzioni che operano su funzioni, che operano su funzioni, …

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 paradigma funzionale - lisp Sistemi Informativi

o lisp (list processing) è un linguaggio di programmazione (John McCarthy 1958) per il
 trattamento di liste e, in generale, di informazione non numerica
 o utilizzato in progetti di intelligenza artificiale
o le liste in lisp sono in realtà alberi con l’informazione (i simboli atomici) memorizzata
 nelle foglie
 o es. la lista (a (b c) d (e f g)) corrisponde all’albero in figura
o un programma lisp è una lista
 o è possibile scrivere programmi che ricevono in input altri programmi

 (defun mylength (lst)
 (cond ((null lst) 0)
 ((atom lst) nil)
 (t (+ 1 (mylength (cdr lst))))))

 funzione mylength che, data una lista lst, ne calcola il numero di elementi

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 esecuzione dei programmi Sistemi Informativi

o linguaggio ad alto livello → passi necessari:
 o compilazione, traduzione in linguaggio macchina
 o collegamento (linking) con librerie di supporto
 o caricamento (loading) in memoria
o programmi compilati: applicati i 3 passi...
 o a tutto il codice; prima dell'esecuzione
o programmi interpretati: applicati i 3 passi...
 o in sequenza, su ogni istruzione; a tempo di esecuzione

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 processo di compilazione Sistemi Informativi

• traduzione da linguaggio alto
 livello a linguaggio macchina
• analisi: lessicale, grammaticale,
 contestuale
• rappresentazione intermedia:
 albero sintattico annotato (AST)
• generazione codice oggetto
 – non ancora eseguibile
 – linker, loader

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 albero sintattico Sistemi Informativi

while b != 0:
 if a > b:
 a = a − b
 else:
 b = b − a
return a

Algoritmo di Euclide per MCD

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 collegamento Sistemi Informativi

o il linker collega diversi moduli oggetto
 o simboli irrisolti → riferimenti esterni
o il collegamento può essere statico o dinamico
 o collegamento statico
 o libreria inclusa nel file oggetto, eseguibile stand-alone
 o dimensioni maggiori, ma possibile includere solo funzionalità utilizzate
 o collegamento dinamico
 o librerie condivise da diverse applicazioni
 o installazione ed aggiornamento unici
 o caricate in memoria una sola volta

 Alberto Ferrari – Informatica e Laboratorio di Programmazione
Ingegneria dei
 caricamento Sistemi Informativi

o il loader carica in memoria un programma rilocabile
 o risolti tutti gli indirizzi relativi (variabili, salti ecc.)
 o caricati eventuali programmi di supporto
o rilocazione statica
 o indirizzi logici trasformati in indirizzi assoluti
o rilocazione dinamica
 o indirizzi logici mantenuti nel programma in esecuzione
 o programma compilato: indirizzamento relativo
 o tramite registro base: locazione in memoria del codice, dei dati e dello stack
 o Memory Management Unit

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Ingegneria dei
 codice gestito Sistemi Informativi

o compilazione in codice intermedio
 o Bytecode (Java), Common Intermediate Lang. (.NET), …
 o Python: compilato per una macchina virtuale (file .pyc), ma in modo trasparente
o esecuzione su una macchina virtuale, che gestisce la memoria (garbage
 collection)
 o Java Virtual Machine, Common Language Runtime, …
 o spesso compilazione “al volo” (Just In Time) in codice nativo

 Alberto Ferrari –Informatica e Laboratorio di Programmazione
Puoi anche leggere