Está en la página 1de 17

DIRECCIN GENERAL DE EDUCACIN SUPERIOR

TECNOLGICA
INSTITUTO TECNOLGICO DE CIUDAD VALLES
DEPARTAMENTO DE SISTEMAS Y COMPUTACIN

LENGUAJES Y AUTOMATAS II
INVESTIGACION LEX Y YACC
INGENIERA EN SISTEMAS COMPUTACIONALES
SEMESTRE 7
UNIDAD 2
MARTINEZ FELIX SALOMON
10690422
SANCHEZ FLORES ARTEMIO
10690519
DOCENTE:

Investigacin Lex y Yacc

Fecha: 24/09/14
CD. VALLES, S.L.P

Contenido
INTRODUCCIN A LOS GENERADORES LEX Y YACC...........................................................................................3
Generador...................................................................................................................................................................3
Esquema de uso..............................................................................................................................................................4
Compilador.................................................................................................................................................................5
Montador....................................................................................................................................................................5
C.................................................................................................................................................................................5
Obtencin y ejecucin del analizador............................................................................................................................6
Ejemplo 1.......................................................................................................................................................................7
EL PROGRAMA GENERADO POR LEX.....................................................................................................................10
ENTRADA Y SALIDA PARA EL TRADUCTOR LEX.................................................................................................12
CONCLUSION................................................................................................................................................................15
BIBLIOGRAFIA..............................................................................................................................................................16

Introduccin a los generadores Lex y Yacc

INTRODUCCIN A LOS GENERADORES LEX Y YACC


Un generador de analizadores es un programa que acepta como entrada la
especificacin de las caractersticas de un lenguaje L y produce como salida

Generador

un analizador para L. La especificacin de entrada puede referirse a la


lexicografa, la sintaxis o la semntica; el analizador resultante servir para
analizar las caractersticas especificadas.
E Especificacin de las caractersticas del lenguaje L
A Analizador para L
Los

generadores

analizadores

Lex

Yacc

lexicogrficos

sirven,

respectivamente,

analizadores

para

sintcticos

generar

para

su

aprovechamiento como partes de los compiladores de los lenguajes de


programacin; estos usos de Lex y Yacc no son los nicos, aunque s son los
que aqu se consideran principalmente.
Para entender cabalmente el funcionamiento de los generadores de
analizadores, hay que conocer la teora de compiladores relacionada con las
tareas de anlisis de lenguajes.

Investigacin Lex y Yacc

Cuando se emplea el trmino Lex, se mencionan dos posibles


significados:
a) una notacin para especificar las caractersticas lexicogrficas de un
lenguaje de programacin,
b) un traductor de especificaciones lexicogrficas.
Esta misma dualidad tambin es de aplicacin al trmino Yacc.

Esquema de uso
El esquema de la pgina siguiente ilustra la manera de usar los generadores
Lex y Yacc para obtener un analizador lxico-sintctico de un lenguaje de
programacin L, y de ejecutar el analizador obtenido. Los nombres que
aparecen en el esquema significan:
ELEXIC.L
es la especificacin de las caractersticas lexicogrficas del lenguaje L,
escrita en Lex
ESINT.Y
es la especificacin de las caractersticas sintcticas del lenguaje L, escrita
en Yacc
LEX.YY.C
es el analizador lexicogrfico de L generado por Lex; est constituido, en su
parte principal, por una funcin escrita en C que realiza las tareas de
anlisis lexicogrfico basndose en autmatas regulares reconocedores de
la forma de las piezas sintcticas de L
LIBL
es una librera asociada a Lex que contiene estructuras de datos y funciones
a las que se puede hacer referencia desde el cdigo generado
LIBY
es una librera asociada a Yacc con la misma utilidad que la anterior
Y.TAB.C
es el analizador sintctico generado por Yacc; est constituido, en su parte
principal, por una funcin escrita en C que realiza las tareas de anlisis
sintctico segn el mtodo ascendente LALR (1), basado en tablas

Introduccin a los generadores Lex y Yacc

ANLESI
es el analizador generado; analiza las caractersticas lexicogrficas y
sintcticas especificadas del lenguaje L; acepta como entrada un programa
escrito en L y comprueba si est codificado segn las especificaciones
dadas
Programa escrito en el lenguaje L
libl

eLexic.l

liby

lex.yy.c

lex
Compilador
Montador
de

yacc

eSint.y

y.tab.c

anLeSi

Resultado
del anlisis

No es preciso que los nombres de los ficheros de entrada para Lex y Yacc
tengan una extensin determinada; los nombres de los ficheros generados por
Lex y Yacc son siempre los indicados, con independencia de cul sea el
nombre de los ficheros de entrada.

Investigacin Lex y Yacc

Obtencin y ejecucin del analizador


El analizador lxico-sintctico se obtiene tras la realizacin de los siguientes
pasos:
1) vieLexic.- edicin del fichero con las caractersticas lexicogrficas
2)vieSint.- edicin del fichero con las caractersticas sintcticas
3) lexeLexic.- traduccin de las caractersticas lexicogrficas
4) yacceSint.- traduccin de las caractersticas sintcticas
5)

cc lex.yy.c y.tab.c ll ly o anLeS.- compilacin del cdigo de los

analizadores generados
(El orden de pasos citado es una posibilidad, no una necesidad; se ha
supuesto el uso del editor vi).
Los ficheros sobre los que acta el analizador lxico-sintctico generado son
(salvo que de manera explcita se indique otra cosa) los pre-definidos de
entrada y de salida; as pues, la ejecucin del analizador obtenido puede
hacerse de una las siguientes formas:
anLeSi
anLeSi <Entrada
anLeSi <Entrada >Salida
Segn que se haga o no re-direccionamiento de los ficheros de entrada y de
salida pre-definidos.
En el fichero de entrada se proporciona un programa escrito en L. La salida,
que debe de informar sobre el resultado del anlisis, puede ser ms o menos
elaborada; por ahora se considera la posibilidad ms sencilla. Si el programa
analizado es correcto en lo que respecta al lxico y a la sintaxis, no se emite
indicacin alguna; si el programa no es correcto porque tiene algn error
lexicogrfico o sintctico, se emite el mensaje syntax error (ms adelante se
justificar la razn por la que se emite este mensaje, tanto si se trata de un
error lexicogrfico como si es uno sintctico).

Introduccin a los generadores Lex y Yacc

Ejemplo 1
Con este ejemplo inicial se muestra, antes de empezar el estudio detallado,
una aplicacin de los generadores Lex y Yacc para obtener un analizador
lxico-sintctico de un lenguaje simple. Se proporciona la solucin sin
explicacin alguna; lo nico que se pretende ahora es obtener automticamente un analizador, y probar su funcionamiento.
Se trata de una clase sencilla de expresiones aritmticas en las que
pueden encontrarse:
-

variables

(nombres

escritos

en

minsculas,

de

cualquier

longitud),
- constantes (nmeros con cifras decimales de cualquier longitud),
- operadores ( +, *),
- parntesis.
La sintaxis de las expresiones se define mediante la siguiente gramtica
(escrita en notacin BNF-Ampliada):
<Expresion> ::= <Termino> { + <Termino> }
<Termino> ::= <Factor> { * <Factor> }
<Factor>

::= ( <Expresion> )

| id
| cte

Investigacin Lex y Yacc

La entrada a Lex (la especificacin lexicogrfica), si se emplean los nombres


pId, pCte, pSum, pMul, pAbr y pCer para representar las distintas piezas
sintcticas del lenguaje, es:

Introduccin a los generadores Lex y Yacc

%{
#define pId 1
#define pCte 2
#define pSum 3
#define pMul 4
#define pAbr 5
#define pCer 6
#define Error 999
%}
%%
[a-z]+

{ return pId; }

[0-9]+

{ return pCte; }

"+"

{ return pSum; }

"*"

{ return pMul; }

"("

{ return pAbr; }

")"

{ return pCer; }

[\ \t\n] { ;
.

{ return Error; }

La entrada a Yacc (la especificacin sintctica) es, considerada a partir de una


gramtica equivalente a la dada, pero escrita en notacin BNF-No ampliada,
es:
%token pId 1
%token pCte 2
%token pSum 3
%token pMul 4
%token pAbr 5
%token pCer 6
%start Expresion
%%
Expresion : Termino RestoExpr ;
RestoExpr : pSum Termino RestoExpr ;

| ;

Termino : Factor RestoTerm ;

Investigacin Lex y Yacc

RestoTerm : pMul Factor RestoTerm ;

| ;

Factor : pId ;

| pCte ;

| pAbr Expresion pCer ;

%%
main () {
yyparse ();
}
La raya vertical puesta a la izquierda de las dos especificaciones representa la
posicin de la primera columna de las lneas de los ficheros de tipo texto.
Si el analizador obtenido se aplica a la entrada (x + y) * cota, que es una
expresin correcta, no se obtiene mensaje alguno como resultado del anlisis;
si se aplica a la entrada x+y*+z, que es una expresin incorrecta, se obtiene
como salida la indicacin syntax error; si se aplica a la entrada x + y? z, que
contiene un carcter que no pertenece al alfabeto (error lexicogrfico), tambin se obtiene el resultado syntax error.

Introduccin a los generadores Lex y Yacc

11

EL PROGRAMA GENERADO POR LEX


Anlisis de secuencias de caracteres
El problema que se pretende resolver con la ayuda de esta herramienta
consiste en encontrar en un texto grabado en un fichero secuencias de
caracteres que se ajusten a unas determinadas formas (a unos determinados
modelos o patrones), y una vez encontrada una secuencia que se ajusta a un
patrn proceder a la realizacin de unas operaciones que se tengan asociadas
a ese patrn. En la figura adjunta el smbolo representa el final de una lnea
en el fichero de texto analizado.

En la prctica habitual suelen tenerse varios patrones, cada uno de ellos con
sus correspondientes operaciones (tareas) asociadas; el siguiente esquema

. . . . . . . . . . . .
Patrn [ forma ]

Accin [ operaciones ]

ilustra esta variedad de patrones en una nica especificacin Lex:


Por ejemplo, si se quisieran contar las palabras en minsculas (cada palabra
. . . . . . . . . .

P1

Pq

............

............

P2

. . . . . . . . . . . .

. . . . . . .

A1
A2

Aq

es una secuencia de una o ms letras minsculas grabadas de forma


consecutiva) y los nmeros (cada nmero es una secuencia de cifras

Investigacin Lex y Yacc

decimales grabadas de forma consecutiva) que hay en un fichero de tipo


texto, se tendra:
P1

patrn indicativo de la forma de una palabra en

minsculas
P2 patrn indicativo de la forma de un nmero
A1 incrementar en una unidad el contador de palabras
A2 incrementar en una unidad el contador de nmeros

Introduccin a los generadores Lex y Yacc

13

ENTRADA Y SALIDA PARA EL TRADUCTOR LEX


El siguiente esquema muestra en qu consisten la entrada y la salida para el
programa traductor Lex (por ahora se trata de una descripcin preliminar; ms
adelante se ampliarn los detalles). La entrada a Lex es una especificacin en
la que se asocian los patrones y las acciones.

Especificacin

Programa generado

...
..

...
.

yylex

lex

(eLexic.l)

(lex.yy.c)

Los patrones se describen mediante expresiones regulares (ampliadas sobre


su definicin originaria). El uso de expresiones regulares est justificado por
estas razones:
- una expresin regular es un texto, una sucesin de caracteres que
resultan fciles de leer y procesar por el traductor Lex,
- suele ocurrir que la forma de las secuencias de caracteres a las que se
quiere aplicar el analizador generado se puede describir con facilidad
mediante expresiones regulares.
Las acciones se describen mediante cdigo escrito en el lenguaje C debido a
que:
- el traductor Lex produce un analizador que es un programa escrito en C
- el cdigo de las acciones escrito en la especificacin de entrada se
traslada de manera literal a la salida, esto es, queda incorporado al
programa escrito en C.
La salida producida por Lex es un programa cuya parte principal la constituye
una funcin, de nombre yylex, que realiza el anlisis de un texto segn los
patrones indicados en la especificacin de la entrada. El algoritmo definido por
la funcin est representado en el siguiente ciclo:

Investigacin Lex y Yacc

acoplar un patrn a partir del punto actual de la entrada


avanzar en la entrada hasta sobrepasar la secuencia acoplada
ejecutar la accin asociada al patrn acoplado
Llamadas a la funcin generada
Aunque las preguntas y los comentarios que ahora se exponen se irn
concretando y confirmando en los puntos siguientes, ya desde ahora cabe
insistir en que son cuestiones importantes que han de tenerse en cuenta.
Lex genera una funcin de nombre yylex; en relacin con esta funcin procede
hacer estas dos preguntas que siguen.
1) Para que se ejecute yylex ha de producirse una llamada, desde dnde se
puede realizar esa llamada? Desde distintos lugares:
- desde la funcin que haga las veces de analizador sintctico, en el
caso

de

que

la

funcin

generada

yylex

sea

un

analizador

lexicogrfico,
- desde la funcin principal main,
- desde otra funcin cualquiera.
En todo caso, la funcin llamante puede estar incorporada o no a la propia
especificacin.
2) Qu tarea se pretende realizar cuando se ejecuta una llamada a yylex?
La tarea de anlisis llevada a cabo por yylex se ha esbozado
anteriormente, pero restan detalles por concretar:
- se lee todo el fichero en una nica llamada o hay que realizar varias
llamadas para completar la lectura,
- se devuelve algn valor o se actualizan variables globales,
- se obtienen o no resultados globales relativos a todo el texto
grabado en el fichero de entrada.
Como se aprecia en el algoritmo que se ejecuta cada vez que se llama a la
funcin yylex, se trata de un ciclo repetido reiteradamente hasta que el
fichero de entrada queda analizado por completo. En efecto, en general, con
una nica llamada a yylex es suficiente para analizar por completo el fichero
de entrada; pero tambin es posible que las acciones asociadas a los patrones

Introduccin a los generadores Lex y Yacc

15

lleven incorporadas sentencias return. La presencia de una sentencia return


hace que se abandone la ejecucin del ciclo y se devuelva el control a la
rutina llamante, sin proseguir con la lectura del texto de entrada; la lectura
ese texto se completar en sucesivas llamadas a yylex.
Lo habitual es que el anlisis del texto de entrada comience con la
primera llamada a yylex.
Los siguientes esquemas ilustran las dos maneras de funcionamiento; ambas
son factibles y tiles: el uso de una u otra depende del problema que se
mientras quede texto

mientras quede texto

return

quiera resolver con el programa generado por Lex.


Si se vuelve sobre el ejemplo 1 expuesto en el captulo inicial, se observa que
en las acciones asociadas a todas las expresiones regulares, excepto en una,
est incluida la sentencia return; en el prximo captulo se ver un ejemplo en
el que ninguna de las acciones de la especificacin tiene incluida esa
sentencia de devolucin del control. As pues, la cantidad de patrones que se
aplican en cada llamada a la funcin generada y, por lo tanto, la cantidad de
texto del fichero de entrada que se analiza durante la ejecucin de esa
llamada depende de las acciones que se asocien a los patrones.

Investigacin Lex y Yacc

CONCLUSION
El programa MKS Lex es una poderosa herramienta para la creacin de
aplicaciones que deben realizar algn tipo de anlisis lxico de entrada. La
elaboracin de un analizador lxico eficiente requiere una cuidadosa atencin
tanto a los patrones de lex , y sus acciones C asociados . Conociendo un poco
de ingenio , sin embargo , ayuda a la herramienta de cumplir su promesa de
hacer ms fcil el desarrollo de software

Introduccin a los generadores Lex y Yacc

BIBLIOGRAFIA
www.unjbg.edu.pe/coin2/pdf/01040502103.pd
www.lpsi.eui.upm.es/webcomp/jgperez/ lexyacc/p03.doc

http://www.mkssoftware.com/docs/wp/wp_lyuse.asp

17

También podría gustarte