Sei sulla pagina 1di 8

Compiladores Conjunto Primero, Siguiente y de Prediccin Ejemplo 1: Dada la siguiente gramtica definida por sus producciones P: S A A B C C a) b) c) d) e) ::= ::=

::= ::= ::= ::= AB a bCd c

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

Primeros {a, b} {a, } {b} {c, }

Siguientes {$} {b} {$} {d}

c) Para construir la tabla debemos calcular el conjunto de prediccin.

Regla
S ::= A B A ::= a A ::= B ::= b C d C ::= c C ::=

Conjunto de Prediccin {a, b} {a} {b} {b} {c} {d}

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

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 $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}

{$}

Por regla 2 del algoritmo p/ obtener el conjunto siguiente.

{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}

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}

Por la produccion 10

{and}

c) Para construir la tabla debemos calcular el conjunto de prediccin.

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, }

1) R ::= F and 2) R ::= x 3) R ::= y 1) F ::= z

{z, x, y} {z}

Tabla de Analisis Sintactico

or S A Q B R F error A::= or Q A error error error error

and error error error error error error

x S::= Q A error Q::= R B B::= R B R::= x error

y S::= Q A error Q::= R B B::= R B R::= y error

z S::= Q A error Q::= R B B::= R B R::= F and F::= z

$ error A::= error B::= error 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

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).

b) Para construir la tabla debemos calcular el conjunto de prediccin.

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 }

Tabla de Analisis Sintactico

id

E A B C F

E :: = A B A ::= F C error error F ::= ( E )

error error error error error

error error B ::= + A B error error

error error error C ::= * F C error

E :: = A B A ::= F C error error F ::= id

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

Potrebbero piacerti anche