Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice
I Consideraciones Iniciales 3
1. Compilador 3
II Herramientas 4
1. Integración de Flex y Bison 4
2. Flex 4
3. Bison 5
3.1. Declaraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2. Reglas de Producción . . . . . . . . . . . . . . . . . . . . . . . . 6
3.3. Código Adicional . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2. Instalación de Bison 11
IV Ejercicio de Ejemplo 17
1. Planteo 17
1
2. Solución 18
2.1. Especificación para Flex . . . . . . . . . . . . . . . . . . . . . . . 18
2.2. Especificación para Bison . . . . . . . . . . . . . . . . . . . . . . 18
2.3. Compiación de la especificación Flex . . . . . . . . . . . . . . . . 19
2.4. Compiación de la especificación Bison . . . . . . . . . . . . . . . 19
2.5. Opcion 1: Generación del Programa Reconocedor Utilizando gcc 20
2.6. Opcion 2: Generación del Programa Reconocedor Utilizando Zinjai 20
2. Comandos Principales 23
2.1. Comando cd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2
PARTE I
CONSIDERACIONES INICIALES
1. Compilador
Un compilador es un grupo de componentes (en los cuales se pueden observar
subcomponentes) donde los datos a compilar transitan de uno a otro. Utilizare-
mos una herramienta diferente para representar cada uno de estos componentes.
Para realizar el análisis léxico, utilizaremos una herramienta llamada Flex, y
para el análisis sintáctico/semántico una herramienta llamada Bison. Final-
mente, para generar el código de máquina (programa recoonocedor), se puede
utilizar LLVM, herramienta que genera código intermedio.
Este apunte tiene por objeto puntualizar el uso de estas herramientas en
la construcción de un analizador sintáctico, con el objeto de entender como
funcionan los compiladores, y tener una idea de la máquina subyacente. Esto
permite luego experimentar con diferentes técnicas de compilación.
3
PARTE II
HERRAMIENTAS
2. Flex
Flex (Fast Lexical Analyzer) es una herramienta para construir analizadores
léxicos o lexers. Un lexer lee un flujo de entrada y lo divide en unidades léxicas
(tokens).
Un programa en flex tiene 3 secciones, separadas por la etiqueta % %
4
Declaraciones y opciones de configuración
%%
Lista de patrones y acciones
%%
código C adicional copiado al escanner
3. Bison
Bison es una herramienta que, a partir de la descripción formal de una gra-
mática libre de contexto que define un lenguaje, genera un analizador sintáctico
(parser) para esa gramática. Este analizador se materializa a través de un pro-
grama en C. A partir del uso de Bison, se obtiene como producto un árbol de
sintaxis abstracta.
Un programa en Bison se divide en 3 partes:
Declaraciones
%%
Reglas de producción
%%
Código adicional
3.1. Declaraciones
La primera parte puede contener:
5
3.2. Reglas de Producción
Esta es la única parte necesaria, esto es, la que siempre debe aparecer en un
programa Bison. Puede contener:
6
PARTE III
1. Instalación de Flex
A continuación se muestran las pantallas de la instalación paso a paso de
Flex.
Paso 1.
Paso 2.
7
Paso 3.
Paso 4.
8
Paso 5.
Paso 6.
9
Paso 7.
Paso 8.
10
2. Instalación de Bison
A continuación se muestran las pantallas de la instalación paso a paso de
Bison.
Paso 1.
Paso 2.
11
Paso 3.
Paso 4.
12
Paso 5.
Paso 6.
13
Paso 7.
Paso 8.
14
Cuando ya se encuentran instaladas ambas herramientas se puede visualizar
el siguiente árbol de directorios
15
Importante: En Windows será necesario incluir en la variable de ambiente
path, el directorio bin (el camino completo), para que los programas flex.exe
y bison.exe puedan ser invocados desde cualquier otro directorio.
16
PARTE IV
EJERCICIO DE EJEMPLO
1. Planteo
Haciendo uso de las herramientas Flex/Bison, desarrollar un analizador léxi-
co (scanner) y un analizador sintáctico (parser) para la gramática que se mues-
tra. Obtener el programa ejecutable que tome como ‘input’ un archivo de texto
con un ejemplo de código fuente que corresponda al lenguaje y lo someta a las
dos primeras fases del proceso de traducción. Como resultado el analizador debe
mostrar la tabla de lexemas-tokens obtenida por el scanner y el árbol de deri-
vación generado por el parser, o el error en caso de producirse alguno de orden
léxico o sintáctico durante el proceso de análisis.
1 rutina ::= i d e n t i f i e r parameter_list
2 parameter_list ::= " ( " defparameter { " , "
d e f p a r a m e t e r }∗ |
3 ( "&" i d e n t i f i e r { " , " "&" i d e n t i f i e r }∗
4 d e f p a r a m e t e r : : = parameter [ "=" e x p r e s s i o n ]
5 identifier ::= l e t t e r { l e t t e r | d i g i t | "_" }∗
6 parameter ::= i d e n t i f i e r | " ( " s u b l i s t " ) "
7 expression : : = c o n d i t i o n a l _ e x p r e s s i o n | lambda_form
8 letter ::= lowercase | uppercase
9 digit ::= " 0 " | " 1 " | . . . | " 9 "
10 identifier : : = ( l e t t e r ) { l e t t e r | d i g i t | "_" }∗
11 sublist : : = parameter ( " , " parameter ) ∗
12 c o n d i t i o n a l _ e x p r e s s i o n : : = " o r _ t e s t " | " and_test "
13 lambda_form : : = " lambda "
14 lowercase ::= " a " | "b" | . . . | " z "
15 uppercase : : = "A" | "B" | . . . | " Z "
EJEMPLOS:
1 algo_1 ( a l f a = o r _ t e s t , Beta = lambda ) // vá l i d o
2 algo_1 ( a l f a = o r _ t e s t , &Beta ) // i n v á l i d o
3 algo_1 ( a l f a = o r _ t e s t , _Beta = lambda ) // i n v á l i d o
17
2. Solución
La resolución del problema viene dada por la configuración de dos ficheros:
1) La especificación léxica para ser reconocida por Flex, y 2) la especificación
sintáctica a ser reconocida por Bison.
18
23
24
25 DEFPARAMETER: PARAMETER IGUAL EXPRESION COMA DEFPARAMETER
26 | PARAMETER IGUAL EXPRESION
27 | AMPERSAND IDENTIFIER
28 ;
29
30
31 PARAMETER: IDENTIFIER
32 | APAR SUBLIST CPAR
33 ;
34
35 SUBLIST :
36 | PARAMETER
37 | SUBLIST COMA PARAMETER
38 ;
39
40 CONDITIONAL_EXPRESSION : ORTEST
41 | ANDTEST
42 ;
43
44 EXPRESION : CONDITIONAL_EXPRESSION { p r i n t f ( " Se e n c o n t r o e x p r e s i o n −−−>
%s " , y y t e x t ) ; }
45 | LAMBDA_FORM { p r i n t f ( " Se e n c o n t r o e x p r e s i o n −−−>
%s " , y y t e x t ) ; }
46
47 LAMBDA_FORM: LAMBDA
48
49 %%
50 i n t y y e r r o r ( c h a r ∗msg ) {
51 p r i n t f ( " cadena i n v a l i d a %s \n " , msg ) ;
52 return ;
53 }
54 i n t main ( ) {
55 p r i n t f ( " I n g r e s e cadena \n " ) ;
56 yyparse () ;
57 }
c:/mitrabajo/flex flex.l
19
2.5. Opcion 1: Generación del Programa Reconocedor Uti-
lizando gcc
Si se cuenta con el compilador gcc (GNU) instalado en la computadora, desde
línea de comandos ejecutar el siguiente:
20
En las opciones de compilación y enlazado se debe especificar la ruta
donde se encuentran las librerias necesarias. Hasta que no se realice dicha
configuración es posible que se obtiene el siguiente error
Para configurar las librerias necesarias, se deben seguir los siguientes pasos:
• Desde el menú principal Ejecución seleccionar Opciones.
21
Ejecución del Programa.
c:/reconocedor.exe <ejemplo.txt
22
PARTE V
2. Comandos Principales
2.1. Comando cd
Este comando sirve para cambiar de directorio. Por ejemplo:
c:/mitrabajo>cd ..
c:/mitrabajo>cd mitrabajo2
23
2.5. Ejecución de un Programa
La ejecución se realiza simplemente colocando el nombre del programa, y
presionando enter.
24