Facultad De Ingeniería Ciencias Físicas Matemática Lenguajes y compiladores
Paralelo 1
Diseño de un compilador utilizando LE y !"CC 1# $%jeti&os •
Crear una guía 'ue (acilite el proceso de instalaci)n de Le* y !acc
•
•
Mostrar como con+gurar las &aria%les de entorno para un (ácil y correcto (uncionamiento# Mostrar un ejemplo 'ue ayude a la comprensi)n del manejo de estas dos ,erramientas#
-# Marco te)rico Le* es una ,erramienta de los sistemas ./I0Linu* 'ue nos &a a permitir generar c)digo C 'ue luego podremos compilar y enlazar con nuestro programa# La principal característica de Le* es 'ue nos &a a permitir asociar acciones descritas en C a la localizaci)n de las E*presiones 2egulares 'ue le ,ayamos de+nido# Para ello Le* se apoya en una plantilla 'ue reci%e como parámetro y 'ue de%eremos diseñar con cuidado# Internamente Le* &a a actuar como un aut)mata 'ue localizará las e*presiones regulares 'ue le descri%amos y una &ez reconocida la cadena representada por dic,a e*presi)n regular ejecutará el c)digo asociado a esa regla# Estructura de un arc,i&o LE# 3ecci)n de declaraciones 44 3ecci)n de reglas 44 C)digo en C 3e compone de tres secciones con estructuras distintas y claramente delimitadas por una línea en la 'ue lo 5nico 'ue aparece es el carácter do%le 4# Las secciones de Declaraciones y la de Procedimientos de .suario son opcionales mientras 'ue la de 2eglas es o%ligatoria 6aun'ue se encuentre &acía7# !acc no es directamente un analizador sino un generador de analizadores# " partir de un +c,ero (uente en yacc se genera un +c,ero (uente en C 'ue contiene el analizador sintáctico# 3in em%argo un analizador sintáctico de yacc no puede (uncionar por sí solo sino 'ue necesita un analizador l8*ico e*terno para (uncionar# Dic,o de otra manera el (uente en C 'ue genera yacc contiene llamadas a una (unci)n yyle*67 'ue de%e estar de+nida y de%e de&ol&er el tipo de le*ema encontrado# "demás es necesario incorporar tam%i8n una (unci)n yyerror67 'ue será in&ocada
cuando el analizador sintáctico encuentre un sím%olo 'ue no encaja en la gramática# La estructura de un arc,i&o !"CC se di&ide en tres secciones y es similar a la estructura de LE estas son9 3ecci)n de declaraciones 44 3ecci)n de reglas 44 3ecci)n de rutinas en C# De estas tres secciones s)lo la segunda es o%ligatoria y esta no de%e estar &acía# La secci)n de declaraciones puede incluir &arias cosas tal y como ocurría en le* pero a,ora su (unci)n principal no es de+nir e*presiones regulares sino declarar los sím%olos terminales de la gramática mediante la directriz 4to:en# ;odo lo 'ue no sea un terminal será considerado un sím%olo no terminal y por tanto de%e ,a%er una regla para 8l# La secci)n de reglas contiene la gramática en sí la cual de%e ir acompañada de una com%inaci)n de terminales y no terminales 'ue descri%e al no terminal de la iz'uierda de la regla# La secci)n de rutinas tiene la misma (unci)n 'ue la de le* pero yacc 6dependiendo de su &ariante7 no de+ne por de(ecto las (unciones main67 yyle*67 e yyerror67 así 'ue ,ay 'ue incluirlas a'uí o %ien en otro +c,ero 'ue se enlazará en la (ase +nal de la compilaci)n# !acc genera una (unci)n llamada yyparse67 'ue contiene el analizador sintáctico# Esta (unci)n se comporta como una má'uina de estados cuya misi)n es intentar reducir todo el +c,ero de entrada al sím%olo inicial de la gramática 6el primero 'ue se ,aya de+nido7# 3i yacc lo consigue el analizador sintáctico &ol&erá sin error y en caso contrario se in&ocará a la (unci)n yyerror67 'ue de%e estar de+nida tam%i8n en alg5n sitio#
<# Instalaci)n de LE y !"CC
Le* y !acc (ueron desarrollados en los =>?s en los la%oratorios @ell de ";A; y aun'ue tradicionalmente se trata de so(tBare propietario e*isten &ersiones li%res como e* y %ison 6"nálogos a le* y yacc respecti&amente7 'ue cuentan con algunas características e*tra además de las tradicionales así como un mejor soporte para reducciones o e*presiones muy largas o complejas# Cual'uier persona 'ue est8 (amiliarizada con Le* y !acc podría utilizar Fle* y @ison respecti&amente sin pro%lemas# El proceso de instalaci)n de Fle* y @ison es muy sencillo en el sistema operati&o indoBs en general ya 'ue cuenta con un asistente de instalaci)n 'ue nos guiará durante todo el proceso# Instalador Fle*
Instalador @ison
Para ello %asta con dar do%le clic uno a uno en los instaladores 'ue se incluyen en el CD y seleccionar la ruta de instalaci)n el resto %asta con dar clic so%re el %ot)n siguiente# Es recomenda%le instalar los dos programas en una ruta 'ue sea de acceso corto para (acilitar la creaci)n de la &aria%le de entorno en el sistema operati&o# .na &ez instalados los programas en la ruta 'ue seleccionamos nos creará una carpeta con el nom%re de nuin<- la cual en su interior contiene una carpeta con el nom%re %in dentro de esta carpeta encontraremos a Fle* y @ison con un otros arc,i&os 'ue cuentan con las li%rerías y procedimientos 5tiles para el correcto (uncionamiento de estos dos programas#
# Instalaci)n del compilador de C 6MingB7 $tro de los programas 'ue utilizaremos en el proceso de creaci)n de un compilador es el compilador de C llamado MingB el cual se puede descargar solo el compilador o la &ersi)n con el IDE un ejemplo de este 5ltimo es De&CGG o Hisual C#
En este caso utilizaremos solo el compilador el instalador del compilador de C igualmente se encuentra en CD así mismo la instalaci)n del compilador es muy sencilla en indoBs damos do%le clic y seguimos las instrucciones 'ue nos %rinda el asistente e inmediatamente el programa empezará a descargar los arc,i&os necesarios para la instalaci)n de%emos procurar instalar en una direcci)n corta para su (ácil acceso en la compilaci)n de arc,i&os de Fle* @ison y el compilador +nal# "sistente de instalaci)n MingB
# Creaci)n de &aria%les de entorno# Como se mencion) anteriormente Fle* y @ison se instalan en el mismo directorio así 'ue se necesita con+gurar una sola &aria%le para el (uncionamiento de estos dos programas# Para con+gurar esta &aria%le de entorno en indoBs lo 'ue necesitamos ,acer es lo siguiente# 1# Dirigirnos a E'uipo# -# Damos clic derec,o en un espacio en %lanco y accedemos a propiedades# <# 3e nos despliega una pantalla y a'uí %uscamos la opci)n Confguración avanzada del sistema. # 3e nos &uel&e a desplegar otra pantalla y a,ora %uscamos la opci)n Variables de Entorno. # Damos clic so%re esta opci)n y se nos despliega una nue&a pantalla en la secci)n de &aria%les del sistema %uscamos la &aria%le Pat,# J# .na &ez encontrada la &aria%le damos do%le clic y se nos muestra una pantalla pe'ueña la cual nos muestra el nom%re y el &alor de la &aria%le# =# En el &alor de la &aria%le con muc,o cuidado de no %orrar el contenido nos dirigimos al +nal y seguido de un punto y coma colocamos la ruta de la carpeta %in 'ue se encuentra en la carpeta de instalaci)n de Fle* y @ison llamada nuin<-#
K# Damos clic en aceptar en todas las pantallas 'ue dejamos antes y listo# .na &ez concluido este proceso de%emos con+gurar la &aria%le de entorno del compilador de C para lo cual seguimos el mismo procedimiento antes descrito solo 'ue en este caso colocamos la ruta de instalaci)n de la carpeta %in 'ue se encuentra en la carpeta de instalaci)n del compilador de C llamada MingB# Creaci)n de las &aria%les de entorno
J# Creaci)n del analizador l8*ico con Fle* Hamos a crear un analizador l8*ico de tal (orma 'ue pueda los operandos puedan ser9 Identi+cadores normales constantes num8ricas 6enteros reales notaci)n cientí+ca y e*presiones entre par8ntesis7 y los operadores puedan ser suma resta multiplicaci)n di&isi)n di& y mod# Para ello necesitamos un editor de te*to plano en donde podamos especi+car los patrones de los le*emas mediante e*presiones regulares nosotros ocuparemos el Bloc de Notas de indoBs# 1# Para generar este analizador l8*ico tenemos las siguientes especi+caciones# "parte de las características antes indicadas le estamos dando la característica de nos in(orme si al ingresar un carácter 'ue no pertenece a los 'ue antes indicamos nos in(orme 'ue este es un carácter desconocido#
;odo lo 'ue encuentra luego de la pala%ra return es lo 'ue Fle* a tra&8s de su (unci)n yyle*67 le pasará a %ison para el análisis sintáctico# /o de%emos ol&idar colocar la (unci)n yyBrap67 indicando 'ue se ,a llegado al +n de arc,i&o#
-# Luego de terminar la especi+caci)n del analizador l8*ico a%rimos una &entana de comandos en indoBs en donde colocaremos la ruta de instalaci)n de Fle* antecedido de la pala%ra cla&e cd y presionamos Enter # En mi caso se instal) en C9nuin<-%in# <# Copiamos nuestro arc,i&o 'ue contiene la especi+caci)n del analizador l8*ico con e*tensi)n lN en la misma ruta 'ue se instal) e* en mi caso el arc,i&o se llama lexer.l” # # En la &entana de comandos ejecutamos la sentencia9 “ex lexer.l”, si el arc,i&o 'ue contiene la especi+caci)n tiene otro nom%re de arc,i&o di(erente al nom%re de mi arc,i&o se de%erá sustituir en la sentencia de la &entana de comandos lexer por el nom%re 'ue se ,a elegido en &ez de este# # "l presionar enter si el arc,i&o no contiene errores en la especi+caci)n del analizador l8*ico en la misma ruta de instalaci)n de Fle* nos creará un arc,i&o con el nom%re le*#yy#c el cual contiene el analizador l8*ico implementado en c)digo C#
=# Creaci)n del analizador sintáctico con @ison Como uno de los o%jeti&os de este manual es crear un ejemplo 'ue relacione las dos ,erramientas ,emos elegido el compilador 'ue trans(orma e*presiones in+jas a post+jas para ello le asignamos en la especi+caci)n las siguientes características9 Los operadores suma y resta tienen igual prioridad y son asociati&os por la iz'uierda# Los operadores multiplicaci)n di&isi)n di& y mod son de igual prioridad asociati&os por la iz'uierda pero de mayor prioridad 'ue la suma y la resta# El proceso de creaci)n de un analizador sintáctico es similar al proceso de creaci)n del analizador l8*ico para empezar de%emos seguir los siguientes pasos9
1# De%emos especi+car en un editor de te*to plano las características de nuestro analizador sintáctico# /ue&amente utilizaremos el Bloc de notas de indoBs# Para cumplir con las características antes mencionadas la especi+caci)n de nuestro analizador sintáctico es la siguiente#
En la parte de %lo'ue escri%imos la pala%ra reser&ada error la cual nos ayudará a tener un mecanismo de recuperaci)n de errores en el caso de 'ue suceda# .na de las cosas 'ue no de%emos ol&idar escri%ir es la (unci)n yyerror67 la cual nos ayudará a emitir un mensaje de error en el caso de 'ue se encuentre con una estructura 'ue no reconozca nuestro analizador sintáctico# ! por 5ltimo escri%ir la (unci)n main67 la cual contendrá a la (unci)n yyparse67 'ue iniciará el proceso de análisis# -# Luego de terminar la especi+caci)n del analizador sintáctico a%rimos una &entana de comandos en indoBs en donde colocaremos la ruta de instalaci)n de %ison antecedido de la pala%ra cla&e cd y presionamos Enter # En mi caso se instal) en C9nuin<-%in#
<# Copiamos nuestro arc,i&o 'ue contiene la especi+caci)n del analizador sintáctico con e*tensi)n yN en la misma ruta 'ue se instal) %ison en mi caso el arc,i&o se llama arser.!” # # En la &entana de comandos ejecutamos la sentencia9 “bison "d! arser.!”, si el arc,i&o 'ue contiene la especi+caci)n tiene otro nom%re de arc,i&o di(erente al nom%re de mi arc,i&o se de%erá sustituir en la sentencia de la &entana de comandos arser por el nom%re 'ue se ,a elegido en &ez de este# # "l presionar enter si el arc,i&o no contiene errores en la especi+caci)n del analizador sintáctico en la misma ruta de instalaci)n de @ison nos creará un arc,i&o con el nom%re y#ta%#c el cual contiene el analizador sintáctico implementado en c)digo C y un arc,i&o adicional llamado y#ta%#, el cual contiene la ta%la de sím%olos#
K# Compilaci)n del c)digo 'ue trans(orma e*presiones in+jas a post+jas# Despu8s de ,a%er pasado por el proceso anterior lo 5nico 'ue nos resta es compilar los tres arc,i&os juntos para o%tener nuestro compilador (uncionando correctamente# Para los cual lo 'ue nos resta ,acer es9 1# Copiar estos tres arc,i&os resultantes del proceso anterior los cuales son9 le*#yy#c y#ta%#c y tam%i8n y#ta%#, a la carpeta %in en donde está instalado el compilador de C en mi caso el compilador de C se encuentra en el directorio9 C9Min%in# -# Luego a%rimos una &entana de comando de indoBs en donde colocaremos la ruta de instalaci)n del compilador de C antecedido de la pala%ra cla&e cd y presionamos Enter <# Luego de esto ejecutamos la sentencia9 gcc lex.!!.c !.tab.c #o Comilador, si desea 'ue su compilador tenga otro nom%re solo de%e intercam%iar la pala%ra Compilador en la sentencia de la &entana de comando de indoBs por otro nom%re 'ue sea de su elecci)n# # Luego de ,a%er ejecutado todos estos pasos en la misma ruta de instalaci)n del compilador de C se creará un arc,i&o con e*tensi)n e*eN el cual %asta con dar do%le clic para empezar a utilizarlo#