Professional Documents
Culture Documents
El conjunto PRIMERO(), siendo una forma sentecial, es el conjunto de Terminales que pueden aparecer los primeros en cadenas derivadas de . El conjunto PRIMERO puede referirse a una forma sentencial (PRIMERO(), siendo por ejemplo aBD ), pero tambin a un smbolo No Terminal de la gramtica considerada (PRIMERO(A)). Si la gramtica est formada por reglas Ai el conjunto PRIMERO(A) ser la unin de todos los PRIMERO(i), que deben ser calculados por separado. Para calcular PRIMERO() basta con seguir las siguientes reglas para cada regla de produccin de la gramtica: 1. Si , donde es la cadena vaca : Aadir { } a PRIMERO() 2. Si a, donde a es un Terminal: Aadir { a } a PRIMERO() 3. Si A, donde A es un No Terminal: Aadir PRIMERO(A) a PRIMERO(). 4. Si AB, donde A y B son No Terminales y PRIMERO(A) incluye { }: Aadir PRIMERO(A) a PRIMERO(), pero sin incluir de momento { }. Adems, y puesto que A puede ser vaco, aadir PRIMERO(B) a PRIMERO(). Esta regla puede extenderse a todos los No Terminales que aparezcan detrs de A. Por ejemplo, si ABCD y PRIMERO (A), PRIMERO(B) y PRIMERO(C) incluyen { }, entonces habr que aadir a PRIMERO() la unin de PRIMERO(A), PRIMERO(B), PRIMERO(C) y PRIMERO(D), sin incluir { }. Por ltimo se decide si incluir { } en PRIMERO(): slo debe incluirse si aparece en los conjuntos PRIMERO de todos los No Terminales. Por ejemplo en el caso anterior, si PRIMERO(D) tambin incluyese { }, entonces PRIMERO() incluira { }.
Clculo de SIGUIENTE
Si A es un smbolo No Terminal de una gramtica, SIGUIENTE(A) es el conjunto de Terminales (incluyendo el smbolo de fin de cadena, $) que pueden aparecer justo despus de A en alguna forma sentencial derivada del smbolo inicial. El clculo de conjuntos SIGUIENTE se realiza a partir de estas reglas: 1. Los conjuntos SIGUIENTE de todos los No Terminales son inicialmente vacos, excepto el del No Terminal inicial de la gramtica, en el que se incluye el smbolo {$}. A partir de este punto, para calcular cada uno de los conjuntos deben aplicarse las dos siguientes reglas (no son excluyentes) por cada ocurrencia del No Terminal en la parte derecha de alguna regla de produccin: 2. Si A B: Aadir a SIGUIENTE(B) los elementos de PRIMERO(), con la excepcin de {}: este smbolo nunca se incluir en los conjuntos SIGUIENTE. 3. Si A B, o bien A B donde PRIMERO() contiene {}: Aadir a SIGUIENTE(B) los elementos de SIGUIENTE(A). Conviene comprender las reglas en lugar de intentar memorizarlas: en el caso de SIGUIENTE, se comprueba intuitivamente que los posibles Terminales que pueden aparecer siguiendo a un No Terminal B son: Los que pertenecen al conjunto PRIMERO del No Terminal que aparece inmediatamente despus que el No Terminal B. Esto lo expresa la Regla 2. Si el No Terminal B aparece el ltimo en la parte derecha de una regla de produccin (o bien el No Terminal que hay a su derecha puede derivar la cadena vaca), estaremos en un caso como el siguiente: S aAb A cB B ... Intuitivamente, cul es el conjunto de Terminales que pueden seguir a B en una cadena? Como B aparece el ltimo en la parte derecha de una regla de produccin de A, habr que buscar los Terminales que puedan seguir a A. Es decir, los siguientes de B sern, como mnimo, los siguientes de A, en este caso {b}. Esto es lo que expresa la Regla 3.