Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Calcular los conjuntos PRIMERO Calcular los conjuntos SIGUIENTE Construir la tabla de anlisis sintctico 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 las siguientes entradas son analizadas correctamente: abd y abc
a) y b)
No Terminales S A B C
Regla
S ::= A B A ::= a A ::= B ::= b C d C ::= c C ::=
Tabla de Analisis Sintactico a S A B C S::= A B A::= a error error b S::= A B A::= B ::= b C d error c error error error C ::= c d error error error C ::= $ error error error error
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 $S $BA $Ba $B $dCb $dC $d $ Entrada abd$ abd$ abd$ bd$ bd$ d$ d$ $ Regla o accin S ::= A B A ::= a Emparejar (a) B ::= b C d Emparejar (b) C ::= Emparejar (d) Aceptar
Para abc Pila de Simbolos $S $BA $Ba $B $dCb $dC $dc $d Entrada abc$ abc$ abc$ bc$ bc$ c$ c$ $ Regla o accin S ::= A B A ::= a Emparejar (a) B ::= b C d Emparejar (b) C ::= c Emparejar (c) Error (d <> $)
Ejemplo 2: Dada la siguiente gramtica definida por sus producciones 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 anlisis sintctico 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
Primeros
Por la produccin 1 se deriva a Q y por la produccin 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
{z, x, y}
{$}
{or, }
{$}
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 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 tambin aplicar la regla 4 del algoritmo, de donde obtenemos que el siguiente de Q es el siguiente de A, por tanto tambin 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 tambin aplicar la regla 4 del algoritmo, de donde obtenemos que el siguiente de R es el siguiente de B, por tanto tambin 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.
{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}
{z, x, y, or, $}
{z}
Por la produccion 10
{and}
Regla
Conjunto de Prediccion Por la produccion 1, Q estara 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 estara 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 estara 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 tambin 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
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, }
{z, x, y} {z}
d) Puede 1. 2. 3.
afirmarse que G es una LL(1) porque: No es una G ambigua No tiene factores comunes por la izquierda No es recursiva por la izquierda
e) Pila de Simbolos $S $AQ $ABR $ A B and F $ A B and z $ A B and $AB $A $ A Q or $AQ $ABR $ABy $AB $ABR $ABx $AB $A $ Entrada z and or y x $ z and or y x $ z and or y x $ z and or y x $ z and or y x $ and or y x $ or y x $ or y x $ or y x $ yx$ yx$ yx$ x$ x$ x$ $ $ $ Regla o accin S ::= Q A Q ::= R B R ::= F and F ::= z Emparejar (z) Emparejar (and) B ::= A ::= or Q A Emparejar (or) Q ::= R B R ::= y Emparejar (y) B ::= R B R ::= x Emparejar (x) B ::= A ::= Aceptar
Ejemplo 3: Dada la siguiente gramtica 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 anlisis sintctico para G Analizar la cadena id*id+id utilizando anlisis predictivo no recursivo Segn los resultados de los apartados anteriores, razonar si G es LL(1)
a)
No Terminale s
Primeros
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 tambin que el primero de E es
Siguientes
{ (, id, }
{$, ) }
Por regla 2 del algoritmo p/ obtener el conjunto siguiente. Por la produccion 8 obtenemos que el siguiente de E es )
{ (, 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
{+ , $, ) }
{ +, }
Por la produccion 4 obtenemos que el primero de B es + y por la produccion 5, obtenemos tambin que el primero de B es
{ $, ) }
{ *, }
Por la produccion 6 obtenemos que el primero de C es + y por la produccion 7, obtenemos tambin que el primero de C 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 tambin aplicar la regla 4 del algoritmo, por lo que tambin obtenemos que el siguiente de A es el siguiente de B. Entonces calculamos el siguiente de B que sera $ 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, tambin 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.
{ (, id}
Por la produccion 8 obtenemos que el primero de F es ( Por la produccion 9 obtenemos tambin 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 tambin aplicar la regla 4 del algoritmo, por lo que tambin 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, tambin deberiamos aplicar la regla 4 del algoritmo en donde el SIG(F) = SIG (C) (que ya calculamos anteriormente).
No terminales
Conjunto de Prediccion
Por produccion 1 obtenemos que A estara en el conjunto de prediccin de E pero por ser un no terminal debemos encontrar a los terminales que deriva A, de all obtenemos (por produccin 3 y luego 8 y ) obtenemos ( e id Por la produccin 2 obtenemos que $ tambin pertenece al conjunto de prediccion Por la produccin 3, obtenemos que F estara en el conjunto de prediccin 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 prediccin de B Por la produccin 5 obtenemos que $ tambin pertenece al conjunto de prediccion Por produccion 6 obtenemos que * se encuentra en el conjunto de prediccin de C Por la produccin 7 obtenemos que $ tambin pertenece al conjunto de prediccion Por produccin 8 obtenemos ( Por produccin 9 obtenemos id
{ (, id, $ }
A { (, id } B { +, $ } C { *, $ } F { (, id }
id
E A B C F
E :: = error B :: = C :: = error
c) Pila de Simbolos $E $BA $BCF $ B C id $BC $BCF* $BCF $ B C id $BC Entrada id * id + id $ id * id + id $ id * id + id $ id * id + id $ * id + id $ * id + id $ id + id $ id + id $ + id $ Regla o accin
E :: = A B
A ::= FC F ::= id Emparejar(id) C ::= * F C Emparejar(*) F ::= id Emparejar(id) Error
d) Puede 1. 2. 3.
afirmarse que G es una LL(1) porque: No es una G ambigua No tiene factores comunes por la izquierda No es recursiva por la izquierda