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

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "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"

Transcript

1 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

2 Esempio aedbae aedbaa aedcaa aadcaa abaa as S applicando R3 S aa A BaA A e B ac B AdC C b applicando R6 applicando R3 applicando R5 a applicando R2 applicando R1 A R1 R2 R3 R4 R5 R6 S A B a A d C e e b Shift-reduce parsing: LR(k) Left scan, Right-most derivation sviluppata da Knuth (1965) genera una right most derivation Due operazioni centrali legge il successivo input: spostamento nella pila applica una produzione: riduce i terminali con un non terminale altre operazioni accettazione: sostituzione di tutta la stringa con l assioma error detection 2

3 LR parsing Introduciamo un metodo di parsing bottom-up efficiente che può essere usato per un ampia classe di grammatiche libere LR(k) parsing: L indica che l input viene letto da sinistra a destra (Left to right) R indica che viene ricostruita una derivazione Rightmost rovesciata (il non terminale più a destra viene sostituito per primo) k indica che vengono usati k simboli di lookahead (se k=1 spesso (1) viene omesso e quindi si parla semplicemente di LR parsing) Vantaggi Può essere costruito un parser LR per tutti i costrutti dei linguaggi di programmazione per i quali può essere scritta una grammatica libera (tipo 2) LR è il metodo di parsing shift-reduce senza backtracking più generale che si conosca e, nonostante ciò, può essere implementato in maniera efficiente tanto quanto altri metodi di parsing shift-reduce meno generali La classe di grammatiche che possono essere analizzate LR propriamente maggiore di quelle che che possono essere analizzate LL con un parser predittivo 3

4 Vantaggi e svantaggi Tutti i parser LR rilevano un errore di sintassi il prima possibile rispetto ad una scansione dell input da sinistra a destra Svantaggio: la costruzione di un parser LR per un linguaggio di programmazione tipico è troppo complicata per essere fatta a mano C è bisogno di un tool apposito, un generatore di parser LR, che applichi gli algoritmi che vedremo e definisca la tabella del parser. Esempi di generatori di questo tipo sono Yacc o Bison Questi tool sono molto utili anche perché danno informazione diagnostica se c è qualche problema (ad esempio, in caso di grammatica ambigua, il tool restituisce abbastanza informazione per determinare dove si crea l ambiguità) Programma 1. Introduciamo l algoritmo generale eseguito da un parser LR 2. K = 0 3. K = 1 1. Introduciamo il metodo più semplice per la costruzione della tabella di un parser LR: simple LR (abbreviato in SLR) 2. Studiamo il metodo LR canonico che è il metodo più potente, ma anche il più costoso, per costruire la tabella 3. Semplifichiamo un po e definiamo il metodo lookahead LR (LALR) che si trova ad un livello intermedio fra gli altri due 4

5 Il parser LR INPUT a 1... a i... a n $ STACK s m Programma di Parsing LR Output X m s m-1 X m-1... action goto s 0 Il parser LR Il programma è sempre lo stesso, cambia la tabella action + goto Ogni s i nello stack è uno stato che serve a riassumere i simboli di stack sottostanti In una reale implementazione è sufficiente lo stato, non c è bisogno di mettere anche i simboli della grammatica Ad ogni passo il parser decide se fare shift o reduce in base allo stato che si trova in cima allo stack e al simbolo di lookahead corrente 5

6 Tabelle Action e GoTo action[s m,a i ] =X X descrive l operazione che bisogna compiere: S = spostamento, R = riduzione, A = accettazione E = error s = stato a = input (simbolo terminale) GoTo(s, y) = s1 s1 e s stati y simbolo terminale o non terminale Una derivazione di un right sentential form γ è una produzione A βe una posizione in γ dove β può essere trovato e sostituito da A per produrre un forma di frase più alta (quando operiamo una riduzione di tipo bottom-up) S αa ω αβω dove α {V T}*, β {V T}*, ω {T}* tutti gli shift-reduce parser operano spostando simboli e esaminando i simboli di ingresso (look-aheads) fino a quando la derivazione viene trovata 6

7 Configurazioni In ogni istante il parser è in una configurazione: (s 0 X 1 s 1 X 2 s 2... X m s m, a i a i+1... a n $) È la stessa configurazione tipica di uno shiftreduce parser, ma in più ci sono gli stati Corrisponde alla forma sentenziale destra X 1 X 2... X m a i a i+1... a n Azioni e goto Se action[s m,a i ]= shift s allora il parser mette il simbolo a i sullo stack Per arrivare ad una configurazione corretta il parser deve inserire lo stato s sopra al simbolo appena impilato Tale stato s è stato determinato da goto[s m,a i ]=s La nuova configurazione è: (s 0 X 1 s 1... X m s m a i s, a i+1... a n $) 7

8 Azioni e goto Se action[s m, a i ] = reduce con A βallora la nuova configurazione diventa: (s 0 X 1 s 1... X m-r s m-r A s, a i a i+1... a n $) dove: r è la lunghezza di β (si eliminano dallo stack 2r simboli fino ad avere in testa s m-r ) Si ha che X m-r+1 X m-r+2... X m = β s = goto[s m-r, A] Azioni e goto Se action[s m, a i ] = accetta allora il parser annuncia che l analisi è terminata con successo Se action[s m, a i ] = errore allora c è un errore di sintassi e il parser chiama una procedura di gestione/recupero dell errore 8

9 Algoritmo Input: Una stringa di terminali (token) w ed una tabella di parsing LR (action + goto) per la grammatica considerata Output: Se w è in L(G) allora restituisce la traccia di una derivazione rightmost rovesciata di w da G, altrimenti dà una indicazione di errore Algoritmo ip punta al primo simbolo di w$; while true do begin s := top(stack); a:= simbolo puntato da ip; if action[s,a] = shift s then begin push(a); push(goto(s,a)); ip avanza di un simbolo end else if action[s,a] = reduce A βthen begin pop 2* β simboli dallo stack; s := top(stack); push(a); push(goto[s,a]); segnala in output la produzione A β end else if action[s,a] = accetta then return else errore() end 9

10 Esempio Consideriamo la seguente grammatica: 1. E E + T 2. E T 3. T T * F 4. T F 5. F (E) 6. F id La numerazione è importante per i riferimenti della tabella Una tabella LR per la grammatica action goto Stato id + * ( ) $ E T F 0 s5 s s6 acc 2 r2 s7 r2 r2 3 r4 r4 r4 r4 4 s5 s r6 r6 r6 r6 6 s5 s s5 s s6 s11 9 r1 s7 r1 r1 10 r3 r3 r3 r3 11 r5 r5 r5 r5 10

11 La tabella Nella tabella si sta per shift i, cioè fai lo shift del simbolo corrente di input e poi metti sullo stack lo stato i rj sta per reduce con la produzione numero j acc significa accetta vuoto significa errore Il valore goto[s,a] per un simbolo terminale a è il valore i di si, se indicato, altrimenti è errore Parsing della stringa: id * id + id Step STACK INPUT AZIONE 1 0 id * id + id $ Shift (s5) 2 0 id 5 * id + id $ Reduce con F id (r6) 3 0 F 3 * id + id $ Reduce con T F (r4) 4 0 T 2 * id + id $ Shift (s7) 5 0 T 2 * 7 id + id $ Shift (s5) 6 0 T 2 * 7 id 5 + id $ Reduce con F id (r6) 7 0 T 2 * 7 F 10 + id $ Reduce con T T * F (r3) 8 0 T 2 + id $ Reduce con E T (r2) 9 0 E 1 + id $ Shift (s6) 10 0 E id $ Shift (s5) 11 0 E id 5 $ Reduce con F id (r6) 12 0 E F 3 $ Reduce con T F (r4) 13 0 E T 9 $ Reduce con E E + T (r1) 14 0 E 1 $ Accetta 11

12 esempio S = <program> V = {<program>, <ist>} T = {begin, i, end, ;, $} P = { 1. <program> begin <ist>end $ 2. <ist> i ; <ist> 3. <ist> begin <ist>end ; <ist> 4 <ist> ε} Goto T begin end 3 8 ; 6 9 i $ <program> <ist>

13 Action T begin S S E E S E S E E S E end E R4 S E R4 E R4 S E R4 R2 ; E E E E E S E E S E E i E S E E S E S E E S E $ E E E A E E E E E E E 11 E R3 E E E Sulla base dei simboli letti si inseriscono stati nella pila e si cambia stato. Una configurazione di un parser LR è una coppia costituita da: s 0 x 1 s 1 x 2 s 3 x m s m a i a i+1 a i+2 a n $ gli elementi della pila s 0 x 1 s 1 x 2 s 3 x m s m l input non espanso a i a i+1 a i+2 a n $ Deve essere presente solo una produzione che ha come LHS l assioma 13

14 Algoritmo di parsing 1. Configurazione iniziale (s 0 a 1 a 2 a n $) 2. se action(s m, a i ) = s il parser esegue una mossa e va nella configurazione s 0 x 1 s 1 x 2 s 3 x m s m a i s a i+1 a i+2 a n $ cioè a i s sono inseriti nella pila e a i+1 è il successivo carattere 2. se action(s m, a i ) = reduce A βil parser esegue una riduzione e va nella configurazione s 0 x 1 s 1 x 2 s 3 x m-r s m-r A s a i a i+1 a n $ dove s = goto (s m-r, A) e r è la lunghezza di β 3. se action(s m, a i ) = accept il parser è completo 4. se action(s m, a i ) = error è segnalato un errore 0 begin i ; i ; end $ configurazione iniziale action(0, begin) = s goto(0,begin) = 1 0 begin 1 i ; i ; end $ nuova configurazione action(1, i) = s goto(1,i) = 5 0 begin 1 i 5 ; i ; end $ nuova configurazione action(5, ;) = s goto(5, ;) = 6 0 begin 1 i 5 ; 6 i ; end $ nuova configurazione action(6, i) = s goto(6,i) = 5 0 begin 1 i 5 ; 6 i 5 ; end $ nuova configurazione action(5, ;) = s goto(5,;) = 6 0 begin 1 i 5 ; 6 i 5 ; 6 end $ nuova configurazione action (6, end) = r4 <ist> ε r=0 goto(6,<ist>) = 10 0 begin 1 i 5 ; 6 i 5 ; 6 <ist> 10 end $ nuova configurazione 14

15 action (10, end) = r2 <ist> i ; <ist> r=3 goto(6,<ist>) = 10 0 begin 1 i 5 ; 6 i 5 ; 6 <ist> 10 end $ 0 begin 1 i 5 ; 6 <ist> 10 end $ action (10, end) = r2 <ist> i ; <ist> r=3 goto(1,<ist>) = 2 0 begin 1 i 5 ; 6 <ist> 10 end $ 0 begin 1 <ist> 2 end $ action (2, end) = s goto(2,end) = 3 0 begin 1 <ist> 2 end 3 $ action (3,$) = a <program> begin <ist>end $ r= 4 <program> 10 <ist> 6 ; 10 5 <ist> i 63 end ; 25 <ist> i 1 begin <program> 0 begin i ; i ; end $ 15

16 Costruzione delle tabelle di parsing LR Come costruiamo la tabella? Una grammatica per la quale possiamo costruirla si dice che è una grammatica LR Esistono grammatiche libere dal contesto che non sono grammatiche LR Possono essere evitate per i costrutti tipici dei linguaggi di programmazione Intuizione Una grammatica è LR quando un parser shiftreduce è in grado di riconoscere le stringa da sostituire quando appaiono in cima allo stack Un parser LR non deve guardare tutto lo stack: lo stato che in ogni momento si trova in testa ad esso contiene tutta l informazione di cui il parser ha bisogno 16

17 Intuizione Fatto importante: se è possibile riconoscere una operazione guardando solo i simboli della grammaticha che sono sullo stack allora esite un automa a stati finiti che, leggendo i simboli dello stack dal fondo alla testa, determina se una certa handle è presente in testa La funzione goto di un parser LR è essenzialmente questo automa a stati finiti L automa non ha bisogno di leggere tutto lo stack ad ogni mossa I simboli di lookahead Oltre allo stato in testa allo stack un parser LR prende le sue decisioni anche in base, in generale, a k simboli di lookhead Noi considereremo solo i casi k=0 e k=1 (che sono quelli di interesse pratico) 17

18 Grammatiche LL vs LR La condizione richiesta ad una grammatica per essere LR(k) è meno forte di quella richiesta alla stessa per essere LL(k) LR(k): dobbiamo essere in grado di riconoscere l occorrenza della parte destra di una produzione avendo visto tutto quello che è stato derivato dalla stessa parte destra e avendo k simboli di lookahead LL(k): dobbiamo essere in grado di decidere quale produzione applicare ad un simbolo non terminale potendo vedere solo k simboli di quello che la parte destra della produzione in questione deriva. Insiemi Grammatiche LR(k) Grammatiche LL(k) 18

19 Grammatiche LR(1) Grammatiche LALR(1) Grammatiche SLR(1) Grammatiche LR(0) Alcune note L analisi di tipo LR(K) richiede una grammatica che ha una sola produzione per l assioma Se la grammatica ha più di una produzione per l assioma viene aggiunta la produzione S S $ e il nuovo assioma è il non terminale S 19

20 Analisi LR(0) Costruzione delle tabelle Goto e Action Candidata LR(0) Un candidata LR(0) per una grammatica G è una produzione di G con un punto in qualche posizione della parte destra della produzione Es: la produzione A XYZ può dar luogo a quattro candidata LR(0): 1. A XYZ 2. A X YZ 3. A XY Z 4. A XYZ 20

21 Collezione canonica LR(0) G grammatica con simbolo iniziale S G grammatica G aumentata con un nuovo simbolo iniziale S e la produzione S S Questo accorgimento serve ad indicare al parser la fine del parsing: il parsing ha successo se e solo se l input è terminato e c è una riduzione con la produzione S S LR(0) I parser LR(0) sono basati su una configurazione con la seguente forma (candidata) A x 0 x 1 x 2 x i x i+1... x m dove il punto indica fino a che punto e stata riconosciuta la frase può comparire in qualsiasi punto nella parte destra di una produzione predict compare all estrema sinistra A x 0 x 1 x 2... x m reduce compare all estrema destrra A x 0 x 1 x 2... x m Noi considereremo tutte le produzioni applicabili in parallelo costruendo l insieme delle candidate La configurazione iniziale e il predict dell assioma 21

22 Candidata LR(0) La produzione A εdà luogo ad una sola candidata LR(0), cioè A Un candidata può essere rappresentata efficacemente con due numeri interi: il numero della produzione e la posizione del punto Una candidata indica quanto di una produzione è stato visto ad un certo punto del parsing Es: A X YZ indica che X è stato visto e ci si aspetta di vedere YZ Chiusura di una candidata LR(0) Do { if (B δ Aρ e nell insieme della chiusura) aggiungere tutte le candidate di forma A γ all insieme While (ci sono altre candidate da aggiungere) Lo stato iniziale per il parser LR coinvolge la chiusura di S γ $ A partire dalla configurazione iniziale costruiremo una FSA (che chiameremo CFSM cioè FSM caratteristica) che mostra tutte le transizioni a nuovi stati attraverso terminali e non terminali. 22

23 Chiusura for LR( 0) Chiusura (I){ Do For each (ogni argomento [A α B β] in I, ogni produzione B γ tale che [B γ ] non è in I) {add [B γ ] ad I While sono possibili nuovi inserimenti return I Costruzione tabella GOTO GOTO (I, X) { Detto J l insieme delle [A α X β] tali che [A α X β ] èin I return Chiusura (J) 23

24 Costruzione delle tabelle LR(0) void BUILD-LR(0) (){ C = Chiusura([ S S]) do for each (I C and X GOTO( I, X) and GOTO( I, X) C) add GOTO( I, X) to C While sono possibili inserimenti Esempio V = {E, T, S} T = {id, +, (, ), $} P = {E E + T E T T id T (E) S E$} stato 0 chiusura (S E$) = {S E$} chiusura(e E+T) chiusura(e T) = {S E$, E E+T, E T} chiusura(t id) chiusura(t (E)) = {S E$, E E+T, E T, T id, T (E) } 24

25 Esempio S E$ E E+T E T T id T (E) T id id id E ( T S E $ E E +T 4 6 E T T T ( E) E E+T E T T id T (E) ( + ( E $ 5 2 S E$ E E + T T id T (E) T T (E ) E E +T ) T (E) id 9 E E + T Goto e action T ) 8 ( 6 6 id 3 3 $ 2 E 1 7 T T S S A R4 R3 9 4 S R5 R2 25

26 LR(0) Una grammatica è LR(0) se ogni stato dellla CFSM contiene o una sola candidata di riduzione una o più candidate di spostamento Algoritmo di parsing 1. Configurazione iniziale (s 0 a 1 a 2 a n $) 2. se action(s m ) = s il parser esegue una mossa e va nella configurazione s 0 x 1 s 1 x 2 s 3 x m s m a i s a i+1 a i+2 a n $ cioè a i s sono inseriti nella pila e a i+1 è il successivo carattere 2. se action(s m ) = reduce A βil parser esegue una riduzione e va nella configurazione s 0 x 1 s 1 x 2 s 3 x m-r s m-r A s a i a i+1 a n $ dove s = goto (s m-r, A) e r è la lunghezza di β 3. se action(s mi ) = accept il parser è completo 4. se action(s mi ) = error è segnalato un errore 26

27 Algoritmo LR(0) ip punta al primo simbolo di w$; while true do begin s := top(stack); a:= simbolo puntato da ip; if action[s] = shift s then begin push(a); push(s ); ip avanza di un simbolo end else if action[s] = reduce A βthen begin pop 2* β simboli dallo stack; s := top(stack); push(a); push(goto[s,a]); segnala in output la produzione A β end else if action[s] = accetta then return else errore() end Parser SLR( 1) I parser LR( 0) generano una forma compatta di tabelle goto e action tables ma spesso non sono abbastanza potenti. SLR(1) usano un simbolo di look-ahead insieme alla CFSM di tipo LR(0) CFSM. I look-aheads sono aggiunti alle candidate (o configurazioni) nel seguente modo: per le candidate di spostamento A α β lookaheads sono rappresentati da First(β ) per le candidate di riduzione A α look-aheads sono rappresentati da Follow(A) 27

28 Esempio T = {+, *, (, id, )} V = {S, E, T, P} P = { S E E E + T T T T * P P P id ( E ) } S = S ( 10 T T * P 8 P (E) P 0S E E E + T E T T T * P T P P id P ( E ) id 1 P id 2 T P E T 7 T 3 S E E E + T 9 id 1 T T * P ( P id 5 P ( E ) 10 4 * P E T T T * P P T 5P ( E ) E E + T E T id T T * P T P P id P ( E ) E ( ) 6 P (E ) E E + T + 7 E E + T T T* P T P P id P ( E ) P id 1 28

29 First(P) = {id, (} First(T) = First(P) = {id, (} First(E) = First(T) = First(P) = {id, (} First(S) = First(E) = First(T) = First(P) = {id, (} Follow(T) = First(*P) Follow(E) = {+, *} Follow(P) = Follow(T) = {+, *} Follow(S) = {$} Follow(E) = First(+ T) Follow(T) = {+, *} Esempio: ambiguità shiftreduce S = S' V = {S', S, A} T = {a, b, $} P = { 0. S' S$ 1. S AS 2. S b 3. A SA 4. A a} 29

30 Esempio 0 S' S$ S AS S b A SA A a b 2 S b 2 b S b A 3 a a S a S 1 S' S $ $ A S A A Sa A A a S AS S b a a 3 4 S Α S S AS S b A SA A a A 5S' S $ 6A SA S A S S AS S b A SA A a A 2 b 7 A S a 8 a A S a 9 S S Α S A S A S First( S') = First(S) = {a, b} First(S) = First(A) {b} = {a, b} First( A) = First(S) {a} = {a, b} Follow( S') = Follow( S) = {$} First(A) = {$, a, b} Follow( A) = First(S) = {a, b} 30

31 Risoluzione dell ambiguità S6 6A SA riduzione Follow( A) = First(S) = {a, b} S A S S AS spostamento S b First(S) First(A) First(b) First(A) A SA = {a, b} A a L ambiguità non può essere risolta Grammatiche non SLR(1) Sappiamo già che nessuna grammatica ambigua può essere LR, quindi tantomeno SLR Ci sono grammatiche non ambigue che però non sono SLR. Ad esempio: S L = R R L * R id R L 31

32 Tabelle LR(1) Costruzione delle tabelle di parsing LR canoniche Perché utilizzare parser LR(1)? Nel metodo SLR, lo stato i chiama per la riduzione A α un simboli di ingresso a se l insieme delle candidate contiene A α e a appartiene al Follow(A). Talvolta quando i appare in cima alla pila, un prefisso βα può essere in cima alla pila ma β A non puo essere seguito da a nelle frasi corrette, quindi la riduzione dovrebbe essere invalida Per evitare tale invalida riduzione che causa una ambiguità shift-reduce, noi possiamo cercare più informazioni dividendo lo stato in piu stati se necessario. L uso dell insieme Follow per stimare i look-aheads che predicono azioni di riduzioni sono meno precise rispetto ad incorporare gli esatti lookaheads nelle configurazioni. I parser LR(1) usano una informazione lookahead più precisa alla scopo di gestire una maggior quantità di linguaggi. 32

33 LR(1) Parsers Un candidata LR(1) è una candidata LR(0) con informazioni look-ahead: [A α β, a]. Il look-ahead non ha effetto sulla candidata di forma [A α β, a], dove β ε, ma una candidata di forma [A α, a] è una riduzione solo quando il successivo ingresso è in a. I parsers LR(1) usa configurazioni (con informazioni di lookahead): A x 1... x i x i x j, l, where l T $. l è il look-ahead dopo che l intera parte destra della regola è ritrovata. $ appare come look-ahead per l assioma. Chiusura for LR( 1) Chiusura (I){ Do For each (ogni argomento [A α B β, a] in I, ogni produzione B γ, e ogni terminale b First(βa) tale che [B γ, b] non è in I) {add [B γ, b] ad I While sono possibili nuovi inserimenti return I 33

34 Costruzione tabella GOTO GOTO (I, X) procedure GOTO (I, X) { Detto J l insieme delle [A α X β, a] tali che [A α X β, a] è in I return Chiusura (J) Costruzione delle tabelle LR(1) void BUILD-LR(1) (){ C = Chiusura([ S S, $]) do for each (I C and X GOTO( I, X) and GOTO( I, X) C) add GOTO( I, X) to C While sono possibili inserimenti 34

35 Example: S = S' V = {S', S, C} T = {c, d} P = { 0. S' S 1. S CC 2. C cc 3. C d} [S' S, $] è la configurazione iniziale I 0 La chiusura di questa configurazione è [A α Bβ, a], A = S', α = ε, B = S, β = ε, a = $ aggiungere [B γ, b] B γ e b First(βa) cioè : S CC e First(βa) = First(a) = $: [S CC, $] 35

36 [S CC, $]. La chiusura di questa configurazione è [A α Bβ, a], A = S', α = ε, B = S, β = ε, a = $ aggiungere [B γ, b] B γ e b First(βa) cioè : C cc e C d, con First(βa) = First(Ca) = {c, d}, [C cc, c d] [C d, c d] Calcolare GOTO(I 0,X) per i vari valori di X. Per X = S, noi dobbiamo effettuare la chiusura di [S' S, $], ma in questo caso nessun altra chiusura è possibile Quindi I 1 è[s' S, $]. Per X = C, noi dobbiamo effettuare la chiusura di [S C C, $]. Noi dobbiamo aggiunge tutte le produzioni di C con lookahead di $ poiché β è. Quindi I 2 is [S C C, $] [C cc, $] [C d, $] 36

37 Per X = c, noi dobbiamo effettuare la chiusura di [C c C, c d]. Quindi noi abbiamo le produzioni di C con lookahead c d. Pertanto I 3 : [C c C, c d] [C cc, c d] [C d, c d] Per X = d, noi dobbiamo effettuare la chiusura di [C d, c d], per la quale non e possibile aggiungere nulla. Quindi I 4 è[c d, c d]. Calcolare GOTO(I 2,X) per i vari valori di X Per X = C, chiusura [S CC, $], non è possibile aggiungere altre candidate, pertanto I 5 is [S CC, $] Per X = c, chiusura [C c C, $]. Dobbiamo aggiungere tutte le candidate di predizione di C con lookahead $, pertanto I 6 : [C c C, $] [C cc, $] [C d, $] For X = d, chiusura [C d, $], non è possibile aggiungere altre candidate, pertanto I 7 is [C d, $] 37

38 Calcolare GOTO(I 3,X) per i vari valori di X Per X = c, chiusura [C c C, c d]. Dobbiamo aggiungere tutte le candidate di predizione di C con lookahead c d, ottenendo I 3 Per X = d, chiusura [C d, c d]. Si ottiene I 4 For X = C, chiusura [C cc, c d], non è possibile aggiungere altre candidate, pertanto I 8 è[c cc, c d] Calcolare GOTO(I 6,X) per i vari valori di X Per X = c, chiusura [C c C, $]. Dobbiamo aggiungere tutte le candidate di predizione di C con lookahead $, ottenendo I 6 Per X = d, chiusura [C d, $]. Si ottiene I 7 For X = C, chiusura [C cc, $], non è possibile aggiungere altre candidate, pertanto I 9 è[c cc, $] 38

39 d S' S, {$} S CC, {$} C cc, {c d} C d, {c d} C C d, {c d} S c c S C C, {$} C cc, {$} C d, {$} C S' S, {$} S C C, {$} C C c C, {c d} C cc, {c d} C d, {c d} d c C C c C, {$} C c C, {c d} d C d, {$} d C c C, {$} C cc,{$} C d,{$} C Esempio T = {+, *, (, id, )} V = {S, E, T, F} P = { S E E E + T T T T * P P P id ( E ) } S = S 39

40 [S Ε, {$}] è la configurazioni iniziale I 0 Per chiudere con [A α B β, a], A = S, α =, B = E, β =, a = $ add [B γ, b] for each B γ εterminale b FIRST( β a), that is : E E + T and E TwithFIRST( β a) FIRST( a) = $: [S Ε, $] [E E + T, $] [E T, $] Chiusura[E E + T, {$}] = [E E + T, {$, +}] [E T, {$, +}] Chiusura [E Τ * P, {$, +}] = [P id, {$, +,*}] [P (E), {$, +,*}] Chiusura [E T, {$, +}] = [T Τ * P, {$, +}] [T P, {$, +}] Chiusura [T Τ * P, {$, +}] = [T Τ * P, {$, +,*}] [T P, {$, +,*}] id pertanto I 0 E [S Ε, {$}] [E E + T, {$, +}] [E T, {$, +}] [T Τ * P, {$, +,*}] [T P, {$, +,*}] [P id, {$, +,*}] [P (E), {$, +,*}] T P I 1 I 2 I 3 I 4 ( I 5 40

41 Calcolo di I 1 [S Ε, {$}] [E E + T, {$, +}] + I 6 [S Ε, {$}] [E E + T, {$, +}] Calcolo di I 2 [E T, {$, +}] [T Τ * P, {$, +,*}] * I 7 [E T, {$, +}] [T Τ * P, {$, +,*}] 41

42 Calcolo di I 3 [T P, {$, +,*}] [T P, {$, +,*}] Calcolo di I 4 [P id, {$, +,*}] [P id, {$, +,*}] 42

43 Considerazioni Ogni grammatica SLR(1) è anche LR(1), ma per una grammatica SLR(1) il parser LR canonico può avere molti più stati rispetto a quelli del parser SLR Ad esempio, la grammatica che abbiamo usato come esempio è SLR e un parser SLR per la stessa ha 7 stati invece dei 10 del parser LR canonico appena costruito Tabelle LALR Costruzione delle tabelle LALR 43

44 Metodo LALR Introduciamo l ultimo metodo di costruzione di tabelle per il parsing LR Nome: lookahead-lr abbreviato in LALR Questo metodo è usato spesso dato che le tabelle che si ottengono sono sensibilmente più piccole di quelle ottenute con l LR canonico I tipici costrutti dei linguaggi di programmazione possono venire facilmente catturati da una grammatica LALR Metodo LALR Lo stesso discorso valeva anche per le grammatiche SLR Tuttavia ci sono un certo numero di costrutti per i quali è meglio usare grammatiche LALR Le tabelle SLR e LALR hanno sempre lo stesso numero di stati Numero: alcune centinaia di stati per un linguaggio tipo il Pascal Per lo stesso linguaggio una tabella LR canonica ha alcune migliaia di stati 44

45 Idea Consideriamo la grammatica usata come esempio per illustrare la costruzione di tabelle LR canoniche: S S S CC C cc d Idea Alcuni insiemi di candidate LR(1) che abbiamo costruito per questa grammatica avevano lo stesso insieme di candidate LR(0) ma differivano per i simboli di lookahead I 4 = {[C d, c], [C d, d] } I 7 = {[C d, $]} 45

46 Idea Osserviamo meglio il comportamento di questi due stati durante il parsing La grammatica genera il linguaggio c*dc*d Durante la lettura di un input cc cdcc cd il parser fa lo shift di tutto il primo gruppo di c e della prima d che le segue entrando nello stato 4 dopo aver letto questa d A questo punto il parser ordina una riduzione con C d se il simbolo successivo è c o d Idea È giusto: sia c che d possono essere l inizio di c*d D altra parte, se $ segue la prima d c è un errore: ad esempio la stringa ccd non è nel linguaggio E giustamente lo stato 4 segnala errore se il simbolo di input è $ 46

47 Idea Dopo la prima d il parser appila tutte le c seguenti e anche la seconda d entrando infine nello stato 7 A questo punto il simbolo di input deve essere $ altrimenti la stringa data non è nel linguaggio (errore) È giusto che lo stato 7 comandi una riduzione con C d se l input è $ e dia errore se l input è c o d. Idea Rimpiazziamo ora gli insiemi I 4 e I 7 con un unico insieme di candidate LR(1) I 47 I 47 è l unione degli candidate di I 4 e di I 7 I 47 = C d, c/d/$ goto(i i,d)=i 47 per i=0,2,3,6 Le azioni dello stato 47 sono: riduci con C d per ogni input 47

48 Conseguenze Il parser così modificato si comporta quasi allo stesso modo di quello di partenza Potrebbe ridurre con C d in alcune circostanze nelle quali il parser originale avrebbe segnalato un errore (es: ccd o ccdcdc) L errore però viene comunque rilevato in seguito (in effetti prima che venga appilato un altro simbolo terminale sullo stack) In generale Cerchiamo gli insiemi di candidate LR(1) che hanno lo stesso core, cioè lo stesso insieme di prime componenti Accorpiamo gli insiemi di candidate LR(1) con lo stesso core in un unico insieme di candidate LR(1) Nell esempio precedente I 4 e I 7 avevano lo stesso core C d 48

49 In generale Ad esempio anche gli insiemi I 3 ed I 6 dell esempio precedente hanno lo stesso core {C c C, C cc, C d} Anche I 8 ed I 9 hanno lo stesso core {C cc } In generale un core è un insieme di candidate LR(0) In generale Il core di goto(i,x) dipende solo dal core di I Questo significa che i goto degli stati accorpati possono essere anche essi accorpati Quindi non c è problema nella ridefinizione della funzione goto La tabella action va modificata in accordo ai nuovi candidate LR(1) (con gli accorpamenti) 49

50 Conseguenze Supponiamo di avere una grammatica LR(1) I suoi insiemi di candidate LR(1) non producono conflitti Se accorpiamo gli insiemi con lo stesso core ci dovremmo aspettare che i nuovi insiemi producano conflitti E invece non è così, almeno per i conflitti shift/reduce Conseguenze Supponiamo infatti di avere un conflitto shift/reduce in uno stato accorpato Più precisamente c è una candidata [A α, a] che indica una riduzione per a e anche una candidata [B β aγ, b] che invece indica uno shift per a Se questo è vero allora almeno un insieme di candidate (non accorpato) aveva nel core la candidata [A α, a] e, visto che il core deve essere uguale per tutti gli stati che sono stati accorpati, anche una candidata [B β aγ, c] per qualche c 50

51 Conseguenze Ma questo significherebbe che c era lo stesso conflitto anche sull insieme di candidate LR(1) di partenza Ciò non è possibile perché siamo partiti dall ipotesi che la grammatica fosse LR(1) Quindi l accorpamento non produrrà mai conflitti shift/reduce Conseguenze Tuttavia è possibile che l accorpamento provochi conflitti reduce/reduce Esempio: S S S aad bbd abe bae A c B c 51

52 Questa grammatica genera le quattro stringhe acd, ace, bcd, bce La grammatica è LR(1) Costruendo gli insiemi di candidate LR(1) si trova {[A c, d], [B c, e} le cui candidate sono valide per ac {[A c, e], [B c, d} le cui candidate sono valide per bc Nessun conflitto Esempio Proviamo ad accorpare gli stati e vediamo se la grammatica è LALR {[A c, d/e], [B c, d/e]} Conflitto reduce/reduce: sugli input d ed viene indicato di ridurre sia con A c che con B c Quindi la grammatica è LR(1), ma non è LALR 52

53 Costruzione tabella LALR Esistono due modi 1. Il primo è basato sulla costruzione preliminare delle candidate LR(1) e successivo accorpamento. È il metodo più semplice, ma anche il più costoso Il secondo, che non faremo, genera direttamente gli stati del parser LALR senza passare per gli stati del parser LR Algoritmo Input: una grammatica aumentata G Output: le funzioni action e goto della tabella di parsing LALR 1. Costruisci C={I 0,...,I n }, la collezione di insiemi di candidate LR(1) 2. Per ogni core degli insiemi di candidate LR(1) accorpa tutti gli insiemi con quel core nello stesso insieme 3. Sia C ={J 0,...,J m } la collezione risultante. I valori della tabella action per lo stato i sono costruiti a partire dall insieme J i utilizzando lo stesso algoritmo visto per la tabella LR canonica. Se ci sono conflitti allora la grammatica non è LALR(1) 4. La tabella goto è costruita come segue: Sia J l unione di uno o più insiemi di candidate LR(1): J = I 1 I 2... I k Allora i core di goto(i 1,X), goto(i 2,X),...,goto(I k,x) sono gli stessi, dato che I 1, I 2,...,I k hanno lo stesso core Sia K l unione di insiemi di candidate che hanno lo stesso core di goto(i 1,X) Allora goto(j,x)=k 53

54 Esempio Riprendiamo la grammatica per c*dc*d che abbiamo usato per illustrare la costruzione della tabella LR canonica Abbiamo visto sopra che si possono accorpare gli stati 4 e 7 Inoltre accorpiamo 3 e 6 E anche 8 e 9 I47 = C d, c/d/$ I36= C c C, c/d/$ C cc, c/d/$ C d, c/d/$ I89= C cc, c/d/$ Tabella LALR STATO action goto c d $ S C 0 s36 s acc 2 s36 s s36 s r3 r3 5 r1 89 r2 r2 54

55 Considerazioni Se presentiamo al parser LALR una stringa corretta (nel nostro esempio una stringa di c*dc*d) il parser LALR esegue esattamente le stesse mosse del parser LR canonico Se presentiamo una stringa che non appartiene al linguaggio i due parser hanno un comportamento differente, ma entrambi segnalano l errore Provare con l input ccd$ 55

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Linguaggi context free. Analizzatori sintattici e alberi di analisi

Linguaggi context free. Analizzatori sintattici e alberi di analisi Linguaggi context free Analizzatori sintattici e alberi di analisi ( ) * id + id id 2 Grammatiche Context Free Una grammatica CF ha produzioni del tipo X α con X N e α (T N)* sono libere dal contesto perché

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

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

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

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

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

controllo stringa a a b a b b c c b a b x y z pila di memoria

controllo stringa a a b a b b c c b a b x y z pila di memoria Gli automi a pila Dagli automi finiti iti agli automi a pila Possiamo ottenere un automa a pila a partire da un automa finito (così come l abbiamo definito in precedenza), attraverso l introduzione di

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

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

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

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

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

Esercizi di Algoritmi e Strutture Dati

Esercizi di Algoritmi e Strutture Dati Esercizi di Algoritmi e Strutture Dati Moreno Marzolla marzolla@cs.unibo.it Ultimo aggiornamento: 3 novembre 2010 1 Trova la somma/1 Scrivere un algoritmo che dati in input un array A[1... n] di n interi

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

Dispensa 3. 1.1 YACC: generalità

Dispensa 3. 1.1 YACC: generalità Dispensa 3 1.1 YACC: generalità Il tool Yacc (acronimo per Yet Another Compiler Compiler) è uno strumento software che a partire da una specifica grammaticale context free di un linguaggio scritta in un

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

Valutazione Lazy. Prefazione alla lezione

Valutazione Lazy. Prefazione alla lezione Valutazione Lazy Aniello Murano Università degli Studi di Napoli Federico II 1 Prefazione alla lezione Nella lezione precedente abbiamo introdotto i linguaggi (funzionali) con tipi di ordine superiore.

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

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

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

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

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

Trattamento degli errori

Trattamento degli errori Corso di Laurea Magistrale in Ingegneria Informatica A.A. 2011-2012 Linguaggi Formali e Compilatori Trattamento degli errori Giacomo PISCITELLI Trattamento degli errori Comunemente gli errori di programmazione

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

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

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

Esercitazioni per il corso di Logica Matematica

Esercitazioni per il corso di Logica Matematica Esercitazioni per il corso di Logica Matematica Luca Motto Ros 02 marzo 2005 Nota importante. Queste pagine contengono appunti personali dell esercitatore e sono messe a disposizione nel caso possano risultare

Dettagli

Le grammatiche formali

Le grammatiche formali Le grammatiche formali Il carattere generativo dei sistemi linguisticii i Consideriamo i la seguente frase: Un gatto rincorre il topo Non facciamo difficoltà a riconoscere che si tratta di una frase sintatticamente

Dettagli

Il problema delle azioni

Il problema delle azioni Il problema delle azioni Per studiare l andamento del mercato azionario bisogna seguire i prezzi delle azioni in un lasso di tempo abbastanza lungo, diciamo n giorni. Se si dispone dei prezzi di un azione

Dettagli

NOTE DI ALGEBRA LINEARE v = a 1 v a n v n, w = b 1 v b n v n

NOTE DI ALGEBRA LINEARE v = a 1 v a n v n, w = b 1 v b n v n NOTE DI ALGEBRA LINEARE 2- MM 9 NOVEMBRE 2 Combinazioni lineari e generatori Sia K un campo e V uno spazio vettoriale su K Siano v,, v n vettori in V Definizione Un vettore v V si dice combinazione lineare

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

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

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

RISOLUZIONE IN LOGICA PROPOSIZIONALE. Giovanna D Agostino Dipartimento di Matemaica e Informatica, Università di Udine

RISOLUZIONE IN LOGICA PROPOSIZIONALE. Giovanna D Agostino Dipartimento di Matemaica e Informatica, Università di Udine RISOLUZIONE IN LOGICA PROPOSIZIONALE Giovanna D Agostino Dipartimento di Matemaica e Informatica, Università di Udine 1. Risoluzione Definitione 1.1. Un letterale l è una variabile proposizionale (letterale

Dettagli

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi Informatica Generale Andrea Corradini 12 - Gli algoritmi e la risoluzione di problemi Sommario Che significa risolvere un problema? Algoritmi e programmi Rappresentazione di algoritmi Lo pseudocodice Primitive

Dettagli

Macchine di Turing. Francesco Paoli. Istituzioni di logica, Francesco Paoli (Istituzioni di logica, ) Macchine di Turing 1 / 29

Macchine di Turing. Francesco Paoli. Istituzioni di logica, Francesco Paoli (Istituzioni di logica, ) Macchine di Turing 1 / 29 Macchine di Turing Francesco Paoli Istituzioni di logica, 2016-17 Francesco Paoli (Istituzioni di logica, 2016-17) Macchine di Turing 1 / 29 Alan M. Turing (1912-1954) Francesco Paoli (Istituzioni di logica,

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

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 18 - Vettori Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it Corso di

Dettagli

Proprietà dei linguaggi regolari

Proprietà dei linguaggi regolari Proprietà dei linguaggi regolari Argomenti della lezione Relazione tra automi, grammatiche ed espressioni regolari Pumping lemma per i linguaggi regolari Equivalenza di automi a stati finiti Le seguenti

Dettagli

Equazioni di primo grado

Equazioni di primo grado Equazioni di primo grado 15 15.1 Identità ed equazioni Analizziamo le seguenti proposizioni: a ) cinque è uguale alla differenza tra sette e due ; b ) la somma di quattro e due è uguale a otto ; c ) il

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

Automi a pila. Automi a pila

Automi a pila. Automi a pila utomi a pila Un automa a pila (PDA) e in pratica un ǫ-nfa con una pila. In una transizione un PDA: 1 Consuma un simbolo di input. 2 Va in un nuovo stato (o rimane dove e ). 3 Rimpiazza il top della pila

Dettagli

Problemi e algoritmi. Il che cosa ed il come. Il che cosa ed il come. Il che cosa e il come

Problemi e algoritmi. Il che cosa ed il come. Il che cosa ed il come. Il che cosa e il come Problemi e algoritmi Il che cosa e il come Problema: descrive che cosa si deve calcolare Specifica (di un algoritmo): descrive che cosa calcola un algoritmo Algoritmo: descrive come effettuare un calcolo

Dettagli

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05

Strutture dati. Il che cosa e il come. F. Damiani - Alg. & Lab. 04/05 Strutture dati Il che cosa e il come Il che cosa ed il come Struttura dati: descrive come sono organizzati i dati e come sono realizzate le operazioni su di essi (cioe come si accede ai dati) Specifica

Dettagli

Elementi di Algebra e di Matematica Discreta Numeri interi, divisibilità, numerazione in base n

Elementi di Algebra e di Matematica Discreta Numeri interi, divisibilità, numerazione in base n Elementi di Algebra e di Matematica Discreta Numeri interi, divisibilità, numerazione in base n Cristina Turrini UNIMI - 2016/2017 Cristina Turrini (UNIMI - 2016/2017) Elementi di Algebra e di Matematica

Dettagli

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento Fondamenti di Informatica Algoritmi di Ricerca e di Ordinamento 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare se un elemento fa parte della sequenza oppure l elemento

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi Ricorsivi e Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 I conigli di Fibonacci Ricerca Binaria L isola dei conigli

Dettagli

Rappresentazione con i diagrammi di flusso (Flow - chart)

Rappresentazione con i diagrammi di flusso (Flow - chart) Rappresentazione con i diagrammi di flusso (Flow - chart) Questo tipo di rappresentazione grafica degli algoritmi, sviluppato negli anni 50, utilizza una serie di simboli grafici dal contenuto evocativo

Dettagli

Proprieta dei linguaggi liberi da contesto. Proprieta dei linguaggi liberi da contesto

Proprieta dei linguaggi liberi da contesto. Proprieta dei linguaggi liberi da contesto roprieta di CFL Semplificazione di una CFG: se un linguaggio e un CFL, ha una grammatica di una forma speciale. Pumping Lemma per CFL: simile ai linguaggi regolari. Proprieta di chiusura: alcune delle

Dettagli

Verifica dei programmi

Verifica dei programmi Verifica dei programmi Consiste nella specifica e nella dimostrazione delle proprietà dei programmi. Per specificare le proprietà utilizzeremo la logica del I ordine. Per dimostrare che le proprietà specificate

Dettagli

Informatica, Algoritmi, Linguaggi

Informatica, Algoritmi, Linguaggi Elementi di Informatica e Applicazioni Numeriche T Informatica, Algoritmi, Linguaggi Cos'è l'informatica? Che cos'è l'informatica? Cos'è l'informatica? Che cos'è l'informatica? Dell'informatica possiamo

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

Logica proposizionale

Logica proposizionale Definire un linguaggio formale Logica proposizionale Sandro Zucchi 2013-14 Definiamo un linguaggio formale LP (che appartiene a una classe di linguaggi detti linguaggi della logica proposizionale) Per

Dettagli

Cenni di programmazione ricorsiva. Appunti per gli studenti di Programmazione I e Laboratorio (corsi A-B)

Cenni di programmazione ricorsiva. Appunti per gli studenti di Programmazione I e Laboratorio (corsi A-B) Cenni di programmazione ricorsiva Appunti per gli studenti di Programmazione I e Laboratorio (corsi A-B) Corso di Laurea in Informatica Università di Pisa A.A. 2009/10 R. Barbuti, P. Mancarella Indice

Dettagli

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore

Dettagli

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1 Esempio: Leggere due interi positivi e calcolarne il massimo comun divisore. MCD(12, 8) = 4 MCD(12, 6) = 6 MCD(12, 7) = 1 Sfruttando direttamente la definizione di MCD osservazione: 1 MCD(m,n) min(m,n)

Dettagli

Anno Scolastico 2014/15 - Classe 1D Verifica di matematica dell 11 Maggio Soluzioni degli esercizi. 2(x 2) 2(x 1) + 2 = 3x

Anno Scolastico 2014/15 - Classe 1D Verifica di matematica dell 11 Maggio Soluzioni degli esercizi. 2(x 2) 2(x 1) + 2 = 3x Anno Scolastico 2014/15 - Classe 1D Verifica di matematica dell 11 Maggio 2015 - Soluzioni degli esercizi Risolvere le seguenti equazioni. Dove è necessario, scrivere le condizioni di accettabilità e usarle

Dettagli

Ma il programma in Fig. 8.2 del libro? Stampa hello, world, dato un input n se e solo se l equazione

Ma il programma in Fig. 8.2 del libro? Stampa hello, world, dato un input n se e solo se l equazione Problemi che i calcolatori non possono risolvere E importante sapere se un programma e corretto, cioe fa uello che ci aspettiamo. E facile vedere che il programma Ma il programma in Fig. 8.2 del libro?

Dettagli

Algoritmi e Strutture Dati - Prof. Roberto De Prisco A.A Seconda prova di verifica (4 Febbraio 2005)

Algoritmi e Strutture Dati - Prof. Roberto De Prisco A.A Seconda prova di verifica (4 Febbraio 2005) Algoritmi e Strutture Dati - Prof. Roberto De Prisco A.A. 004-00 Seconda prova di verifica (4 Febbraio 00) Laurea/Diploma in Informatica Università di Salerno Nome e Cognome: Matricola: 1 3 4 TOTALE /1

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

Grafi: visita generica

Grafi: visita generica .. Grafi: visita generica Una presentazione alternativa (con ulteriori dettagli) Algoritmi di visita Scopo: visitare tutti i vertici di un grafo (si osservi che per poter visitare un vertice occorre prima

Dettagli

Annamaria Mazzia. Corso di Metodi Numerici per l Ingegneria dispense e altro materiale su

Annamaria Mazzia. Corso di Metodi Numerici per l Ingegneria dispense e altro materiale su Soluzione di un sistema non lineare con la Regula Falsi generalizzata per la determinazione degli angoli conico di taglio ed elicoidale di taglio di una cremagliera Annamaria Mazzia Dipartimento di Metodi

Dettagli

Analizzatore Lessicale Parte I Scanner

Analizzatore Lessicale Parte I Scanner Analizzatore Lessicale Parte I Scanner Sommario Dispensa di Linguaggi di Programmazione Corrado Mencar, Pasquale Lops In questa dispensa si descrive un approccio alla costruzione di un analizzatore lessicale

Dettagli

PROGRAMMAZIONE STRUTTURATA

PROGRAMMAZIONE STRUTTURATA PROGRAMMAZIONE STRUTTURATA Programmazione strutturata 2 La programmazione strutturata nasce come proposta per regolamentare e standardizzare le metodologie di programmazione (Dijkstra, 1965) Obiettivo:

Dettagli

Integrali indefiniti fondamentali. Integrali indefiniti riconducibili a quelli immediati. a dx ax c. log. e dx e c. cos xdx senx c.

Integrali indefiniti fondamentali. Integrali indefiniti riconducibili a quelli immediati. a dx ax c. log. e dx e c. cos xdx senx c. Integrali indefiniti fondamentali Integrali indefiniti riconducibili a quelli immediati d f ( c d f ( c a d a c n n d c con n - n a a d log k e d e k k e c a c e d e c d log c send cos c cos d sen c senhd

Dettagli

Corso di Calcolo Numerico

Corso di Calcolo Numerico Corso di Calcolo Numerico Dott.ssa M.C. De Bonis Università degli Studi della Basilicata, Potenza Facoltà di Ingegneria Corso di Laurea in Ingegneria Meccanica Risoluzione di Equazioni Algebriche Le equazioni

Dettagli

Problemi, istanze, soluzioni

Problemi, istanze, soluzioni lgoritmi e Strutture di Dati II 2 Problemi, istanze, soluzioni Un problema specifica una relazione matematica tra dati di ingresso e dati di uscita. Una istanza di un problema è formata dai dati di un

Dettagli

7 Procedure. Estensioni sintattiche Dec ::= void Ide (Ptype Ide) Block Com ::= Ide(Exp);

7 Procedure. Estensioni sintattiche Dec ::= void Ide (Ptype Ide) Block Com ::= Ide(Exp); 7 Procedure Nei linguaggi di programmazione è di fondamentale importanza riuscire a scrivere dei programmi che siano facili da leggere e da modificare. Lo scopo di funzioni e procedure è quello di permettere

Dettagli

Le equazioni e i sistemi di primo grado

Le equazioni e i sistemi di primo grado Le equazioni e i sistemi di primo grado prof. Roberto Boggiani Isiss Marco Minghetti 1 settembre 009 Sommario In questo documento verrà trattato in modo semplice e facilmente comprensibile la teoria delle

Dettagli

Tipi di dato strutturati: Array

Tipi di dato strutturati: Array Tipi di dato strutturati: Array I dati visti finora sono: numeri (interi o razionali), booleani le stringhe (sequenze di caratteri) ma i dati manipolati nelle applicazioni reali sono spesso complessi (o

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

acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1

acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1 acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1 richiami teorici sulle grammatiche di Chomsky esercizivari esercizi su grammatiche ed espressioni regolari

Dettagli

La programmazione nel linguaggio C

La programmazione nel linguaggio C Cancellazione : versione ricorsiva Sfruttiamo la visione ricorsiva della struttura dati per realizzare la cancellazione in modo ricorsivo 1. la cancellazione della vuota non richiede alcuna azione 2. la

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi:

Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi: Pag 24 3) Il problema della ricerca Nell informatica esistono alcuni problemi particolarmente rilevanti, poiché essi: si incontrano in una grande varietà di situazioni reali; appaiono come sottoproblemi

Dettagli

Corso di Matematica per la Chimica

Corso di Matematica per la Chimica Dott.ssa Maria Carmela De Bonis a.a. 2013-14 Risoluzione di Equazioni Algebriche Le equazioni algebriche sono equazioni del tipo P(x) = 0 dove P è un polinomio di grado n cioé P(x) = a 1 x n + a 2 x n

Dettagli

Arithmetic and Logic Unit e moltiplicatore

Arithmetic and Logic Unit e moltiplicatore Arithmetic and Logic Unit e moltiplicatore M. Favalli Engineering Department in Ferrara (ENDIF) ALU - multiplier Analisiesintesideicircuitidigitali 1 / 34 Sommario 1 Arithmetic and Logic Unit - ALU 2 Moltiplicatore

Dettagli

Verifica di programmi

Verifica di programmi Verifica di programmi Informalmente, un programma è corretto se l output prodotto è quello atteso rispetto all input. La correttezza dei programmi può essere espressa mediante formule per la correttezza

Dettagli

Dispensa YACC. 1.1 YACC: generalità

Dispensa YACC. 1.1 YACC: generalità Dispensa YACC 1.1 YACC: generalità Il tool Yacc (acronimo per Yet Another Compiler Compiler) è uno strumento software che a partire da una specifica grammaticale context free di un linguaggio scritta in

Dettagli

Dispense del corso di Linguaggi di programmazione e laboratorio Linguaggi formali(versione non definitiva con diversi refusi) Francesco Sisini

Dispense del corso di Linguaggi di programmazione e laboratorio Linguaggi formali(versione non definitiva con diversi refusi) Francesco Sisini Dispense del corso di Linguaggi di programmazione e laboratorio Linguaggi formali(versione non definitiva con diversi refusi) Francesco Sisini 04 Giugno 2014 Indice 0.1 Automi.................................

Dettagli

Definizione di Grammatica

Definizione di Grammatica Corso di Linguaggi e Traduttori 1 AA 2004-05 GRAMMATICHE 1 Definizione di Grammatica Formalmente definiamo un grammatica G mediante una quadrupla ( VN, VT, P, S ) dove: V N e l insieme dei simboli non

Dettagli

Corso di Linguaggi e Traduttori 1 AA GRAMMATICHE

Corso di Linguaggi e Traduttori 1 AA GRAMMATICHE Corso di Linguaggi e Traduttori 1 AA 2004-05 GRAMMATICHE 1 Definizione di Grammatica Formalmente definiamo un grammatica G mediante una quadrupla V, V, P S ( ) N T, dove: V N e l insieme dei simboli non

Dettagli

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal Algoritmi, Strutture Dati e Programmi : Programmazione in Pascal Prof. Alberto Postiglione AA 2007-2008 Università degli Studi di Salerno Il Linguaggio di Programmazione Pascal Esistono molti linguaggi

Dettagli

Anno 1. Quadrilateri

Anno 1. Quadrilateri Anno 1 Quadrilateri 1 Introduzione In questa lezione impareremo a risolvere i problemi legati all utilizzo dei quadrilateri. Forniremo la definizione di quadrilatero e ne analizzeremo le proprietà e le

Dettagli

Note sull implementazione in virgola fissa di filtri numerici

Note sull implementazione in virgola fissa di filtri numerici Note sull implementazione in virgola fissa di filtri numerici 4 settembre 2006 1 Introduction Nonostante al giorno d oggi i processori con aritmetica in virgola mobili siano molto comuni, esistono contesti

Dettagli