SLR(1)

Messaggioda ciuf_ciuf » 21/11/2014, 19:07

Salve, chiedo aiuto per un piccolo dubbio che ho riscontrato mentre svolgevo un esercizio. Ho questa grammatica
Codice:
S -> rAIStI
A -> aA | epsilon
I-> iI | epsilon
e si chiede di verificare se si tratta di una grammatica di tipo SLR(1).
Dopo aver costruito tutti gli stati per LR(0), mi preparo ad analizzare tutti quelli che presentano conflitti di Riduzione/Spostamento all'interno dello stesso stato calcolando i Follow per le riduzioni e i First per gli spostamenti. Ad esempio uno stato che presenta questi conflitti è il seguente:
Codice:
S -> r . AIStI
A-> . aA
A-> .

Adesso arriva il problema, calcolo per gli spostamenti:
Codice:
First(AIStI) U First(aA) = {a}
e fin qui tutto ok
Invece per la riduzione bisogna calcolare (secondo quello che conoscevo):
Codice:
Follow(A) = First(I) = {i} U Follow(I) = {i} U First(S) U Follow(S) =  {i} U {r} U {$,t} = {i,r,$,t}

se vado però a controllare lo svolgimento dell'esercizio vedo che come Follow(A) hanno considerato soltanto {i,r}, inoltre se utilizzo questi generatori automatici
http://galileo.dmi.unict.it/utenti/reve ... oreparser/
http://hackingoff.com/compilers/predict ... follow-set
il Follow di A viene calcolato in maniera diversa, per uno è soltanto {i} per l'altro è {i,r}. Quindi a questo punto sono entrato in confusione e non sapevo più a chi credere :-D. Se qualcuno è in grado di aiutarmi mi faccia sapere.
Grazie e spero in qualche risposta.
ciuf_ciuf
Junior Member
Junior Member
 
Messaggio: 75 di 156
Iscritto il: 24/09/2010, 12:18

Messaggioda Rggb » 25/11/2014, 16:57

Vado a rimembranze di roba fatta eoni fa, comunque

ciuf_ciuf ha scritto:
Codice:
Follow(A) = First(I) = {i} U Follow(I) = {i} U First(S) U Follow(S) =  {i} U {r} U {$,t} = {i,r,$,t}

Non mi torna... perchè unisci Follow(S)? Qual è la definizione che hai di "insieme Follow"?

ciuf_ciuf ha scritto:se vado però a controllare lo svolgimento dell'esercizio vedo che come Follow(A) hanno considerato soltanto {i,r}

Mi torna, e torna anche con JFLAP. Verifica con quello
http://www.jflap.org/
Avatar utente
Rggb
Cannot live without
Cannot live without
 
Messaggio: 2181 di 3226
Iscritto il: 30/07/2009, 17:27

Re:

Messaggioda ciuf_ciuf » 25/11/2014, 19:45

Rggb ha scritto:Vado a rimembranze di roba fatta eoni fa, comunque

ciuf_ciuf ha scritto:
Codice:
Follow(A) = First(I) = {i} U Follow(I) = {i} U First(S) U Follow(S) =  {i} U {r} U {$,t} = {i,r,$,t}

Non mi torna... perchè unisci Follow(S)? Qual è la definizione che hai di "insieme Follow"?

ciuf_ciuf ha scritto:se vado però a controllare lo svolgimento dell'esercizio vedo che come Follow(A) hanno considerato soltanto {i,r}

Mi torna, e torna anche con JFLAP. Verifica con quello
http://www.jflap.org/


Regole per il Follow:

regola 1- Il Follow(S) se S è l'assioma deve contenere 'dollaro'
regola 2- Il Follow(S) se S è un simbolo che sta in produzioni del tipo A -> $ alpha $S$beta $ deve contenere i First($beta$) - $ epsilon $
regola 3- Il Follow(S) se S è un simbolo che sta in produzioni del tipo A-> $ alpha $S oppure in produzioni del tipo A -> $ alpha $S$beta $ dove il First($beta $) contiene $ epsilon $ $ rArr $ tutti i simboli di Follow(A) devono essere inseriti nel Follow(S)

Quindi io ho ragionato così, per il Follow(A) applico la seconda regola alla produzione(S->rAIStI) e quindi calcolo i First(I).
I First(I) sono {i,epsilon} quindi prendo i e a causa di epsilon, per la terza regola, sono costretto a calcolare il Follow(I).
Il Follow(I) lo calcolo applicando sia la seconda regola, sia la terza regola(produzioni del tipo A-> $ alpha $S) alla produzione (S->rAIStI). Quindi significa che devo calcolare il First(S) che è {r} e il Follow(S) che contiene {$,t} riapplicando nuovamente le varie regole.

Bo, io non capisco dov'è che sbaglio. ](*,)
ciuf_ciuf
Junior Member
Junior Member
 
Messaggio: 76 di 156
Iscritto il: 24/09/2010, 12:18

Messaggioda Rggb » 26/11/2014, 00:38

ciuf_ciuf ha scritto:Quindi io ho ragionato così, per il Follow(A) applico la seconda regola alla produzione(S->rAIStI) e quindi calcolo i First(I).


Forse ho capito., secondo me sbagli nel calcolare FIRST(). Infatti hai
$FOLLOW(A)=FIRST(\I\S\t\I)={i} uu FIRST(\S\t\I)={i, r}$

Dà un'occhiata a queste dispense, secondo me molto chiare (sono segnalate nell'apposita sezione):
http://www.cs.nuim.ie/~jpower/Courses/Previous/parsing/
Avatar utente
Rggb
Cannot live without
Cannot live without
 
Messaggio: 2182 di 3226
Iscritto il: 30/07/2009, 17:27

Re:

Messaggioda ciuf_ciuf » 26/11/2014, 15:32

Rggb ha scritto:
ciuf_ciuf ha scritto:Quindi io ho ragionato così, per il Follow(A) applico la seconda regola alla produzione(S->rAIStI) e quindi calcolo i First(I).


Forse ho capito., secondo me sbagli nel calcolare FIRST(). Infatti hai
$FOLLOW(A)=FIRST(\I\S\t\I)={i} uu FIRST(\S\t\I)={i, r}$


Questo ragionamento è quello che ho fatto subito anche io quando ho visto che il mio risultato non coincideva con quello degli altri, però poi pensandoci meglio mi sono ricordato che l'operazione di slittamento dovuto all'epsilon viene fatto quando si calcolano i Predict delle produzioni e non i Follow, o almeno io so così. Comunque probabilmente l'errore è questo, anche se la cosa non mi torna.

Rggb ha scritto:Dà un'occhiata a queste dispense, secondo me molto chiare (sono segnalate nell'apposita sezione):
http://www.cs.nuim.ie/~jpower/Courses/Previous/parsing/


Oggi le guardo. Grazie :smt023
ciuf_ciuf
Junior Member
Junior Member
 
Messaggio: 77 di 156
Iscritto il: 24/09/2010, 12:18

Messaggioda Rggb » 27/11/2014, 17:17

ciuf_ciuf ha scritto:Comunque probabilmente l'errore è questo, anche se la cosa non mi torna.

Cosa è che non ti torna?
Avatar utente
Rggb
Cannot live without
Cannot live without
 
Messaggio: 2184 di 3226
Iscritto il: 30/07/2009, 17:27

Re: SLR(1)

Messaggioda ciuf_ciuf » 27/11/2014, 17:31

Non mi torna perchè come ho detto nella risposta precedente l'operazione di slittamento, dovuto ad epsilon, viene fatto in caso di calcolo dei Predict o nel caso di calcolo di First che non derivi però dal calcolo di un Follow. Perchè nel calcolo dei Follow quando si incontra un epsilon bisogna applicare la regola opportuna, se faccio lo slittamento è come se ignorassi la regola 3.
ciuf_ciuf
Junior Member
Junior Member
 
Messaggio: 78 di 156
Iscritto il: 24/09/2010, 12:18


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite