You are on page 1of 13

Corporacin Universitaria Rmington

PCLEX y PCYAAC
Informe Cientfico

Jos Fdo. Hernndez Lodoo


Carlos Cano
Tutor: Ing. Diego Fernando Castao

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

El analizador lxico es la primera fase de un compilador. Su principal funcin consiste


en
leer los caracteres de entrada y elaborar como salida una secuencia de componentes
lxicos que utiliza el analizador sintctico para hacer el anlisis. Se han desarrollado
algunas herramientas para construir analizadores lxicos a partir de notaciones de
propsito especial basadas en expresiones regulares. El PCLEX (Analizador lxico) es
un
metacompilador cuya funcin es generar un programa que reconoce las palabras
reservadas, luego otra herramienta llamada PCYAAC (Analizador sintctico) tiene
como
funcin generar un programa que es la parte del compilador que indica si una sentencia
del lenguaje es vlida o no.
-[1] El lex es un generador de programas diseado para el proceso lxico de cadenas de
caracteres de input. El programa acepta una especificacin, orientada a resolver un
problema de alto nivel para comparar literales de caracteres, y produce un programa C
que reconoce expresiones regulares. Estas expresiones las especifica el usuario en
las especificaciones fuente que se le dan al lex. El cdigo lex reconoce estas expresiones

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

II. - Cmo funciona el LEX?


[2] Un analizador lxico creado por LEX se comporta en sincrona con un analizador
sintctico como sigue. Cuando es activado por el analizador sintctico, el analizador
lxico
crea una funcin llamada yylex, que una vez llamada, comienza a leer la entrada, un
carcter a la vez, hasta que encuentre el mayor prefijo de la cadena que concuerde con
una de las expresiones regulares pi. Entonces, ejecuta la accin i. Generalmente, accin
i
devolver el control al analizador sintctico. Sin embargo, si no lo hace, el analizador
lxico se dispone a encontrar ms lexemas, hasta que una accin hace que el control
regrese al analizador sintctico. La bsqueda repetida de lexemas hasta encontrar una
instruccin return explcita permite al analizador lxico procesar espacios en blanco y
comentarios de manera apropiada.
El analizador lxico devuelve un nico lexema al analizador sintctico que estar
almacenado en la variable yytext. Si queremos retornar ms informacin adems del
token, podemos usar la variable global yylval.
Los programas que se obtienen en LEX son muy grandes, (aunque muy rpidos
tambin),
lo cual a veces resulta perjudicial. Aunque su ventaja principal es que permite hacer
analizadores complejos con bastante rapidez.
LEX tiene su propio lenguaje, al que llamaremos LEX.
Ejemplo:
A continuacin se presenta un ejemplo que ilustra de manera general el uso de lex para
reconocer patrones de expresiones regulares bsicas, que reconoce cualquier numero
entero y cualquier palabra formada por letras maysculas de la "a" a la "z", sin importar
si
son maysculas o minsculas.

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

para colorear cdigo (En caso de un coloreador de cdigo).


A continuacin mostrar un ejemplo de script para flex:
Ahora bien, este script debemos enviarlo al Flex para que nos retorne un archivo en
lenguaje C el cual podemos integrar a nuestro proyecto que estamos realizando, de
manera sencilla.
Lo primero que debemos hacer es descargar el archivo djgpp.rar cuyo link de descarga
se
encuentra al final de este documento, crear una carpeta llamada DJGPP en la unidad D:\
y
descomprimir todos los archivos del *.rar aqu.

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 ++.

Lo ejecutamos y le ingresamos como parmetro el nombre del archivo que creamos


como
test.txt y presionamos enter:
El resultado de la compilacin es:

El comportamiento del programa generado imprime en pantalla la salida de los lexemas


que identifico el FLEX y proporciona informacin acerca de qu tipo de variable
corresponde, en la ltima lnea FLEX identifica 3 datos bolanos y una operacin lgica

que genera un informe al analizador sintctico Bison(YAAC) que indica que la


sentencia no
es sintcticamente correcta debido a un error lxico, como lo muestra el anlisis de la
siguiente figura:

CONCLUSIONES-

El analizador lxico es la primera fase de un compilador, su principal funcin consiste


en
leer los caracteres de entrada y elaborar como salida una secuencia de componentes
lxicos que utiliza el analizador sintctico para hacer el anlisis. Como pudimos
observar 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. Bison es un gen erador de
analizadores sintcticos de propsito general que convierte una descripcin para una
gramtica independiente del contexto en un programa escrito en C que analiza esa
gramtica. En fin Flex y Bison son analizadores importantes en la creacin de a rchivos
ejecutables.
Bibliografa:
- [1] http://www.medina-
web.com/programas/documents/tutoriales/lex_yacc/core/lex.html
- [2] http://es.scribd.com/doc/71053960/Microsoft-Word-PCLEX-doc-PUBLICO
- [3] http://rolandopalermo.blogspot.com/2009/12/como-configurar-flex-en-windows-y-
no.html

You might also like