Sie sind auf Seite 1von 18

ESCUELA DE INGENIERIA- SISTEMAS

COMPILADORES

PONTIFICIA UNIVERSIDAD CATOLICA DEL ECUADOR


SEDE IBARRA
Nombre: Jhampier Piedra
TALLER DE COMPILADORES
Utilizando la herramienta de bsqueda de la Web, Investigar los siguientes
temas:
Herramientas para la construccin de procesadores de lenguaje.
Herramientas para la construccin de Procesadores de Lenguajes
Herramienta Lenguaje

Descripcin

Bison

Generador de Analizadores Sintcticos


Ascendentes tipo YACC

COCO/R

C/C++

Generador de Analizadores Lxicos y Sintcticos


Descendentes Recursivos

Flex

Generador de Analizadores Lxicos tipo Lex

Lex

Generador de Analizadores Lxicos

SDGLL1

exe

Sistema Detector de Gramticas LL(1) y


generador de la tabla

TS 2006

C/C++

Tipo abstracto de datos Tabla de Smbolos de


uso sencillo

TS

Tipo abstracto de datos Tabla de Smbolos

TS-OO

C++

Tipo abstracto de datos orientado a objetos


Tabla de Smbolos

exe

Visualizador de rboles sintcticos partiendo de


los ficheros con la gramtica y el parse pedidos
en la Prctica [versin 2.0, Windows]

VASt

C++

Visualizador de rboles sintcticos partiendo de


los ficheros con la gramtica y el parse pedidos
en la Prctica [versin 1.0, Linux]

YACC

Generador de Analizadores Sintcticos


Ascendentes LR(1)

VASt

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

Aplicacin de los lenguajes:


Los lenguajes de programacin hoy en da tienen una infinidad de aplicaciones,
bsicamente cualquier objeto electrnico tiene cierto grado de
programacin. Algunos de los ms comunes son C++ y JAVA, tambin existe
HTML, HTTP, XML, XAML y C#, este ltimo actualmente es el ms utilizado
en todos los dispositivos y redes basados en MICROSOFT (Xbox 350,
Windows Mobile, Windows Phone, Windows Cloud, Zune, etc.). Ya que los
lenguajes de programacin son informticamente un puente entre el
Hardware y el Software estos permiten que las computadoras puedan
establecer conexin con un celular, una cmara o una consola porttil de
videojuego. Otra de las aplicaciones de los lenguajes de programacin son las
matemticas como las calculadoras, cajas registradoras, cajeros
automticos, por solo mencionar algunos ejemplos sencillos. Existen tambin
niveles de programacin mucho ms complejos como los videojuegos o los
pilotos automticos de los aviones comerciales o las mquinas de juego de los
casinos que siguen un patrn de probabilidad a partir de un arreglo de
nmeros al azar establecido por una programacin numrica. La robtica es
la combinacin de mecnica, electrnica y programacin, la cual en base a
sensores y mecanismos sigue una serie de instrucciones algortmicas las
cuales le permiten por ejemplo a un brazo robtico montar una rueda, ajustar
un tornillo o cortar un rectngulo de 3 cm cuadrados en una placa de acero.
Con el avance de la tecnologa los lmites de la programacin se vuelven cada
vez ms distantes.
Resea Histrica
Para facilitar el trabajo, los primeros operadores de computadoras
decidieron hacer un traductor para reemplazar los 0 y 1 por palabras o
abstraccin de palabras y letras provenientes del ingls; ste se conoce
como lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la
palabra inglesa add (sumar). El lenguaje ensamblador sigue la misma
estructura del lenguaje mquina, pero las letras y palabras son ms fciles
de recordar y entender que los nmeros.
La necesidad de recordar secuencias de programacin para las acciones
usuales llev a denominarlas con nombres fciles de memorizar y

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

asociar:ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar


subrutina), etc. A esta secuencia de posiciones se le denomin
"instrucciones", y a este conjunto de instrucciones se le llam lenguaje
ensamblador. Posteriormente aparecieron diferentes lenguajes de
programacin, los cuales reciben su denominacin porque tienen una
estructura sintctica similar a los lenguajes escritos por los humanos,
denominados tambin lenguajes de alto nivel.
La primera programadora de computadora conocida fue Ada Lovelace, hija
de Anabella Milbanke Byron y Lord Byron. Anabella introdujo en las
matemticas a Ada quien, despus de conocer aCharles Babbage, tradujo y
ampli una descripcin de su mquina analtica. Incluso aunque Babbage nunca
complet la construccin de cualquiera de sus mquinas, el trabajo que Ada
realiz con stas le hizo ganarse el ttulo de primera programadora de
computadoras del mundo. El nombre del lenguaje de programacin Ada fue
escogido como homenaje a esta programadora.
Diseo y construccin de un compilador.

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

Flex y Bison
Flex es un una herramienta que permite generar analizadores lxicos. A partir de un conjunto
de expresiones regulares, Flex busca concordancias en un fichero de entrada y ejecuta acciones
asociadas a estas expresiones. Es compatible casi al 100% con Lex, una herramienta clsica de
Unix para la generacin de analizadores lxicos, pero es un desarrollo diferente realizado por
GNU bajo licencia GPL.
GNU bison es un programa generador de analizadores sintcticos de propsito general
perteneciente al proyecto GNU disponible para prcticamente todos los sistemas operativos, se
usa normalmente acompaado de flex aunque los analizadores lxicos se pueden tambin
obtener de otras formas.

Instalacin de Flex y Bison


1. Descarga el software disponible en el sitio de la ctedra.
2. Instalar el software en la unidad C: (para explicar a partir del punto 4 se tendr como
hiptesis 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)
3. Flex y bison son aplicaciones de consola, por lo que se deber entrar al Smbolo del sistema y
tipear lneas de comando para ejecutar Flex. Una alternativa es crear un archivo de proceso por
lotes (*.bat) que contenga las lneas de comando para la ejecucin de Flex y Bison y/o la
compilacin del archivo generado.
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 ubicacin en la lnea de comandos) debes hacer lo
siguiente:

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

Clic derecho en Mi PC.


Selecciona Propiedades
Clic en la pestaa Opciones Avanzadas
Presiona el botn Variables de entorno

En la ventana de variables de entorno, ubicarse en la seccin Variables del sistema luego haz
clic en PATH y luego en el botn Modificar (si no est hacer clic en Nueva y agregar PATH)

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

En la nueva ventana, escribir la ruta completa al directorio bin de la aplicacin flex/bison. Si


existe otro valor, separarlos con comas.

Aceptar los cambios y luego reiniciar el sistema operativo.


Si deseas instalar un compilador de C como MinGwin, debers 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 (anlogo a los pasos anteriores) lo siguiente:

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

Como se compila con Flex y Bison


Para compilar en Flex y Bison seguimos los siguientes pasos.
Cuando tengas listo podrs llamar a flex/bison desde el smbolo del sistema sin necesidad de
ubicarte en la carpeta donde ha sido instalado flex/bison.
Luego de escribir las especificaciones de flex y bison realizar lo siguiente. Si se desea invocar a
flex:

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

2 Ejemplos de la creacin de un compilador utilizando Flex y Bison.

/*****************
Definiciones
Se colocan las cabeceras, variables y expresiones regulares
********************
%{
#include <stdio.h>

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

#include <stdlib.h>
#include "sintactico.tab.h"
int linea=0;
%}
/*
Creamos todas las expresiones regulares
Creamos la definicin llamada DIGITO, podemos acceder esta definicin
usando {DIGITO}*/
DIGITO [0-9]
NUMERO {DIGITO}+("."{DIGITO}+)?
%%
/***************
Reglas
*****************/
/* Creamos las reglas que reconocern las cadenas que acepte
Nuestro scanner y retornaremos el token a bison con la
funcion return. */
{NUMERO} {yylval.real=atof(yytext); return(NUMERO);}
"="

{return(IGUAL);}

"+"

{return(MAS);}

"-"

{return(MENOS);}

";"

{return(PTOCOMA);}

"*"

{return(POR);}

"/"

{return(DIV);}

"("

{return(PAA);}

")"

{return(PAC);}

"\n"

{linea++;}

[\t\r\f] {}
""

{}

/* Si en nuestra entrada tiene algn caracter que no pertenece a

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

las reglas anteriores, se genera un error lxico */

{printf("Error lexico en linea %d",linea);}

%%
/*
Cdigo de Usuario
Aqu podemos realizar otras funciones, como por ejemplo ingresar
smbolos a nuestra tabal de smbolos o cualquier otra accione
del usuario.
Todo lo que el usuario coloque en esta seccin se copiara al
archvi lex.yy.c tal y como esta.
*/
Guardamos el archivo como lexico.l. Luego creamos un nuevo archivo y colocamos el
siguiente cdigo.
%{
/********************
Declaraciones en C
**********************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
extern int yylex(void);
extern char *yytext;
extern int linea;
extern FILE *yyin;
void yyerror(char *s);
%}
/************************
Declaraciones de Bison
*************************/
/* Especifica la coleccion completa de tipos de datos para poder usar

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

varios tipos de datos en los terminales y no terminales*/


%union
{
float real;
}
/* Indica la produccion con la que inicia nuestra gramatica*/
%start Exp_l
/* Especificacion de termines, podemos especificar tambien su tipo */
%token <real> NUMERO
%token MAS
%token MENOS
%token IGUAL
%token PTOCOMA
%token POR
%token DIV
%token PAA
%token PAC
/* No Terminales, que tambien podemos especificar su tipo */
%type <real> Exp
%type <real> Calc
%type <real> Exp_l
/* Definimos las precedencias de menor a mayor */
%left MAS MENOS
%left POR DIV
%%
/**********************
Reglas Gramaticales
***********************/
Exp_l:

Exp_l Calc
|Calc

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

;
Calc

: Exp PTOCOMA {printf ("%4.1f\n",$1)}


;

/* con el smbolo de $$ asignamos el valor semntico de toda


la accin de la derecha y se la asignamos al no terminal de
la izquierda, en la siguiente regla, se la asigna a Exp.
Para poder acceder al valor de los terminales y no terminales del lado
derecho usamos el smbolo $ y le concatenamos un numero que representa
la posicin en la que se encuentra es decir si tenemos
A --> B NUMERO C
Si queremos usar le valor que tiene el no terminal B usamos $1, si queremos
usar el valor que tiene NUMERO usamos $2 y as sucesivamente.
*/
Exp :

NUMERO {$$=$1;}
|Exp MAS Exp {$$=$1+$3;}
|Exp MENOS Exp {$$=$1-$3;}
|Exp POR Exp {$$=$1*$3;}
|Exp DIV Exp {$$=$1/$3;}
|PAA Exp PAC {$$=$2;}
;

%%
/********************
Codigo C Adicional
**********************/
void yyerror(char *s)
{
printf("Error sintactico %s",s);
}
int main(int argc,char **argv)
{

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

if (argc>1)
yyin=fopen(argv[1],"rt");
else
yyin=stdin;
yyparse();
return 0;
}

Segundo ejemplo

Fichero lxico_solo.l
%{
/* Ejemplo para una pequea calculadora que permite
trabajar con numeros enteros y reales con las operaciones
bsicas de suma, resta, producto, division y trigonometricas como el seno y el coseno */
#include <stdio.h>
#include <stdlib.h>
int nlines=0;
%}
DIGITO [0-9]
ID [a-zA-Z][a-zA-Z0-9_]*
%%
{DIGITO}+ {printf("Encontrado TKN_NUM_ENTERO: %d",atoi(yytext));}
{DIGITO}+"."{DIGITO}+ {printf("Encontrado TKN_NUM_REAL: %f",atof(yytext));}
"=" {printf("Encontrado TKN_ASIGN: %s",yytext);}
";" {printf("Encontrado TKN_PTOCOMA: %s",yytext);}
"*" {printf("Encontrado TKN_MULT: %s",yytext);}
"/" {printf("Encontrado TKN_DIV: %s",yytext);}
"+" {printf("Encontrado TKN_MAS: %s",yytext);}
"-" {printf("Encontrado TKN_MENOS: %s",yytext);}

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

"(" {printf("Encontrado TKN_PAA: %s",yytext);}


")" {printf("Encontrado TKN_PAC: %s",yytext);}
"cos" {printf("Encontrado TKN_COS: %s",yytext);}
"sen" {printf("Encontrado TKN_SEN: %s",yytext);}
{ID} {printf("Encontrado TKN_ID: %s",yytext);}
"\n" {nlines++;}
%%
void main(int argc,char **argv)
{
if (argc>1)
yyin=fopen(argv[1],"rt");
else
yyin=stdin;
yylex();
printf("\nNumero lineas analizadas: %d\n", nlines);
}
/* para compilar
flex lexico.l
cc lex.yy.c -o milex -lfl -lm
*/
Fichero lxico.l (versin a enlazar con Bison)
%{
/* Ejemplo para una pequea calculadora que permite trabajar
con las operaciones bsicas de suma, resta, producto, division y
trigonometricas como el seno y el coseno */
#include <stdio.h>
#include <stdlib.h>
#include "sintactico.tab.h"
int nlines=0;
%}

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

DIGITO [0-9]
ID [a-zA-Z][a-zA-Z0-9_]*
%%
{DIGITO}+("."{DIGITO}+)? {//printf("Encontrado TKN_NUM: %f\n",atof(yytext));
yylval.real=atof(yytext);
return(TKN_NUM);}
"=" {//printf("Encontrado TKN_ASIGN: %s\n",yytext);
return(TKN_ASIGN);}
";" {//printf("Encontrado TKN_PTOCOMA: %s\n",yytext);
return(TKN_PTOCOMA);}
"*" {//printf("Encontrado TKN_MULT: %s\n",yytext);
return(TKN_MULT);}
"/" {//printf("Encontrado TKN_DIV: %s\n",yytext);
return(TKN_DIV);}
"+" {//printf("Encontrado TKN_MAS: %s\n",yytext);
return(TKN_MAS);}
"-" {//printf("Encontrado TKN_MENOS: %s\n",yytext);
return(TKN_MENOS);}
"(" {//printf("Encontrado TKN_PAA: %s\n",yytext);
return(TKN_PAA);}
")" {//printf("Encontrado TKN_PAC: %s\n",yytext);
return(TKN_PAC);}
"cos" {//printf("Encontrado TKN_COS: %s\n",yytext);
return(TKN_COS);}
"sen" {//printf("Encontrado TKN_SEN: %s\n",yytext);
return(TKN_SEN);}
{ID} {//printf("Encontrado TKN_ID: %s\n",yytext);
return(TKN_ID);}
"\n" {nlines++;}
.

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

%%
/********
Para el lexico solo
void main(int argc,char **argv)
{
if (argc>1)
yyin=fopen(argv[1],"rt");
else
yyin=stdin;
yylex();
printf("\nNumero lineas analizadas: %d\n", nlines);
}
*******/
/* para compilar
flex lexico.l
cc lex.yy.c -o milex -lfl -lm
*/
Fichero sintactico.y (Bison)
%{
/* Ejemplo para una pequea calculadora que permite trabajar
con numeros enteros y reales con las operaciones bsicas de
suma, resta, producto, division y trigonometricas como el seno y el coseno */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
extern int yylex(void);
extern char *yytext;
extern int nlines;
extern FILE *yyin;
void yyerror(char *s);

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

%}
%union
{
float real;
}
%start Calculadora
%token <real> TKN_NUM
%token TKN_ASIGN
%token TKN_PTOCOMA
%token TKN_MULT
%token TKN_DIV
%token TKN_MAS
%token TKN_MENOS
%token TKN_PAA
%token TKN_PAC
%token TKN_COS
%token TKN_SEN
%token <real> TKN_ID
%type Calculadora
%type <real> Expresion
%left TKN_MAS TKN_MENOS
%left TKN_MULT TKN_DIV
%%
Calculadora : TKN_ID { printf("El valor de %s es: ", yytext);}
TKN_ASIGN Expresion TKN_PTOCOMA { printf("%5.2f\n", $4); } ;
Expresion : TKN_NUM {$$=$1;}|
Expresion TKN_MAS Expresion {$$=$1+$3;}|
Expresion TKN_MENOS Expresion {$$=$1-$3;}|
Expresion TKN_MULT Expresion {$$=$1*$3;}|
Expresion TKN_DIV Expresion {$$=$1/$3;} |

ESCUELA DE INGENIERIA- SISTEMAS


COMPILADORES

TKN_PAA Expresion TKN_PAC {$$=$2;}|


TKN_COS TKN_PAA Expresion TKN_PAC {$$=cos($3);}|
TKN_SEN TKN_PAA Expresion TKN_PAC {$$=sin($3);};
%%
void yyerror(char *s)
{
printf("Error %s",s);
}
int main(int argc,char **argv)
{
if (argc>1)
yyin=fopen(argv[1],"rt");
else
yyin=stdin;
yyparse();
printf("FIN del Analisis. Entrada CORRECTA\n");
printf("Numero lineas analizadas: %d\n", nlines);
return 0;
}
/* para compilar
bison -d sintactico.y
flex lexico.l
cc lex.yy.c sintactico.tab.c -o analizador -lfl -lm
*/

Das könnte Ihnen auch gefallen