Grammatiche Grammatiche libere da contesto Grammatiche regolari

Slides:



Advertisements
Presentazioni simili
Premessa: si assume di aver risolto (correttamente
Advertisements

Algoritmi e Strutture Dati
Ricorsione in SQL-99.
Alberi binari Definizione Sottoalberi Padre, figli
Introduzione ai grafi Grafo diretto e non diretto
Il problema del minimo albero ricoprente in un grafo non cooperativo
Algoritmi e Strutture Dati (Mod. B)
Estendere i linguaggi: i tipi di dato astratti
Sommario Nelle lezioni precedenti abbiamo introdotto tutti gli elementi che formano un particolare tipo di linguaggio logico, denominato linguaggio predicativo.
Sintassi (prima parte)
Traduttore diretto dalla sintassi (seconda parte)
Parser Bottom UP Giuseppe Morelli. Parser Bottom UP Un parser Bottom Up lavora costruendo il corrispondente albero di parsing per una data stringa di.
Linguaggi Regolari e Linguaggi Liberi
Traduzione guidata dalla sintassi
Generazione di Codice Intermedio
Sistemi di Lindenmayer
INSIEMI INSIEME= gruppo di oggetti di tipo qualsiasi detti elementi dell’insieme. Un insieme è definito quando viene dato un criterio non ambiguo che.
1 Linguaggi di Programmazione - elementi Corso di Laurea in Informatica (AA 2005/2006) Gabriella Pasi e Carla Simone
1 Il punto di vista Un sistema è una parte del mondo che una persona o un gruppo di persone, durante un certo intervallo di tempo, sceglie di considerare.
RB-alberi (Red-Black trees)
Alberi binari di ricerca
Algoritmi e Strutture Dati
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Macchine non completamente specificate
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 19/05/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 15/05/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Il problema del minimo albero ricoprente in un grafo con archi privati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Alberi AVL (Adelson-Velskii.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Alberi AVL (Adelson-Velskii.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e strutture dati
-calcolo Vogliamo studiare le problematiche relative al meccanismo di chiamata di funzione (eg differenze fra binding statico e dinamico) in isolamento.
Processi e scambio di messaggi Lidea di base è che un processo può evolvere un passo alla volta. Le interazioni del processo col mondo esterno sono limitate.
Esercizi su alberi binari
Unità Didattica 2 I Linguaggi di Programmazione
mosaic manipola oggetti primitivi (ruota e unisci) regole:
Fondamenti di Informatica1 Linguaggi Classificati rispetto alle caratteristiche principali: –potere espressivo che influenza lo stile di programmazione.
INSIEMI NUMERABILI L’analisi matematica introduce il concetto di insieme numerabile come insieme i cui elementi possono essere “contati” ossia che possiede.
LINGUAGGI DI PROGRAMMAZIONE
Prof. Cerulli – Dott.ssa Gentili
Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua.
Lo sviluppo del software e i linguaggi di programmazione
Introduzione ai linguaggi formali e alle stringhe
Algoritmi e Strutture Dati
Grammatiche, Linguaggio e Automi R. Basili TAL - a.a
Alberi CORDA – Informatica A. Ferrari Testi da
Alberi Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice. Alberi liberi : grafi non orientati connessi e senza cicli. Alberi.
MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche
Capitolo 13 Cammini minimi: Ordinamento topologico Algoritmi e Strutture Dati.
Olimpiadi di Informatica 2010 Giornate preparatorie
Esecuzione di un Programma [P] Una computazione corrisponde al tentativo di dimostrare, tramite la regola di risoluzione, che una formula (goal) segue.
Linguaggi di programmazione: panoramica Linguaggi di programmazione ad alto livello: – –Programmazione procedurale – –Programmazione object oriented –
Semantica dinamica Vogliamo definire una funzione che associ ad ogni termine corretto del mio linguaggio di programmazione un valore. Questa associazione.
public class volume { public static void main (String[] args) { final double bott_vol =2.0; final double latt_vol = 0.355; int bott_num = 4; int latt_num.
Grammatiche non contestuali (1)
Macchine di Turing (1) Il modello di base ha un controllo finito, un nastro di input diviso in celle e una testa di lettura che esamina una cella alla.
Capitolo 13 Cammini minimi Algoritmi e Strutture Dati.
Corso di Laboratorio primo modulo Introduzione all'uso di un sistema operativo. Introduzione all'uso della shell (bash). Java – –Introduzione – –Tipi di.
Espressioni regolari (1)
Capitolo 13 Cammini minimi: Bellman e Ford Algoritmi e Strutture Dati.
La codifica dei numeri.
Automi temporizzati.
In generale, con il termine di grammatica si intende un formalismo che permette di definire un insieme di stringhe mediante l’imposizione di un particolare.
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
Flusso di Costo Minimo Applicazione di algoritmi: Cammini Minimi Successivi (SSP) Esercizio 1 Sia data la seguente rete di flusso, in cui i valori riportati.
Linguaggi e Grammatiche Alfabeto : insieme non vuoto di elementi detti simboli A = { a, b, c } Stringa : sequenza di simboli di un alfabeto ab abc abcab.
Linguaggi, stringhe e alfabeti. Linguaggi e grammatiche Un linguaggio è un sistema di comunicazione tra persone che permette di trasmettere informazioni.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Transcript della presentazione:

Grammatiche Grammatiche libere da contesto Grammatiche regolari Potenza delle grammatiche libere e regolari Struttura di frase: Alberi di derivazione

Esempio dei numeri interi Si consideri il linguaggio per dei numeri interi, costituito cioè da tutte le sequenze di simboli che rapresentano numeri interi: es: +38 -567 +456

Esempio di Grammatica Vediamo come può essere definita una grammatica per i numeri: <{0,1,2,3,4,5,6,7,8,9,+,-}, {cifra, nat, int} , int, {cifra::=0|1|2|3|4|5|6|7|8|9, nat ::= cifra cifra*, int::= (+|-) nat | nat} > Attenzione alla notazione

Definizione di Grammatica Una grammatica è una quadrupla <,V,sV,P> dove:  = insieme finito di terminali (alfabeto) V = insieme finito di non terminali (categorie sintattiche o grammaticali) s = simbolo iniziale (categoria sintattica del linguaggio) P = {i ::= e | iV, e EV} insieme finito di produzioni. Le produzioni hanno una parte sinistra (i) e una parte destra separate da una freccia ( oppure ::=) Le grammatiche regolari hanno produzioni in cui a sinistra del ::= c’è un simbolo non terminale a destra un’espressione regolare su V.

Espressioni regolari   EA ( è un’espressione regolare) Espressioni regolari su un alfabeto A: EA   EA ( è un’espressione regolare) aA, a EA (a è un’espressione regolare) e, e’ EA, ee’ EA (giustapposizione) e, e’ EA, e | e’ EA (alternativa) e  EA, [e] EA (opzione) e  EA, e*  EA (chiusura)

Significato delle produzioni di una grammatica Fondamenti di Programmazione 16/04/2017 Significato delle produzioni di una grammatica Le produzioni di una grammatica permettono di derivare insiemi di sequenze di simboli terminali, definite dall’espressione a destra A=V:   EA S()= {e} a, S(a)={a} aV, S(a)=S(e) a::=e  P Una sola produzione e, e’ EA, ee’ EA S(ee’)= S(e) S(e’ )= {ss’|sS(e), s’ S(e’)} e, e’ EA, e | e’ EA S(e | e’)=S(e)  S(e’) (1) Nell’ipotesi di una sola produzione per v in P prof. Marco Bellia

Significato delle produzioni di una grammatica -continua Fondamenti di Programmazione 16/04/2017 Significato delle produzioni di una grammatica -continua Le produzioni di una grammatica permettono di derivare insiemi di sequenze di simboli terminali, definite dall’espressione a destra A=V: e  EA, [e]  EA S([e] )= {S(e)}  {e} e  EA, e*  EA S(e*)= {S(e)}*= n≥0 S(e)n S(e)0 = {e}, S(e)1= S(e) , S(e)2= S(ee) S(e)n= S(e ... e) (1) Nell’ipotesi di una sola produzione per v in P } n volte prof. Marco Bellia

Linguaggio di una grammatica Le sequenze che possono essere derivate da s (simbolo iniziale) costituiscono il linguaggio definito dalla grammatica. L(G)= S(s) Esempio: G=<{a,b},{A,B,S},S,{A::=a|aa, B::=bb, S::=AB |BA L(G)=?

L’operatore * L’operatore interessante è * (stella): permette di derivare tutte le sequenze comunque lunghe di simboli della base introduce insiemi infiniti G=<{a,b},{A,S},S,{A::=aa*, S::=Ab | b*}> L(G)=?

Osservazioni La semantica definisce un metodo effettivo di calcolo del linguaggio. generazione dell’insieme anche infinito appartenenza di una sequenza? quando termino? se termino Esercizi: lettura di una grammatica definizione di grammatiche. sottolinguaggi (sottoinsiemi)

Esempio dei numeri Si consideri il linguaggio per dei numeri, costituito cioè da tutte le sequenze di simboli che rapresentano numeri, sia interi che frazionari, rappresenti in virgola fissa e anche in virgola mobile: es: +38 -567 +456.34 -1239.02 +0.289E2

Esempio di Grammatica Vediamo come può essere definita una grammatica per i numeri: <{0,1,2,3,4,5,6,7,8,9,+,-,E,.}, {cifra, nat, int,fract,exp,num} , num, {cifra::=0|1|2|3|4|5|6|7|8|9, nat ::= cifra cifra*, int::= ([+|-]) nat, fract::= int.nat, exp::= fract E int, num::= nat | fract | exp>

Esempio delle espressioni aritmetiche Ci sono molte grammatiche equivalenti per uno stesso linguaggio, ad esempio: <{0,1,2,3,4,5,6,7,8,9,+,-,E,.}, {nat,int fract,exp,num} num, {nat ::= (0|1|2|3|4|5|6|7|8|9) (0|1|2|3|4|5|6|7|8|9)*, int::=(+|-) nat fract::= int.nat, exp::= fract E int, num::= nat | fract | exp> È stato eliminato il non terminale cifra con un peggiorameno della leggibilità della grammatica

Grammatiche regolari Lo studio dei linguaggi e delle grammatiche è argomento di corsi più avanzati noi vediamo solo: le grammatiche Libere da Contesto (LC) che ci permettono di definire la sintassi dei linguaggi di programmazione e le grammatiche regolari incluse in quelle LC. Nelle grammatiche libere da contesto le produzioni possono avere a sinistra della freccia solo un simbolo non terminale. (Gli esempi visti rientrano tutti in questo caso). Le grammatiche regolari (GR) sono LC ed inoltre esiste un ordinamento totale sui non terminali tale che j>i se j compare a destra nella produzione di i cioè i::=e  P  e E {jV| j>i} 

Potenza delle grammatiche Si consideri l’insieme di sequenze su {a,b} costituite da n occorrenze di ‘a’ seguite da altrettante occorrenze di ‘b’, cioè: {anbn | n≥0} Si definisca una grammatica G tale che L(G)={anbn | n≥0}

Grammatiche libere da contesto Le produzioni delle grammatiche LC sono così definite P = {i ::=  | iV,   (V)+} senza nessuna restrizione sui non terminali a destra, come invece avveniva per le GR (ordinamento). L’alternatore(|), la [] e l’operatore * non sono ammessi nelle produzioni.A destra c’è una concatenazione di simboli (terminali e non). Le produzioni possono essere ricorsive: Non è possibile definire un ordinamento su V. Si dimostra (non in questo corso) che le grammatiche LC includono le GR.

Caratteristiche delle grammatiche LC La produzione S := a S b |  è una produzione corretta ma... Cosa significa? Quale linguaggio denota L(S)? Il significato delle produzioni e quindi il linguaggio definito dalla grammatica possono essere ottenuti con la relazione *.

Esempi di derivazioni S  aSb aSb  aaSbb aaSbb aaaSbbb S ::= aSb e ancora... S ::= aSb produzione derivazioni S  e aSb  ab aaSbb  aabb S ::= e produzione derivazioni continua1

Esempi di * S * S S * aSb aSb * aaaSbbb S *  S * ab S * aabb S * aaabbb Ottenuto per induzione sui passi di *

Linguaggio definito da una grammatica G Sia G = <,V,S,P>, A V Definiamo linguaggio L(A) denotato in G da A: L(A) = {  * | A * } Sia G = <,V,S,P>, Definiamo linguaggio L(G) denotato dalla grammatica L(G) = L(s) = { * | s * } Esempio: G=<{a,b}, {S}, S, {S::=a S b, S::= e }> allora L(G) = L(S) = {anbn | n≥ 0}

Esempio delle espressioni aritmetiche La seguente grammatica definisce il linguaggio delle espressioni aritmetiche: <{0,1,2,3,4,5,6,7,8,9,*,+,-,/ ,(,)}, {Int,Op,Exp}, Exp, {Int::= 0|1|2|3|4|5|6|7|8|9, Op::= (+|-|*|/), Exp::= Int, Exp::= Exp Op Exp, Exp::=(Exp)}, >

Struttura delle frasi Ad esempio L(G) contiene: {3+4*6,78-34,... ecc.} Le sequenze di simboli non rappresentano la struttura della frase che è invece espressa nella grammatica. Non c’è traccia in una sequenza di simboli di come sia stata derivata. Quali sono i modi per derivare una sequenza? Vediamo alcuni esempi di derivazioni diverse.

Struttura delle frasi Ad esempio 3+4*6 potrebbe essere stata derivata: Exp  Exp Op Exp  Int Op Exp  Int Op Exp Op Exp  3 Op Exp Op Exp  3 + Exp Op Exp 3 + Int Op Exp  3 + 4 Op Exp  3 + 4 * Exp 3 + 4 * Int  3 + 4 * 6 oppure Exp  Exp Op Exp  Exp Op Int  Exp Op Exp Op Int  Int Op Exp Op Int  Int Op Int Op Int3 Op Int Op Int 3 + Int Op Int  3 + 4 Op Int 3 + 4 * Int  3 + 4 * 6

Definizione di grafo Un grafo è una coppia di insiemi <N,E> dove N sono i nodi e E gli archi. I nodi sono individuati da un’etichetta Gli archi sono coppie <s,t> o triple <s,t,c> dove s e t sono nodi (di partenza e di arrivo se il grafo è orientato) mentre c è l’eventuale etichetta.

Alberi Un albero è un grafo orientato in cui ogni nodo ha al più un arco entrante e non ci sono cicli. Esiste un unico nodo detto radice che non ha archi entranti. I nodi che non hanno archi uscenti sono detti foglie. I nodi B1, B2, ..., Bk raggiunti da un arco uscente dal nodo A sono detti figli di A mentre A è detto padre di B1, B2, ..., Bk Si possono definire: la profondità di un albero data dal cammino più lungo dalla radice ad una foglia. l’ampiezza data dal massimo numero di archi uscenti da un nodo (ovvero dal numero massimo di figli per ogni nodo)

Esempio radice intermedi * foglie Gli alberi sono utilissimi per strutturare le informazioni. Nella sintassi servono per rappresentare la struttura della frase, che altrimenti si perde nella sequenza di simboli. radice + 3 * 4 6 Exp Op Int intermedi foglie

Visita e frontiera di un albero La visita di un albero è un operazione in cui si esaminano tutti i nodi dell’albero: l’accesso è dalla radice scendendo sui figli esistono vari tipi di visite (non le trattiamo) a seconda dell’ordine con cui si esaminano i nodi. La frontiera di un albero è costituita dai nodi foglia dell’albero.

Alberi di derivazione sintattica parse tree Le produzioni di una grammatica possono essere utilizzate per costruire un albero, detto albero di derivazione sintattica (ADS), per rappresentare ogni frase del linguaggio. Sia G = <,V,s,P> e sia A= <N,E> un ADS derivante da G. Valgono le seguenti proprietà: N    V in particolare: la radice ha etichetta s le foglie sono etichettate su  i nodi intermedi su V - {s} Per ogni nodo non foglia con etichetta a, compresa la radice, se esiste un arco <a,b>  esiste a::= b  P

Costruzione degli ADS a partire da una grammatica G Sia G = <,V,s,P> una grammatica, si inizia costruendo un albero che ha un solo nodo etichettato con s cioè A=<N,E> tali che N={s},E={} Finchè la frontiera di A contiene un simbolo non terminale a si sceglie una produzione a::=x1…xkP, (si noti che xi   V) e si riscrive l’albero con un albero avente al posto del nodo foglia a un nodo intermedio a con k nodi figli, in particolare xi N e <a, xi>  E.

Produzioni come riscritture di alberi In sostanza si parte costruendo la radice e si espande l’albero sostituendo le foglie etichettate con simboli non terminali con sottoalberi corrispondenti ad una produzione che abbia il simbolo non terminale a sinistra. Gli alberi che rappresentano frasi del linguaggio sono quelli che hanno sulla frontiera solo simboli terminali. La frase del linguaggio rappresentata da un albero si ottiene concatenando etichette della sua frontiera.

Esempio    ....  * Exp Exp Exp Op Op Int 3 Exp Exp Op Op + Int Int 4 + 3 * 6 Exp Op Int 3 Exp Op Int .... 

Grammatiche ambigue Una grammatica è ambigua se esiste più di un albero di derivazione sintattica con una stessa frontiera. Es: la grammatica delle espressioni aritmetiche definita precedentemente. 3+4*6 l’albero rappresenta 3+(4*6) 4 + 3 * 6 Exp Op Int 3+4*6, l’albero rappresenta (3+4)*6 Exp Exp Exp Op Exp Exp Op Int * Int Int + 6 3 4