Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Algoritmi parsing Bottom up, Dispense di Tecniche E Linguaggi Di Programmazione

Algoritmo di Parsing Bottom up

Tipologia: Dispense

2018/2019

Caricato il 20/10/2019

jack-pagoda
jack-pagoda 🇮🇹

5

(5)

40 documenti

1 / 35

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Parsing Bottom-up
Classificazione:
Ogni classe marcata dal parser P corrisponde a un insieme di grammatiche che
possono essere analizzate da P
Tecnologie dei Linguaggi Artificiali 5. Parsing bottom-up
1
LR(1)
LALR(1)
SLR(1)
LR(0)
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23

Anteprima parziale del testo

Scarica Algoritmi parsing Bottom up e più Dispense in PDF di Tecniche E Linguaggi Di Programmazione solo su Docsity!

Parsing Bottom-up

 Classificazione:

 Ogni classe marcata dal parser P corrisponde a un insieme di grammatiche che

possono essere analizzate da P

LR(1)

LALR(1)

SLR(1)

LR(0)

Parsing Bottom-up (ii)

 Architettura simile al parsing LL(1)

 Possibili azioni (oltre accetta ):

1. Sposta il terminale corrente dall'input alla cima della pila 2. Riduci una stringa  in cima alla pila al nonterminale A , data la produzione A  

Programma di Parsing

Tabella di parsing

pila output

input (sequenza di simboli)

Pila Input Azione $ stringa $

$ S’ $ accetta

Overview del parsing:

assioma della G "estesa"

Parsing Bottom-up (iv)

(A) (B)

Note:

  1. Per scegliere l'azione, necessario “guardare” oltre la cima della pila (a differenza di LL(1)) Esempio: (A) passi 5, 6: stessa cima, ma diverse riduzioni!
  2. Prospezione arbitraria all'interno della pila: non è un problema poiché pila costruita dal parser
  3. Azione: dipende non solo dalla pila ma anche dal terminal corrente Esempio: (B) passi 3, 6: stesso contenuto nella pila, ma azioni diverse
  4. [Riduzioni] = Traccia in ordine inverso di derivazione canonica destra
  5. Pila+input = forma sentenziale destra  lista di simboli sulla pila prefisso viabile della forma sentenziale destra

Pila Input Azione 1 $ () $ sposta 2 $ ( ) $ S   3 $ (S ) $ sposta 4 $ (S) $ S   5 $ (S)S $ S( S ) S 6 $ S $ S’S 7 $ S’ $ accetta

Pila Input Azione 1 $ n+n $ sposta 2 $ n +n $ En 3 $ E +n $ sposta 4 $ E+ n $ sposta 5 $ E+n $ EE + n 6 $ E $ E’E 7 $ E’ $ accetta

(A): S’S(S)S(S)()

(B): E’EE+nn+n

Parsing Bottom-up (v)

 Tecnica: spostamento dei simboli dall'input alla pila finché possibile una riduzione

corrispondente alla forma sentenziale precedente

 Quindi:  in cima alla pila = condizione per riduzione A  

Esempio: (A): S    =  è sempre in cima alla pila! Riducibile solo quando pila+input = forma sentenziale precedente

necessaria

insufficiente

Passo 3: $ (S ) $ S   $ (SS ) $ non forma sentenziale!

Parsing LR(0)

 Item LR(0) di G  Produzione di G con una posizione specificata nella RHS

Intuitivamente: produzione “contestualizzata”

Genericamente: A  ,  =  : A  .

 Intuitivamente: item = rappresentazione dello stato di riconoscimento della RHS di una produzione

Stato

EE. + n

S’  S

S  ( S ) S | 

S’ . S

S’  S.

S . ( S ) S

S  (. S ) S

S  ( S. ) S

S  ( S ). S

S  ( S ) S.

S .

E’  E

EE + n | n

E’ . E

E’  E.

E. E + n EE. + n EE +. n EE + n. E. n En.

caso generale: A  .

casi specifici

: già analizzata  in cima alla pila : da processare (presente in forma concreta in un prefisso dell'input ancora da analizzare) A.   Item iniziale : si inizia a riconoscere A mediante A   A  .Item completo :  in cima alla pila: A   = candidata alla riduzione

Parsing LR(0) (ii)

 Item LR(0) organizzati in NFA di item = (, S, T, s 0 )

  = { simboli grammaticali }  Item LR(0) = stati di un NFA che mantiene lo stato di riconoscimento di un parser bottom-up  Transizioni =?

 Stato iniziale? In teoria: S . , ma poiché   alternative S’ . S

  stati finali: compito dell'automa

A. X AX. 

X

terminale: spostamento di X sulla pila

nonterminale:

spostamento virtuale di X sulla pila, ma dopo una riduzione X  : deve essere preceduto dal riconoscimento di 

.  = stato iniziale di tale riconoscimento

 alternativa X  : A . X ^ X.  (in aggiunta)

mantenere lo stato del parsing bottom-up non riconoscimento di stringhe!

Possibilità: X

Trasformazione NFA  DFA

S’ . S S^ S’  S.

S . ( S ) S

S .

S  (. S ) S

S  ( S. ) S

S

S ( S ). S

S  ( S ) S.

S

S’ . S

S . ( S ) S

S .

S S’  S.

S  (. S ) S

S . ( S ) S

S .

S  ( S. ) S

S  ( S ). S

S . ( S ) S

S .

S  ( S ) S.

S

S

Trasformazione NFA  DFA (ii)

 Nello stato: distinzione

E’ . E E^ E’  E.

E . E + n

E . n

n^ E  n.

E

E  E. + n +^ E  E +. n n^ E  E + n.

E’ . E

E . E + n E . n

E E’^ ^ E^.

E  E. + n

n E  n.

E  E +. n n E  E + n.

kernel item  { stati raggiunti da transizioni non-vuote (o stato iniziale) } closure item  { stati raggiunti da -chiusura }

sufficienti per identificare lo stato

Grammatiche LR(0)

Def: G è LR(0) se le azioni dell'algoritmo non sono ambigue, cioè,

 stato del DFA:

 conflitto

riduzione/riduzione : s  { A  . , B  . }

spostamento/riduzione : s  { A  . , B  . a }

(

S’ . S S . ( S ) S S .

S (^) S’  S.

(

S  (. S ) S S . ( S ) S S .

S  ( S. ) S

S  ( S ). S S . ( S ) S S .

S S  ( S ) S.

(

S

S’  S

S  ( S ) S | 

E’  E

EE + n | n

E’ . E E . E + n E . n

E E’^ ^ E^. E  E. + n

n E  n.

+ E  E +. n n^ E  E + n.

Grammatiche LR(0) (ii)

A’  A

A( A ) | a

(

A’ . A A . ( A ) A . a

A (^) A’  A.

(

A  (. A ) A . ( A ) A . a

A  a.

A A  ( A. )

a

a ) A  ( A ).

Pila Input Azione 1 $ 0 ((a)) $ sposta 2 $ 0 (3 (a)) $ sposta 3 $ 0 (3 (3 a)) $ sposta 4 $ 0 (3 (3 a2 )) $ Aa 5 $ 0 (3 (3 A4 )) $ sposta 6 $ 0 (3 (3 A4 )5 ) $ A( A ) 7 $ 0 (3 A4 ) $ sposta 8 $ 0 (3 A4 )5 $ A( A ) 9 $ 0 A1 $ accetta

( ( a ) )

0 1

2

(^3 4 )

Parsing SLR(1)

 Sufficientemente potente per quasi tutti i costrutti dei LP in uso

 Idea: Sfruttamento del prossimo simbolo in input per decidere quale azione intraprendere:

In 2 modi prima dello spostamento prima della riduzione: FOLLOW ( A ): per decidere se ridurre A  

pila := $0; lookahead := primo simbolo in input; repeat s := Top(pila); /* s è uno stato / if A  . X*  ∊ s and Terminal( X ) and X = lookahead then Sposta lookahead sulla pila; Push(s’), where s  s’ è una transizione nel DFA else if A  . ∊ s and lookaheadFOLLOW ( A ) then Riduci A  ; if A   = S’  S then Accetta /* lookahead = $ , poichè FOLLOW ( A ) = { $ } / else Rimuovi  con i suoi stati dalla pila; /  è in cima alla pila per costruzione / s’ := Top(stack); / B  . A  ∊ s’ */ Push(A); Push(s’’), where s’  s’’ è una transizione nel DFA else Errore() until acettazione o errore.

A

X

Grammatiche SLR(1)

Def: G è SLR(1) se  s del DFA (azioni non ambigue):

1.  A  . a ∈ s, Terminale(a) (∄ B  . ∈ s (a ∊ FOLLOW (B)));

2.  A  . ∈ s,  B  . ∈ s ( FOLLOW (A)  FOLLOW (B) = ∅).

(

S’ . S S . ( S ) S S .

S (^) S’  S.

(

S  (. S ) S S . ( S ) S S .

S  ( S. ) S

S  ( S ). S S . ( S ) S S .

S S  ( S ) S.

(

S

E’ . E E . E + n E . n

E E’  E. E  E. + n

n E  n.

+ E  E +. n n^ E  E + n.

FOLLOW ( S’ ) = { $ }

FOLLOW ( S ) = { $ , ) }

S’  S

S  ( S ) S | 

FOLLOW ( E’ ) = { $ }

FOLLOW ( E ) = { + , $ }

E’  E

EE + n | n

LR(0)

SLR(1)

Grammatiche SLR(1) (iii)

E’  E

EE + n | n

E’ . E E . E + n E . n

E E’^ ^ E^. E  E. + n

n E  n.

+ E  E +. n n^ E  E + n.

1

2 3 4

0

Stato Input Goto n + $ E 0 s2 1 1 s3 accetta 2 En En 3 s 4 EE + n EE + n

Pila Input Azione $ 0 n+n+n $ sposta $ 0 n2 +n+n $ En $ 0 E1 +n+n $ sposta $ 0 E1 +3 n+n $ sposta $ 0 E1 +3 n4 +n $ EE + n $ 0 E1 +n $ sposta $ 0 E1 +3 n $ sposta $ 0 E1 +3 n4 $ EE + n $ 0 E1 $ accetta

n + n + n

FOLLOW ( E’ ) = { $ }

FOLLOW ( E ) = { + , $ }

Regole di Disambiguamento per Conflitti di Parsing

 Conflitto

 Esempio: conflitto spostamento/riduzione

spostamento/riduzione  scelto lo spostamento riduzione/riduzione  errore nella specifica della G?

statif-stat | other if-statif expr then stat | if expr then stat else stat exprtrue | false

G ambigua  deve  un conflitto da qualche parte!

astrazione (rimozione di expr e then )

S’  S

SI | other Iif S | if S else S

FOLLOW ( S’ ) = { $ }

FOLLOW ( S ) = FOLLOW ( I ) = { $ , else }