Sie sind auf Seite 1von 8

Compiladores

Conjunto Primero, Siguiente y de Prediccin

Ejemplo 1: Dada la siguiente gramtica definida por sus producciones P:

S ::= AB
A ::= a
A ::=
B ::= bCd
C ::= c
C ::=

a) Calcular los conjuntos PRIMERO


b) Calcular los conjuntos SIGUIENTE
c) Construir la tabla de anlisis sintctico para G
d) A la vista de los resultados anteriores. Puede afirmarse que G es LL(1)?
e) 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 prediccin.

Regla Conjunto de Prediccin

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 accin

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

$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 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) Calcular los conjuntos SIGUIENTE
c) Construir la tabla de anlisis sintctico para G
d) A la vista de los resultados anteriores. Puede afirmarse que G es LL(1)?
e) En caso de ser una G LL(1), probar si la siguiente entrada es analizada correctamente: z and or
yx

a) y b)
No
Primeros Siguientes
Terminales
Por la produccin 1 se deriva a
Q y por la produccin 4 se
deriva a R, por la produccion 7
S Por regla 2 del algoritmo p/ obtener el
{z, x, y} se deriva de R a F y por la prod {$} conjunto siguiente.
10 se deriva de F a z. Por las
producciones 8 y 9 de R se
deriva a x e y

Por la produccion 1, aplicando la regla 4 del


algoritmo, el siguiente de A es el siguiente de
A Por la prod. 2 se deriva a or. Por
{or, la prod. 3 obtenemos
{$} 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.
Por la prod. 4, el primero de Q
Q Debido a que se encuentra en el conjunto
{z, x, y} es R y por las producciones 7, {or, $} primero de A, debemos tambin aplicar la
10, 8 y 9 obtenemos z, x, y
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


Por la prod 5 el primero de B es siguiente de Q (apliacando la regla 4 del
B R y por las producciones 7, 10, algoritmo), por tanto obtenemos or y $.
{z, x, y,} 8 y 9 , obtenemos z, x, y. Por la
{or, $} De la produccion 5 no se puede obtener el
produccion 6 obtenemos 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.
R Por las producciones 7, 10, 8 y 9 Debido a que se encuentra en el conjunto
{z, x, y} obtenemos z, x, y
{z, x, y, or, $} 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
F
{z} Por la produccion 10 {and} 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 prediccin.


Regla Conjunto de Prediccion

Por la produccion 1, Q estara en el conjunto de prediccion de S, como


S ::= QA Q es un no terminal debemos buscar cuales son los terminales a los
{z, x, y}
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
1) A ::= or QA
2) A ::= {or, } 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
1) Q ::= RB R es un no terminal debemos buscar cuales son los terminales a los
{z, x, y}
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


1) B ::= RB R es un no terminal debemos buscar cuales son los terminales a los
2) B ::= {z, x, y, } 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
1) R ::= F and
2) R ::= x
{z, x, y}
3) R ::= y
Por las producciones 7, 10, 8 y 9, obtenemos que R deriva a z, x, y
1) F ::= z Por la produccion 10 obtenemos que z se encuentra en el conj. De
{z}
prediccion de F

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 accin

$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 gramtica G = {N, T, E, P} donde:

1) E ::= AB
2) E ::=
3) A ::= FC
4) B ::= +AB
5) B ::=
6) C ::= *FC
7) C ::=
8) F ::= ( E )
9) F ::= id

a) Calcular los conjuntos PRIMERO y SIGUIENTE


b) Construir la tabla de anlisis sintctico para G
c) Analizar la cadena id*id+id utilizando anlisis predictivo no recursivo
d) Segn los resultados de los apartados anteriores, razonar si G es LL(1)
a)

No
Primeros Siguientes
Terminales

Por la produccion 1, el primero de E


es A, y como A es un no terminal
debemos encontrar los terminales a
Por regla 2 del algoritmo p/ obtener
los que deriva A. De all obtenemos
el conjunto siguiente.
E { (, id, } que por la produccion 3 A deriva a F {$, ) } Por la produccion 8 obtenemos que
y por las producciones 8 y 9, F deriva
el siguiente de E es )
a ( e id
Por la produccion 2, obtenemos
tambin que el primero 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 tambin aplicar la regla 4
del algoritmo, por lo que tambin
Por la produccion 3 obtenemos que obtenemos que el siguiente de A es
el primero de A es F, y como F es un el siguiente de B. Entonces
no terminal debemos encontrar los calculamos el siguiente de B que
A { (, id} terminales a los cuales deriva F. De
{+ , $, ) } sera $ y ).
all obtenemos por las producciones Por la produccion 4 y aplicando la
8 y 9, F deriva a ( e id 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
Por la produccion 4 obtenemos que
B es el siguiente de E y de alli
el primero de B es + y por la
B { +, } produccion 5, obtenemos tambin
{ $, ) } obtenemos $ y )
Por la produccion 4 no podemos
que el primero de B es
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
Por la produccion 6 obtenemos que
C es el siguiente de A y de alli
el primero de C es + y por la
C { *, } produccion 7, obtenemos tambin
{ +, $, ) } obtenemos +, $ y )
Por la produccion 6 no podemos
que el primero de C es
calcular el siguiente de C ya que
entrariamos a un bucle infinito.
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
Por la produccion 8 obtenemos que el siguiente de C. Entonces
el primero de F es ( agregamos al conjunto siguiente +,
F { (, id} Por la produccion 9 obtenemos
{ *, +, $, ) } $ y ).
tambin que el primero de F es id 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
E { (, id, $ } 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
A por ser un no terminal debemos encontrar a los terminales que deriva F, de all
{ (, id } obtenemos por las producciones 8 y 9 a ( e id
Por produccion 4 obtenemos que + se encuentra en el conjunto de prediccin de B
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
C { *, $ } Por la produccin 7 obtenemos que $ tambin pertenece al conjunto de prediccion
Por produccin 8 obtenemos (
F { (, id } Por produccin 9 obtenemos id

Tabla de Analisis Sintactico

( ) + * id $
E E :: = A B error error error E :: = A B E :: =

A A ::= F C error error error A ::= F C error

B error error B ::= + A B error error B :: =

C error error error C ::= * F C error C :: =

F F ::= ( E ) error error error F ::= id error


c)

Pila de Simbolos Entrada Regla o accin

$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

Das könnte Ihnen auch gefallen