View Full Version : Grammatica LL(1)
alessia86
05-04-2009, 16:50
Qualcuno sa dirmi se una regola del tipo T->aGs/T , T sia una ricorsione sinistra o destra??
Grazie
Vincenzo1968
05-04-2009, 18:08
È destra.
Nella ricorsione destra, il non terminale specificato nella testa della produzione(nel tuo esempio, T), si trova, nel corpo della produzione, alla fine(è, appunto, il terminale più a destra):
T -> aGs/T , T
Nella ricorsione a sinistra, invece, il non terminale si trova, nel corpo della produzione, all'inizio. Per esempio:
T-> TaGs
è ricorsiva a sinistra.
La ricorsione a sinistra va sempre eliminata per i parser di tipo LL(k). Si può trasformare una produzione ricorsiva a sinistra in una ricorsiva a destra modificando la grammatica(il simbolo 'e' indica la stringa vuota):
T = T'
T' -> aGsT' | e
alessia86
05-04-2009, 18:28
Grazie mille.. Quindi trattandosi di una ricorsione destra,e siccome io devo produrre una grammatica del tipo LL(1), non c'è bisogno di eliminarla vero? :stordita:
Vincenzo1968
05-04-2009, 18:54
Esatto.
La ricorsione sinistra porterebbe il parser in un loop infinito. La ricorsione destra, invece, non comporta alcun problema per i parser top-down(con grammatiche, quindi, di tipo LL(k)).
;)
alessia86
05-04-2009, 18:58
ok..ci sono...Mentre,un ultima domanda..Se la regola era T->T/aGs...in questo caso si trattava di ricorsione sinistra,vero?
Vincenzo1968
05-04-2009, 19:04
Si,
perché il non terminale T è il primo simbolo(quello più a sinistra) nel corpo della produzione T->T/aGs.
EDIT:
Occhio, non sempre la ricorsione a sinistra è immediata. Per esempio,
T -> ATcbS
A -> b | e
Nella grammatica precedente, T non compare come simbolo più a sinistra nella produzione T -> ATcbS; tuttavia si tratta di una produzione ricorsiva a sinistra perchè il non terminale A deriva la stringa vuota(indicata dal simbolo 'e').
alessia86
05-04-2009, 19:26
ho capito..grazie mille..mi sei stato davv d'aiuto :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.