Upload
duongnhan
View
241
Download
2
Embed Size (px)
Citation preview
Idea del parsing bottom-up
Costruisce l’albero sintattico iniziando dallefoglie e salendo verso la radice
Esempio
E ! T + E |TT ! int ⇤ T |int|(E )
Consideriamo la stringa int ⇤ int + int
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
2 of 55
Idea del parsing bottom-up
Esempio
Il parsing bottom-up riduce una stringa al simboloiniziale invertendo le produzioni:
stringa produzione
int ⇤ int + int T ! int
int ⇤ T + int T ! int ⇤ TT + int T ! int
T + T E ! T
T + E E ! T + E
EAutomi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
3 of 55
Osservazione
Leggiamo le produzioni in ordine inverso (dalbasso verso l’alto rispetto all’albero di parsing)
E’ una derivazione da destra (letta in ordineinverso, da destra a sinistra)
Esempio
E )rm
T+E )rm
T+T )rm
T+int )rm
int⇤T+int )rm
int⇤int+int
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
4 of 55
Esempio
int ⇤ int + intint ⇤ T + int
T + intT + TT + E
E
E
T
int ⇤ T
int
+ E
T
int
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
5 of 55
Costruzione dell’albero
int ⇤ int + int int ⇤ int + int
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
6 of 55
Costruzione dell’albero
int ⇤ int + intint ⇤ T + int int ⇤
T
int + int
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
7 of 55
Costruzione dell’albero
int ⇤ int + intint ⇤ T + int
T + int
T
int ⇤ T
int + int
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
8 of 55
Costruzione dell’albero
int ⇤ int + intint ⇤ T + int
T + intT + T
T
int ⇤ T
int +
T
int
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
9 of 55
Costruzione dell’albero
int ⇤ int + intint ⇤ T + int
T + intT + TT + E
T
int ⇤ T
int +
E
T
int
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
10 of 55
Costruzione dell’albero
int ⇤ int + intint ⇤ T + int
T + intT + TT + E
E
E
T
int ⇤ T
int
+ E
T
int
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
11 of 55
Un algoritmo per il parsing bottom-up
Sia I la stringa in input
repeat
seleziona una sottostringa non vuota � di I
dove X ! � e una produzione
se non c’e alcun �, torna indietro
rimpiazza � con X in I
until I = S (simbolo iniziale) o tutte le possibilitasono state provate
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
12 of 55
Maniglie
Decisioni da prendere durante il parsingbottom-up:
quale sottostringa ridurreche produzione usare
Maniglia (handle): sottostringa � tale cheX ! � e una produzione che corrisponde ad unpasso in una derivazione da destra della stringain input
Nota: la sottostringa piu a sinistra che coincidecon la parte destra di una produzione non esempre una maniglia
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
13 of 55
Dove riduciamo ?
Sia ↵�! la stringa corrente durante un parsingbottom-up
Assumiamo che la prossima riduzione sia fattausando la produzione X ! �
Allora ! e una stringa di terminali, perche↵X! ! ↵�! e un passo di una derivazione dadestra
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
14 of 55
Notazione
Idea: Dividere la stringa in due sottostringhe
la sottostringa di destra deve essere ancoraesaminata (una stringa di terminali)la sottostringa di sinistra ha terminali e non-terminali (e inserita in una pila)
Il punto di divisione e marcato dal simbolo |il simbolo | non e parte della stringa
Inizialmente, tutto l’input e non esaminato:
|x1
x2
. . . xn
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
15 of 55
Operazioni di Shift e Reduce
Il parsing bottom-up usa solo due tipi di azioni (nonbanali):
Shift (scorri)
Reduce (riduci)
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
16 of 55
Shift
Muove | di un posto verso destraSposta un terminale nella stringa di sinistra
legge un terminale e lo inserisce sulla pila
ABC |xyz ) ABCx |yz
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
17 of 55
Reduce
Applica una produzione inversa nella parte finaledella stringa di sinistra
Rimpiazza una stringa di terminali in cimaalla pila con la parte sinistra di unaproduzione
Se A ! xy e una produzione, allora:
Cbxy |ijk ) CbA|ijk
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
18 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ T
T |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
L’esempio con le due operazioni Shift-Reduce
|int ⇤ int + int shift
int| ⇤ int + int shift
int ⇤ |int + int shift
int ⇤ int|+ int reduce T ! int
int ⇤ T |+ int reduce T ! int ⇤ TT |+ int shift
T + |int shift
T + int| reduce T ! int
T + T | reduce E ! T
T + E | reduce E ! T + E
E |
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
19 of 55
La pila
La stringa di sinistra puo essere implementatacon una pila
La cima della pila e il simbolo |Un’operazione di Shift inserisce un terminale incima alla pila
Un’operazione di Reduce toglie 0 o piu simbolidalla pila (parti destre di produzioni) e aggiungeun non-terminale sulla pila (parti sinistre diproduzioni)
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
20 of 55
Conflitti
Il parsing shift-reduce non funziona con tutte legrammatiche libere da contestoPer alcune grammatiche, qualunque parser shift-reducearriva a dei conflitti
Anche conoscendo tutta la pila e i prossimi k simboliin input
Conflitto shift-reduce: il parser non sa decidere se fareuno shift o una reduce
Conflitto reduce-reduce: il parser non sa quale riduzionefareGrammatiche non LR(k) (o non LR)
Una grammatica ambigua non e LR
Di solito i compilatori usano grammatiche LR(1)
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
21 of 55
Parsing Shift-Reduce
Due azioni:
ShiftABC |xyz ) ABCx |yz
Reduce (con A ! xy)Cbxy |ijk ) CbA|ijk
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
22 of 55
Come decidere se applicare shift o reduce
Esempio
E ! T + E |TT ! int ⇤ T |int|(E )
Consideriamo int| ⇤ int + int
Potremmo ridurre tramite T ! intarrivando a T | ⇤ int + intErrore: non potremo arrivare al simboloiniziale E
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
23 of 55
Maniglie
Intuizione: vogliamo ridurre solo se il risultatopuo ancora essere ridotto fino al simbolo iniziale
Prendiamo una derivazione da destra:
S⇤)rm
↵X! )rm
↵�!
Allora ↵� e una maniglia di ↵�!
In un parsing shift-reduce, le maniglie appaionosolo in cima alla pila, mai nel mezzo
Perche ?
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
24 of 55
Maniglie
Intuizione: vogliamo ridurre solo se il risultatopuo ancora essere ridotto fino al simbolo iniziale
Prendiamo una derivazione da destra:
S⇤)rm
↵X! )rm
↵�!
Allora ↵� e una maniglia di ↵�!
In un parsing shift-reduce, le maniglie appaionosolo in cima alla pila, mai nel mezzo
Perche ?
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
24 of 55
Maniglie
Intuizione: vogliamo ridurre solo se il risultatopuo ancora essere ridotto fino al simbolo iniziale
Prendiamo una derivazione da destra:
S⇤)rm
↵X! )rm
↵�!
Allora ↵� e una maniglia di ↵�!
In un parsing shift-reduce, le maniglie appaionosolo in cima alla pila, mai nel mezzo
Perche ?
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
24 of 55
Maniglie solo in cima alla pila
Induzione informale sul numero di passi di riduzione:
All’inizio e vero, e la pila e vuotaDopo aver ridotto una maniglia
Il nonterminale piu a destra e in cima allapilaLa prossima maniglia deve essere alla destradel nonterminale piu a destra, perche e unaderivazione da destraLa sequenza di mosse shift raggiunge laprossima maniglia
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
25 of 55
Sommario sulle maniglie
In un parsing shift-reduce, le maniglie appaionosempre in cima alla pila
Le maniglie non sono mai alla sinistra delnonterminale piu a destra
Quindi non dobbiamo mai muovere versosinistra il simbolo |Gli algoritmi di parsing bottom-up si basano sulriconoscimento delle maniglie
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
26 of 55
Riconoscere le maniglie
Non esistono algoritmi e�cienti per riconoscerele maniglie
Soluzione: usare delle euristiche che cercano diindovinare quali pile sono delle maniglie
Per alcune grammatiche, le euristicheindovinano sempre correttamente
Per le euristiche che useremo, si tratta dellegrammatiche SRL
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
27 of 55