Este documento presenta información sobre herramientas para la creación de compiladores, incluyendo Flex y Bison. Explica cómo Flex genera analizadores léxicos a partir de expresiones regulares y cómo Bison genera analizadores sintácticos a partir de gramáticas. También proporciona instrucciones sobre cómo instalar estas herramientas y un ejemplo de cómo crear un compilador simple utilizando Flex y Bison.
Transparencias Clase de Expresiones Regulares
Expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos.
1. PONTIFICIA UNIVERSIDAD CATOLICA DE L ECUADOR
SEDE IBARRA
NOMBRE: EDISON MALES
TEMA: COMPILADORES
Utilidades y Generadores de Procesadores de Lenguajes
A continuación se muestran algunas de las herramientas disponibles que pueden utilizarse
para la realización de la Práctica de Procesadores de Lenguajes. Todas estas herramientas
funcionan bajo Windows, aunque se puede utilizar, si se desea, cualquier otra herramienta.
Historia y aplicación de los lenguajes algorítmicos.
Al igual que los idiomas sirven de vehículo de comunicación entre los seres humanos,
existen lenguajes que realizan la comunicación entre los seres humanos y las
2. computadoras. Estos lenguajes permiten expresar los programas o el conjunto de
instrucciones que el operador humano desea que la computadora ejecute.
Los lenguajes de computadoras toman diferentes formas; los de las primeras computadoras,
como la ENIAC y la EDSAC, se componían en el lenguaje real de las máquinas mismas. La
dificultad de programar las máquinas de esta manera limitaba drásticamente su utilidad y
proporcionaba un fuerte incentivo para que se desarrollaran lenguajes de programación más
orientados hacia la expresión de soluciones con la notación de los problemas mismos.
Diseño y Construcción de un compilador.
Este apasionante libro combina un estudio detallado de las teorías modernas de diseño de
compiladores con una descripción completa (con código fuente) de un compilador
funcionando para un lenguaje pequeño. El libro refleja la convicción del autor de que los
aspectos prácticos del diseño de compiladores no pueden entenderse sin una comprensión
de la teoría, y que los estudiantes universitarios no pueden comprender verdaderamente la
teoría sin verla actuar en la práctica real. Para unificar la exposición de los conceptos del
texto se tiene un compilador completamente funcional escrito en C y desarrollado con las
técnicas comentadas en cada capítulo. Al final de cada capítulo se presentan abundantes
ejercicios que enfocan la atención del estudiante en problemas específicos de
programación. Características * Una detallada presentación (capítulos 4 y 5) de los
algoritmos de análisis sintáctico descendentes que cubren los métodos de análisis sintáctico
descendente recursivo y LL(1), análisis sintáctico ascendente, tablas de análisis sintáctico
LALR(1) y el uso de la herramienta generadora de analizador sintáctico Yacc. * Una
exposición completa (capítulo 7) de formas comunes de ambientes de ejecución que
abarcan desde el ambiente completamente estático de FORTRAN, pasando por las diversas
variedades de ambientes basados en pilas, hasta los ambientes completamente dinámicos
de los lenguajes tipo LISP. * Cobertura de la generación de código (capítulo 8) con un
generador de código completo para el lenguaje de muestra proporcionando junto con una
introducción para técnicas de optimización de código.
3. HERRAMIENTA FLEX Y BISON
INTRODUCCION:
Con esta práctica se pretende introducir el uso de la herramienta bison. Esta
herramienta se usa en consonancia con la herramienta flex y sirve para especificar
analizadores sintácticos. De la misma forma que flex tiene como base las expresiones
regulares, la herramienta bison también se basa en otro formalismo para describir lenguajes,
en este caso serán las gramáticas independientes del contexto las que constituirán el núcleo
de las especificaciones que procesará bison.
Herramienta Flex:
Que es y para qué sirve la herramienta Flex?
Flex es un una herramienta que permite generar analizadores léxicos. A partir de un
conjunto de expresiones regulares, Flex busca concordancias en un fichero de entrada y
ejecuta acciones asociadas a estas expresiones.
Los ficheros de entrada de Flex (normalmente con la extensión .l) siguen el siguiente
esquema:
%%
patrón1 {acción1}
patrón2 {acción2}
...
donde:
patrón: expresión regular
acción: código C con las acciones a ejecutar cuando se encuentre concordancia del patrón
con el texto de entrada-
Ejemplo:
4. Flex recorre la entrada hasta que encuentra una concordancia y ejecuta el código asociado.
El texto que no concuerda con ningún patrón lo copia tal cual a la salida. Por ejemplo:
%%
a*b {printf(“X”);};
re ;
El ejecutable correspondiente transforma el texto:
abre la puertaab
en
X la puertX
pues ha escrito X cada vez que ha encontrado ab o aab y nada cuando ha encontrado re.
Flex lee los ficheros de entrada dados, o la entrada estándar si no se le ha indicado ningún
nombre de fichero, con la descripción de un escáner a generar. La descripción se encuentra
en forma de parejas de expresiones regulares y código C, denominadas reglas. Flex genera
como salida un fichero fuente en C, „lex.yy.c‟, que define una función „yylex()‟. Este fichero
se compila y se enlaza con la librería de Flex para producir un ejecutable.
La sección de definiciones contiene declaraciones de definiciones de nombres sencillas para
simplificar la especificación del escáner, y declaraciones de condiciones de arranque, que
se explicarán en una sección posterior. Las definiciones de nombre tienen la forma:
nombre definición
El "nombre" es una palabra que comienza con una letra o un subrayado („_‟) seguido por
cero o más letras, dígitos, „_‟, o „-‟ (guión). La definición se considera que comienza en el
primer carácter que no sea un espacio en
blanco siguiendo al nombre y continuando hasta el final de la línea. Posteriormente se
puede hacer referencia a la definición utilizando "{nombre}", que se expandirá a
"(definición)".
Por ejemplo,
DIGITO [0-9]
ID [a-z][a-z0-9]*
define "DIGITO" como una expresión regular que empareja un dígito sencillo, e "ID" como
una expresión regular que empareja una letra seguida por cero o más letras o dígitos. Una
5. referencia posterior a
{DIGITO}+"."{DIGITO}*
es idéntica a
([0-9])+"."([0-9])*
y empareja uno o más dígitos seguido por un „.‟ seguido por cero o más dígitos.
La sección de reglas en la entrada de Flex contiene una serie de reglas de la forma:
patrón acción
donde el patrón debe estar sin sangrar y la acción debe comenzar en la misma línea.
Finalmente, la sección de código de usuario simplemente se copia a „lex.yy.c‟ literalmente.
Esta sección se utiliza para rutinas de complemento que llaman al escáner o son llamadas
por este. La presencia de esta sección es opcional; Si se omite, el segundo „%%‟ en el
fichero de entrada se podría omitir también.
El fichero de entrada de Flex está compuesto de tres secciones, separadas por una línea
donde aparece únicamente un „%%‟ en esta:
definiciones
%%
reglas
%%
código de usuario
Herramienta Bison
Bison es un generador de analizadores sintácticos de propósito general que convierte una
descripción para una gramática independiente del contexto (en realidad de una subclase de
éstas, las LALR) en un programa en C que analiza esa gramática.
Usándolo junto a Flex esta herramienta permite construir compiladores de lenguajes.
Un fuente de Bison (normalmente un fichero con extensión .y) describe una gramática. El
ejecutable que se genera indica si un fichero de entrada dado pertenece o no al lenguaje
generado por esa gramática. La forma general de una gramática de Bison es la siguiente:
%{
declaraciones en C
%}
Declaraciones de Bison
6. %%
Reglas gramaticales
%%
Código C adicional
Los „%%‟, „%{„ y „%}‟ son signos de puntuación que aparecen en todo archivo de gramática
de Bison para separar las secciones.
Las declaraciones de Bison declaran los nombres de los símbolos terminales y no
terminales, y también podrían describir la precedencia de operadores y los tipos de datos de
los valores semánticos de varios símbolos.
Las reglas gramaticales son las producciones de la gramática, que además pueden llevar
asociadas acciones, código en C, que se ejecutan cuando el analizador encuentra las reglas
correspondientes.
CREAR COMPILADORES EN FLEX Y BISON
COMO SE INSTALA FLEX Y BISON
1. Descarga el software disponible en el sitio de la cátedra.
2. Instalar el software en la unidad C: (para explicar a partir del punto 4 se tendrá como
hipótesis de que flex y bison han sido instalados en la ruta: C:GnuWin32 donde contiene
una subcarpeta
llamada bin donde se encuentran los programas respectivos)
7. 3. Flex y bison son aplicaciones de consola, por lo que se deberá entrar al Símbolo del
sistema y tipear líneas de comando para ejecutar Flex. Una alternativa es crear un archivo
de proceso por lotes (*.bat) que contenga las líneas de comando para la ejecución de Flex y
Bison y/o la compilación del archivo generado.
8. 4. Si deseas que flex y bison se integren al conjunto de variables del entorno (esto te va a
permitir llamar a flex/bison desde cualquier ubicación en la línea de comandos) debes hacer
lo siguiente:
9.
10. • Clic derecho en “Mi PC”.
• Selecciona “Propiedades”
• Clic en la pestaña “Opciones Avanzadas”
• Presiona el botón “Variables de entorno”
• En la ventana de variables de entorno, ubicarse en la sección “Variables del sistema” luego
haz clic en PATH y luego en el botón “Modificar” (si no está hacer clic en “Nueva” y agregar
PATH)
COMO SE COMPILA CON FLEX Y BISON
2 EJEMPLOS DE LA CREACIÓN DE UN COMPILADOR UTILIZANDO FLEX Y BISON.
Codigo01.txt
11. ? 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Definir Constante Entero numero
:= 145 ;
Definir Booleano nume := 1 ;
Funcion Entero ( Entero num;
Real fre; Booleano boll;)
Mientras ( )
Booleano ghjfg;
bocfgh:=1;
Mientras ( a>=4 )
Car:=Carro;
Entero bandera;
Booleano boole;
boole:=1;
Si ( a==4 )
Bool:=1;
Booleano boolean;
SinoSi (a==5) Entonces
Bool:=2;
Sino Entonces
Bool:=3;
16
17
18
19
20
21
22
23
FinSi
FinMientra
s
FinMientra
s
Retorna
Carro
FinFuncion
12. • En la nueva ventana, escribir la ruta completa al directorio “bin” de la aplicación
flex/bison. Si existe otro valor, separarlos con comas
• Aceptar los cambios y luego reiniciar el sistema operativo.
5. Si deseas instalar un compilador de C como MinGwin, deberás integrar la ruta de
acceso al compilador a las variables de entorno para facilitar la llamada al programa.
Por ejemplo si se instaló MingWin en “C:Mingw” y dentro de la carpeta “bin” se encuentra
“gcc.exe” que es el ejecutable, entonces de deberá agregar (análogo a los pasos
anteriores) lo siguiente:
6. Cuando tengas listo podrás llamar a flex/bison desde el símbolo del sistema sin
necesidad de ubicarte en la carpeta donde ha sido instalado flex/bison.
13. COMO SE COMPILA CON FLEX Y BISON
2 EJEMPLOS DE LA CREACIÓN DE UN COMPILADOR UTILIZANDO FLEX Y BISON.
Codigo01.txt
? 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Definir Constante Entero
numero := 145 ;
Definir Booleano nume := 1
;
Funcion Entero ( Entero
num; Real fre; Booleano
boll;)
Mientras ( )
Booleano ghjfg;
bocfgh:=1;
Mientras ( a>=4 )
Car:=Carro;
Entero bandera;
Booleano boole;
boole:=1;
Si ( a==4 )
Bool:=1;
Booleano boolean;
SinoSi (a==5) Entonces
Bool:=2;
Sino Entonces
Bool:=3;