Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MÉXICO
FACULTAD DE INGENIERÍA
DIVISIÓN DE INGENIERÍA ELÉCTRICA
COMPILADORES
GRUPO 1
ADRIÁN ULISES MERCADO
‘ANALIZADOR LÉXICO-SINTÁCTICO’
EQUIPO: CTRL + Z
GUTIÉRREZ HERNÁNDEZ PABLO ISRAEL
HERNÁNDEZ GUATEMALA ISAÍAS SINAÍ
LEYVA DÍAZ ALEJANDRO IVÁN
MARTIN MANCILLA ÁNGEL OMAR
2019-2
Descripción del problema
Se pretende hacer un Analizador sintáctico en lenguaje C para identificar si nuestro programa está
escrito de una manera satisfactoria de acuerdo a la gramática elaborada para su análisis
Partiendo del análisis léxico previamente realizado con Flex, se implementan las funciones
correspondientes para poder generar una cadena de átomos a partir de los componentes léxicos
detectados. Esta cadena es esencial para el análisis sintáctico.
Son relevantes las clases de componentes léxicos. Las clases más variantes son las de
palabras reservadas y operadores relacionales.
Las reglas de la gramática son las siguientes:
First 1 = [ First 29 = o
First 2 = bceduxv First 30 = w
First 3 = First 31 = (anrj
First 4 = ahmpi First 32 = (anrj
First 5 = ahmpi First 33 = ><qlg!
First 6 = ahmpi First 34 =
First 7 = First 35 = !
First 8 = bceduxv First 36 = q
First 9 = b First 37 = <
First 10 = c First 38 = l
First 11 = e First 39 = >
First 12 = d First 40 = g
First 13 = u First 41 = (anrj
First 14 = x First 42 = +
First 15 = v First 43 = -
First 16 = , First 44 =
First 17 = ; First 45 = (anrj
First 18 = a First 46 = *
First 19 = h First 47 = /
First 20 = m First 48 = %
First 21 = p First 49 =
First 22 = i First 50 = (
First 23 = a First 51 = a
First 24 = h First 52 = n
First 25 = m First 53 = r
First 26 = p First 54 = j
First 27 = i First 55 = t
First 28 = First 55 = f
Para cada no terminal:
First(G) = [ First(I) = i
First(Z) = bceduxvahmpi First(N) = o
First(Y) = ahmpi First(K) = s(anrjtf
First(X) = ahmpi First( R) = (anrj
First(D) = bceduxv First(Q) = ><qsg!
First(J) = bceduxv First(O) = ><qsg!
First(V) = ,;: First( E) = (anrj
First(S) = ahmpi First(E') = +-
First(A) = a First(T) = (anrj
First(H) = h First(T') = */%
First(M) = m First(F) = (anrj
First(P) = p
c) Follows:
Follow(G) =
Follow(Z) = ] fin ] fin
Follow(Y) = Follow(Z) U {fin ]} ] fin
Follow(X) = Follow(Y) U {fin} ] fin
Follow(D) = First(Z) U Follow(Z) b c e d u x v a h m p i ] fin
Follow(J) = a a
Follow(V) = Follow(D) U fin b c e d u x v a h m p i ] fin
Follow(S) = First(X) U Follow(Y) a h m p i ] fin
Follow(A) = ;) ;)
Follow(H) = Follow(S) U fin a h m p i ] fin
Follow(M) = Follow(S) U fin a h m p i ] fin
Follow(P) = Follow(S) U fin a h m p i ] fin
Follow(I) = Follow(S) U fin a h m p i ] fin
Follow(N) = Follow(I) U fin a h m p i ] fin
Follow(K) = Follow(A) U fin ; ) fin
Follow(R) = ); );
Follow(Q) = Follow(R U fin ) ; fin
Follow(O) = First(E (anrj
Follow(E) = First(Q) U Follow(R U Follow(Q) U ) U > < q s g ! ) ; fin
Follow(K)
Follow(E') = Follow(E U fin > < q s g ! ) ; fin
Follow(T) = First(E') U Follow(E') > < q s g ! ) ; fin + -
Follow(T') = Follow(T) U fin U > < q s g ! ) ; fin + -
Follow(F) = First(T') U Follow(T') U Follow(T) > < q s g ! ) ; fin + - * / %
d) Conjuntos de selección (C.S.):
C.S. 1 = [ C.S. 29 = o
C.S. 2 = bceduxv C.S. 30 = w
C.S. 3 = ] fin C.S. 31 = (anrj
C.S. 4 = ahmpi C.S. 32 = (anrj
C.S. 5 = ahmpi C.S. 33 = ><qsg!
C.S. 6 = ahmpi C.S. 34 = ) ; fin
C.S. 7 = ] fin C.S. 35 = !
C.S. 8 = bceduxv C.S. 36 = q
C.S. 9 = b C.S. 37 = <
C.S. 10 = c C.S. 38 = s
C.S. 11 = e C.S. 39 = >
C.S. 12 = d C.S. 40 = g
C.S. 13 = u C.S. 41 = (anrj
C.S. 14 = x C.S. 42 = +
C.S. 15 = v C.S. 43 = -
C.S. 16 = , C.S. 44 = > < q s g ! ) ; fin
C.S. 17 = ; C.S. 45 = (anrj
C.S. 18 = a C.S. 46 = *
C.S. 19 = h C.S. 47 = /
C.S. 20 = m C.S. 48 = %
C.S. 21 = p C.S. 49 = > < q s g ! ) ; fin + -
C.S. 22 = i C.S. 50 = (
C.S. 23 = a C.S. 51 = a
C.S. 24 = h C.S. 52 = n
C.S. 25 = m C.S. 53 = r
C.S. 26 = p C.S. 54 = j
C.S. 27 = i C.S. 55 = t
C.S. 28 = a h m p i ] fin C.S. 56 = f
Todos los conjuntos de selección son disjuntos, por lo que se trata de una gramática LL(1). Se
puede proceder a la implementación en C.
Conclusiones
El análisis sintáctico es el segundo tipo de análisis que se realiza en un proceso de compilación. Se
trata de un proceso indispensable, pues es gracias a este que se puede asegurar, o no, que el
orden de los componentes léxicos es el correcto, de acuerdo con las reglas de producción de la
gramática establecida.
Gracias al trabajo realizado para la primera etapa de compilación, el análisis léxico, fue
posible realizar una implementación de este proceso de manera apropiada, realizando algunas
modificaciones e implementando la funcionalidad en lenguaje C.
Con este proyecto se pudo comprobar y aplicar lo visto en clase con respecto al tema,
pudiendo apreciar claramente la necesidad de los procesos descritos en este documento, así como
aprender las particularidades de cada uno.
Ya finalizado el proceso de pruebas, puedo decir que el objetivo se cumplió, realizándose
exitosamente la comprobación de cada regla de producción gramatical previamente definida.