Está en la página 1de 8

UNIVERSIDAD NACIONAL AUTÓNOMA DE

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:

1: G  [Z] 30: K  w Tomando estas reglas como


2: Z  DZ 31: K  E base se realizó la comprobación de
3: Z  Ꜫ 32: R  EQ gramática LL(1) (el procedimiento se
4: Z  Y 33: Q  OE
muestra en la siguiente sección). Con
5: Y  SX 34: Q  Ꜫ
esto, es posible definir los conjuntos
6: X  Y 35: O  !
de selección para cada producción;
7: X Ꜫ 36: O  q
8: D  JaV 37: O  < se utilizan en la implementación de
9: J  b 38: O  s las funciones recursivas que
10: J  c 39: O  > permiten el reconocimiento
11: J  e 40: O  g sintáctico.
12: J  d 41: E  TE’
13: J  u 42: E’  +TE’
14: J  x 43: E’  -TE’
15: J  v 44: E’  Ꜫ
16: V  ,aV 45: T  FT’
17: V  ; 46: T’  *FT’ El análisis sintáctico se
18: S  A; 47: T’  /FT’ ejecuta sólo hasta que se ha
19: S  H 48: T’  %FT’ realizado el análisis léxico, pues es
20: S  M 49: T’  Ꜫ necesaria como entrada la cadena de
21: S  P 50: F  (E)
átomos generada; una vez finalizado
22: S  I 51: F  a
23: A  a=K 52: F  n
se regresa la cadena de átomos, así
24: H  h[Y]m(R); 53: F  r como un mensaje indicando si la
25: M  m(R)[Y] 54: F  j sintaxis es correcta o existen errores.
26: P  p(A;R;A)[Y] 55: K  t
27: I  i(R)[Y]N 56: K  f
28: N  Ꜫ
29: N  o[Y]
Átomos para cada clase:
 Palabras reservadas:  :=
 Boolean: b  Operadores relacionales:
 Cadena: c  != : !
 Cierto: t  == : q
 Falso: f  <:<
 Haz: h  <= : s
 Mientras: m  >:>
 Para: p  >= : g
 Flotante: d  Operadores aritméticos:
 Estructura: u  +-*/%
 Doble: x  Constante cadena:
 Vacio: v  w
 Si: i  Constantes numéricas enteras:
 Sino: o  n
 Identificadores:  Constantes numéricas flotantes:
 a  r
 Símbolos especiales:  Constantes númericas dobles:
 ( ) , ; [ ]:  j
 Operador de asignación:
Análisis
 Planificación de actividades:
Actividad Elaboró
Comprobación LL(1) Gutiérrez Hernández Pablo Israel

Implementación de función generadora de la Hernández Guatemala Isaias Sinai


cadena de átomos en C Gutiérrez Hernández Pablo Israel

Implementación de las funciones de análisis en Leyva Diaz Alejandro Ivan


C Gutiérrez Hernández Pablo Israel
Hernández Guatemala Isaias Sinai
Pruebas Martin Mancilla Angel Omar
Gutiérrez Hernández Pablo Israel
Leyva Diaz Alejandro Ivan
 Diseño:
 Arreglos de átomos de palabras reservadas y átomos de operadores relacionales:
Los átomos de las palabras reservadas y los operadores relacionales están definidos por defecto
en archivos .txt ubicados en el mismo directorio que el programa. Los átomos están definidos con
el siguiente formato.
Átomo1
Átomo2
Átomo3
.
La función “populateArray(char *fileName, int *numero)” se ejecuta para atomos de palabras
reservadas y atomos de operadores relacionales, insertándose en sus respectivos arreglos
conforme se va leyendo, línea por línea. Debido a esto es posible omitir el número de su valor del
archivo, pues la posición en la que son insertados en el arreglo de palabras reservadas es este. Las
posiciones corresponden a las de los arreglos de palabras reservadas y operadores relacionales,
respectivamente.
 Cálculo de conjuntos de selección y comprobación LL(1):
a) Producciones anulables: 3, 7, 28, 34, 44, 49
No-terminales anulables: Z, X, N, Q, E', T'
b) Firsts:

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.

La implementación se realizó utilizando la distribución de Linux, Ubuntu, y la compilación


se realizó utilizando gcc.
Instrucciones de ejecución
Para para poder ejecutar el programa es necesario generar el código en C y compilarlo desde Linux
utilizando el compilador GCC.
Primero que nada, generamos el código en archivo .C utilizando Flex:
flex analizador.l
Esto nos genera el archivo .C con el nombre “lex.yy.c” por default. Procedemos a compilarlo:
gcc lex.yy.c –o analizador.bin -lfl
Una vez hecho esto ejecutamos el programa. Para su uso es necesario indicar el nombre del
archivo a analizar inmediatamente después del programa.
./analizador.bin probando1.txt
Al ejecutarse el programa imprimirá las tablas en pantalla, además de guardarlas como archivo de
texto en la misma carpeta para su posterior revisión.
Se muestra la cadena de átomos y si se trata de una sintaxis correcta o no.

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.

También podría gustarte