Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - Problema eliminazione della ricorsione sinistra
Forum - Algoritmi - Problema eliminazione della ricorsione sinistra

Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 17:11
Domenica, 04/11/2012
Ciao a tutti,sto studiando da autodidatta Il libro  "Compilatori Principi, tecniche e strumenti", e sono arrivato all'analisi sintattica.
Studiando le grammatiche mi sono fermato in un problema che non capisco cioè la rimozione della ricorsione sinistra in una grammatica.
Il mio libro spiega questo algoritmo per eliminare la ricorsione sinistra:

ordina arbitrariamente i non terminali come A1,A2 ....... An.
for(ogni i fino a n)
{
  for(ogni j da 1 a i-1)
  {
    sostituisci ogni produzione nella forma Ai--> Ajγ
    con le produzioni Ai--> δ1γ | δ1γ | ... | δkγ in cui Aj--> δ1 | δ2 | ... | δk
    sono tutte le produzioni per il non terminale Aj in esame
  }
  elimina la ricorsione sinistra immediata delle produzioni per Ai
}

Per esempio se ho questa grammatica con ricorsione sinistra:

S--> Aa|b
A--> Ac|Sd|ε

dandola in input all'algoritmo dovrebbe diventare:

S--> Aa|b
A--> bdA'|A'
A'-->cA'|adA'|ε
Perchè?
Quello che non capisco è il funzionamento dell'algoritmo. Me lo potreste spiegare meglio?
Grazie mille in anticipo.

Ultima modifica effettuata da dmr il 04/11/2012 alle 17:13
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 1:06
Lunedì, 05/11/2012
Una spiegazione (forse troppo simile a quella data dal libro?) la trovi qui: http://en.wikipedia.org/wiki/Left_recursion#Removing_left_ ...

Il punto fondamentale da capire e' che una grammatica sinistra ricorsiva e' difficile da parsare, mentre un'equivalente grammatica non sinistra ricorsiva e' piu' semplice.


Il mio blog: https://piero.dev
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:55
Lunedì, 05/11/2012
La parte nel for consiste nell'espandere le produzioni che non sono immediatamente ricorsive a sinistra, ma contengono dei non-terminali che potrebbero renderle indirettamente ricorsive. In sostanza, da regole del tipo:

A -> By
B -> x | z | w

In questo esempio, A e B sono non-terminali, mentre x, y, z e w sono stringhe di terminali e non-terminali. A questo punto, effettuando la sostituzione, si ottiene:

A -> xy | zy | wy

Ora se x, z o w contengono A come prefisso, si ha una situazione di ricorsività sinistra immediata, che è facilmente eliminabile. In caso contrario, si continua ad espandere.

Ultima modifica effettuata da Il Totem il 05/11/2012 alle 11:55
PM Quote
Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 13:21
Lunedì, 05/11/2012
Ok grazie mille a entrambi!!:k:

PM Quote