1 Implementazione di Linguaggi 2 PARTE 5 Implementazione di Linguaggi 2 PARTE 5 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.

Slides:



Advertisements
Presentazioni simili
LR Parser II Parte Giuseppe Morelli.
Advertisements

Ricorsione in SQL-99.
Tecnologia delle basi di dati: Strutture fisiche di accesso
Il problema del minimo albero ricoprente in un grafo non cooperativo
Estendere i linguaggi: i tipi di dato astratti
Sommario Nelle lezioni precedenti abbiamo introdotto tutti gli elementi che formano un particolare tipo di linguaggio logico, denominato linguaggio predicativo.
Sintassi (prima parte)
Traduttore diretto dalla sintassi (seconda parte)
LR Parser Giuseppe Morelli. La maggior parte dei parser Bottom-Up è costituita dai cosiddetti parser LR(k) dove: L indica il verso dellanalisi della stringa.
Parser Bottom UP Giuseppe Morelli. Parser Bottom UP Un parser Bottom Up lavora costruendo il corrispondente albero di parsing per una data stringa di.
Linguaggi Regolari e Linguaggi Liberi
Viable Prefixes, conflitti e formato delle tabelle per il parsing LR
Costruzione delle tabelle di parsing LR canoniche
Costruzione di tabelle di Parsing SLR
Linguaggi di Programmazione e compilatori
Traduzione guidata dalla sintassi
1 Implementazione di Linguaggi 2 PARTE 5 Implementazione di Linguaggi 2 PARTE 5 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
Type Checking (1° parte)
Generazione di Codice Intermedio
Algoritmi e Programmazione
Generalità Linguaggio e Macchina Astratta
Biglietti: schema E/R.
1 Biglietti: schema E/R. 2 Biglietti: albero degli attributi.
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Strategie per la progettazione di algoritmi:
Strutture dati elementari
Alberi binari di ricerca
Maria Teresa PAZIENZA a.a
Esercizi su alberi binari
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 22/05/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 19/05/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Il problema del minimo albero ricoprente in un grafo con archi privati
Algoritmi e strutture Dati - Lezione 7
Il problema del dizionario
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati
Fondamentidi Programmazione Corso: Fondamenti di Programmazione Classe: PARI-DISPARI Docente: Prof. Luisa Gargano Testo: Aho, Ulman, Foundations of Computer.
1 Implementazione di Linguaggi 2 PARTE 4 Implementazione di Linguaggi 2 PARTE 4 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions.
Implementazione di Linguaggi 2
1 Implementazione di Linguaggi 2 PARTE 4 Implementazione di Linguaggi 2 PARTE 4 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
1 Implementazione di Linguaggi 2 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman Compilers Principles,Techniques and Tools,
1 Generazione codice Daniela Briola Lorena Bellino.
Esercizi su alberi binari
Unità Didattica 2 I Linguaggi di Programmazione
Fondamenti di Informatica
INSIEMI NUMERABILI L’analisi matematica introduce il concetto di insieme numerabile come insieme i cui elementi possono essere “contati” ossia che possiede.
LINGUAGGI DI PROGRAMMAZIONE
Linguaggi e Modelli Computazionali LS - Prof E.Denti
Gianfranco Zampolini Progetto per il corso di: Linguaggi e Modelli Computazionali LS EM Linguaggio per la Descrizione di un Evento Musicale.
Gerarchie Ricorsive Una gerarchia ricorsiva deriva dalla presenza di una ricorsione o ciclo (un anello nel caso più semplice) nello schema operazionale.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Corso di Informatica 2 a.a. 2003/04 Lezione 6
MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche
Trading EToro Un linguaggio per descrivere e gestire operazioni di borsa Progetto di Linguaggi e Modelli Computazionali LS Prof. Enrico Denti Mancini Laura.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
Semantica dinamica Vogliamo definire una funzione che associ ad ogni termine corretto del mio linguaggio di programmazione un valore. Questa associazione.
Grammatiche Grammatiche libere da contesto Grammatiche regolari
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Master Bioinformatica 2002: Visite di Grafi La struttura dati D è una PILA (STACK) Visita in profondità o Depth-First-Search (DFS)
1 Implementazione di Linguaggi 2 PARTE 3 Implementazione di Linguaggi 2 PARTE 3 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi Complessità e Trasportabilità Lezione n°3.
Algoritmi Avanzati a.a.2013/2014 Prof.ssa Rossella Petreschi Albero ricoprente di costo minimo Lezione n°12.
Transcript della presentazione:

1 Implementazione di Linguaggi 2 PARTE 5 Implementazione di Linguaggi 2 PARTE 5 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman Compilers Principles,Techniques and Tools, Addison Wesley

2 TRADUZIONE GUIDATA (DIRETTA) DALLA SINTASSI TRADUZIONE GUIDATA (DIRETTA) DALLA SINTASSI Definizioni guidate dalla sintassi (DGS) Una definizione guidata dalla sintassi è una generalizzazione di una CFG in cui ogni simbolo grammaticale è associato un insieme di attributi, suddiviso in due sottoinsiemi chiamati rispettivamente insieme degli attributi ereditati e insieme degli attributi sintetizzati.

3 Attributi e loro gestione Se si pensa un nodo del parse tree associato ad un simbolo grammaticale come una struttura di record con campi destinati a mantenere informazioni allora un attributo corrisponde al nome di un campo. ll valore di un attributo in un nodo del parse tree è definito da una regola semantica associata alla produzione applicata in quel nodo. Il valore di un attributo sintetizzato in un nodo è calcolato in funzione del valore degli attributi dei figli del nodo. ll valore di un attributo in un nodo del parse tree è definito da una regola semantica associata alla produzione applicata in quel nodo. Il valore di un attributo sintetizzato in un nodo è calcolato in funzione del valore degli attributi dei figli del nodo. Il valore di un attributo ereditato in un nodo è calcolato in funzione del valore degli attributi dei fratelli e del genitore del nodo. Le regole semantiche introducono dipendenze tra gli attributi nei nodi. Queste vengono rappresentate da un grafo orientato detto grafo delle dpendenze.

4 Parsing Tree Decorato e Attribute Grammar Un parsing tree decorato è un parsing tree che riportii valori degli attributi di ogni nodo. Nelle DDS si associa ad ogni produzione A  un insieme di regole semantiche della forma: b:=f(c 1,c 2,...,c k ) In cui f è una e b verifica una dei due casi seguenti: 1.b è un attributo sintetizzato di A e c 1,c 2,...,c k sono attributi dei simboli nella parte destra della produzione 2.b è un attributo ereditato di uno dei simboli della parte destra della produzione e c 1,c 2,...,c k attributi di A e di alcuni simboli della parte destra di A . Una attribute grammar è una definizione guidata dalla sintassi in cui le funzioni f non generano side-effect. Quando si vogliono generare side-effect si usano procedure in luogo di funzioni. Le funzioni sono spesso espresse in forma da espressioni

5 Attributi Sintrtizzati Esempio di un semplice calcolatore: L  Enprint(E.val) E  E 1 +TE.val:=E 1.val+T.val E  TE.val:=T.val E  TE.val:=T.val T  T 1 *FT.val:=T 1.val  F.val T  FT.val:=F.val F  (E)F.val:=E.val F  digitF.val:=digit.lexval

6 Attributi sintetizzati: esempio

7 Attributi Ereditati Dipendono dagli attributi di genitore e fratelli e sono utili per esprimere dipendenze dal contesto del linguaggio. Esempio: D  TLL.in:=T.type T  intT.type:=integer T  floatT.type:=real T  floatT.type:=real L  L 1,idL 1.in:=L.in addtype(id.entry,L.in) L  L 1,idaddtype(id.entry,L.in)

8 Attributi ereditati: esempio

9 Ordine di valutazione degli Attributi

10 Ordine di valutazione-grafo di dipendenza Se l’attributo b nel nodo n dipende da c nel nodo m allora la regola che valuta b in n deve essere valutata dopo quella che valuta c in m. Le interdipendenze di valutazione degli attributi in un parse tree vengono descritte da un grafo diretto etichettato detto grafo di dipendenza (o delle dipendenze). Il grafo ha un nodo per ogni attributo e un arco dal nodo m al nodo n se b dipende da c. Ogni ordinamento topologico del grafo rappresenta un ordine di valutazione possibile.

11 Ordine di valutazione Qui consideriamo solo metodi che non richiedono la costruzione del grafo di dipendenza (oblivious methods) ma metodi che definiscono l’ordine in base alla tecnica di parsing adottata. Questo restringe la classe degli attributi definibili ma è semplice da implementare ed estrememente efficiente.

12 Attributi semantici: applicazioni Costruzione di syntax tree. L’uso di alberi sintattici come rappresentazione intermedia consente di disaccoppiare il processo di traduzione da quello di analisi. Un albero sintattico è una forma astratta e compatta di parsing tree dipendente solo dal linguaggio e non dalla grammatica adottata per descriverlo.

13 Esempi di Syntax Tree

14 Costruzione del Syntax Tree di espressioni Ogni nodo è rappresentato da un record contrnrntr vari campi. Un nodo può rappresentare un operatore o un operando. Nel primo caso deve anche contenere puntatori agli operandi. Si usano tre funzioni. Ciascuna restituisce un puntatore al nodo creato.

15 Costruzione del Syntax Tree funzioni primitive 1. mknode(op,left,right), crea nodo op (operatore) op e operandi left right. 2. mkleaf(id,entry) crea nodo id (operando). entry è uno spix a symbol table. 3. mkleaf(num,val), crea un nodo di tipo valore: il campo val contiene il valore

16 Costruzione del Syntax Tree funzioni primitive E  E 1 +T E.np:=mknode(‘+’,E 1.np,T.np) E  E 1 -T E.np:=mknode(‘-’,E 1.np,T.np) E  T E.np:=T.np T  (E) T.np:=E.np T  id T.np:=mkleaf(id,id.entry) T  numT.np:=mkleaf(num,num.val)

17 Costruzione del Syntax Tree esempio

18 Costruzione del Syntax Tree a DAG Si usa un grafo orientato aciclico per rappresentare sotto-espressioni comuni. Esempio: a+a*(b-c)+(b-c)*d 1. p1=mkleaf(id,a) 2. p2:=mkleaf(id,a) 3. p3:=mkleaf(id,b) 4. p4:=mkleaf(id,c) 5. p5:=mknode(‘-’,p3,p4)

19 Costruzione del Syntax Tree a DAG Esempio: a+a*(b-c)+(b-c)*d 6. p6:=mknode(‘*’,p2,p5) 7. p7:=mknode(‘+’,p1,p6) 8. p8:=mkleaf(id,b) 9. p9:=mkleaf(id,c)

20 Costruzione di un Syntax Tree a DAG

21 Costruzione di un Syntax Tree a DAG Algoritmo I nodi del grafo sono memorizzati in un array ciascuno puntato da un cursore (indice). La segnatura di un nodo è formata da una tripla I nodi del grafo sono memorizzati in un array ciascuno puntato da un cursore (indice). La segnatura di un nodo è formata da una tripla Input: op l ed r Output: nodo con segnatura Output: nodo con segnatura Metodo: scandire l’array fino a trovare nodo con etichetta op

22 Costruzione di un Syntax Tree a DAG Algoritmo Metodo: scandire l’array fino a trovare un nodo m con etichetta op figlio sinistro l e destro r. Se esiste restituire m altrimenti creare un nuovo nodo alla posizione lst e restituire lst. La ricerca può essere ottimizzato con una tavola hash.

23 Calcolo bottom-up di definizioni s- attributed In questo caso gli attributi possono essere valutati bottom-up da un parser shift- reduce o di altro tipo bottom-up che conservi i valori associati ai simboli grammaticali sullo stack. Ad ogni azione reduce il parser valuta gli attributi sintetizzati a partire dai valori sullo stack. Il metodo è applicabile anche a certi tipi di attributi ereditati (parser LR)

24 Calcolo bottom-up di definizioni s- attributed Ipotesi: stack composto da due array paralleli stato-valore. “stato” è uno spix a parsing table (memorizzare sullo stack anche il simbolo grammaticale non serve, ma per leggibilità identifichiamo lo stato con il simbolo grammaticale).

25 Calcolo bottom-up di definizioni s- attributed

26 Calcolo bottom-up di definizioni s- attributed Supponendo di valutare gli attributi prima della riduzione e che A.a:=f(X.x,Y.y,Z.z) sia associata a A  XYZ. Prima di ridurre XYZ ad A i valori di Z.z, Y.y e X.x si trovano in val[top], val[top-1] e val[top-2] rispettivamente. Dopo la riduzione top viene decrementato di 2 e lo stato corrispondente ad A viene impilato in state[top] mentre il valore di A.a in val[top].

27 Definizioni L-attributed Quando il processo di traduzione avviene durante il parsing un ordine di valutazione ottimale dipende dall’ ordine di creazione dei nodi del parsing tree da parte del parser. Un metodo compatibile con molti parser top- down e bottom-up si basa su una visita depth first dell’albero.

28 Visita depth-first e def. L-attributed PROC dfv(n: node); BEGIN FOR EACH child m OF n FROM left TO right DO eval inherited attributes of m; dfv(m);OD; eval syntetized attributes of n END;

29 Definizioni L-attributed Una definizione è L-attributed se ciascun attributo di ogni regola semantica di ogni produzione A  X 1 X 2 …X n è un attributo sintetizzato un attributo sintetizzato un attributo ereditato di Xj 1 un attributo ereditato di Xj 1  j  n che dipende solo da: 1. Gli attributi di X 1 X 2 …X j-1 a sinistra di X j 2. Dagli attributi ereditati di A; Ogni definizione S-attributed è L-attributed.

30 Definizioni L-attributed esempio A  LML.in:=l(A.i) A  LML.in:=l(A.i)M.i:=m(L.s)A.s:=f(M.s) A  QR R.i:=r(A.i) Q.i:=q(R.s)A.s:=f(Q.s)

31 Schemi di traduzione Uno schema di traduzione è una DGS in cui gli attributi sono associati ai simboli grammaticali e le azioni semantiche sono inserite tra graffe nella parte destra delle produzioni ad indicare l’ordine di valutazione. Esempio: A  TR A  TR R  adop T  print(adop.lexeme)  R 1 |  T  num  print(num.val) 

32 Schemi di traduzione

33 Schemi di traduzione Nel progetto di schemi di traduzione occorre rispettare vincoli per garantire la disponibilità del valore di un attributo al momento dell’ uso. Per questo si usano definizioni L- attributed o meglio s-attributed. In questo caso le azioni vengono inserite in coda alla produzione, esempio: T  T 1 *F T.val:=T 1.val  F.val T  T 1 *F T.val:=T 1.val  F.val T  T 1 *F  T.val:=T1.val  F.val) 

34 Schemi di traduzione: regole 1. Un attributo ereditato di un simbolo nella parte destra di una produzione deve essere calcolato un una azione che precede il simbolo, 2. Un’azione non deve usare un attributo sintetizzati di un token a destra dell’azione stessa, 3. Un attributo sintetizzato della parte sinistra di una prod. va calcolato solo dopo quelli a cui fa riferimento (OK in coda alla produzione)

35 Schemi di traduzione L-attributed Una TGDS L-attributed è trasformabile in uno schema conforme alle tre regole precedenti. Esempio (formattazione testo): S  B  B.ps:=10; S.ht:=B.ht  S  B  B.ps:=10; S.ht:=B.ht  B  B 1 B 2  B 1.ps:=B.ps; B 2.ps:=B.ps B.ht:=max(B 1.ht,B 2.ht)  B.ht:=max(B 1.ht,B 2.ht)  B  B 1 sub B 2  B 1.ps:=B.ps; B 2.ps:=shrink(B.ps) B.ht:=disp(B 1.ht,B 2.ht)  B.ht:=disp(B 1.ht,B 2.ht)  B  text  B.ht:=text.h  B.ps; 

36 Schemi di traduzione L-attributed B sta per box, B  B 1 B 2 indica giustap- posizione di testo, B  B 1 sub B 2 denota l’operazione pedice: B2 viene posto a destra in basso di B1 ma in dimensione ridotta. ps è ereditato e indica l’altezza di una formula

37 Schemi di traduzione L-attributed S  B.ps:=10  B  S.ht:=B.ht  B  B 1.ps:=B.ps  B 1  B 2.ps:=B.ps  B 2  B.ht:=max(B 1.ht,B 2.ht)  B  B 1.ps:=B.ps  B 1 sub  B 2.ps:=shrink(B.ps)  B 2  B.ht:=disp(B 1.ht,B 2.ht)   B.ht:=disp(B 1.ht,B 2.ht)  B  text  B.ht:=text.h  B.ps; 

38 Traduzioni topdown Implementazione di DGS L-attributed con parser topdown: E  E 1 +T  E.val:=E 1.val+T.val  E  E 1 -T  E.val:=E 1.val+T.val  E  T  E.val:=T.val  T  (E)  T.val:=E.val  T  num  T.val:=num.val 

39 Traduzioni topdown Implementazione di DGS L-attributed con parser topdown: E  T  R.i:=T.val  R  E.val:=R.s  R  +T  R 1.i:=R.i+T.val  R 1  R.s:=R 1.s  R  -T  R 1.i:=R.i-T.val  R 1  R.s:=R 1.s  R   R.s:=R.i  T  (E)  T.val:=E.val  T  num  T.val:=num.val 

40 Traduzioni topdown Si ricordi che un attributo ereditato di un token deve essere valutato in una azione che compare prima del token mentre un attributo sintetizzato della parte sinistra deve essere valutato dopo gli attributi Da cui ssso dipende.

41 Traduzioni topdown A  A 1 Y  A.a:=g(A 1.a,Y.y)  A  X  A.a:=f(X.x)  A  XR R  YR|  Con le azioni sementiche diviene: A  X  R.i:=f(X.x)  R  A.a:=R.s  R  Y  R.i:=g(R.i,Y.y)  R 1  R.s:=R 1.s  R    R.s:=R.i 