Compiladores Conjunto Primero, Siguiente y de Predicción
Ejemplo 1: Dada la siguiente gramática definida por sus producciones P: S A A B C C a) b) c) d) e)
::= ::= ::= ::= ::= ::=
AB a ε bCd c ε
Calcul Calcular ar los los conjun conjuntos tos PRIME PRIMERO RO Calcul Calcular ar los conju conjunto ntos s SIGUIEN SIGUIENTE TE Construir Construir la la tabla tabla de análisis análisis sintácti sintáctico co para para G A la vista vista de los resultados resultados anterio anteriores. res. Puede Puede afirmarse afirmarse que G es LL(1)? LL(1)? En caso de ser una G LL(1), probar si las siguientes entradas son analizadas correctamente: abd y abc
a) y b)
No Terminales
Primeros
Siguientes
S
{a, b}
{$}
A
{a, ε}
{b}
B
{b}
{$}
C
{c, ε}
{d}
c) Para construir la tabla debemos calcular el conjunto de predicción.
Regla
Conjunto de Predicción
S ::= A B
{a, b}
A ::= a
{a}
A ::= ε
{b}
B ::= b C d
{b}
C ::= c
{c}
C ::= ε
{d}
Tabla de Analisis Sintactico a
b
c
d
$
S
S::= A B
S::= A B
error
error
error
A
A::= a
A::= ε
error
error
error
B
error
B ::= b C d
error
error
error
C
error
error
C ::= c
C ::= ε
error
d) Puede afirmarse que G es una LL(1) porque:
1. No es una G ambigua 2. No tiene factores comunes por la izquierda 3. No es recursiva por la izquierda
e) Para abd Pila de Simbolos
Entrada
Regla o acción
$S
abd$
S ::= A B
$BA
abd$
A ::= a
$Ba
abd$
Emparejar (a)
$B
bd$
B ::= b C d
$dCb
bd$
Emparejar (b)
$dC
d$
C ::= ε
$d
d$
Emparejar (d)
$
$
Aceptar
Para abc Pila de Simbolos
Entrada
Regla o acción
$S
abc$
S ::= A B
$BA
abc$
A ::= a
$Ba
abc$
Emparejar (a)
$B
bc$
B ::= b C d
$dCb
bc$
Emparejar (b)
$dC
c$
C ::= c
$dc
c$
Emparejar (c)
$d
$
Error (d <> $)
Ejemplo 2: Dada la siguiente gramática definida por sus pr oducciones P: 1) S ::= QA 2) A ::= or QA 3) A ::= ε 4) Q ::= RB 5) B ::= RB 6) B ::= ε 7) R ::= F and 8) R ::= x 9) R ::= y 10) F ::= z a) Calcular los conjuntos PRIMERO
b) c) d) e)
Calcular los conjuntos SIGUIENTE Construir la tabla de análisis sintáctico para G A la vista de los resultados anteriores. Puede afirmarse que G es LL(1)? En caso de ser una G LL(1), probar si la siguiente entrada es analizada correctamente: z and or yx
a) y b)
No Terminale s
S
A
Q
B
R
F
Primeros
{z, x, y}
{or, }
Por la producción 1 se deriva a Q y por la producción 4 se deriva a R, por la produccion 7 se deriva de R a F y por la prod 10 se deriva de F a z. Por las producciones 8 y 9 de R se deriva a x e y Por la prod. 2 se deriva a or. Por la prod. 3 obtenemos
Siguientes
{$}
Por regla 2 del algoritmo p/ obtener el conjunto siguiente.
{$}
Por la produccion 1, aplicando la regla 4 del algoritmo, el siguiente de A es el siguiente de S. De la produccion 2 no se puede obtener el siguiente de A dado que nos quedamos en un bucle infinito.
Por la prod. 4, el primero de Q es R y por las producciones 7, 10, 8 y 9 obtenemos z, x, y
{or, $}
{z, x, y, }
Por la prod 5 el primero de B es R y por las producciones 7, 10, 8 y 9 , obtenemos z, x, y. Por la produccion 6 obtenemos
{or, $}
{z, x, y}
Por las producciones 7, 10, 8 y 9 obtenemos z, x, y
{z, x, y, or, $}
{z, x, y}
{z}
Por la produccion 10
{and}
Por la produccion 2 el siguiente de Q es el primero de A (aplicando la regla 3 del algoritmo) y de allí obtenemos or. Debido a que ε se encuentra en el conjunto primero de A, debemos también aplicar la regla 4 del algoritmo, de donde obtenemos que el siguiente de Q es el siguiente de A, por tanto también agregamos $ Por la produccion 4, el siguiente de B es el siguiente de Q (apliacando la regla 4 del algoritmo), por tanto obtenemos or y $. De la produccion 5 no se puede obtener el siguiente de B dado que nos quedamos en un bucle infinito. Por la produccion 4 (aplicando la regla 3 del algoritmo), el siguiente de R es el primero de B, por lo que obtenemos z, x, y. Debido a que ε se encuentra en el conjunto primero de B, debemos también aplicar la regla 4 del algoritmo, de donde obtenemos que el siguiente de R es el siguiente de B, por tanto también agregamos or, $. Por la produccion 7 (aplicando la regla 3 del algoritmo), el siguiente de F es and. Como and es un terminal, y este no tiene en su conjunto primero a , entonces no hace falta aplicar la regla 4 del algoritmo. Nota: En caso de que and hubiese sido un no terminal pero que en su conjunto primero no contenga a , tampoco deberiamos aplicar la regla 4 del algoritmo.
c) Para construir la tabla debemos calcular el conjunto de predicción.
Regla
Conjunto de Prediccion
S ::= QA
{z, x, y}
1) A ::= or QA 2) A ::= ε
{or, ε}
1) Q ::= RB
{z, x, y}
1) B ::= RB 2) B ::= ε
{z, x, y, ε}
1) R ::= F and 2) R ::= x 3) R ::= y
{z, x, y}
1) F ::= z
Por la produccion 1, Q estaría en el conjunto de prediccion de S, como Q es un no terminal debemos buscar cuales son los terminales a los que deriva Q. Por la produccion 4 Q, deriva a R y por las producciones 7, 10, 8 y 9, obtenemos que Q deriva a z, x, y Por la produccion 2 obtenemos que or está en el conj. De prediccion de A. Por la produccion 3 obtenemos ε. Por la produccion 4, R estaría en el conjunto de prediccion de Q, como R es un no terminal debemos buscar cuales son los terminales a los que deriva R. Por las producciones 7, 10, 8 y 9, obtenemos que R deriva a z, x, y Por la produccion 5, R estaría en el conjunto de prediccion de B, como R es un no terminal debemos buscar cuales son los terminales a los que deriva R. Por las producciones 7, 10, 8 y 9, obtenemos que R deriva a z, x, y Por la produccion 6 obtenemos que ε también se encuentra en el conjunto de prediccion de B Por las producciones 7, 10, 8 y 9, obtenemos que R deriva a z, x, y Por la produccion 10 obtenemos que z se encuentra en el conj. De prediccion de F
{z}
Tabla de Analisis Sintactico
or
and
x
y
z
$
S
error
error
S::= Q A
S::= Q A
S::= Q A
error
A
A::= or Q A
error
error
error
error
A::= ε
Q
error
error
Q::= R B
Q::= R B
Q::= R B
error
B
error
error
B::= R B
B::= R B
B::= R B
B::= ε
R
error
error
R::= x
R::= y
R::= F and
error
F
error
error
error
error
F::= z
error
d) Puede afirmarse que G es una LL(1) porque: 1. No es una G ambigua 2. No tiene factores comunes por la izquierda 3. No es recursiva por la izquierda
e) Pila de Simbolos
Entrada
Regla o acción
$S
z and or y x $
S ::= Q A
$AQ
z and or y x $
Q ::= R B
$ABR
z and or y x $
R ::= F and
$ A B and F
z and or y x $
F ::= z
$ A B and z
z and or y x $
Emparejar (z)
$ A B and
and or y x $
Emparejar (and)
$AB
or y x $
B ::=
$A
or y x $
A ::= or Q A
$ A Q or
or y x $
Emparejar (or)
$AQ
yx$
Q ::= R B
$ABR
yx$
R ::= y
$ABy
yx$
Emparejar (y)
$AB
x$
B ::= R B
$ABR
x$
R ::= x
$ABx
x$
Emparejar (x)
$AB
$
B ::=
$A
$
A ::=
$
$
Aceptar
Ejemplo 3: Dada la siguiente gramática G = {N, T, E, P} donde: 1) 2) 3) 4) 5) 6) 7) 8) 9) a) b) c) d)
E ::= AB E ::= A ::= FC B ::= +AB B ::= C ::= *FC C ::= F ::= ( E ) F ::= id
Calcular los conjuntos PRIMERO y SIGUIENTE Construir la tabla de análisis sintáctico para G Analizar la cadena id*id+id utilizando análisis predictivo no recursivo Según los resultados de los apartados anteriores, razonar si G es LL(1)
a)
No Terminale s
E
Primeros
{ (, id, ε}
Por la produccion 1, el primero de E es A, y como A es un no terminal debemos encontrar los terminales a los que deriva A. De allí obtenemos que por la produccion 3 A deriva a F y por las producciones 8 y 9, F deriva a ( e id Por la produccion 2, obtenemos también que el primero de E es ε
Siguientes
{$, ) }
{ (, id}
Por la produccion 3 obtenemos que el primero de A es F, y como F es un no terminal debemos encontrar los terminales a los cuales deriva F. De allí obtenemos por las producciones 8 y 9, F deriva a ( e id
{+ , $, ) }
B
{ +, ε}
Por la produccion 4 obtenemos que el primero de B es + y por la produccion 5, obtenemos también que el primero de B es ε
{ $, ) }
C
{ *, ε}
A
Por la produccion 6 obtenemos que el primero de C es + y por la produccion 7, obtenemos también que el primero de C es ε
{ +, $, ) }
Por regla 2 del algoritmo p/ obtener el conjunto siguiente. Por la produccion 8 obtenemos que el siguiente de E es )
Por la produccion 1, aplicando la regla 3 del algoritmo, obtenemos que el siguiente de A es el primero de B por lo que agregamos al conjunto siguiente a + (ε no va). Debido a que ε se encuentra en el conjunto primero de B, entonces debemos también aplicar la regla 4 del algoritmo, por lo que también obtenemos que el siguiente de A es el siguiente de B. Entonces calculamos el siguiente de B que sería $ y ). Por la produccion 4 y aplicando la regla 3 del algoritmo obtenemos que el siguiente de A es el primero de B (que ya calculamos anteriormente). Nuevamente analizamos si B tiene en su conj primero a ε y como esto se cumple, también deberiamos aplicar la regla 4 del algoritmo en donde el SIG(A) = SIG (B) (que ya calculamos anteriormente). Por la produccion 1, aplicando la regla 4 del algoritmo, el siguiente de B es el siguiente de E y de alli obtenemos $ y ) Por la produccion 4 no podemos calcular el siguiente de B ya que entrariamos a un bucle infinito. Por la produccion 3, aplicando la regla 4 del algoritmo, el siguiente de C es el siguiente de A y de alli obtenemos +, $ y ) Por la produccion 6 no podemos calcular el siguiente de C ya que entrariamos a un bucle
infinito.
F
{ (, id}
Por la produccion 8 obtenemos que el primero de F es ( Por la produccion 9 obtenemos también que el primero de F es id
{ *, +, $, ) }
Por la produccion 3, aplicando la regla 3 del algoritmo, obtenemos que el siguiente de F es el primero de C por lo que agregamos al conjunto siguiente a * (ε no va). Debido a que ε se encuentra en el conjunto primero de C, entonces debemos también aplicar la regla 4 del algoritmo, por lo que también obtenemos que el siguiente de F es el siguiente de C. Entonces agregamos al conjunto siguiente +, $ y ). Por la produccion 6 y aplicando la regla 3 del algoritmo obtenemos que el siguiente de F es el primero de C (que ya calculamos anteriormente). Nuevamente analizamos si C tiene en su conj primero a ε y como esto se cumple, también deberiamos aplicar la regla 4 del algoritmo en donde el SIG(F) = SIG (C) (que ya calculamos anteriormente).
b) Para construir la tabla debemos calcular el conjunto de predicción.
No terminales
Conjunto de Prediccion
E
{ (, id, $ }
A { (, id } B { +, $ } C { *, $ } F
{ (, id }
Por produccion 1 obtenemos que A estaría en el conjunto de predicción de E pero por ser un no terminal debemos encontrar a los terminales que deriva A, de allí obtenemos (por producción 3 y luego 8 y ) obtenemos ( e id Por la producción 2 obtenemos que $ también pertenece al conjunto de prediccion Por la producción 3, obtenemos que F estaría en el conjunto de predicción de A pero por ser un no terminal debemos encontrar a los terminales que deriva F, de allí obtenemos por las producciones 8 y 9 a ( e id Por produccion 4 obtenemos que + se encuentra en el conjunto de predicción de B Por la producción 5 obtenemos que $ también pertenece al conjunto de prediccion Por produccion 6 obtenemos que * se encuentra en el conjunto de predicción de C Por la producción 7 obtenemos que $ también pertenece al conjunto de prediccion Por producción 8 obtenemos ( Por producción 9 obtenemos id
Tabla de Analisis Sintactico
(
)
+
*
id
$
E
E :: = A B
A
A ::= F C
B
error
C F
error error
error
error
E :: = A B
E :: = ε
error
error
A ::= F C
error
error
B ::= + A B
error
error
error
F ::= ( E )
error
error
error C ::= * F C error
error
B :: = ε
error
C :: = ε
F ::= id
error
c) Pila de Simbolos
Entrada
Regla o acción
$E
id * id + id $
E :: = A B
$BA
id * id + id $
A ::= FC
$BCF
id * id + id $
F ::= id
$ B C id
id * id + id $
Emparejar(id)
$BC
* id + id $
C ::= * F C
$BCF*
* id + id $
Emparejar(*)
$BCF
id + id $
F ::= id
$ B C id
id + id $
Emparejar(id)
$BC
+ id $
Error
d) Puede afirmarse que G es una LL(1) porque: 1. No es una G ambigua 2. No tiene factores comunes por la izquierda 3. No es recursiva por la izquierda