SlideShare una empresa de Scribd logo
1 de 20
ESCUELA DE INGENIERÍA EN SISTEMAS
TALLER DE COMPILADORES
Daniel Rosero 20/06/2019
Utilizando la herramienta de búsqueda de la Web, Investigar los siguientes temas:
Herramientas para la construcción de procesadores de lenguaje.
Herramienta
Lenguaje
Descripción
Bison C Generador de Analizadores Sintácticos Ascendentes tipo YACC
COCO/R
C/C++ Generador de Analizadores Léxicos y Sintácticos Descendentes Recursivos
Flex C Generador de Analizadores Léxicos tipo Lex
Lex C Generador de Analizadores Léxicos
SDGLL1 exe Sistema Detector de Gramáticas LL(1) y generador de la tabla
TS 2006 C/C++ Tipo abstracto de datos Tabla de Símbolos de uso sencillo
TS C Tipo abstracto de datos Tabla de Símbolos
TS-OO C++ Tipo abstracto de datos orientado a objetos Tabla de Símbolos
VASt exe
Visualizadorde árbolessintácticospartiendode losficherosconla
gramática y el parse pedidosenlaPráctica[versión2.0, Windows]
VASt C++
Visualizadorde árbolessintácticospartiendode losficherosconla
gramática y el parse pedidos en laPráctica [versión 1.0, Linux]
YACC C Generador de Analizadores Sintácticos Ascendentes LR(1)
Aplicación de los lenguajes:
Los lenguajes de programación hoy en día tienen una infinidad de aplicaciones, básicamente
cualquier objetoelectrónico tiene cierto grado de programación. Algunosde los más comunes
sonC++ y JAVA,tambiénexiste HTML,HTTP,XML,XAML yC#, este últimoactualmente esel más
utilizadoentodoslosdispositivosyredesbasadosenMICROSOFT(Xbox 350, WindowsMobile,
Windows Phone, Windows Cloud, Zune, etc.). Ya que los lenguajes de programación son
informáticamente un puente entre el Hardware y el Software estos permiten que las
computadoraspuedanestablecerconexiónconuncelular,unacámaraounaconsolaportátil de
videojuego.Otradelasaplicacionesde loslenguajesde programaciónsonlasmatemáticascomo
lascalculadoras,cajasregistradoras,cajeros automáticos,porsolomencionaralgunosejemplos
sencillos.Existentambiénnivelesde programaciónmuchomáscomplejoscomolosvideojuegos
o lospilotosautomáticosde losavionescomercialesolasmáquinasde juegode loscasinosque
siguenunpatrón de probabilidadapartirde un arreglode númerosal azar establecidoporuna
programación numérica. La robótica es la combinación de mecánica, electrónica y
programación, la cual en base a sensores y mecanismos sigue una serie de instrucciones
algorítmicas las cuales le permiten por ejemplo a un brazo robótico montar una rueda, ajustar
un tornilloocortarun rectángulode 3 cm cuadradosen unaplaca de acero.Con el avance de la
tecnología los límites de la programación se vuelven cada vez más distantes.
Reseña Histórica
Las primerasaplicacionesdelprocesamientodellenguajenatural surgieronentre 1940 y 1960,
teniendo como interés fundamental la traducción automática de textos entre diferentes
idiomas. Los experimentosen este ámbito se basaban fundamentalmente en la sustitución
automáticapalabra por palabra, por lo que se obteníantraduccionesmuyrudimentarias,que
no proporcionaban unos resultados claros.
Surgiópor tanto la necesidadde resolverambigüedadessintácticasysemánticas,así como la
importancia de considerar la información contextual. Los problemas más relevantes en este
tiempo fueron la carencia de un orden de la estructura oracional en algunas lenguas, y la
dificultadparaobtenerunarepresentacióntantosintácticacomosemántica,perounavezque
se empezarona teneren cuentase dio pasoa una concepciónmás realistadel lenguaje enla
que eranecesariocontemplarlastransformacionesquese producenenlaestructurade lafrase
durante el proceso de traducción.
Los últimos años se caracterizan por la incorporación de técnicasestadísticas y el desarrollo
de formalismos adecuados para el tratamiento de la información léxica. Se ha introducido
nuevastécnicasde representacióndel conocimientomuycercanas a la inteligenciaartificial,
y las técnicas de procesamiento utilizadas por investigadores procedentes del área de la
lingüística e informática son cada vez más próximas.
Diseño y construcción de un compilador.
 Diseño:
 Construcción
La construcción de un compilador involucra la división del proceso en una serie de fases que
variará con su complejidad.Generalmente estas fases se agrupan en dos tareas: el análisis del
programa fuente y la síntesis del programa objeto.
Análisis: Se trata de la comprobación de la corrección del programa fuente,e incluye las fases
correspondientesal Análisisléxico(que consiste enladescomposicióndel programafuente en
componentes léxicos), Análisis sintáctico (agrupación de los componentes léxicos en frases
gramaticales) y Análisis semántico (comprobación de la validez semántica de las sentencias
aceptadas en la fase de Análisis Sintáctico).
Síntesis:Su objetivoesla generaciónde la salidaexpresadaenel lenguaje objetoysuele estar
formado por una o varias combinaciones de fases de Generación de Código (normalmente se
trata de códigointermedioode códigoobjeto)yde Optimizaciónde Código(enlasque se busca
obtener un código lo más eficiente posible).
Las herramientas Flex y Bison.
Esta herramienta se usa en consonancia con la herramienta Flex y sirve para especificar
analizadoressintácticos.De lamismaformaqueFlextiene comobase lasexpresionesregulares,
la herramientaBisontambiénse basaenotroformalismoparadescribirlenguajes,enestecaso
serán las gramáticas independientes del contexto las que constituirán el núcleo de las
especificaciones que procesará Bison.
Que es Flex
Es una herramientaútil paracrear programasque reaccionena una entradade datos con
una estructura y un lenguaje predeterminado, como, por ejemplo, podemos crear
compiladores, intérpretes y analizadores de línea de comando.
El Flex define las reglas de reconocimiento de símbolos (Tokens) a partir de expresiones
regulares. Cuando un Token es reconocido por uno de estos patrones de agrupamiento se le
define una acción, por lo general esta acción es devolver el Tipo y el valor (lexema).
El Flex cuandose utilizacombinadoconel Bison,utilizalasdefinicionesde losTokensrealizadas
en el Bison para la comunicación entre ellos.
Como se instala Flex y Bison
1. Descarga el software disponible en el sitio de la cátedra.
2. Instalarel softwareenlaunidadC:(paraexplicarapartirdel punto4se tendrácomo
hipotesis 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 Bisonson aplicacionesde consola,porloque se deberáentraral Símbolodel
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.
4. Si deseasque Flex y Bison se integrenal conjuntode variablesdel entorno(estote
vaa permitirllamaraFlex/Bisondesdecualquierubicaciónenlalíneade comandos)
debes hacer lo siguiente:
o Clic derecho en “Mi PC”.
o Selecciona “Propiedades”
o Clic en la pestaña “Opciones Avanzadas”
o Presiona el botón “Variables de entorno”
o 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) • En la nueva ventana, escribir la ruta
completa al directorio “bin” de la aplicación Flex/Bison. Si existe otro valor,
separarlos con comas.
o Aceptar los cambios y luego reiniciar el sistema operativo.
5. Si deseasinstalaruncompiladorde C como MinGwin,deberásintegrarlaruta
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.
Patrones en Flex
Los patrones en la entrada se escriben utilizando un conjunto extendido de expresiones
regulares. Estas son:
`x' empareja el caracter `x'
`.' cualquier caracter (byte) excepto una línea nueva
`[xyz]' una "clase de caracteres"; en este caso, el patrón empareja una `x', una `y', o una `z'
`[abj-oZ]' una "clase de caracteres" con un rango; empareja una `a', una`b', cualquier letra
desde la `j' hasta la `o', o una `Z'
`[^A-Z]' una"clase de caracteresnegada",esdecir,cualquiercaractermenoslosque
aparecen en la clase. En este caso, cualquier caracter EXCEPTO una letra mayúscula.
`[^A-Zn]' cualquier caracter EXCEPTO una letra mayúscula o una línea nueva
`r*' cero o más r's, donde r es cualquier expresión regular
`r+' una o más r's
`r?' cero o una r (es decir, "una r opcional")
Entre Otros. Fíjese que dentrode una clase de caracteres,todoslos operadoresde expresiones
regularespierdensusignificadoespecial exceptoel caracterde escape (`') y losoperadoresde
clase de caracteres, `-', `]', y, al principio de la clase, `^'.
Emparejamiento de la entrada
Cuando el escáner generado está funcionando,este analiza su entrada buscando cadenasque
concuerden con cualquiera de sus patrones.Si encuentra más de un emparejamiento,toma el
que empareje más texto (para reglas de contexto posterior, se incluye la longitud de la parte
posterior, incluso si se devuelve a la entrada). Si encuentra dos o más emparejamientosde la
misma longitud, se escoge la regla listada en primer lugar en el fichero de entrada de flex.
Una vez que se determina el emparejamiento, el texto correspondiente al emparejamiento
(denominadoel token) estádisponibleenel punteroacaracterglobal yytext,ysulongitudenla
variable global enterayyleng. Entonces la acción correspondiente al patrón emparejado se
ejecuta(See section Acciones,para una descripciónmásdetalladade las acciones),y entonces
la entrada restante se analiza para otro emparejamiento.
Si no se encuentra un emparejamiento, entonces se ejecuta la regla por defecto: el siguiente
caracter en la entrada se considera reconocido y se copia a la salida estándar. Así, la entrada
válida más simple de flex es:
%% que genera un escáner que simplemente copia su entrada (un caracter a la vez) a la
salida.
Condiciones de arranque
Variables disponibles para el usuario
Compilación y ejecución en Flex de un programa.
Introducción a 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,lasLALR) enunprogramaenC que analizaesagramática.Escompatibleal 100% con Yacc,
unaherramientaclásicadeUnix paralageneraciónde analizadoresléxicos,peroesundesarrollo
diferente realizado por GNU bajo licencia GPL. Todas las gramáticas escritas apropiadamente
para Yacc deberían funcionar con Bison sin ningún cambio. Usándolo junto a Flex esta
herramienta permite construir compiladores de lenguajes.
Símbolos terminales y no terminales
Los símbolosterminalesde lagramáticase denominanenBisontokensydebendeclararse enla
sección de definiciones. Por convención se suelen escribir los tokens en mayúsculas y los
símbolos no terminales en minúsculas.
Hay tresmanerasde escribirsímbolosterminalesenlagramática.Aquíse describenlasdosmás
usuales:
• Un tokendeclaradose escribe con unidentificador,de lamismamaneraque un identificador
en C. Por convención, debería estar todo en mayúsculas. Cada uno de estos nombres debe
definirse con una declaración de %token.
• Un tokende carácter se escribe enla gramática utilizandolamismasintaxisusadaen C para
lasconstantesde uncarácter; por ejemplo,‘+’esuntipode tokende carácter.Un tipode token
de carácter no necesita ser declarado a menos que necesite especificar el tipo de datos de su
valor semántico, asociatividad, o precedencia. Por convención, un token de carácter se utiliza
únicamente para representar un token consistente en ese carácter en particular.
Sintaxis de las reglas gramaticales (producciones)
Declaraciones en Bison
La sección de declaracionesde Bison de una gramática de Bison define los símbolosutilizados
en la formulación de la gramática y los tipos de datos de los valores semánticos. Todos los
nombres de tokens (pero no los tokens de carácter literal simple tal como ‘+’ y ‘*’) se deben
declarar.Lossímbolosnoterminalesdebenserdeclaradossi necesitaespecificarel tipode dato
a utilizar para los valores semánticos.
La primera regla en el fichero también especifica el símbolo inicial, por defecto. Si desea que
otro símbolo sea el símbolo de arranque, lo debe declarar explícitamente.
Precedencia de operadores
Funcionamiento del analizador
La fuente de Bison se convierte en una función en C llamada yyparse. Aquí describimos las
convenciones de interfaz de yyparse y las otras funciones que éste necesita usar. Tenga en
cuenta que el analizador utiliza muchos identificadores en C comenzando con ‘yy’ e ‘YY’ para
propósito interno.
Si utiliza tales identificadores (a parte de aquellos descritos en el manual) en una acción o en
códigoC adicional enel archivode lagramática, esprobable que se encuentre con problemas.
2 ejemplos de la creación de un compilador utilizando Flex y Bison.
 Ejemplo 1:
 Ejemplo 2:
Ante la siguiente entrada
a =12+2*cos(3.14) ;
La salida debe ser:
El valordel identificadoraes10.LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-
11
Fichero léxico_solo.l
%{
/* Ejemplo para una pequeña calculadora que permite trabajar con numeros enterosy reales
con lasoperacionesbásicasde suma,resta,producto,divisionytrigonometricascomoel senoy
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);}
"(" {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++;}
.LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11
%% void main(int argc,char **argv)
{
if (argc>1)
yyin=fopen(argv[1],"rt");
else
yyin=stdin;
yylex();
printf("nNumero lineas analizadas: %dn", nlines);
}
/* para compilar
flex lexico.l
cc lex.yy.c -o milex -lfl -lm
*/LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11
Fichero léxico.l (versión a enlazar con Bison)
%{
/* Ejemplo para una pequeña calculadora que permite trabajar
con las operaciones básicas 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;
%}
DIGITO [0-9]
ID [a-zA-Z][a-zA-Z0-9_]*
%%
{DIGITO}+("."{DIGITO}+)? {//printf("Encontrado TKN_NUM: %fn",atof(yytext));
yylval.real=atof(yytext);
return(TKN_NUM);}
"=" {//printf("Encontrado TKN_ASIGN: %sn",yytext);
return(TKN_ASIGN);}
";" {//printf("Encontrado TKN_PTOCOMA: %sn",yytext);
Steven Tabango PUCESI
return(TKN_PTOCOMA);}
"*" {//printf("Encontrado TKN_MULT: %sn",yytext);
return(TKN_MULT);}
"/" {//printf("Encontrado TKN_DIV: %sn",yytext);
return(TKN_DIV);}
"+" {//printf("Encontrado TKN_MAS: %sn",yytext);
return(TKN_MAS);}
"-" {//printf("Encontrado TKN_MENOS: %sn",yytext);LABORATORIO DE PROCESADORES DE
LENGUAJE CURSO 2010-11
return(TKN_MENOS);}
"(" {//printf("Encontrado TKN_PAA: %sn",yytext);
return(TKN_PAA);}
")" {//printf("Encontrado TKN_PAC: %sn",yytext);
return(TKN_PAC);}
"cos" {//printf("Encontrado TKN_COS: %sn",yytext);
return(TKN_COS);}
"sen" {//printf("Encontrado TKN_SEN: %sn",yytext);
return(TKN_SEN);}
{ID} {//printf("Encontrado TKN_ID: %sn",yytext);
return(TKN_ID);}
"n" {nlines++;}
.
%%
/********
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: %dn", nlines);
}
*******/
/* para compilar
flex lexico.l
cc lex.yy.c -o milex -lfl -lm
*/LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11
Fichero sintactico.y (Bison)
%{
/* Ejemplo para una pequeña calculadora que permite trabajar
con numeros enteros y reales con las operaciones básicas 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);
%}
%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_PACLABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11
%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.2fn", $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;} |
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");LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11
else
yyin=stdin;
Steven Tabango PUCESI
yyparse();
printf("FIN del Analisis. Entrada CORRECTAn");
printf("Numero lineas analizadas: %dn", nlines);
return 0;
}
/* para compilar
bison -d sintactico.y
flex lexico.l
cc lex.yy.c sintactico.tab.c -o analizador -lfl -lm
*/

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Tutorial Flex y Bison
Tutorial Flex y BisonTutorial Flex y Bison
Tutorial Flex y Bison
 
Administrador de Tabla de Símbolos
Administrador de Tabla de SímbolosAdministrador de Tabla de Símbolos
Administrador de Tabla de Símbolos
 
Flex y bison
Flex y  bisonFlex y  bison
Flex y bison
 
Flex y Bison
Flex y BisonFlex y Bison
Flex y Bison
 
Herramientas flex y bison
Herramientas flex y bisonHerramientas flex y bison
Herramientas flex y bison
 
Flex ybison
Flex ybisonFlex ybison
Flex ybison
 
Compiladores flex bison
Compiladores flex bisonCompiladores flex bison
Compiladores flex bison
 
INTRODUCCION A FLEX Y BISON
INTRODUCCION A FLEX Y BISONINTRODUCCION A FLEX Y BISON
INTRODUCCION A FLEX Y BISON
 
FLEX Y BISON
FLEX Y BISONFLEX Y BISON
FLEX Y BISON
 
Generalidades de la programacion
Generalidades de la programacionGeneralidades de la programacion
Generalidades de la programacion
 
TALLER FLEX Y BISON
TALLER FLEX Y BISONTALLER FLEX Y BISON
TALLER FLEX Y BISON
 
Tabla simbolos
Tabla simbolosTabla simbolos
Tabla simbolos
 
Flex y bison
Flex y bisonFlex y bison
Flex y bison
 
Flex y bison
Flex y bisonFlex y bison
Flex y bison
 
Tabla de símbolos
Tabla de símbolosTabla de símbolos
Tabla de símbolos
 
Tabla SiMbolos, victor mamani catachura, boreasH,Compiladores
Tabla SiMbolos, victor mamani catachura, boreasH,CompiladoresTabla SiMbolos, victor mamani catachura, boreasH,Compiladores
Tabla SiMbolos, victor mamani catachura, boreasH,Compiladores
 
TABLA DE SIMBOLOS
TABLA DE SIMBOLOSTABLA DE SIMBOLOS
TABLA DE SIMBOLOS
 
Arreglos Turbo C
Arreglos Turbo CArreglos Turbo C
Arreglos Turbo C
 
Investigacion Flex Y Bison
Investigacion Flex Y BisonInvestigacion Flex Y Bison
Investigacion Flex Y Bison
 
Turbo c
Turbo cTurbo c
Turbo c
 

Similar a Taller de Compiladores flx y bsn (20)

Taller de flex y bison
Taller de flex y bisonTaller de flex y bison
Taller de flex y bison
 
Taller 21 de junio
Taller 21 de junioTaller 21 de junio
Taller 21 de junio
 
Taller flex y bison
Taller flex y bisonTaller flex y bison
Taller flex y bison
 
Flex y bison
Flex y bisonFlex y bison
Flex y bison
 
Trabajo compiladores ivan bolaños
Trabajo compiladores ivan bolañosTrabajo compiladores ivan bolaños
Trabajo compiladores ivan bolaños
 
Taller
TallerTaller
Taller
 
Taller de compiladores
Taller de compiladoresTaller de compiladores
Taller de compiladores
 
Taller Flex Bison
Taller Flex BisonTaller Flex Bison
Taller Flex Bison
 
Flex y bison
Flex y bisonFlex y bison
Flex y bison
 
Curso prog sist
Curso prog sistCurso prog sist
Curso prog sist
 
Lex
LexLex
Lex
 
Lex
LexLex
Lex
 
Flex y brison
Flex y brisonFlex y brison
Flex y brison
 
Bison y flex
Bison y flexBison y flex
Bison y flex
 
Unidad 2
Unidad 2Unidad 2
Unidad 2
 
Unidad 2
Unidad 2Unidad 2
Unidad 2
 
Compilador2
Compilador2Compilador2
Compilador2
 
Programazion
ProgramazionProgramazion
Programazion
 
Flex y bison
Flex y bisonFlex y bison
Flex y bison
 
Bison y flex
Bison y flexBison y flex
Bison y flex
 

Más de DanielRosero23

Graficas sencillas con_matlab
Graficas sencillas con_matlabGraficas sencillas con_matlab
Graficas sencillas con_matlabDanielRosero23
 
Operaciones con matlab
Operaciones con matlabOperaciones con matlab
Operaciones con matlabDanielRosero23
 
Operaciones con matrices
Operaciones con matricesOperaciones con matrices
Operaciones con matricesDanielRosero23
 
Segunda y tercera_parte_matlab
Segunda y tercera_parte_matlabSegunda y tercera_parte_matlab
Segunda y tercera_parte_matlabDanielRosero23
 
Primera_parte_instalacion_de_matlab_2017
Primera_parte_instalacion_de_matlab_2017Primera_parte_instalacion_de_matlab_2017
Primera_parte_instalacion_de_matlab_2017DanielRosero23
 
La luz y_el_espectro_electromagnetico
La luz y_el_espectro_electromagneticoLa luz y_el_espectro_electromagnetico
La luz y_el_espectro_electromagneticoDanielRosero23
 
Fundamentos de la_Teoria_del_Color_2
Fundamentos de la_Teoria_del_Color_2Fundamentos de la_Teoria_del_Color_2
Fundamentos de la_Teoria_del_Color_2DanielRosero23
 
Fundamentos de la_teoria_del_color
Fundamentos de la_teoria_del_colorFundamentos de la_teoria_del_color
Fundamentos de la_teoria_del_colorDanielRosero23
 
Taller de actividades de compiladores 06 06 2019
Taller de actividades de compiladores 06 06 2019Taller de actividades de compiladores 06 06 2019
Taller de actividades de compiladores 06 06 2019DanielRosero23
 
Lenguajes de programacion1
Lenguajes de programacion1Lenguajes de programacion1
Lenguajes de programacion1DanielRosero23
 
Frameworks de Javascript Lema-Rosero
Frameworks de Javascript Lema-RoseroFrameworks de Javascript Lema-Rosero
Frameworks de Javascript Lema-RoseroDanielRosero23
 

Más de DanielRosero23 (15)

Graficas sencillas con_matlab
Graficas sencillas con_matlabGraficas sencillas con_matlab
Graficas sencillas con_matlab
 
Operaciones con matlab
Operaciones con matlabOperaciones con matlab
Operaciones con matlab
 
Operaciones con matrices
Operaciones con matricesOperaciones con matrices
Operaciones con matrices
 
Segunda y tercera_parte_matlab
Segunda y tercera_parte_matlabSegunda y tercera_parte_matlab
Segunda y tercera_parte_matlab
 
Primera_parte_instalacion_de_matlab_2017
Primera_parte_instalacion_de_matlab_2017Primera_parte_instalacion_de_matlab_2017
Primera_parte_instalacion_de_matlab_2017
 
La luz y_el_espectro_electromagnetico
La luz y_el_espectro_electromagneticoLa luz y_el_espectro_electromagnetico
La luz y_el_espectro_electromagnetico
 
Fundamentos de la_Teoria_del_Color_2
Fundamentos de la_Teoria_del_Color_2Fundamentos de la_Teoria_del_Color_2
Fundamentos de la_Teoria_del_Color_2
 
Fundamentos de la_teoria_del_color
Fundamentos de la_teoria_del_colorFundamentos de la_teoria_del_color
Fundamentos de la_teoria_del_color
 
Taller de actividades de compiladores 06 06 2019
Taller de actividades de compiladores 06 06 2019Taller de actividades de compiladores 06 06 2019
Taller de actividades de compiladores 06 06 2019
 
Analisis sintactico
Analisis sintacticoAnalisis sintactico
Analisis sintactico
 
Parte 2
Parte 2Parte 2
Parte 2
 
Emu8086
Emu8086Emu8086
Emu8086
 
Compiladores
CompiladoresCompiladores
Compiladores
 
Lenguajes de programacion1
Lenguajes de programacion1Lenguajes de programacion1
Lenguajes de programacion1
 
Frameworks de Javascript Lema-Rosero
Frameworks de Javascript Lema-RoseroFrameworks de Javascript Lema-Rosero
Frameworks de Javascript Lema-Rosero
 

Taller de Compiladores flx y bsn

  • 1. ESCUELA DE INGENIERÍA EN SISTEMAS TALLER DE COMPILADORES Daniel Rosero 20/06/2019 Utilizando la herramienta de búsqueda de la Web, Investigar los siguientes temas: Herramientas para la construcción de procesadores de lenguaje. Herramienta Lenguaje Descripción Bison C Generador de Analizadores Sintácticos Ascendentes tipo YACC COCO/R C/C++ Generador de Analizadores Léxicos y Sintácticos Descendentes Recursivos Flex C Generador de Analizadores Léxicos tipo Lex Lex C Generador de Analizadores Léxicos SDGLL1 exe Sistema Detector de Gramáticas LL(1) y generador de la tabla TS 2006 C/C++ Tipo abstracto de datos Tabla de Símbolos de uso sencillo TS C Tipo abstracto de datos Tabla de Símbolos TS-OO C++ Tipo abstracto de datos orientado a objetos Tabla de Símbolos VASt exe Visualizadorde árbolessintácticospartiendode losficherosconla gramática y el parse pedidosenlaPráctica[versión2.0, Windows] VASt C++ Visualizadorde árbolessintácticospartiendode losficherosconla gramática y el parse pedidos en laPráctica [versión 1.0, Linux] YACC C Generador de Analizadores Sintácticos Ascendentes LR(1) Aplicación de los lenguajes: Los lenguajes de programación hoy en día tienen una infinidad de aplicaciones, básicamente cualquier objetoelectrónico tiene cierto grado de programación. Algunosde los más comunes sonC++ y JAVA,tambiénexiste HTML,HTTP,XML,XAML yC#, este últimoactualmente esel más utilizadoentodoslosdispositivosyredesbasadosenMICROSOFT(Xbox 350, WindowsMobile, Windows Phone, Windows Cloud, Zune, etc.). Ya que los lenguajes de programación son informáticamente un puente entre el Hardware y el Software estos permiten que las computadoraspuedanestablecerconexiónconuncelular,unacámaraounaconsolaportátil de videojuego.Otradelasaplicacionesde loslenguajesde programaciónsonlasmatemáticascomo lascalculadoras,cajasregistradoras,cajeros automáticos,porsolomencionaralgunosejemplos sencillos.Existentambiénnivelesde programaciónmuchomáscomplejoscomolosvideojuegos
  • 2. o lospilotosautomáticosde losavionescomercialesolasmáquinasde juegode loscasinosque siguenunpatrón de probabilidadapartirde un arreglode númerosal azar establecidoporuna programación numérica. La robótica es la combinación de mecánica, electrónica y programación, la cual en base a sensores y mecanismos sigue una serie de instrucciones algorítmicas las cuales le permiten por ejemplo a un brazo robótico montar una rueda, ajustar un tornilloocortarun rectángulode 3 cm cuadradosen unaplaca de acero.Con el avance de la tecnología los límites de la programación se vuelven cada vez más distantes. Reseña Histórica Las primerasaplicacionesdelprocesamientodellenguajenatural surgieronentre 1940 y 1960, teniendo como interés fundamental la traducción automática de textos entre diferentes idiomas. Los experimentosen este ámbito se basaban fundamentalmente en la sustitución automáticapalabra por palabra, por lo que se obteníantraduccionesmuyrudimentarias,que no proporcionaban unos resultados claros. Surgiópor tanto la necesidadde resolverambigüedadessintácticasysemánticas,así como la importancia de considerar la información contextual. Los problemas más relevantes en este tiempo fueron la carencia de un orden de la estructura oracional en algunas lenguas, y la dificultadparaobtenerunarepresentacióntantosintácticacomosemántica,perounavezque se empezarona teneren cuentase dio pasoa una concepciónmás realistadel lenguaje enla que eranecesariocontemplarlastransformacionesquese producenenlaestructurade lafrase durante el proceso de traducción. Los últimos años se caracterizan por la incorporación de técnicasestadísticas y el desarrollo de formalismos adecuados para el tratamiento de la información léxica. Se ha introducido nuevastécnicasde representacióndel conocimientomuycercanas a la inteligenciaartificial, y las técnicas de procesamiento utilizadas por investigadores procedentes del área de la lingüística e informática son cada vez más próximas. Diseño y construcción de un compilador.  Diseño:
  • 3.  Construcción La construcción de un compilador involucra la división del proceso en una serie de fases que variará con su complejidad.Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto. Análisis: Se trata de la comprobación de la corrección del programa fuente,e incluye las fases correspondientesal Análisisléxico(que consiste enladescomposicióndel programafuente en componentes léxicos), Análisis sintáctico (agrupación de los componentes léxicos en frases gramaticales) y Análisis semántico (comprobación de la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico). Síntesis:Su objetivoesla generaciónde la salidaexpresadaenel lenguaje objetoysuele estar formado por una o varias combinaciones de fases de Generación de Código (normalmente se trata de códigointermedioode códigoobjeto)yde Optimizaciónde Código(enlasque se busca obtener un código lo más eficiente posible). Las herramientas Flex y Bison. Esta herramienta se usa en consonancia con la herramienta Flex y sirve para especificar analizadoressintácticos.De lamismaformaqueFlextiene comobase lasexpresionesregulares, la herramientaBisontambiénse basaenotroformalismoparadescribirlenguajes,enestecaso serán las gramáticas independientes del contexto las que constituirán el núcleo de las especificaciones que procesará Bison. Que es Flex Es una herramientaútil paracrear programasque reaccionena una entradade datos con una estructura y un lenguaje predeterminado, como, por ejemplo, podemos crear compiladores, intérpretes y analizadores de línea de comando. El Flex define las reglas de reconocimiento de símbolos (Tokens) a partir de expresiones regulares. Cuando un Token es reconocido por uno de estos patrones de agrupamiento se le define una acción, por lo general esta acción es devolver el Tipo y el valor (lexema). El Flex cuandose utilizacombinadoconel Bison,utilizalasdefinicionesde losTokensrealizadas en el Bison para la comunicación entre ellos.
  • 4. Como se instala Flex y Bison 1. Descarga el software disponible en el sitio de la cátedra. 2. Instalarel softwareenlaunidadC:(paraexplicarapartirdel punto4se tendrácomo hipotesis 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 Bisonson aplicacionesde consola,porloque se deberáentraral Símbolodel 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. 4. Si deseasque Flex y Bison se integrenal conjuntode variablesdel entorno(estote vaa permitirllamaraFlex/Bisondesdecualquierubicaciónenlalíneade comandos) debes hacer lo siguiente: o Clic derecho en “Mi PC”. o Selecciona “Propiedades” o Clic en la pestaña “Opciones Avanzadas” o Presiona el botón “Variables de entorno” o 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) • En la nueva ventana, escribir la ruta completa al directorio “bin” de la aplicación Flex/Bison. Si existe otro valor, separarlos con comas. o Aceptar los cambios y luego reiniciar el sistema operativo. 5. Si deseasinstalaruncompiladorde C como MinGwin,deberásintegrarlaruta 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.
  • 5. Patrones en Flex Los patrones en la entrada se escriben utilizando un conjunto extendido de expresiones regulares. Estas son: `x' empareja el caracter `x' `.' cualquier caracter (byte) excepto una línea nueva `[xyz]' una "clase de caracteres"; en este caso, el patrón empareja una `x', una `y', o una `z' `[abj-oZ]' una "clase de caracteres" con un rango; empareja una `a', una`b', cualquier letra desde la `j' hasta la `o', o una `Z' `[^A-Z]' una"clase de caracteresnegada",esdecir,cualquiercaractermenoslosque aparecen en la clase. En este caso, cualquier caracter EXCEPTO una letra mayúscula. `[^A-Zn]' cualquier caracter EXCEPTO una letra mayúscula o una línea nueva `r*' cero o más r's, donde r es cualquier expresión regular `r+' una o más r's `r?' cero o una r (es decir, "una r opcional") Entre Otros. Fíjese que dentrode una clase de caracteres,todoslos operadoresde expresiones regularespierdensusignificadoespecial exceptoel caracterde escape (`') y losoperadoresde clase de caracteres, `-', `]', y, al principio de la clase, `^'. Emparejamiento de la entrada Cuando el escáner generado está funcionando,este analiza su entrada buscando cadenasque concuerden con cualquiera de sus patrones.Si encuentra más de un emparejamiento,toma el que empareje más texto (para reglas de contexto posterior, se incluye la longitud de la parte posterior, incluso si se devuelve a la entrada). Si encuentra dos o más emparejamientosde la misma longitud, se escoge la regla listada en primer lugar en el fichero de entrada de flex. Una vez que se determina el emparejamiento, el texto correspondiente al emparejamiento (denominadoel token) estádisponibleenel punteroacaracterglobal yytext,ysulongitudenla variable global enterayyleng. Entonces la acción correspondiente al patrón emparejado se ejecuta(See section Acciones,para una descripciónmásdetalladade las acciones),y entonces la entrada restante se analiza para otro emparejamiento. Si no se encuentra un emparejamiento, entonces se ejecuta la regla por defecto: el siguiente caracter en la entrada se considera reconocido y se copia a la salida estándar. Así, la entrada válida más simple de flex es: %% que genera un escáner que simplemente copia su entrada (un caracter a la vez) a la salida.
  • 6. Condiciones de arranque Variables disponibles para el usuario Compilación y ejecución en Flex de un programa.
  • 7. Introducción a 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,lasLALR) enunprogramaenC que analizaesagramática.Escompatibleal 100% con Yacc, unaherramientaclásicadeUnix paralageneraciónde analizadoresléxicos,peroesundesarrollo diferente realizado por GNU bajo licencia GPL. Todas las gramáticas escritas apropiadamente para Yacc deberían funcionar con Bison sin ningún cambio. Usándolo junto a Flex esta herramienta permite construir compiladores de lenguajes. Símbolos terminales y no terminales Los símbolosterminalesde lagramáticase denominanenBisontokensydebendeclararse enla sección de definiciones. Por convención se suelen escribir los tokens en mayúsculas y los símbolos no terminales en minúsculas. Hay tresmanerasde escribirsímbolosterminalesenlagramática.Aquíse describenlasdosmás usuales: • Un tokendeclaradose escribe con unidentificador,de lamismamaneraque un identificador en C. Por convención, debería estar todo en mayúsculas. Cada uno de estos nombres debe definirse con una declaración de %token. • Un tokende carácter se escribe enla gramática utilizandolamismasintaxisusadaen C para lasconstantesde uncarácter; por ejemplo,‘+’esuntipode tokende carácter.Un tipode token de carácter no necesita ser declarado a menos que necesite especificar el tipo de datos de su valor semántico, asociatividad, o precedencia. Por convención, un token de carácter se utiliza únicamente para representar un token consistente en ese carácter en particular.
  • 8. Sintaxis de las reglas gramaticales (producciones) Declaraciones en Bison La sección de declaracionesde Bison de una gramática de Bison define los símbolosutilizados en la formulación de la gramática y los tipos de datos de los valores semánticos. Todos los nombres de tokens (pero no los tokens de carácter literal simple tal como ‘+’ y ‘*’) se deben declarar.Lossímbolosnoterminalesdebenserdeclaradossi necesitaespecificarel tipode dato a utilizar para los valores semánticos. La primera regla en el fichero también especifica el símbolo inicial, por defecto. Si desea que otro símbolo sea el símbolo de arranque, lo debe declarar explícitamente. Precedencia de operadores
  • 9. Funcionamiento del analizador La fuente de Bison se convierte en una función en C llamada yyparse. Aquí describimos las convenciones de interfaz de yyparse y las otras funciones que éste necesita usar. Tenga en cuenta que el analizador utiliza muchos identificadores en C comenzando con ‘yy’ e ‘YY’ para propósito interno. Si utiliza tales identificadores (a parte de aquellos descritos en el manual) en una acción o en códigoC adicional enel archivode lagramática, esprobable que se encuentre con problemas. 2 ejemplos de la creación de un compilador utilizando Flex y Bison.  Ejemplo 1:
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.  Ejemplo 2: Ante la siguiente entrada a =12+2*cos(3.14) ; La salida debe ser: El valordel identificadoraes10.LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010- 11 Fichero léxico_solo.l %{ /* Ejemplo para una pequeña calculadora que permite trabajar con numeros enterosy reales con lasoperacionesbásicasde suma,resta,producto,divisionytrigonometricascomoel senoy el coseno */ #include <stdio.h> #include <stdlib.h> int nlines=0; %} DIGITO [0-9]
  • 15. 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);} "(" {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++;} .LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11 %% void main(int argc,char **argv) { if (argc>1) yyin=fopen(argv[1],"rt"); else yyin=stdin; yylex(); printf("nNumero lineas analizadas: %dn", nlines); }
  • 16. /* para compilar flex lexico.l cc lex.yy.c -o milex -lfl -lm */LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11 Fichero léxico.l (versión a enlazar con Bison) %{ /* Ejemplo para una pequeña calculadora que permite trabajar con las operaciones básicas 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; %} DIGITO [0-9] ID [a-zA-Z][a-zA-Z0-9_]* %% {DIGITO}+("."{DIGITO}+)? {//printf("Encontrado TKN_NUM: %fn",atof(yytext)); yylval.real=atof(yytext); return(TKN_NUM);} "=" {//printf("Encontrado TKN_ASIGN: %sn",yytext); return(TKN_ASIGN);} ";" {//printf("Encontrado TKN_PTOCOMA: %sn",yytext); Steven Tabango PUCESI return(TKN_PTOCOMA);} "*" {//printf("Encontrado TKN_MULT: %sn",yytext); return(TKN_MULT);}
  • 17. "/" {//printf("Encontrado TKN_DIV: %sn",yytext); return(TKN_DIV);} "+" {//printf("Encontrado TKN_MAS: %sn",yytext); return(TKN_MAS);} "-" {//printf("Encontrado TKN_MENOS: %sn",yytext);LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11 return(TKN_MENOS);} "(" {//printf("Encontrado TKN_PAA: %sn",yytext); return(TKN_PAA);} ")" {//printf("Encontrado TKN_PAC: %sn",yytext); return(TKN_PAC);} "cos" {//printf("Encontrado TKN_COS: %sn",yytext); return(TKN_COS);} "sen" {//printf("Encontrado TKN_SEN: %sn",yytext); return(TKN_SEN);} {ID} {//printf("Encontrado TKN_ID: %sn",yytext); return(TKN_ID);} "n" {nlines++;} . %% /******** 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: %dn", nlines); }
  • 18. *******/ /* para compilar flex lexico.l cc lex.yy.c -o milex -lfl -lm */LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11 Fichero sintactico.y (Bison) %{ /* Ejemplo para una pequeña calculadora que permite trabajar con numeros enteros y reales con las operaciones básicas 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); %} %union { float real; } %start Calculadora %token <real> TKN_NUM %token TKN_ASIGN %token TKN_PTOCOMA %token TKN_MULT %token TKN_DIV
  • 19. %token TKN_MAS %token TKN_MENOS %token TKN_PAA %token TKN_PACLABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11 %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.2fn", $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;} | 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) {
  • 20. if (argc>1) yyin=fopen(argv[1],"rt");LABORATORIO DE PROCESADORES DE LENGUAJE CURSO 2010-11 else yyin=stdin; Steven Tabango PUCESI yyparse(); printf("FIN del Analisis. Entrada CORRECTAn"); printf("Numero lineas analizadas: %dn", nlines); return 0; } /* para compilar bison -d sintactico.y flex lexico.l cc lex.yy.c sintactico.tab.c -o analizador -lfl -lm */