UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS
INFORME 02: FLEX
Estudiante: Frank Lupaca Lupaca Código: 2016-119005 Ciclo: XI Curso: Compiladores y teoría de lenguajes
Tacna - Perú
2018
INTRODUCCIÓN
La teoría de compiladores es un área muy interesante y compleja. El implementar un lenguaje de programación y crear un compilador para este es una tarea muy dura, pero el ámbito de las aplicaciones son muy variadas y la satisfacción es grande. Los compiladores están muy ligados a las teorías de autómatas, lenguajes formales y teoría de la computación. El desarrollo de estos comprende varias partes, el análisis léxico, sintáctico, semántico, la generación de código intermedio y generación de código final. Por otro lado el avance de la tecnología respecto a software, ha permitido que la web sea muy concurrida y por ende las aplicaciones web han ido en aumento, tal es el caso que para las personas ligadas al ámbito de las ciencias de la computación se nos sea de gran utilidad acceder a un sitio web y poder realizar cálculos y pruebas de escritorio de nuestros algoritmos.
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. Es compatible casi al 100% con Lex, una herramienta clásica de Unix para la generación de analizadores léxicos, pero es un desarrollo diferente realizado por GNU bajo licencia GPL. %% patrón1 {acción1} patrón2 {acción2} ... Donde: patrón: expresión regular acción: código C con las acciones 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. Cuando se arranca el fichero ejecutable, este analiza su entrada en busca de casos de las expresiones regulares. Siempre que encuentra uno, ejecuta el código C correspondiente. El fichero de entrada de Flex está compuesto de tres secciones, separadas por una línea donde aparece únicamente un ‘%%’ en esta: 1. 2. 3. 4. 5.
Definiciones %% reglas %% código de usuario
La sección de definiciones Esta sección del archivo contiene la declaración Lex en C para incluir el archivo (y.tab.h) producido por Yacc / Bison que contiene las definiciones de la del fichas de varios caracteres. La primera sección también contiene definiciones Lex utilizados en las expresiones regulares. En este caso, DIGIT se define como uno de los símbolos del 0 al 9 y el ID se define para ser una letra minúscula seguida de cero o más letras o dígitos. 2.10.1.2. La sección de reglas La segunda sección del archivo Lex da las expresiones regulares para cada ficha ser reconocido y una acción correspondiente. Las cadenas de uno o más dígitos se reconocen como un entero y por lo tanto el valor INT se devuelve al analizador. Las palabras reservadas del lenguaje son una cadena de letras en minúscula (mayúscula pueden ser utilizados,
pero deben ser tratados de manera diferente).Los espacios en blanco, tabuladores y saltos de línea se ignoran. Todos los demás símbolos de caracteres solo se devuelven como ellos mismos (los lugares de entrada de escáner todo en el yytextcadena). La sección de código de usuario Esta sección suele estar vacía pero puede contener código C asociado con las acciones. Analizador Léxico En Flex Código de Usuario: %{ #include <stdio.h> #include <stdlib.h> #include "y.tab.h" int linea=0; %} Definiciones: DIGITO [0-9] LETRA [a-zA-Z] IDENTIFICADOR {LETRA}({LETRA}|{DIGITO})* constEntera {DIGITO}({DIGITO})* /*SIGNO [< <= > >= != ;]*/ Boleano "True"|"False"|"<"|"<="|">"|">="|"!=" Reglas: %% "=" "+" "-" "," ";" "*"
{return(IGUAL);} {return(MAS);} {return(MENOS);} {return(COMA);} {return(PTOCOMA);} {return(POR);}
"/" {return(DIV);} "(" {return(PARENTABIER);} ")" {return(PARENTCERR);} "Dim" {return(DIM);} "As" {return (AS);} "Integer" {return (TIPO);} "End" {return(END);} "Else" {return(ELSE);} "If" {return(IF);} "Then" {return(THEN);} "Select" {return(SELECT);} "Case" {return(CASE);} "While" {return(WHILE);} "Do" {return(DO);} "Loop" {return(LOOP);} "Until" {return(UNTIL);} "Next" {return(NEXT);} "For" {return(FOR);} "Step" {return(STEP);} "To" {return(TO);} {Boleano} {return BOLEANO;} {constEntera} {return (INT);} {IDENTIFICADOR} {return (ID);} "\n" {linea++;} [\t\r\f] {} "" {} . {printf("Error lexico en linea %d",linea);} %%
TRADUCCIÓN
DIRIGIDA POR LA SINTAXIS
Es importante destacar que el analizador sintáctico tiene el control en todo momento, y el léxico por trozos, a petición del sintáctico. En otras palabras, el sintáctico va construyendo su árbol poco a poco (de izquierda derecha), y cada vez que necesita un nuevo componente léxico para continuar dicha construcción, se lo solicita al lexicográfico; éste lee nuevos caracteres del fichero de entrada hasta conformar un nuevo componente y, una vez obtenido, se lo suministra al sintáctico, quien continúa la construcción del árbol hasta que vuelve a necesitar otro componente, momento en que se reinicia el proceso. Este mecanismo finaliza cuando se ha obtenido el árbol y ya no hay más componentes en el fichero de entrada, o bien cuando es imposible construir el árbol. Estos tan sólo el principio de lo que se denomina compilación dirigida por sintaxis (ver figura 5): es aquél mecanismo de compilación en el que el control lo lleva el analizador sintáctico, y todas las demás fases están sometidas a él.
TRADUCCIÓN DIRIGIDA POR LA SINTAXIS . (GALVEZ ROJAS & MORA MATA, 2005)
Desarrollo Lo desarrolle en Ubuntu (Linux) poniendo en el terminal los siguientes comandos: 1. sudo apt-get update 2. sudo apt-get install flex 3. sudo apt-get install bison Para luego crear el código básico en un documento de texto terminando con .l
Para que resulte de la siguiente manera en el terminal:
Bibliografía:
Aho, A., Lam, M., Sethi, R., & Ullman, J. (1998). Compiladores: Principios, Tecnicas y Herramientas 2 Edicion. https://es.pdfcoke.com/document/319235593/Diseno-de-un-CompiladorOnline-usando-Flex-y-Bison