Linguaggi context free. Analizzatori sintattici e alberi di analisi

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Linguaggi context free. Analizzatori sintattici e alberi di analisi"

Transcript

1 Linguaggi context free Analizzatori sintattici e alberi di analisi ( ) * id + id id

2 2 Grammatiche Context Free Una grammatica CF ha produzioni del tipo X α con X N e α (T N)* sono libere dal contesto perché la sostituzione di X è indipendente dal contesto in cui si trova. sempre possibile sostituire X con α βxγ βαγ G β,γ (T N)* permettono di definire linguaggi abbastanza espressivi come i linguaggi di programmazione, le espressioni aritmetiche e le espressioni regolari

3 3 Grammatiche CF espressioni artimetiche numero ( ) + * / T = { numero,(,),+,-,*,/} N = {} La grammatica definisce la struttura delle espressioni aritmetiche in modo ricorsivo Il simbolo terminale numero corrisponde ad un insieme di stringhe che si possono descrivere con una R A partire da simbolo si possono generare tutte le espressioni aritmetiche possibili

4 4 Grammatiche CF - esempio S ab A baa S ba B b A a B bs A as B abb T = {a,b} N = {S,A,B} In genere è complesso descrivere in modo compatto qual è il definito da una grammatica Nel caso dell esempio L(G) è il che in base alla scelta del simbolo di start * S w tale che w ha un ugual numero di a e b A * w tale che w ha un numero di a maggiore di 1 rispetto a quello di b * B w tale che w ha un numero di b maggiore di 1 rispetto a quello di a La dimostrazione si fa per induzione

5 5 Gramatiche CF esempio: dimostrazione Per w = 1 le uniche derivazioni possibili sono A * a e B * b Si suppone che le ipotesi siano vere per w =k-1 * S w può essere ottenuta da S ab dove ab = a w 1 con w 1 = k-1 e B w 1. Per ipotesi di induzione w 1 ha 1 b in più e quindi w ha lo stesso numero di a e b S ba dove ba = b w 1 con w 1 = k-1 e A w 1. Per ipotesi di induzione w 1 ha 1 a in più e quindi w ha lo stesso numero di a e b A w può essere ottenuta da A as dove as = a w 1 con w 1 = k-1 e S w 1. Per ipotesi di induzione w 1 ha lo stesso numero di a e b e quindi w ha 1 a in più A baa dove baa = b w 1 w 2 con w 1 < k-1 w 2 < k-1 e A w 1, A w 2. Per ipotesi di induzione w 1, w 2 hanno 1 a in più delle b e quindi in totale c è 1 a B w in più in w * si procede in modo analogo

6 6 Alberi di analisi (parse tree) La derivazione di ogni stringa appartenente ad un generato da una grammatica CF si può rappresentare con un albero id ( ) + * / * ( ) + id id id (id+id)*id

7 7 Parse tree - definizione I nodi dell albero di analisi sono etichettati dai simboli terminali o non terminali I simboli terminali si trovano nelle foglie I simboli non terminali si trovano nei nodi interni La radice corrisponde al simbolo non terminale di start Ogni nodo interno corrisponde esattamente ad una produzione Il nodo padre è il simbolo non terminale che viene espanso I nodi figli corrispondono ai simboli terminali e non terminali nella parte destra della produzione. I figli sono ordinati nello stesso modo dei rispettivi simboli nella stringa della produzione La struttura di analisi è un albero per il fatto che le produzioni hanno la struttura N α propria delle grammatiche CF La stringa analizzata è leggibile con una visita anticipata dell albero che considera solo i simboli terminali

8 8 Parse tree e derivazioni Un albero sintattico può essere visto come una rappresentazione di una serie di derivazioni α 1 α 2. α n dove α 1 = A N Per ciascuna stringa α i la derivazione che produce α i+1 corrisponde all applicazione di una produzione e quindi all espansione di un sottoalbero in corrispondenza di un simbolo non terminale in α i A tree X j β β=y 1 Y 2 Y r A tree α k-1 X 1 X 2 X j X k X 1 X 2 X j X k produzione usata per derivare α k α k Y 1 Y 2 Y r

9 9 Parse tree - esempio L albero di analisi risultante mostra quali sono le produzioni applicate per ottenere la derivazione α 1 * α n ma non l ordine con cui sono state applicate * () * ( + ) * (id + ) * (id + )* id (id + id)*id * * * * * * ( ) ( ) ( ) ( ) id ( ) id id id id id

10 10 Grammatiche ambigue Una grammatica è ambigua se è possibile costruire più di un albero sintattico per descrivere la derivazione di una stessa stringa appartenente al generazione di ()()() B ( B ) B B B B B B ( B ) ( B B B ( B ) B ) B ( B ) B B B ( B ) ( B B ) B ( B ) B B B ( B ) B ( B ) B ( B ) B grammatica ambigua grammatica non ambigua

11 11 Grammatiche ambigue problemi In genere è complesso provare se una grammatica è ambigua L ambiguità può portare problemi in alcuni casi quando l albero sintattico è usato per interpretare sematicamente la stringa id ( ) + * * id + * id + id * id + id * id id+id*id * + * id + * id + id * id + id * id

12 12 Grammatiche ambigue espressioni 1 + * id * + id OK id id id id KO La grammatica non modella la precedenza degli operatori aritmetici Se si usasse l albero a destra per valutare l espressione il valore non sarebbe corretto (si effettua prima la somma) Il problema può essere risolto con una modellazione più precisa ovvero definendo una grammatica che considera gli operatori in modo diverso Si introducono più categorie sintattiche per raggruppare le singole parti dell espressione nel modo corretto

13 13 Grammatiche ambigue espressioni 2 Si introducono tre categorie sintattiche F fattore: è un singolo operando o espressione fra () T termine: è un prodotto/quoziente di fattori espressioni: è la somma/sottrazione di termini + T T T T T * F T / F F F ( ) id L uso di produzioni del tipo + T impone che i termini siano raggruppati da sinistra a destra (es (1+2)+3 )

14 14 Grammatiche ambigue - espressioni id+id*id derivazione con sostituzione a sinistra + T T + T F + T id + T id + T * F id + F * F id + id * F id + id * id + T T T T T * F T / F F T + T T * F F ( ) id F F id id id OK

15 15 Ambiguità if then else <stmt> if <expr> then <stmt> <stmt> if <expr> then <stmt> else <stmt> <stmt> instruction. La grammatica è ambigua perché if 1 then if 2 then S 1 else S 2 ha due alberi di analisi validi <stmt> <stmt> if <expr> then <stmt> if <expr> then <stmt> else <stmt> 1 if <expr> then <stmt> else <stmt> 1 if <expr> then <stmt> S 2 2 S 1 S 2 2 S 1

16 16 Ambiguità if.. then.. else non ambiguo L ambiguità deriva dal fatto che la grammatica non permette una chiara associazione fra else e gli if presenti La regola normalmente usata è che l else si riferisca all if più vicino <stmt> <stmt_c> <stmt_u> <stmt_c> if <expr> then <stmt_c> else <stmt_c> <stmt_c> instruction. <stmt_u> if <expr> then <stmt> <stmt_u> if <expr> then <stmt_c> else <stmt_u> fra then-else possono solo trovarsi espressioni if-then-else complete <stmt> <stmt_u> if <expr> then <stmt> 1 <stmt_u> if <expr> then <stmt_c> else <stmt_u> 2 S 1 S 2

17 17 Produzioni equivalenti Si possono riscrivere alcune produzioni in modo da ottenere una grammatica * equivalente (che genera lo stesso ) ma in cui le produzioni rispettano tutte alcune strutture liminazione della ricorsione a sinistra Una grammatica è ricorsiva a sinistra se esiste un simbolo non terminale + A per il quale esiste una derivazione A Aα dove α (T N)* Produzione semplice A A α A β A β A A α A genera le stringhe A β α n

18 18 Ricorsione a sinistra La ricorsione a sinistra nelle produzioni si può eliminare semplicemente anche nel caso più generale A A α 1 Aα 2 Aα m A β 1 β 2 β n A β 1 A β 2 A. β n A A α 1 A α 2 A. α m A Per eliminare la ricorsione a sinistra che riguarda derivazioni a uno o più passi esiste comunque un algoritmo L eliminazione della ricorsione a sinistra semplifica la realizzazione di parser che analizzano la stringa da sinistra a destra La ricorsione a destra realizza un espansione delle stringhe verso destra

19 19 Ricorsione a sinistra - esempio Si elimina la ricorsione a sinistra per la grammatica delle espressioni aritmetiche + T T T T * F F F () id α = +T β = T α = *F β = F T + T T FT T * FT F () id

20 20 Fattorizzazione a sinistra La fattorizzazione a sinistra è una trasformazione delle produzioni che genera una grammatica equivalente A α β 1 α β 2 α β n A α A A β 1 β 2 β n Nelle produzioni si assume che β 1, β 2,,β n non abbiano un prefisso in comune Nell ottica di un analisi della stringa da sinistra a destra la fattorizzazione permette una prima decisione con l espansione di α rimandando la scelta di quale espandere fra β 1, β 2,,β n al passo successivo

21 21 Analisi discendente (top-down) L analisi discendente è un algoritmo che mira a costruire l albero di analisi a partire dalla radice, creando i nodi in ordine anticipato L analisi discendente ricorsiva In genere necessità di backtracking quando ci sono più opzioni nella scelta della produzione da applicare, si prova con la prima e si tentano quelle seguenti in caso di fallimento La grammatica definisce un insieme di funzioni mutuamente ricorsive ciascuna delle quali corrisponde ad una delle categorie sintattiche (simboli non terminali) La chiamata di una delle funzioni corrisponde all applicazione di una produzione (espansione del simobolo non terminale) La funzione per il simbolo di start S legge una sequenza di ingresso e produce il puntatore all albero di analisi generato (nullo se la stringa in ingresso non appartiene al e si genera un errore di analisi)

22 22 Analisi top-down - esempio S cad S() A ab a A() w = cad c S() S A d A() c backtracking S A d c S() S A d A() c S A d cad a cad Una grammatica ricorsiva a sinistra può generare un numero infinito di espansioni in un parser top-down ricorsivo (si espande all infinito lo stesso simbolo) b cad a cad

23 23 Analisi top-down procedura di analisi 1 Si tiene traccia del prossimo simbolo della stringa di ingresso che deve essere generato nell albero di analisi Si restringe il numero di produzioni che possono essere applicate per espandere un simbolo non terminale Si espandono i nodi da sinistra a destra un simbolo terminale soddisfa l obiettivo se coincide col prossimo simbolo della sequenza di ingresso un simbolo non terminale soddisfa l obiettivo se lo soddisfa la chiamata alla funzione ricorsiva corrispondente Stringa in ingresso x 1 x 2..x n $ Cursore di ingresso (simbolo di previsione)

24 24 Analisi top-down procedura di analisi 2 Quando si espande una produzione (si chiama la funzione ricorsiva corrispondente) e si genera un simbolo terminale si verifica se corrisponde a quello puntato dal cursore in ingresso Sì si sposta il cursore in avanti e si procede nell analisi No si fallisce e si prova a soddisfare l obiettivo precedente con una nuova ipotesi (backtracking) Se l espansione introduce un simbolo non terminale T si chiama la funzione ricorsiva corrispondente che crea il sottoalbero di analisi che ha T come radice

25 25 Analisi top-down - esempio B ( B ) B Node *B(int *lh, char *s) { } Node *b1,*b2; if(s[*lh]== ( ) { (*lh)++; b1 = B(lh,s); if((s[*lh]== ) )&&(b1!=null)){ (*lh)++; b2 = B(lh,s); if(b2==null) { freetree(b1); return(null); } else } else { } } else return tree4( B,tree0( ( ),b1,tree0( ) ),b2); freetree(b1); return NULL; return tree1( B,tree0( e )); B cursore di ingresso stringa da analizzare B ( ) b 1 b 2

26 26 Analizzatori predittivi Si elimina la ricorsione a sinistra Si fattorizzano a sinistra le produzioni Per alcune grammatiche si può costruire un parser predittivo che non effettua il backtracking durante l analisi Il simbolo terminale di previsione permette sempre di selezionare una sola produzione da applicare a A A α 1 α 2. α n simbolo in ingresso non terminale da espandere produzioni per A

27 27 Analisi predittiva Per riconoscere quale pruduzione si applica si possono usare diagrammi a stati che rappresentano le sequenze nel lato destro delle produzioni Le transizioni fra gli stati possono avvenire in corrispondenza di un simbolo terminale (si legge l input) o non terminale (si chiama la procedura corrispondente) T + T T FT T * FT F () id 0 T T F 8 T 9 T * F T ( ) 17 id T F

28 28 Analisi guidata da tabella Si utilizza esplicitamente uno stack invece delle chiamate ricorsive a + b $ stringa da analizzare simboli della grammatica T N X Y Z $ stack albero sintattico Tabella di analisi Tabella bidimensionale M[A,s] non terminale terminale o $

29 29 Analisi con tabella - funzionamento Lo stack inzialmente contiene il simbolo S Il controllo determina l azione da eseguire in base al simbolo in testa allo stack (X) e al simbolo terminale in ingresso (a) Se X=a=$ il parser termina con successo Se X=a $ il parser estrae X dallo stack e avanza il cursore di ingresso di una posizione (match del simbolo di previsione) X è un simbolo non terminale si controlla M[X,a] Se corrisponde a una produzione si fa il push nello stack degli elementi della stringa a destra X UVW push(w); push(v); push(u) Altrimenti si genera un errore di analisi Se X a e X è un simbolo terminale, allora si genera un errore di analisi

30 30 Analisi con tabella - esempio T + T T FT T * FT F () id id + * ( ) $ T T +T T FT FT T *FT F id () stack input output $ $ T $ T F $ T id $ T $ $ T+ $ T $ T F $ T id $ T $ T F* $ T F $ T id $ T $ $ id+id*id$ id+id*id$ id+id*id$ id+id*id$ +id*id$ +id*id$ +id*id$ id*id$ id*id$ id*id$ *id$ *id$ id$ id$ $ $ $ T T FT F id T +T T FT F id T *FT F id T

31 31 Analisi con tabella costruzione 1 Si considerano due funzioni FIRST(α) è l insieme dei simboli terminali che inziano le stringhe generate a partire da α (T N)* FOLLOW(A) è l insieme dei simboli terminali che possono apparire subito alla destra del simbolo A N in una stringa derivata da S (esiste una derivazione S αaaβ con a T) Calcolo di FIRST(x) x T N se x T allora FIRST(x) = {x} se x N ed esiste la produzione x allora FIRST(x) se x N ed esiste la produzione x Y 1 Y 2 Y k a FIRST(x) se a FIRST(Y i ) e FIRST(Y j ) j=1,..,i-1 (Y 1 Y i-1 ) FIRST(x) se FIRST(Y j ) j=1,..,k In pratica si aggiungono a FIRST(x) gli elementi di FIRST(Y i ) fino a che non si incontra un Y i per il quale FIRST(Y i )

32 32 Analisi con tabella costruzione 2 Calcolo di FIRST(α) α (T N)* con α = Y 1 Y 2 Y k F = FIRST(Y 1 ) for(i=1; i<k && FIRST(Y i );i++) F = F FIRST(Y i+1 ) Calcolo di FOLLOW(A) $ FOLLOW(S) Se esiste la produzione B αaβ tutti i simboli in FIRST(β) eccetto sono in FOLLOW(A) Se esiste una produzione B αa o B αaβ e FIRST(β) contiene allora tutto ciò che è in FOLLOW(A) è anche in FOLLOW(B)

33 33 Analisi con Tabella esempio FIRST/FOLLOW T + T T FT T * FT F () id FIRST() = {(,id} FIRST(T) = {(,id} FIRST(F) = {(,id} FIRST( ) = {+,} FIRST(T ) = {*,} FOLLOW() = {),$} FOLLOW(T) = {),+,$} FOLLOW(F) = {),*,+,$} FOLLOW( ) = {),$} FOLLOW(T ) = {),+,$}

34 34 Analisi con tabella costruzione Gli elementi della tabella di analisi sono definiti da Se esiste la produzione A α allora per ogni simbolo a in FIRST(α) M[A,a] = {A α} Infatti se si è nello stato A e si legge a si dve espandere la produzione A in α perché garantisce che venga generato il simbolo a Se FIRST(α) allora M[A,b] = {A α} per ogni simbolo b in FOLLOW(A) Tiene conto del fatto che se α allora il simbolo a deve essere generato da qualche produzione in cui A compare seguito da un altra espressione che può generare a

35 35 Analisi con tabella grammatiche ambigue Il procedimento per la costruzione della tabella d analisi può portare a generare elementi della matrice M che contengono più alternative S i t S S a S es b grammatica per if-then-else FIRST(S) = {i,a} FIRST(S ) = {e, } FIRST() = {b} FOLLOW(S) = {e,$} FOLLOW(S ) = {e,$} FOLLOW() = {t} a b e i t $ S a itss S es b

36 36 Grammatiche LL(1) Una grammatica che non ha definizioni multiple nella tabella di analisi discendente si dice LL(1) Left-to-right nella scansione dell ingresso Leftmost si espande sempre il simbolo più a sinistra 1 si usa un simbolo di previsione Non tutte le grammatiche CF sono LL(1) Si deve eliminare la ricorsione a sinistra Si deve fattorizzare a sinistra Non è comunque detto di ottenere una grammatica LL(1)

37 37 Analisi ascendente (bottom-up) L albero di analisi viene costruito a partire dalle foglie verso la radice Si riduce una stringa di ingresso al simbolo non terminale di scopo S Ad ogn passo una sottostringa che corrisponde al lato destro di una produzione è rimpiazzata col simbolo terminale a sinistra si genera il corrispondente nodo dell albero di analisi collegando i nodi figli al padre S aabe A Abc b B d abbcde aabcde aade aabe S sottostringhe a cui si può applicare A b B d

38 38 Analisi bottom-up scelta delle riduzioni S aabe A Abc b B d S aabe aade aabcde abbcde Nell esempio le riduzioni sono sempre scelte tenendo conto di una derivazione della stringa in cui si sostituisce sempre il non terminale più a destra l approccio bottom-up riduce da sinistra a destra Come si sceglie la sottostringa da ridurre? Si può prendere la più a sinistra che fa il match con il lato destro di una produzione Non è detto che si riesca ad arrivare ad S (occorre il backtracking)

39 39 Analisi bottom-up scelta delle riduzioni Nell esempio la scelta di ridurre al primo passo la sottostringa più a sinistra ha permesso di completare l analisi Non è in genere detto che questo accada. Se si sceglie in modo sbagliato si arriva ad un risultato intermedio in cui non esistono sottostringhe che fanno match con almeno un lato destro di una produzione S aabe A Abc b B d abbcde aabcde se al secondo passo si sceglie A b aaacde aaacbe non è più riducibile.

40 40 Sottostringhe handle Una sottostringa handle corrisponde al lato destro di una produzione A β si può rimpiazzare con A nella stringa di partenza γ ottenendo un passo della derivazione destra di γ da S S * rm αaw αβw (w contiene solo simboli terminali perché la derivazione è destra - right most) Se la grammatica è ambigua la stessa sottostringa può appartenere a più di un handle S α β A handle w ridurre β in A corrisponde ad eliminare tutti i figli di A dall albero

41 41 Riduzione La procedura di riduzione mira a sostituire progressivamente sottostringhe handle con il corrispondente simbolo non terminale Si parte dalla stringa di soli simboli terminali da analizzare S = γ 0 γ 1 γ 2.. γ n-1 γ n = w rm rm rm rm rm Si sotituisce l handle β n in γ n utilizzando la produzione A n β n in modo tale che γ n-1 = α n-1 Aw n-1 Si ripete il processo fino ad ottenere S Questa procedura ha due problemi correlati da risolvere Come determinare la sottostringa da ridurre Come scegliere la produzione corretta per la riduzione

42 42 Analizzatore bottom-up con stack Si utilizza uno stack per i risultati intermedi (frontiera dell albero) il parser inserisce simboli nello stack a partire dalla stringa in ingresso w fino a che non viene individuato un handle β in cima allo stack Il parser riduce l handle β al simbolo non terminale A corrispondente L analisi si ferma con successo quando lo stack contiene solo il simbolo S e la stringa in ingresso è vuota Le azioni che il parser può eseguire sono SPOSTA (shift) il prossimo simbolo di w è inserito nello stack RIDUCI (reduce) viene riconosciuta una stringa handle in testa allo stack e si rimpiazza col simbolo non terminale corrispondente ACCTTA fine con successo dell analisi RROR l analizzatore genera un errore di sintassi

43 43 Analisi bottom-up - esempio id stack input output ( ) + * id+id*id $ $id $ $+ $+id $+ $+* $+*id $+* $+ $ id+id*i$ +id*id$ +id*id$ id*id$ *id$ *id$ id$ $ $ $ $ SHIFT RDUC id SHIFT SHIFT RDUC id SHIFT (*) SHIFT RDUC id RDUC * RDUC + ACCPT La grammatica è ambigua ed esiste un altra riduzione possibile siste un conflitto SHIFT/RDUC in (*) che è stato risolto con SHIFT Si poteva anche applicare RDUC +

44 44 Analizzatori bottom-up - conflitti Il parsing ascendente con stack senza backtracking non può essere applicato a tutte le grammatiche CF Noto il contenuto dello stack e il prossimo simbolo in ingresso C è un conflitto SHIFT/RDUC Non si riesce a decidere quale riduzione fare in un insieme di riduzioni possibili Le azioni del parser ascendente con stack si possono determinare in modo univoco solo se la grammatica ha date proprietà Analizzatori con operatori a precedenza Corrispondono a grammatiche molto particolari (grammatiche ad operatori) in cui non esistono produzioni del tipo A e per qualsiasi produzione A β in β non esistono due simboli non terminali adiacenti (esiste sempre un operatore in mezzo). s. espressioni aritmetiche. Analizzatori LR (Left-to-right Right-most-derivation)

45 45 Analizzatori LR(k)

46 46 Analizzatori LR(k) - struttura ToS a a 1 a i.. a n $ stringa da analizzare stato - simbolo S m X m S m-1 albero sintattico X m AZION $ stack GOTO Tabelle di analisi AZION[S,a] GOTO[S,A]

47 47 Analizzatori LR schema di funzionamento 1 Nello stack è memorizzata una stringa di coppie simbolo-stato S 0 X 1 S 1 X 2 S 2.X m S m Ciascun stato riassume l informazione contenuta nello stack al di sotto di esso ai fini del riconoscimento degli handle L azione del parser è determinata dallo stato in testa allo stack e dal simbolo corrente (Tos,a) Nell implementazione i simboli del X i (T N) non sono strettamente necessari (lo stato già memorizza l elaborazione della loro sequenza) La configurazione del parser è data dal contenuto dello stack e dalla parte di ingresso ancora da espandere S 0 X 1 S 1 X 2 S 2.X m S m a i a i+1..a n $

48 48 Analizzatori LR schema di funzionamento 2 La configurazione rappresenta una stringa derivata con sostituzione a destra X 1 X 2.X m a i a i+1..a n $ da espandere già espanso Il controllo dell analizzatore LR termina l azione da compiere in base allo stato S m in testa allo stack e al simbolo corrente a i 1. AZION[S m,a i ]=SHIFT S (PUSH a i, PUSH S) La nuova configurazione è S 0 X 1 S 1 X 2 S 2.X m S m a i S a i+1..a n $ ToS a

49 49 Analizzatori LR schema di funzionamento 3 2. AZION[S m,a i ]=RDUC A β Si opera una riduzione che corrisponde alla nuova configurazione S 0 X 1 S 1 X 2 S 2.X m-r S m-r AS a i..a n $ dove S = GOTO[S m-r,a] e r= β β=x m-r+1.x m 3. AZION[S m,a i ]=ACCPT L analisi è completata con successo 4. AZION[S m,a i ]=RROR Si è rilevato un errore e si chiama la procedura di gestione degli errori ToS a

50 50 Analisi LR un esempio 1 AZION GOTO 1 +T 2 T 3 T T*F 4 T F 5 F () 6 F id s# = shift #nuovo stato r# = reduce #produzione stato id + * ( ) $ T F s5 s5 s5 s5 s6 r2 r4 r6 s6 r1 r3 r5 s7 r4 r6 s7 r3 r5 s4 s4 s4 s4 r2 r4 r6 s11 r1 r3 r5 Ac r2 r4 r6 r1 r3 r

51 51 Analisi LR un esempio 2 stack input AZION riduzione GOTO 0 0 id 5 0 F 3 0 T 2 0 T 2 * 7 0 T 2 * 7 id 5 0 T 2 * 7 F 10 0 T id F T id*id+id$ *id+id$ *id+id$ *id+id$ id+id$ +id$ +id$ +id$ +id$ id$ $ $ $ $ SHIFT 5 RDUC 6 RDUC 4 SHIFT 7 SHIFT 5 RDUC 6 RDUC 3 RDUC 2 SHIFT 6 SHIFT 5 RDUC 6 RDUC 4 RDUC 1 ACCPT F id T F F id T T*F T F id T F +T G[0,F]=3 G[0,T]=2 G[7,F]=10 G[0,T]=2 G[0,]=1 G[6,F]=3 G[6,T]=9 G[0,]=1

52 52 Grammatiche LR - definizione Una grammatica LR è una grammatica per la quale si riescono a costruire le tabelle AZION e GOTO per un analizzatore LR sistono grammatiche CF che non sono LR Una grammatica è LR se il parser SHIFT/RDUC riesce a riconoscere le sottostringhe handle quando compaiono in testa allo stack (per fare questo basta lo stato) Per riconoscere un handle sullo stack si può usare un automa a stati finiti che analizza i simboli contenuti nello stack e dice quale è l handle in testa Questo meccanismo è implementato nella tabella GOTO Lo stato nella testa dello stack è lo stato di questo automa riconoscitore dopo aver elaborato la stringa di simboli dalla base alla testa dello stack

53 53 Grammatiche LR - proprietà Le grammatiche LR(k) sono più generali di quelle LL(k) Le grammatiche LR(k) richiedono di riconoscere, con k simboli di previsione, il lato destro di una produzione (l handle) A β dopo aver visto tutto quello che è derivato da β Le grammatiche LL(k) richiedono di riconoscere una produzione in base ai primi k simboli di ciò che si può derivare dalla sua parte destra Come si costruiscono le tabelle di analisi? Si considera un caso semplice, quello delle Simple LR (SLR) che non copre tutte le grammatiche LR

54 54 Grammatiche SLR Un elemento LR(0) di una grammatica G è una produzione annotata con un punto ( ) che individua una posizione nel lato destro #i A xyz A xyz (i,0) A x yz (i,1) A xy z (i,2) A xyz (i,3) Un elemento è individuato dalla coppia di indici (#produzione,posizione) Un elemento tiene traccia di quanta parte del lato destro di una produzione è stata vista fino ad un certo punto dell analisi La costruzione delle tabelle di analisi parte dalla costruzione di un automa a stati finiti che riconosce i prefissi associabili alle produzioni in una derivazione destra

55 55 Grammatiche SLR elementi Gli elementi definiti a partire da ciascuna produzione possono essere visti come stati di un automa a stati finiti A α xβ x A αx β si accetta l input x per avanzare di un passo nel riconoscimento di αxβ A α Bβ B γ soddisfare B significa applicare ogni sua espansione Si introduce un nuovo simbolo di partenza S e la produzione S S (è la riduzione che determina l accettazione della stringa) Si costruisce l automa che riconosce i lati destri delle produzioni

56 56 Grammatiche SLR esempio 1 +T + +T + T +T T T T 4-5 T T*F F 6-7 F () id T T 3 T 5 T F F T F T T*F T T T *F * T T* F F F id F () id ( 6 F id F ( ) F ( ) ) 2 7 F () 4 T T*F

57 57 Grammatiche SLR esempio 2 eliminazione delle -transizioni 1 I 0 ={[ ],[ T], [ +T],[T F], [T T*F],[F id], [F ()]} +T T T 3 T 5 +T + T +T T F F T F T T*F T T T *F * T T* F F + F id F () T id ( 6 F id F ( ) F ( ) ) 2 7 F () 4 T T*F

58 58 Grammatiche SLR esempio 3 I 0 ={[ ],[ T], [ +T],[T F], [T T*F],[F id], [F ()]} F T F I 3 ={[T F ]} +T I 1 I 1 ={[ +T],[ ]} dagli stati in I 1,I 2, I 3, I 5 non ci sono -transizioni I 0 T T I 2 id T T *F I 2 ={[ T ],[T T *F]} I 5 ( I 3 F id I 4 I 5 ={[F id ]} I 4 va determinato con eliminazione di -transizioni

59 59 Grammatiche SLR esempio 4 eliminazione delle -transizioni per lo stato F ( ) 1 I 4 ={[F ( )],[ +T], [ T],[T F], [T T*F],[F id], [F ()]} +T T T 3 T 5 +T + T +T T F F T F T T*F T T T *F * T T* F F + F id F () T id ( 6 F id F ( ) F ( ) ) 2 7 F () 4 T T*F

60 60 Grammatiche SLR esempio 5 transizioni da +T + +T + T +T T I 1 ={[ +T],[ ]} 1 La transizione con + definisce I 6 ={ [ + T],[T F], [T T*F],[F id], [F ()]} T T T T F F T F T T*F T T T *F * T T* F F T T*F F id F () id ( 6 F id F ( ) F ( ) ) 2 7 F ()

61 61 Grammatiche SLR esempio 6 transizioni da I 6 ={ [ + T],[T F], [T T*F],[F id], [F ()]} 1 La transizione con T definisce I 9 ={ [ +T ],[T T *F]} +T T T 3 T 5 I 3 +T + T +T T F F T F T T*F T T T *F * T T* F F + F id F () T id ( 6 I 5 I 4 F id F ( ) F ( ) ) 2 7 F () 4 T T*F

62 62 Grammatiche SLR esempio 7 transizioni da +T + +T + T +T T I 2 ={[ T ],[T T *F]} 1 La transizione con * definisce I 7 ={ [T T* F],[F id], [F ()]} T T 3 T 5 T F F T F T T*F T T T *F * T T* F F F id F () id ( 6 F id F ( ) F ( ) ) 2 7 F () 4 T T*F

63 63 Grammatiche SLR esempio 8 La transizione con definisce +T I 8 + +T + T +T T I 8 ={ [ +T],[F ( )]} 1 transizioni da I 4 ={[F ( )],[ +T], [ T],[T F], [T T*F],[F id], [F ()]} T T 3 T I I 3 T F F T F T T*F T T T *F * T T* F F T T*F F id F () 6 id ( I 8 I 5 I 4 F id F ( ) F ( ) ) 2 7 F ()

64 64 Grammatiche SLR esempio 9 transizioni da +T + +T + T +T T I 7 ={ [T T* F],[F id], [F ()]} 1 La transizione con F definisce I 10 ={ [T T*F ]} T T 3 T 5 I 10 4 T F F T F T T*F T T T *F * T T* F F T T*F F id F () id ( 6 I 5 I 4 F id F ( ) F ( ) ) 2 7 F ()

65 65 Grammatiche SLR esempio 10 transizioni da +T + +T + T +T T I 8 ={ [ +T],[F ( )]} 1 La transizione con ) definisce I 11 ={ [F () ]} T T 3 T 5 T F F T F T T*F T T T *F * T T* F F I 6 F id F () 6 id ( I 11 F id F ( ) F ( ) ) 2 7 F () 4 T T*F

66 66 Grammatiche SRL esempio 11 I 0 ={[ ],[ T],[ +T],[T F],[T T*F],[F id],[f ()]} I 1 ={[ +T],[ ]} I 2 ={[ T ],[T T *F]} I 3 ={[T F ]} I 4 ={[F ( )],[ +T],[ T],[T F],[T T*F],[F id],[f ()]} I 5 ={[F id ]} I 6 ={ [ + T],[T F],[T T*F],[F id],[f ()]} I 7 ={ [T T* F],[F id],[f ()]} I 8 ={ [ +T],[F ( )]} I 9 ={ [ +T ],[T T *F]} I 10 ={ [T T*F ]} I 11 ={ [F () ]}

67 67 Grammatiche SRL esempio 12 stato id + * ( ) T F Tabella di transizione di stato

68 68 Tabelle di analisi costruzione AZION A partire dall automa deterministico che riconosce i prefissi dei lati destri delle produzioni è possibile ottenere le tabelle di analisi AZION e GOTO Gli stati dell automa C={I 0,I 1,,I n } corrispondono agli stati 0,1,..n usati dall analizzatore Le azioni per lo stato i sono definite come segue Se [A α aγ] I i e nell automa esiste la transizione I i I j per ingresso a T allora AZION[i,a]=SHIFT j (si passa nel nuovo stato dell automa e non è ancora completato il match con il lato destro di una produzione) Se [A α ] I i allora AZION[i,a]=RDUC A α per ogni simbolo a in FOLLOW(A) Se [S S ] I i allora AZION[i,$]=ACCPT

69 69 Tabelle di analisi costruzione GOTO La tabella GOTO è costruita considerando per ogni stato le transizioni per simboli non terminali Se esiste la transizione I i I j per ingresso A N allora GOTO[i,A]=j Lo stato iniziale è quello contenente [S S] Le componenti non definite corrispondono ad errori Le tabelle costruite con questo algoritmo si dicono SLR(1) Una grammatica che ammette un parser SLR(1) si dice SLR(1)

70 70 Tabelle di analisi - esempio I 0 ={[ ], [ T], [ +T], [T F], [T T*F], [F id], [F ()]} I 0 T F ( id I 1 I 2 I 3 I 4 I 5 AZION[0,id] = SHIFT 4 AZION[0,(] = SHIFT 5 GOTO[0,] = 1 GOTO[0,T] = 2 GOTO[0,F] = 3 I 1 ={[ +T],[ ]} + I 1 I 6 AZION[1,$] = ACCPT AZION[1,+] = SHIFT 6 I 2 ={[ T ],[T T *F]} * I 2 I 7 FOLLOW()={$,+,)} AZION[2,*] = SHIFT 7 AZION[2,$] = RDUC T AZION[2,)] = RDUC T AZION[2,+] = RDUC T

71 71 Grammatiche non SLR(1) La costruzione delle tabelle per un analizzatore SLR(1) fallisce quando c è un conflitto nella definizione di una componente Per linguaggi più generali di SLR(1) si possono costruire Tabelle canoniche LR Tabelle LALR (LookAhead LR) I problemi nascono quando ci sono più riduzioni possibili e si deve evitare di applicare riduzioni errate che richiederebbero il backtracking Una soluzione è usare uno stato più informativo che memorizza esplicitamente i simboli che possono seguire un handle α per cui è ammessa la riduzione A α

72 72 Grammatiche LR Si definiscono gli elementi LR(1) come coppie [A α β,a] L elemento di lookahead a ha effetto solo per gli elementi della forma [A α,a] dove si prevede la riduzione solo se il prossimo simbolo è a Infatti non è detto che la riduzione sia applicabile per tutti gli elementi in FOLLOW(A) come ipotizzato nella costruzione delle tabelle SLR Un analizzatore canonico LR ha molti più stati degli analizzatori SLR e LALR I generatori automatici di parser sintattici generano analizzatori LALR

Pumping lemma per i linguaggi Context-free

Pumping lemma per i linguaggi Context-free Pumping lemma per i linguaggi Context-free Sia L un linguaggio context-free. E possibile determinare una costante k, dipendente da L, tale che qualunque stringa z! L con z > k si può esprimere come z=

Dettagli

Parser Bottom UP. Giuseppe Morelli

Parser Bottom UP. Giuseppe Morelli Parser Bottom UP Giuseppe Morelli Parser Bottom UP Un parser Bottom Up lavora costruendo il corrispondente albero di parsing per una data stringa di input partendo dalle foglie (bottom) e risalendo via

Dettagli

Dispensa 2. Data una grammatica context free esistono tre metodi diversi per costruirne la parsing table per un parser LR:

Dispensa 2. Data una grammatica context free esistono tre metodi diversi per costruirne la parsing table per un parser LR: Dispensa 2 2.1 Costruzione Parsing Table LR: generalità Come tutti i parser tabellari predittivi, anche i parser LR possono essere applicati solo a parsing table senza conflitti (ossia entrate multiple)

Dettagli

Linguaggi formali e compilazione

Linguaggi formali e compilazione Linguaggi formali e compilazione Corso di Laurea in Informatica A.A. 2014/2015 L input per il parser Nel contesto della compilazione l input per il parser è costituito da una stringa di token (che indicheremo

Dettagli

Contenuti del corso. Parsing: esempio. Cosa aggiungiamo in questo corso. Parsing. Data una grammatica: E T T + E

Contenuti del corso. Parsing: esempio. Cosa aggiungiamo in questo corso. Parsing. Data una grammatica: E T T + E Continuazione del corso di linguaggi. Nuovi paradigmi di computazione logico: Prolog logic - funzionale: Curry Teoria base dei compilatori parsing grammatiche ad attributi type checking generazione codice

Dettagli

Analisi sintattica. Syntax Analysis. albero. sintattico. parser. scanner. Errori sintattici

Analisi sintattica. Syntax Analysis. albero. sintattico. parser. scanner. Errori sintattici Analisi sintattica Syntax Analysis albero programma scanner tokens parser sintattico rrori sintattici Un parser deve riconoscere la struttura di una stringa di ingresso, la cui struttura è fornita in termini

Dettagli

albero sintattico parser scanner Errori sintattici

albero sintattico parser scanner Errori sintattici albero programma scanner tokens parser sintattico rrori sintattici Un parser deve riconoscere la struttura di una stringa di ingresso, la cui struttura è fornita in termini di regole di produzione di una

Dettagli

Traduttore diretto dalla sintassi (seconda parte) Giuseppe Morelli

Traduttore diretto dalla sintassi (seconda parte) Giuseppe Morelli Traduttore diretto dalla sintassi (seconda parte) Giuseppe Morelli Traduzione di linguaggi guidata da Grammatiche Context Free La traduzione diretta della sintassi avviene associando regole e/o frammenti

Dettagli

Linguaggi e Traduttori: Analisi sintattica

Linguaggi e Traduttori: Analisi sintattica Linguaggi e Traduttori: Analisi sintattica Armando Tacchella Sistemi e Tecnologie per il Ragionamento Automatico (STAR-Lab) Dipartimento di Informatica Sistemistica e Telematica (DIST) Università di Genova

Dettagli

Costruzione dell insieme dei Follow

Costruzione dell insieme dei Follow Costruzione dell insieme dei Follow E! T E - T E E! + T E - T E " T! F T T! *F T " F! (E) i Per evitare che alcuni insiemi siano vuoti si aggiunge per default il simbolo speciale $ che demarca la fine

Dettagli

Analisi sintattica. Analisi sintattica. albero. sintattico. parser. scanner. Errori sintattici

Analisi sintattica. Analisi sintattica. albero. sintattico. parser. scanner. Errori sintattici Analisi sintattica Analisi sintattica albero programma scanner tokens parser sintattico rrori sintattici Un parser deve riconoscere la struttura di una stringa di ingresso, la cui struttura è fornita in

Dettagli

Parser top-down. Top-Down Parsing

Parser top-down. Top-Down Parsing Parser top-down Top-Down Parsing Il parse tree è creato dalla radice alle foglie. Il parser puo essere realizzato Recursive-Descent Parsing Il Backtracking è necessario (se una scelta di una regola non

Dettagli

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

Grammatiche. Grammatiche libere da contesto Grammatiche regolari Potenza delle grammatiche libere e regolari Struttura di frase: Alberi di derivazione 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

Dettagli

Linguaggi Liberi dal Contesto. Linguaggi Liberi dal Contesto

Linguaggi Liberi dal Contesto. Linguaggi Liberi dal Contesto rammatiche e Linguaggi Liberi da Contesto Abbiamo visto che molti linguaggi non sono regolari. Consideriamo allora una classe piu ampia di linguaggi, i Linguaggi Liberi da Contesto (CFL) i CFL sono stati

Dettagli

Verificare se una grammatica e LL(1) e costruirne la tabella di parsing. Verificare se una grammatica e LR(0) e costruirne la tabele ACTION e GOTO

Verificare se una grammatica e LL(1) e costruirne la tabella di parsing. Verificare se una grammatica e LR(0) e costruirne la tabele ACTION e GOTO ANALISI SINTATTICA TIPO 1: Data un linguaggio scrivere una grammatica che lo generi TIPO 2: Verificare se una grammatica non contestuale è ambigua TiPO 3: Verificare se una grammatica e LL(1) e costruirne

Dettagli

Riconoscitori e analizzatori sintattici. Scanning e parsing. Funzionamento di un parser: la tecnica Shift/Reduce. Esempio

Riconoscitori e analizzatori sintattici. Scanning e parsing. Funzionamento di un parser: la tecnica Shift/Reduce. Esempio POLITECNICO I TORINO Laboratorio di Compilatori Corso di Linguaggi e Traduttori mail: stefano.scanzio@polito.it sito: Riconoscitori e analizzatori sintattici ata una grammatica non ambigua ed una sequenza

Dettagli

Dispensa 3. Se in uno stato c è l LR(0) item A α. (ossia un item col punto alla fine) è invocata una riduzione per ogni terminale a in Follow(A)

Dispensa 3. Se in uno stato c è l LR(0) item A α. (ossia un item col punto alla fine) è invocata una riduzione per ogni terminale a in Follow(A) Dispensa 3 3.1 Tecnica LR canonica Il punto debole della tecnica SLR illustrata in Dispensa 2 sta nelle riduzioni, che, ricordiamo, vengono inserite nella parsing table in accordo alla seguente regola:

Dettagli

Espressività e limitazioni delle grammatiche regolari

Espressività e limitazioni delle grammatiche regolari Espressività e limitazioni delle grammatiche regolari Vantaggi: Le grammatiche regolari consentono di esprimere una significativa classe di linguaggi: linguaggi con un numero di sequenze infinito grazie

Dettagli

Dispensa 1. Da un punto di vista logico l architettura di un compilatore si può suddividere in due parti: Analisi e Sintesi.

Dispensa 1. Da un punto di vista logico l architettura di un compilatore si può suddividere in due parti: Analisi e Sintesi. Dispensa 1 1. Introduzione ai compilatori Compilatore Un compilatore è un programma che legge un programma scritto in un linguaggio (sorgente) e lo traduce in un programma equivalente in un altro linguaggio

Dettagli

PROLOG E ANALISI SINTATTICA DEI LINGUAGGI Quando si vuole definire in modo preciso la sintassi di un linguaggio si ricorre a una grammatica G=(V n,v t

PROLOG E ANALISI SINTATTICA DEI LINGUAGGI Quando si vuole definire in modo preciso la sintassi di un linguaggio si ricorre a una grammatica G=(V n,v t PROLOG E ANALISI SINTATTICA DEI LINGUAGGI Quando si vuole definire in modo preciso la sintassi di un linguaggio si ricorre a una grammatica Una grammatica permette di stabilire se una sequenza di simboli

Dettagli

LR Parser II Parte. Giuseppe Morelli

LR Parser II Parte. Giuseppe Morelli LR Parser II Parte Giuseppe Morelli Parser LR(1) Con il metodo SLR la tabella indica di effettuare una riduzione attraverso una produzione A-> α, se accade che per un certo item Ii : [A->α. Є Ii] Per ogni

Dettagli

Yet Another Compiler-Compiler. Generazione automatica di analizzatori sintattici

Yet Another Compiler-Compiler. Generazione automatica di analizzatori sintattici Yet Another Compiler-Compiler Generazione automatica di analizzatori sintattici 2 YACC Yet Another Compiler-Compiler YACC (Bison) è un generatore di analizzatori sintattici a partire dalla descrizione

Dettagli

Automi e Linguaggi Formali Automi a stack (Pushdown automata)

Automi e Linguaggi Formali Automi a stack (Pushdown automata) Automi e Linguaggi Formali Automi a stack (Pushdown automata) A.A. 2014-2015 Enrico Mezzetti emezzett@math.unipd.it Automi a stack Un Pushdown Automata (PDA) o Automa a stack Essenzialmente un ɛ-nfa con

Dettagli

Automa deterministico con prospezione 1. < {q}, Σ, Σ V, δ, q, S, Φ > δ(a, X) = α R. se a Gui(X α) senza spostamento della testina.

Automa deterministico con prospezione 1. < {q}, Σ, Σ V, δ, q, S, Φ > δ(a, X) = α R. se a Gui(X α) senza spostamento della testina. Automa deterministico con prospezione 1 < {q}, Σ, Σ V, δ, q, S, Φ > δ(a, X) = α R δ(a, a) = ε se a Gui(X α) senza spostamento della testina con spostamento della testina Grammatica 1S ( S ) 2S [ S ] 3S

Dettagli

Analisi sintattica (parser)

Analisi sintattica (parser) Corso di Laurea Magistrale in Ingegneria Informatica A.A. 2013-2014 Linguaggi Formali e Compilatori Analisi sintattica (parser) Giacomo PISCITELLI Analisi sintattica: il parser Problema di base dell analisi

Dettagli

Grammatiche context-free

Grammatiche context-free Corso di Laurea Magistrale in Ingegneria Informatica A.A. 2013-2014 Linguaggi Formali e Compilatori Grammatiche context-free Giacomo PISCITELLI Politecnico di Bari G. Piscitelli pag. 1 di 28 Grammatiche

Dettagli

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser.

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser. Analizzatore lessicale o scanner Dispensa del corso di Linguaggi e Traduttori A.A. 2005-2006 Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser. Lo scanner,

Dettagli

Sui Linguaggi Regolari: Teorema di Kleene - Pumping Lemm

Sui Linguaggi Regolari: Teorema di Kleene - Pumping Lemm Sui Linguaggi Regolari: Teorema di Kleene - Pumping Lemma N.Fanizzi - V.Carofiglio 6 aprile 2016 1 Teorema di Kleene 2 3 o 1 o 3 o 8 Teorema di Kleene Vale la seguente equivalenza: L 3 L FSL L REG Dimostrazione.

Dettagli

Metodo LALR. Tabelle LALR. Metodo LALR. Idea. Idea. Idea. Costruzione delle tabelle LALR

Metodo LALR. Tabelle LALR. Metodo LALR. Idea. Idea. Idea. Costruzione delle tabelle LALR Metodo LALR Tabelle LALR Costruzione delle tabelle LALR Introduciamo l ultimo metodo di costruzione di tabelle per il parsing LR Nome: lookahead-lr abbreviato in LALR Questo metodo è usato spesso dato

Dettagli

7. Automi a Pila e Grammatiche Libere

7. Automi a Pila e Grammatiche Libere (fanizzi@di.uniba.it) Dipartimento di Informatica Università degli Studi di Bari 20 aprile 2016 1 Automi a Pila Definizione Descrizioni Istantanee Condizioni di Accettazione per PDA Esempi 2 Teorema delle

Dettagli

Forme Normali. Forma normale di Chomsky. E caratterizzata da regole di due tipi. A! BC dove A, B, C $ V N A! a con a $ V T. Forma normale di Greibach

Forme Normali. Forma normale di Chomsky. E caratterizzata da regole di due tipi. A! BC dove A, B, C $ V N A! a con a $ V T. Forma normale di Greibach Forme Normali A partire da una grammatica Context-free G è sempre possibile costruire una grammatica equivalente G ovvero L(G) = L(G ) che abbiano le produzioni in forme particolari, dette forme normali.

Dettagli

AUTOMA A STATI FINITI

AUTOMA A STATI FINITI Gli Automi Un Automa è un dispositivo, o un suo modello in forma di macchina sequenziale, creato per eseguire un particolare compito, che può trovarsi in diverse configurazioni più o meno complesse caratterizzate

Dettagli

Parser bottom-up. Esempio. V = {S, A, B, C} T = {a, b, d, e} P = { S aa R1 A BaA R2 A e R3 B ac R4 B AdC R5

Parser bottom-up. Esempio. V = {S, A, B, C} T = {a, b, d, e} P = { S aa R1 A BaA R2 A e R3 B ac R4 B AdC R5 Parser bottom-up Esempio V = {S, A, B, C} T = {a, b, d, e} P = { S aa R1 A BaA R2 A e R3 B ac R4 B AdC R5 C b R6 Come costruire l albero sintattico di aedbae in modo bottom-up? 1 Esempio aedbae aedbaa

Dettagli

Forma Normale di Chomsky

Forma Normale di Chomsky 2. Eliminazione delle produzioni unitarie Forma Normale di Chomsky Una produzione si dice unitaria se è della forma A! B. Le produzioni unitarie in pratica consistono in una ridenominazione di variabili,

Dettagli

Quiz sui linguaggi regolari

Quiz sui linguaggi regolari Fondamenti dell Informatica 1 semestre Quiz sui linguaggi regolari Prof. Giorgio Gambosi a.a. 2016-2017 Problema 1: Data l espressione regolare a, definita su {a, b}, descrivere il linguaggio corrispondente

Dettagli

LINGUAGGI CONTEXT FREE. Lezione Lezione

LINGUAGGI CONTEXT FREE. Lezione Lezione LINGUAGGI CONTEXT FREE Lezione 25-11-2010 Lezione 30-11-2010 2 INTRODUZIONE GERARCHIA DI CHOMSKY 3 4 DEFINIZIONE DEI LINGUAGGI CONTEXT FREE LINGUAGGI CF I linguaggi di tipo 2 sono detti context free (CF)

Dettagli

Linguaggi Regolari e Linguaggi Liberi

Linguaggi Regolari e Linguaggi Liberi Linguaggi Regolari e Linguaggi Liberi Linguaggi regolari Potere espressivo degli automi Costruzione di una grammatica equivalente a un automa Grammatiche regolari Potere espressivo delle grammatiche 1

Dettagli

Espansione: si parte da uno stato e applicando gli operatori (o la funzione successore) si generano nuovi stati.

Espansione: si parte da uno stato e applicando gli operatori (o la funzione successore) si generano nuovi stati. CERCARE SOLUZIONI Generare sequenze di azioni. Espansione: si parte da uno stato e applicando gli operatori (o la funzione successore) si generano nuovi stati. Strategia di ricerca: ad ogni passo scegliere

Dettagli

Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd

Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd Fondamenti d Informatica: linguaggi formali Barbara Re, Phd Agenda } Introdurremo } La nozione di linguaggio } Strumenti per definire un linguaggio } Espressioni Regolari 2 Linguaggio } Da un punto di

Dettagli

Alberi e alberi binari I Un albero è un caso particolare di grafo

Alberi e alberi binari I Un albero è un caso particolare di grafo Alberi e alberi binari Un albero è un caso particolare di grafo È costituito da un insieme di nodi collegati tra di loro mediante archi Gli archi sono orientati (ogni arco esce da un nodo origine ed entra

Dettagli

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione Alberi Strutture dati: Alberi Strutture gerarchiche di dati Esempi Il file system di un sistema operativo L organigramma di un azienda Alberi generali, alberi n-ari, alberi binari, Ogni nodo ha un unico

Dettagli

Automi a Pila e Grammatiche Libere dal Contesto. Automi a Pila e Grammatiche Libere dal Contesto

Automi a Pila e Grammatiche Libere dal Contesto. Automi a Pila e Grammatiche Libere dal Contesto utomi a Pila Un automa a pila (PDA) e una estensione degli automi a stati finiti, che ha una memoria (una pila) Vedremo due modi equivalenti per definire il linguaggio accettato da un PDA Vedremo che la

Dettagli

Linguaggi e Grammatiche Liberi da Contesto

Linguaggi e Grammatiche Liberi da Contesto N.Fanizzi-V.Carofiglio Dipartimento di Informatica Università degli Studi di Bari 22 aprile 2016 1 Linguaggi Liberi da Contesto 2 Grammatiche e Linguaggi Liberi da Contesto G = (X, V, S, P) è una grammatica

Dettagli

Grammatiche Parse trees Lezione del 17/10/2012

Grammatiche Parse trees Lezione del 17/10/2012 Fondamenti di Programmazione A.A. 2012-2013 Grammatiche Parse trees Lezione del 17/10/2012 AUTILI MARCO http://www.di.univaq.it/marco.autili/ Riassunto lezione precedente Sintassi vs Semantica Stringhe,

Dettagli

Esempio stringhe palindrome 1

Esempio stringhe palindrome 1 Esempio stringhe palindrome 1 Automa per il riconoscimento del linguaggio L = {w c w R } A = < {s,f}, {a,b,c}, {a,b},!, s, { f } > con! che contiene le transizioni: 1. (( s, a, " ), (s, a)! [ push a] 2.

Dettagli

Linguaggi di Programmazione Corso C. Parte n.3 Linguaggi Liberi da Contesto e Linguaggi Contestuali. Nicola Fanizzi

Linguaggi di Programmazione Corso C. Parte n.3 Linguaggi Liberi da Contesto e Linguaggi Contestuali. Nicola Fanizzi Linguaggi di Programmazione Corso C Parte n.3 Linguaggi Liberi da Contesto e Linguaggi Contestuali Nicola Fanizzi (fanizzi@di.uniba.it) Dipartimento di Informatica Università degli Studi di Bari Grammatiche

Dettagli

Linguaggi formali e compilazione

Linguaggi formali e compilazione Linguaggi formali e compilazione Corso di Laurea in Informatica A.A. 2015/2016 Linguaggi formali e compilazione Elementi generali Un parser generico di tipo procede operando una sequenza di riduzioni a

Dettagli

Proprietà dei linguaggi non contestuali

Proprietà dei linguaggi non contestuali Proprietà dei linguaggi non contestuali Argomenti della lezione Pumping lemma per i linguaggi non contestuali Proprietà di chiusura Argomenti della lezione Grammatiche non contestuali in forma ridotta

Dettagli

Parte n.4 Linguaggi: Gerarchia ed Operazioni

Parte n.4 Linguaggi: Gerarchia ed Operazioni Linguaggi di Programmazione Corso C Parte n.4 Linguaggi: Gerarchia ed Operazioni Nicola Fanizzi (fanizzi@di.uniba.it) Dipartimento di Informatica Università degli Studi di Bari Gerarchia di Chomsky Sia

Dettagli

Esercitazioni di Linguaggi e Traduttori

Esercitazioni di Linguaggi e Traduttori 1 Linguaggi CF e Riconoscitori 2 Introduzione a Yacc Introduzione a YACC Definizione dei simboli Codifica della grammatica Formato del programma prodotto da YACC Ambiguità e conflitti Conflitti shift-reduce

Dettagli

Grammatiche. Rosario Culmone, Luca Tesei. 20/11/2006 UNICAM - p. 1/49

Grammatiche. Rosario Culmone, Luca Tesei. 20/11/2006 UNICAM - p. 1/49 Grammatiche Rosario Culmone, Luca Tesei 20/11/2006 UNICAM - p. 1/49 Grammatiche libere dal contesto Ogni linguaggio di programmazione ha delle regole che prescrivono la struttura sintattica dei programmi

Dettagli

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST) Albero binario 2 Alberi binari (introduzione) Struttura di dati bidimensionale formata da nodi costituiti ciascuno dai dati da memorizzare e da due link Ver. 2.4 20 - Claudio Fornaro - Corso di programmazione

Dettagli

Definizioni syntax-directed

Definizioni syntax-directed Definizioni syntax-directed Esempio: Notazione infissa Notazione postfissa Produzioni E E 1 + T E E 1 T E T T 0 T 1 T 2... T 9 Regole semantiche E.t := E 1.t _T.t _ + E.t := E 1.t _T.t _ - E.t := T.t T.t

Dettagli

Espressioni aritmetiche

Espressioni aritmetiche Espressioni aritmetiche Consideriamo espressioni costruite a partire da variabili e costanti intere mediante applicazione delle operazioni di somma, sottrazione, prodotto e divisione (intera). Ad esempio:

Dettagli

Intro. Traduzione guidata dalla sintassi. Attributi. Due notazioni a diversi livelli. Due notazioni a diversi livelli. Il flusso concettuale

Intro. Traduzione guidata dalla sintassi. Attributi. Due notazioni a diversi livelli. Due notazioni a diversi livelli. Il flusso concettuale Intro Traduzione guidata dalla sintassi Attributi e Definizioni guidate dalla sintassi In questa ultima parte del corso vediamo, in breve, una tecnica che permette di effettuare analisi semantiche e traduzione

Dettagli

Quiz sui linguaggi CF

Quiz sui linguaggi CF Fondamenti dell Informatica 1 semestre Quiz sui linguaggi CF Prof. Giorgio Gambosi a.a. 2014-2015 Problema 1: Si consideri la seguente grammatica context free G, dove S, NP, V P, P P, A sono i simboli

Dettagli

Alberi binari e alberi binari di ricerca

Alberi binari e alberi binari di ricerca Alberi binari e alberi binari di ricerca Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica

Dettagli

Linguaggi per il Web

Linguaggi per il Web Sapienza Università di Roma Corso di Laurea in Ingegneria Informatica e Automatica Corso di Laurea in Ingegneria dei Sistemi Informatici Linguaggi per il Web a.a. 2014/2015 Riccardo Rosati Dipartimento

Dettagli

Definire tramite una grammatica ad attributi il

Definire tramite una grammatica ad attributi il 1 ESERCIZI ESERCIZIO 1 Definire tramite una grammatica ad attributi il linguaggio L = {a n b n c n n 0} Implementare un analizzatore sintattico/ semantico a discesa ricorsiva Costruire le tabelle di analisi

Dettagli

Indici multilivello dinamici (B-alberi e B + -alberi) Alberi di ricerca - 1. Un esempio. Alberi di ricerca - 3. Alberi di ricerca - 2

Indici multilivello dinamici (B-alberi e B + -alberi) Alberi di ricerca - 1. Un esempio. Alberi di ricerca - 3. Alberi di ricerca - 2 INDICI MULTILIVELLO DINAMICI Indici multilivello dinamici (B-alberi e B + -alberi) Gli indici multilivello dinamici (B-alberi e B + -alberi) sono casi speciali di strutture ad albero. Un albero è formato

Dettagli

Espressioni regolari

Espressioni regolari spressioni Regolari Un FA (NFA o DFA) e una macchina a stati finiti che riconosce linguaggi regolari. Una espressione regolare e un modo dichiarativo (o algebrico) per descrivere un linguaggio regolare.

Dettagli

Linguaggi e Ambienti di Programmazione

Linguaggi e Ambienti di Programmazione Linguaggi e Ambienti di Programmazione Principi e tecniche diffuse che si incontrano spesso nelle applicazioni dell informatica. Compilatori Editor di struttura: riceve in input una sequenza di comandi

Dettagli

Linguaggi Regolari e Linguaggi Liberi

Linguaggi Regolari e Linguaggi Liberi Linguaggi Regolari e Linguaggi Liberi Potenza espressiva degli automi Potenza espressiva delle grammatiche 9/11/2004 Programmazione - Luca Tesei 1 Linguaggi Regolari Tutti i linguaggi che possono essere

Dettagli

Traduzione guidata dalla sintassi

Traduzione guidata dalla sintassi Traduzione guidata dalla sintassi Attributi e definizioni guidate dalla sintassi Dipartimento di Matematica e Informatica mariarita.diberardini@unicam.it Analisi Semantica Analisi sintattica - output:

Dettagli

Lezioni del corso di Progetto di Linguaggi e Traduttori

Lezioni del corso di Progetto di Linguaggi e Traduttori Università di Roma La Sapienza corso di laurea in Ingegneria Informatica Lezioni del corso di Progetto di Linguaggi e Traduttori a.a. 2006/2007 Riccardo Rosati Dipartimento di Informatica e Sistemistica

Dettagli

Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe.

Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe. Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe. 1) Comprendere il problema 2) Stabilire quali sono le azioni da eseguire per risolverlo 3) Stabilire la

Dettagli

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve LE STRUTTURE DATI DINAMICHE: GLI ALBERI Cosimo Laneve 1 argomenti 1. definizione di alberi e nozioni relative 2. implementazione degli alberi, creazione, visita 3. algoritmo di visita iterativa e sua implementazione

Dettagli

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen Esercitazione Ricorsione May 31, 2016 Esercizi presi dal libro di Rosen Problema 2 a) sezione 5.3 Data la seguente funzione definita ricorsivamente come: f(n+1) = 2f(n) f(0) = 3 Determinare il valore di

Dettagli

Informatica teorica Lez. n 7 Macchine di Turing. Macchine di Turing. Prof. Giorgio Ausiello Università di Roma La Sapienza

Informatica teorica Lez. n 7 Macchine di Turing. Macchine di Turing. Prof. Giorgio Ausiello Università di Roma La Sapienza Macchine di Turing Argomenti della lezione Definizione della macchina di Turing Riconoscimento e accettazione di linguaggi Macchine a più nastri La macchina di Turing èun è automa che può leggere e scrivere

Dettagli

Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl

Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl Approfondimento 2.1 Non è questo il testo dove trattare esaurientemente queste tecniche semantiche. Ci accontenteremo di dare un semplice esempio delle tecniche basate sui sistemi di transizione per dare

Dettagli

Note per la Lezione 4 Ugo Vaccaro

Note per la Lezione 4 Ugo Vaccaro Progettazione di Algoritmi Anno Accademico 2016 2017 Note per la Lezione 4 Ugo Vaccaro Ripasso di nozioni su Alberi Ricordiamo che gli alberi rappresentano una generalizzazione delle liste, nel senso che

Dettagli

Alberi ed Alberi Binari

Alberi ed Alberi Binari Alberi ed Alberi Binari Il tipo di dato Albero Un albero è una struttura di data organizzata gerarchicamente. È costituito da un insieme di nodi collegati tra di loro: ogni nodo contiene dell informazione,

Dettagli

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco. Alberi Alberi Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Frodo Dudo Daisy Alberi Gli alberi sono una generalizzazione

Dettagli

Espressioni Regolari

Espressioni Regolari Espressioni Regolari Le espressioni regolari sono costituite dalle stringhe sull alfabeto Σ = Σ {+,,*,(,),φ} ottenute secondo le seguenti regole: 1. φ e ciascun membro di Σ sono Epressioni Regolari 2.

Dettagli

9. Analisi Sintattica

9. Analisi Sintattica 9. Analisi Sintattica Nicola Fanizzi (fanizzi@di.uniba.it) Dipartimento di Informatica Università degli Studi di Bari Corso di Linguaggi di Programmazione 3 maggio 2005 1 Introduzione Denizione Funzionalità

Dettagli

TRIE (albero digitale di ricerca)

TRIE (albero digitale di ricerca) TRIE (albero digitale di ricerca) Struttura dati impiegata per memorizzare un insieme S di n stringhe (il vocabolario V). Tabelle hash le operazioni di dizionario hanno costo O(m) al caso medio per una

Dettagli

Automi Automi finiti: macchine a stati su sistemi di transizioni finiti Modellare con TS e specificare con automi: si usa lo stesso tipo di

Automi Automi finiti: macchine a stati su sistemi di transizioni finiti Modellare con TS e specificare con automi: si usa lo stesso tipo di Automi Automi finiti: macchine a stati su sistemi di transizioni finiti Modellare con TS e specificare con automi: si usa lo stesso tipo di rappresentazione per descrivere programmi e specifiche. ω-automi:

Dettagli

FUNZIONI BOOLEANE. Vero Falso

FUNZIONI BOOLEANE. Vero Falso FUNZIONI BOOLEANE Le funzioni booleane prendono il nome da Boole, un matematico che introdusse un formalismo che opera su variabili (dette variabili booleane o variabili logiche o asserzioni) che possono

Dettagli

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà Informatica 3 Informatica 3 LEZIONE 14: Alberi binari: introduzione Lezione 14 - Modulo 1 Modulo 1: Definizioni e proprietà Modulo 2: Attraversamento degli alberi binari Definizioni e proprietà Politecnico

Dettagli

Introduzione alla programmazione

Introduzione alla programmazione Introduzione alla programmazione Risolvere un problema Per risolvere un problema si procede innanzitutto all individuazione Delle informazioni, dei dati noti Dei risultati desiderati Il secondo passo consiste

Dettagli

Appunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato

Appunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato Appunti Senza Pretese di Programmazione II: Costruzione di un Albero Bilanciato Alessandro Panconesi DSI, La Sapienza via Salaria 113, 00198, Roma Consideriamo un problema che ci consentirá di vedere un

Dettagli

Implementazione dell albero binario in linguaggio C++

Implementazione dell albero binario in linguaggio C++ Implementazione dell albero binario in linguaggio C++ Costruire il programma per gestire le operazioni su un albero binario. Ogni nodo dell albero contiene un codice e una descrizione; il programma deve

Dettagli

a cura di Luca Cabibbo e Walter Didimo

a cura di Luca Cabibbo e Walter Didimo a cura di Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1 automi a pila automi a pila e grammatiche non contestuali notazioni sul livello degli esercizi: (*)

Dettagli

Metodo di Quine-McCluskey. Algoritmo. Sommario. Sommario. M. Favalli

Metodo di Quine-McCluskey. Algoritmo. Sommario. Sommario. M. Favalli Sommario Metodo di Quine-McCluskey M. Favalli Engineering Department in Ferrara 2 3 Sommario Analisi e sintesi dei sistemi digitali / Algoritmo Analisi e sintesi dei sistemi digitali 2 / 2 3 Metodo esatto

Dettagli

Suffix Trees. Docente: Nicolò Cesa-Bianchi versione 21 settembre 2017

Suffix Trees. Docente: Nicolò Cesa-Bianchi versione 21 settembre 2017 Complementi di Algoritmi e Strutture Dati Suffix Trees Docente: Nicolò Cesa-Bianchi versione 21 settembre 2017 In generale, possiamo trovare tutte le occorrenze di un pattern y in un testo x in tempo O(

Dettagli

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni. Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni. Algoritmi e Strutture Dati + Lab A.A. 14/15 Informatica Università degli Studi di Bari Aldo Moro Nicola Di Mauro

Dettagli

Sistemi lineari. Lorenzo Pareschi. Dipartimento di Matematica & Facoltá di Architettura Universitá di Ferrara

Sistemi lineari. Lorenzo Pareschi. Dipartimento di Matematica & Facoltá di Architettura Universitá di Ferrara Sistemi lineari Lorenzo Pareschi Dipartimento di Matematica & Facoltá di Architettura Universitá di Ferrara http://utenti.unife.it/lorenzo.pareschi/ lorenzo.pareschi@unife.it Lorenzo Pareschi (Univ. Ferrara)

Dettagli

Esercizi su alberi binari

Esercizi su alberi binari Esercizi su alberi binari Esercizi svolti: Determinazione nodi contenti verifica completezza verifica quasi completezza lunghezza del cammino interno determinazione ultima foglia in un quasi completo verifica

Dettagli

Linguaggi di Programmazione

Linguaggi di Programmazione Linguaggi di Programmazione 1 Linguaggio naturale e linguaggio macchina La comunicazione uomo-macchina avviene attraverso formalismi che assumono la forma di un linguaggio. Caratteristiche del Linguaggio

Dettagli

Algoritmi e strutture dati

Algoritmi e strutture dati Algoritmi e strutture dati Roberto Cordone A. A. 2015-16 Capitolo 3 Implementazioni dei dizionari ordinati Nota: queste dispense sono un rapido riassunto delle lezioni svolte nel dicembre 2015 e gennaio

Dettagli

Fasi di un Compilatore

Fasi di un Compilatore Dipartimento di Matematica e Informatica Università di Camerino Un implementazione compilativa di un linguaggio di programmazione viene realizzata tramite un programma che prende il nome di compilatore

Dettagli

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree Dati e Algoritmi I (Pietracaprina): Esercizi 1 Problema 1 Si definisca Interval Tree un albero binario di ricerca le

Dettagli

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave

Dettagli

e Algoritmi Marco Piastra Intelligenza Artificiale I Soddisfacibilità

e Algoritmi Marco Piastra Intelligenza Artificiale I Soddisfacibilità Intelligenza Artificiale I Soddisfacibilità e Algoritmi Marco Piastra Intelligenza Artificiale I - A.A. 2010- Soddisfacibilità e Semantic Tableau [1] Problemi e decidibilità (automatica) Problema Un problema

Dettagli

generalità concetti di base

generalità concetti di base generalità concetti di base cosa significa informatica? scienza dell informazione e l informazione giornalistica? scienza dei computer (dall inglese computer science) per i progettisti di computer? scienza

Dettagli

Informatica Teorica. linguaggi non contestuali

Informatica Teorica. linguaggi non contestuali Informatica Teorica linguaggi non contestuali di tipo 2 context free (CF) 1 linguaggi non contestuali molte frasi in linguaggio naturale hanno una struttura sintattica non contestuale esempio: soggetto

Dettagli

Metodo di Quine-McCluskey. Algoritmo. Sommario. Sommario. M. Favalli

Metodo di Quine-McCluskey. Algoritmo. Sommario. Sommario. M. Favalli Sommario Metodo di Quine-McCluskey M. Favalli Engineering Department in Ferrara 2 3 Sommario (ENDIF) Reti logiche / 46 Algoritmo (ENDIF) Reti logiche 2 / 46 2 3 Metodo esatto per la sintesi di reti a 2

Dettagli

L algoritmo per la classificazione delle superfici topologiche connesse e compatte

L algoritmo per la classificazione delle superfici topologiche connesse e compatte Università degli studi di Torino Corso di Studi in Matematica Geometria 3 L algoritmo per la classificazione delle superfici topologiche connesse e compatte Alberto Albano Come notato varie volte a lezione,

Dettagli

Dall algoritmo al calcolatore: concetti introduttivi. Fondamenti di Programmazione

Dall algoritmo al calcolatore: concetti introduttivi. Fondamenti di Programmazione Dall algoritmo al calcolatore: concetti introduttivi Fondamenti di Programmazione Algoritmo Problema o compito Preparazione di una torta Programmazione del VCR MCD tra due numeri Algoritmo sequenza precisa

Dettagli