Supponiamo di avere il seguente CFG.Come trovare gli insiemi FIRST e FOLLOW di una grammatica ricorsiva?
A -> B | Cx | EPSILON
B -> C | yA
C -> B | w | z
Ora, se cerco di trovare
FIRST(C) = FIRST(B) U FIRST(w) U FIRST(z)
= FIRST(C) U FIRST(yA) U {w, z}
Cioè, sto andando in un ciclo. Quindi presumo di doverlo convertire in una forma con ricorsione a sinistra immediata, che posso fare come segue.
A -> B | Cx | EPSILON
B -> C | yA
C -> C | yA | w | z
Ora, se provo a calcolare i PRIMI set, penso di poterlo fare come segue.
FIRST(C) = FIRST(C) U FIRST(yA) U FIRST(w) U FIRST(z)
= { y, w, z } // I ignore FIRST(C)
FIRST(B) = FIRST(C) U FIRST(yA)
= { y, w, z }
FIRST(A) = FIRST(B) U FIRST(Cx) U FIRST(EPSILON)
= { y, w, z, EPSILON }
Sono corretto lì?
Ma anche se sono a posto, continuo a riscontrare un problema quando provo a calcolare SEGUI insiemi da questa grammatica.
FOLLOW(A) = { $ } U FOLLOW(B) U FOLLOW(C)
Ottengo SEGUIRE (B) dalla seconda regola e SEGUI (C) dalla terza regola. Ma ora per calcolare FOLLOW (B), ho bisogno di SEGUIRE (A) (dalla prima regola della grammatica) quindi di nuovo sono bloccato in un ciclo.
Qualsiasi aiuto? Grazie in anticipo!
Capito, grazie! Funziona magnificamente! – Sach
Grazie fratello, questo mi aiuta molto! – Jiahao
Grazie mille. Mi ha davvero aiutato! – Zephyr