Inside Out & Back Again

Parsing LR(k)
Vedremo il parsing LR
L = scorre l’input da sinistra a destra
R = segue una derivazione a destra al contrario
k = numero di simboli in input da guardare per
prendere una decisione
LR = LR(1): legge anticipatamente 1 simbolo in
input per capire cosa fare
SLR: LR semplice
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
29 of 55
Qualit`a del parsing LR
Molto generale: funziona per quasi tutti i
costrutti che possono essere descritti da
grammatiche libere da contesto
Non fa backtracking, pu`o essere implementato
efficientemente
Trova errori sintattici appena possibile in una
singola passata da sinistra a destra dell’input
Pu`o essere applicato ad un soprainsieme delle
grammatiche LL
Grammatiche LR(k): dobbiamo poter riconoscere la
parte destra di una produzione in una forma
sentenziale destra, leggendo k simboli di input futuri
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
30 of 55
Prefissi validi
Non `e ovvio come trovare le maniglie
Ad ogni passo il parser vede solo la pila, non
l’intero input
↵ `e un prefisso ammissibile se ! `e tale che ↵|! `e
uno stato di un parser shift-reduce
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
31 of 55
Cosa significa ?
Un prefisso ammissibile non va oltre la fine
destra di una maniglia
E un prefisso ammissibile perch´e `e un prefisso
della maniglia
Finch´e ci sono prefissi validi sulla pila, non sono
stati visti errori di parsing
Per ogni grammatica, l’insieme dei prefissi validi `e
un linguaggio regolare
Mostreremo come costruire automi a stati finiti che
accettano prefissi validi
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
32 of 55
Item
Un item `e una produzione con un “.” nella sua
parte destra
Esempio: gli item per T ! (E ) sono
T
T
T
T
! .(E )
! (.E )
! (E .)
! (E ).
L’unico item per X ! ✏ `e X ! .
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
33 of 55
Item
Spesso chiamati “item LR(0)”
Intuizione: un item indica quanto abbiamo visto
di una produzione finora
l’item A ! .XYZ indica che speriamo di vedere
nell’input una stringa derivabile da XYZ
l’item A ! X .YZ indica che abbiamo gi`a visto una
stringa derivabile da X e che speriamo di vedere
nell’input una stringa derivabile da YZ
l’item A ! XYZ . indica che abbiamo gi`a visto una
stringa derivabile da XYZ e che potrebbe essere il
momento di ridurre XYZ ad A
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
34 of 55
Dagli item ad un automa a stati finiti
Alcuni item sono usati per costruire un automa
a stati finiti deterministico che viene usato per
prendere decisioni durante il parsing (automa
LR(0))
Ogni stato dell’automa LR(0) rappresenta un
insieme di item canonici LR(0)
Data una grammatica e due funzioni CLOSURE
e GOTO, costruiamo gli item canonici LR(0)
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
35 of 55
Funzione CLOSURE
Grammatica aumentata: aggiungiamo S 0 ! S
Serve a dire al parser quando fermarsi
(quando riduce tramite questa produzione)
CLOSURE(I), dove I `e un insieme di item per
una grammatica:
I `e un sottoinsieme di CLOSURE(I)
Se A ! ↵.B `e in CLOSURE(I) e B ! `e
una produzione, aggiungiamo B ! . in
CLOSURE(I). Applichiamo questa regola
finch´e non si pu`o aggiungere pi`u niente a
CLOSURE(I)
Usato per definire gli stati dell’automa
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
36 of 55
Idea di CLOSURE
A ! ↵.B `e in CLOSURE(I) se pensiamo di
poter vedere in futuro una sottostringa
derivabile da B come input
Questa sottostringa avr`a un prefisso derivabile
da B
Quindi aggiungiamo l’item B ! . per tutte le
produzioni B !
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
37 of 55
Intuizione
Il problema nel riconoscere prefissi validi consiste
nel fatto che la pila contiene solo alcune parti
della parte destra di una produzione
Se avesse una parte destra completa,
potremmo ridurre
Queste parti sono sempre prefissi della parte
destra di una produzione
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
38 of 55
Esempio
Consideriamo la stringa in input (int)
Allora (E |) `e uno stato in un parsing shift-reduce
(E `e un prefisso della parte destra di T ! (E )
sar`a ridotto dopo il prossimo shift
L’item T ! (E .) dice che finora abbiamo visto
(E di questa produzione e speriamo di vedere )
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
39 of 55
Esempio
Grammatica
E0
E
T
F
!E
! E + T |T
! T ⇤ F |F
! (E )|id
I = {E 0 ! .E }
CLOSURE (I ) = {E 0 ! .E , E ! .E + T , E ! .T ,
T ! .T ⇤ F , T ! .F , F ! .(E ), F ! .id}
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
40 of 55
Generalizzazione
La pila pu`o avere molti prefissi di parti destre di
produzioni
Prefix1 Prefix2 . . . Prefixn 1 Prefixn
Sia Prefixi un prefisso della parte destra di
Xi ! ↵i
Prefixi prima o poi verr`a ridotto a Xi
la parte mancante di ↵i 1 inizia con Xi
esiste un Xi 1 ! Prefixi 1 Xi per qualche
|
{z
}
↵i
1
Ricorsivamente, Prefixk+1 . . . Prefixn prima o
poi verr`a ridotto alla parte mancante di ↵k
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
41 of 55
Esempio
Consideriamo la stringa in input (int ⇤ int)
(int ⇤ |int) `e uno stato in un parsing shift-reduce
( `e un prefisso della parte destra di T ! (E )
✏ `e un prefisso della parte destra di E ! T
int⇤ `e un prefisso della parte destra di
T ! int ⇤ T
(
✏
int⇤
Prefix1
Prefix2
Prefix3
T ! (E ) E ! ✏T T ! int⇤T
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
42 of 55
Esempio
La “pila di item”
T ! (.E )
E ! .T
T ! int ⇤ .T
Dice:
Abbiamo visto ( di T ! (E )
Abbiamo visto ✏ di E ! T
Abbiamo visto int⇤ di T ! int ⇤ T
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
43 of 55
Funzione GOTO
GOTO(I , X ), dove I `e un insieme di item e X `e
un simbolo della grammatica:
CLOSURE dell’insieme di item A ! ↵X .
tale che A ! ↵.X `e in I
Usata per definire le transizioni dell’automa
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
44 of 55
Esempio
Grammatica
E0
E
T
F
!E
! E + T |T
! T ⇤ F |F
! (E )|id
I = {E 0 ! E ., E ! E . + T }
GOTO(I , +) = {E ! E + .T , T ! .T ⇤ F ,
T ! .F , F ! .(E ), F ! .id}
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
45 of 55
Collezione canonica di insiemi di item LR(0)
Data una grammatica G , aggiungere una
produzione S 0 ! S a G
C = CLOSURE ({S 0 ! .S})
Per ogni insieme di item in C
Per ogni simbolo X di G
Se GOTO(I , X ) non `e vuoto e non in C ,
aggiungi GOTO(I , X ) a C
Finch´e non `e pi`u possibile aggiungere qualcosa
aC
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
46 of 55
Automa DFA
Stati: insiemi di item dalla collezione canonica
Transizioni: funzione GOTO
Stato iniziale: CLOSURE ({S 0 ! .S})
Altri stati: ottenuti applicando GOTO e poi
facendo la chiusura
Tutti gli stati sono finali
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
47 of 55
Esempio
Grammatica
E ! T + E |T
T ! int ⇤ T |int|(E )
Produzione aggiunta S 0 ! .E
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
48 of 55
Esempio
E→T+.E
Automa DFA
E → .T
T
E
T → .int * T
E → T. + E
T
T → int. * T
S’ → . E
int
E→.T
*
T → .(E)
T → int * .T
T → .int * T
T → .(E)
T → .int
T → .int * T
T → .int
(
T → .int
int
T
int
T → int.
int
E → .T + E
E → T + E.
T → .(E)
+
E → T.
S’ → E .
E
E → .T + E
T → int * T.
T
T → (. E)
(
E → .T
E → .T + E
E
T → .int * T
T → .int
T → (E.)
T → (E).
T → .(E)
)
(
63
(
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
49 of 55
Nota
Ogni stato corrisponde ad un simbolo della
grammatica: quello delle transizioni che
portano a lui
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
50 of 55
Per riconoscere i prefissi ammissibili
Dobbiamo:
riconoscere una sequenza di parti destre
parziali, dove
ogni sequenza pu`o eventualmente essere
ridotta (reduce) a parte del suffisso
mancante del suo predecessore
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
51 of 55
Come usare l’automa nel parsing shift-reduce?
Inseriamo gli stati raggiunti in una pila (ultimo stato in
cima)
Supponiamo che la stringa di simboli della grammatica
porti l’automa dallo stato iniziale ad uno stato j
Allora:
Shift sul prossimo simbolo in input a se c’`e una
transizione da j etichettata a, e aggiungo prossimo
stato sulla pila
Altrimenti, riduciamo:
Gli item nello stato j ci diranno quale produzione
usare: A ! ↵
Eliminiamo tanti stati dalla pila quanti sono i
simboli di ↵
Seguiamo una transizione etichettata A
Inseriamo il nuovo stato sulla pila
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
52 of 55
Perch´e l’automa LR(0) `e utile ? Item validi!
L’item X ! . `e valido per un prefisso ammissibile ↵ se
⇤
S 0 ) ↵X ! ) ↵
rm
rm
!
Gli item validi per ↵ aiutano a decidere quale azione
intraprendere se sulla cima della pila compare ↵ :
se 6= ✏ significa che non abbiamo ancora una
maniglia sulla cima della pila e quindi dobbiamo
e↵ettuare uno shift
se = ✏ significa che sulla cima abbiamo una
maniglia e possiamo ridurre utilizzando la produzione
X !
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
53 of 55
Item validi
Un item pu`o essere valido per prefissi ammissibili diversi
Ad esempio: l’item T ! (.E ) `e valido per i prefissi
(
((
(((
((((
...
Esiste un teorema che a↵erma
l’insieme di item validi per un prefisso ammissibile `e
esattamente l’insieme di item raggiungibili dall’automa
LR(0) della grammatica a partire dallo stato iniziale lungo
un percorso etichettato con
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
54 of 55
Verificare per prefisso (((
E→T+.E
Automa DFA
E → .T
T
E
T → .int * T
E → T. + E
T
T → int. * T
S’ → . E
int
E→.T
*
T → .(E)
T → int * .T
T → .int * T
T → .(E)
T → .int
T → .int * T
T → .int
(
T → .int
int
T
int
T → int.
int
E → .T + E
E → T + E.
T → .(E)
+
E → T.
S’ → E .
E
E → .T + E
T → int * T.
T
T → (. E)
(
E → .T
E → .T + E
E
T → .int * T
T → .int
T → (E.)
T → (E).
T → .(E)
)
(
63
(
Automi e Linguaggi Formali – A.A 2014-2015
Docente: Alessandro Sperduti
55 of 55