Professional Documents
Culture Documents
PCLEX y PCYAAC
Informe Cientfico
COMPILADORES
Resumen El presente documento pretende analizar, describir y definir cmo funcionan
los
analizadores lxicos y sintcticos (como lo son LEX y YAAC). Para lograr esto es
necesario conocer
el funcionamiento de cada uno de estos analizadores en donde se desarrolla un anlisis
detallado
del funcionamiento de las herramientas PCLEX y PCYAAC. Tambin se realiza una
prueba utilizando
herramientas existentes tales como el Flex y Bison que es un programa que genera
analizadores
semnticos y sintcticos de propsito general disponible prcticamente para todos los
sistemas
operativos. Luego de conocer los dos pilares de esta investigacin se proceder
finalmente a
exponer una breve conclusin general sobre los hallazgos encontrados.
Abstract - This paper aims to analyze, describe and define how the lexical and syntactic
analyzers
(such as LEX and YAAC). To achieve this it is necessary to see how each of these
analyzers where it
develops a detailed analysis of how the tools and PCYAAC PCLEX. Also run a test
using existing
tools such as Flex and Bison is a program that generates semantic and syntactic
analyzers general
purpose available for virtually all operating systems. After meeting the two pillars of t
his
investigation will proceed finally to present a brief overall assessment of the findings.
- INTRODUCCION
en una cadena de input y divide este input en cadenas de caracteres que coinciden con
las
expresiones. En los bordes entre los literales, se ejecutan las secciones de programas
proporcionados por el usuario. El fichero fuente lex asocia las expresiones regulares y
los
fragmentos de programas. Puesto que cada expresin aparece en el input del programa
escrito por el lex.
El estudio de una herramienta existente permitir mostrar cmo, utilizando expresiones
regulares, se puede combinar la especificacin de patrones con acciones, por ejemplo,
haciendo entradas de una tabla de smbolos cuya ejecucin se pueda pedir a un
analizador
lxico. Las reglas de conversin son de la forma:
p1 {accin 1}
p2 {accin 2}... ...
pn {accin n}
Donde pi es una expresin regular y cada accin es un fragmento de programa que
describe cul ha de ser la accin del analizador lxico cuando el patrn p i concuerda
con
un lexema. En LEX, las acciones se escriben en C, en general, sin embargo, pueden
estar en
cualquier lenguaje de implantacin.
-
Expresiones regulares
Definiciones - En este ejemplo, una de las primeras cosas a notar, son las dos lneas "%
%"
que sirven como separadores para las tres secciones de una especificacin lex, la
primera,
la de definiciones, sirve para definir cosas que se van a usar en el programa resultante o
en la misma especificacin, si vemos al ejemplo:
%{
#include
int palabra=0, numero=0;
%}
Numero
Palabra
-?[0-9]+
[a-zA-Z]+
Podemos ver dos tipos de declaraciones, declaraciones de C y declaraciones de lex, las
de
C son aquellas encerradas entre dos lneas %{ y %} respectivamente que le indican a
lex,
cuando se incluye cdigo que ser copiado sin modificar al archivo generado en C
(tpicamente lex.yy.c).
Las declaraciones de lex estn formadas por un nombre o identificador y su respectiva
expresin regular, su funcionamiento es anlogo a aquel del "#define" del preprocesador
de C, cada vez que aparecen es como si en ese lugar estuviera escrita la expresin
regular
equivalente, tambin se pueden usar estas para formar nuevas expresiones regulares,
incluso dentro de la misma seccin de declaraciones como veremos ms adelante.
Reglas - Esta seccin tambin puede incluir cdigo de C encerrado por %{ y %}, que
ser
copiado dentro de la funcin yylex(), su alcance es local dentro de la misma funcin.
Las reglas de lex, tienen el siguiente formato:
{Cdigo en C}
En el ejemplo podemos ver que:
"bye"
{bye();return 0;}
"quit"
{bye();return 0;}
"resume"
{bye();return 0;}
{Palabra}
{printf("Se ley la palabra : %s", yytext);palabra++;}
{Numero}
{printf("Se ley el numero : %d", atoi(yytext));numero++;}
. printf("%s",yytext[0]);
Son reglas tpicas de lex, donde la primera columna es la lista de expresiones regulares,
"bye", "quit" y "resume" por ejemplo, se encargan de terminar con el programa,
terminando la funcin yylex() llamando a la funcin bye() y despus return,
especificados
en la segunda columna.
Como ya vimos en la segunda columna se escriben acciones en C a realizar cada que se
acepta una cadena con ese patrn, misma que es almacenada en un array apuntado por
yytext, podemos ver que las acciones estn encerradas entre "{" y "}" lo que indica que
se
incluye ms de un statement de C por regla, el contra ejemplo es la ultima regla, que
reconoce cualquier caracter y lo imprime a la pantalla mediante el uso de printf().
Entonces, podemos decir que una regla de lex est formada por una expresin regular y
la
accin correspondiente, tpicamente encerrada entre "{" y "}".
Subrutinas - La tercera y ltima seccin es usada para escribir cdigo C, generalmente
se
usa para incluir funciones o subrutinas que se va a ocupar en el programa resultante, ya
sea que se llamen desde una regla como es el caso de bye() en nuestro ejemplo, o que se
llamen desde otro lugar como main(), es posible tambin modificar las funciones
internas
que usa lex, redefinindolas en esta seccin como veremos ms adelante.
III - Herramientas FLEX/LEX y Bison/YAAC
Lex/Flex reconoce expresiones regulares, y Yacc/Bison reconoce gramticas
independientes del contexto.
Lex/Flex divide el programa fuente en tokens y Yacc/Bison agrupa esos tokens.
Es habitual utilizar Lex/Flex y Yacc/Bison conjuntamente para desarrollar un
compilador.
Con Lex/Flex se construye el analizador morfolgico y con Yacc/Bison el sintctico.
Yacc/Bison construye a partir de la gramtica especificada por el usuario un
Analizador sintctico que reconoce entradas vlidas para dicha gramtica, es decir,
reconoce entradas sintcticamente vlidas.
-[3] Configurando FLEX y Bison en Windows y no morir en el intento -Flex es una
herramienta para generar escneres, es decir programas que reconocen patrones lxicos
en un texto. En otras palabras, flex se encarga de convertir esos patrones lxicos en
tokens que pueden servir para estructurar una gramtica (en el caso de un compilador) o
Luego debemos crear una carpeta en la unidad D:\ llamada PRUEBAS. Con esto ser
suficiente, pero es bueno recordar que las rutas son relativas. Eso s, al momento de
configurar las variables de entorno debemos tener cuidado de la ubicacin de ambas
carpetas.
Bueno, el siguiente paso es configurar el Flex para lo cual haremos lo siguiente:
1. Presionar window+r y escribir cmd. Se abrir la consola del windows, ah debemos
escribir lo siguiente:
view plainprint?
1.
d:
2.
3.
4.
5.
cd PRUEBAS
set djgpp=d:\djgpp\djgpp.env
set path=d:\djgpp\bin
flex -oanalisis.c FLE.L
Con esto se generar un archivo llamado analisis.c el cual podemos integrarlo a nuestro
proyecto en C. En este caso el archivo tiene su funcin main por lo que puede trabajar
por
si solo. Al ejecutar y enviarle un archivo con patrones lxicos veremos que nos
devolver
los tokens correspondientes.
V. -Realizando prueba con FLEX y Bison
Luego de haber realizado un anlisis detallado acerca de cmo funcionan los
analizadores
PCLEX/PCYAAC y configurado en windows nuestra herramienta FLEX/LEX y
Bison/YAAC,
realizaremos una prueba simple pero a la vez muy puntual del funcionamiento de LEX
con
el archivo analisis.c que se gener en la configuracin del FLEX; para la siguiente
prueba es
necesario crear un archivo *.txt al cual le ingresamos diferentes tipos de variables para
que sean interpretados por nuestro compilador.
-Para este caso creamos un archivo en bloc de notas llamado test.txt y le ingresamos
diferentes tipos de variables.
Luego abrimos el archivo analisis.c en Devc ++.
CONCLUSIONES-