Passa al tema normale
Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

SLR(1)

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.

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/

Re:

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. ](*,)

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/

Re:

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

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?

Re: SLR(1)

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.
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.