Está en la página 1de 4

Generacin de analizadores lexicogrficos

Justificacin. Tarea realizada


Un analizador lexicogrfico para un lenguaje L analiza la forma de los componentes bsicos de un programa escrito en L; esas formas pueden describirse (en la mayor a de los casos! mediante expresiones regulares. "or ello# la forma de todas las piezas sintcticas existentes en la definicin lexicogrfica del lenguaje puede constituir la secuencia de patrones de una especificacin Lex; se incluye un patrn por cada pieza sintctica $ue deba reconocer el analizador lexicogrfico. %a accin correspondiente al acoplamiento de un patrn a una cierta secuencia de caracteres (en este caso se tratar de un lexema! ser la $ue corresponde a un analizador lexicogrfico& de'ol'er a la rutina llamante una representacin de la pieza sintctica encontrada en el texto de entrada. (s pues# la funcin yylex generada a partir de una especificacin debe de realizar la tarea de un analizador lexicogrfico; ello implica lo siguiente& ) cada 'ez $ue se llame a yylex deber a'anzar en la entrada *asta encontrar la siguiente pieza sintctica (esto es# en cada llamada a yylex se leer una pe$ue+a porcin del texto $ue se analiza!# ) las llamadas a yylex se realizan desde el analizador sintctico. %as operaciones $ue se ejecutan al producirse una llamada a yylex son& seleccionar el patrn $ue se acopla a la siguiente pieza sintctica# comunicar la representacin de la pieza sintctica cuyo lexema se *a acoplado y de'ol'er el control al analizador sintctico.

,specificacin lexicogrfica
-e los comentarios anteriores se deduce $ue la forma de una especificacin Lex# cuando se $uiera generar un analizador lexicogrfico para un lenguaje L# es la representada en este es$uema&

" " "

. / 0

{ return v1 } { return v2 } { return v3 }

" "

n). n

{ return vn-1 } { return vn }

%%
37

Todas las "iezas sintcticas

%%

38

Generacin de analizadores lexicogrficos

%a relacin de patrones "i est formada por las expresiones regulares $ue definen todas y cada una de las piezas sintcticas del lenguaje L; Vi es el 'alor representati'o de la pieza sintctica "i (el 'alor $ue se comunica al analizador sintctico!; ese 'alor *a de estar asociado de manera biun 'oca a la pieza sintctica. %as cajas dibujadas en el es$uema en la parte final de la seccin de reglas representan la necesidad de completar la especificacin# tal y como se comenta ms adelante.

-efinicin de los 'alores asociados a las piezas


%a funcin generada yylex es de tipo entero& de'uel'e un 'alor de tipo entero; por ello# los 'alores asociados a las piezas sintcticas *an de ser n1meros enteros. ,n principio# se puede elegir cual$uier 'alor para la asociacin (*ay alguna excepcin $ue se comenta despu2s!. ,s *abitual# para fa'orecer la legibilidad# $ue se den nombres a los 'alores num2ricos asociados a las piezas sintcticas; estos nombres se asignan mediante clusulas #define incorporadas en la seccin de definiciones. "or a*ora se considera la asignacin de nombres para todas las piezas sintcticas; no obstante# con'iene resaltar a$u $ue posteriormente se expondr otra manera distinta de definir la comunicacin entre los analizadores lexicogrfico y sintctico (esta otra manera resultar ser ms sencilla# ms fiable y la $ue realmente se emplea en la prctica *abitual; pero no se introduce a*ora por ser menos didctica!.

,specificacin completa
3a se *a comentado $ue# en general# con'iene $ue las especificaciones Lex sean completas; en el caso de la especificacin de un analizador lexicogrfico# esa con'eniencia se transforma en necesidad. ,n el analizador lexicogrfico se *a de pre'er la posible presencia de cual$uier carcter (representable! en el fic*ero de entrada# aun$ue sean caracteres $ue no pertenezcan al alfabeto del lenguaje analizado. 4a de tenerse especial cuidado en no ol'idar en la especificacin los patrones $ue se corresponden con los caracteres& espacio en blanco tabulador \t final de l nea \n $ue tan importante papel tienen en el anlisis lexicogrfico. "ara la mayor a de los lenguajes de programacin (as ocurre en los $ue se codifican con formato libre!# cuando se analiza lexicogrficamente un programa# *ay $ue saltar los espacios en blanco (espacios propiamente dic*os# tabuladores# caracteres indicati'os del final de una l nea!; en consecuencia# a los patrones $ue se corresponden con esos caracteres $ue *an de sobrepasarse se les debe de asociar la accin nula (la accin $ue consiste en no *acer nada! y cuando se acopla uno de esos patrones# no se de'uel'e el control al analizador sintctico. 5tese $ue si no de'uel'e el control# la funcin yylex contin1a a'anzando en la entrada# pasa a acoplar nue'os patrones& de esta manera se consigue saltar los caracteres $ue no constituyen piezas sintcticas. 6omo ejemplo de aplicacin de estas consideraciones puede repasarse el ,jemplo . expuesto en el cap tulo inicial sin explicar los detalles; a continuacin se da otro ejemplo.

Generacin de analizadores lexicogrficos

39

,jemplo 0
7e considera la especificacin l2xico)sintctica de una sencilla declaracin de tipos de datos (al estilo de las declaraciones de "ascal!; la gramtica est escrita en notacin 859 (mpliada; los corc*etes delimitados mediante apstrofos son s mbolos terminales (no metacaracteres! y las palabras reser'adas estn escritas en may1sculas.
<Tipo> ::= <TipoSimple> | ^ <Id> | TABLA [ <TipoSimple> ] <Tipo> <TipoSimple> ::= ENTEROS | CARACTERES | < um> .. < um> <Id> ::= <Letr!> { <Letr!> | <"i#ito> } <Letr!> ::= a | b | $ $ $ | z | A | B | $ $ $ | Z <"i#ito> ::= 0 | 1 | $ $ $ | 9

%a especificacin lexicogrfica de este lenguaje# escrita en Lex# es como sigue&


%%{ % %#define pr&ntero' ( %#define pr)!r!*tere' + %#define prT!,l! %#define pr"e . %#define pId / %#define p um 0 %#define p1untero 2 %#define p3,rir 4 %#define p)err!r 5 %#define pSep!r!dor (6 %#define &rror 555 % %%} % %letr! 7!8938:; %di#ito 7685; % %%% % %& T&<=S { return pr&ntero'> } %)3<3)T&<&S { return pr)!r!*tere'> } %T3?L3 { return prT!,l!> } %"& { return pr"e> } % %{letr!}@{letr!}|{di#ito}AB { return pId> } %{di#ito}C { return p um> } % %DED { return p1untero> } %D7D { return p3,rir> } %; { return p)err!r> } %DFFD { return pSep!r!dor> } % %7\ \t\n; { > } %F { return &rror> }

40

Generacin de analizadores lexicogrficos

,n el caso del patrn 7\ \t\n; no se de'uel'e el control# la accin asociada es no *acer nada; por ello# una 'ez acoplado ese patrn# desde yylex se intentar acoplar otro patrn# es decir# se a'anzar en la entrada# *abiendo saltado el espacio en blanco# o el tabulador o el final de l nea# tal y como debe de *acerse en un anlisis lexicogrfico. 5tese $ue el patrn 7\ \t\n;: tambi2n es correcto& en este caso se saltar an 'arios espacios en blanco (o tabuladores o finales de l nea! consecuti'os mediante una 1nica llamada a la funcin yylex. ,l 1ltimo patrn (el metacarcter uni'ersal punto! representa los caracteres $ue no pertenecen al alfabeto del lenguaje especificado y# por ello# corresponde de'ol'er una indicacin de error.

6omunicacin del lexema de una pieza sintctica


4ay piezas sintcticas $ue para $uedar definidas por completo re$uieren la indicacin de cules son sus atributos (lexicogrficos!. ,n todo caso# los atributos pueden deducirse del lexema de la pieza. ,l programa generado por Lex deja anotadas en las 'ariables globales yytext e yylen## respecti'amente# la secuencia de caracteres acoplada (en el caso de un analizador lexicogrfico se tratar del lexema de la pieza sintctica reconocida! y su longitud. -ado $ue estas 'ariables son globales# sus contenidos podrn consultarse desde el analizador sintctico. (s pues# a modo de recapitulacin de lo *asta a*ora descrito# puede decirse $ue la comunicacin entre los analizadores lexicogrfico y sintctico se realiza de la siguiente manera& ) el analizador lexicogrfico generado por Lex es la funcin yylex# ) el analizador sintctico produce sucesi'as llamadas a yylex# ) la funcin yylex de'uel'e un 'alor num2rico representati'o de la pieza sintctica detectada en el texto de entrada# ) en las 'ariables globales yytext e yylen# se pueden consultar (si fuera preciso desde el analizador sintctico! el lexema de la pieza y la longitud de ese lexema (secuencia de caracteres acoplada y sobrepasada!.

,rrores lexicogrficos
,n una especificacin Lex se pueden a+adir tratamientos relati'os a los distintos errores lexicogrficos detectables durante el anlisis; para ello# se incluye cdigo escrito en ) $ue realiza las tareas de emisin de los mensajes apropiados (y de la *ipot2tica recuperacin de los errores encontrados!. "ero no suele *acerse as . %a prctica *abitual es $ue cuando se encuentra una situacin anmala )en concreto cuando se encuentra un carcter $ue no pertenece al alfabeto del lenguaje analizado) se comunica al analizador sintctico (es decir# se de'uel'e a la funcin llamante! en 'alor especial representati'o de la presencia de un error. 3 ser desde en analizador sintctico desde donde se tomar en consideracin el error encontrado. ,n cierta manera podr a decirse $ue# por facilidad# los errores lexicogrficos se trasladan al analizador sintctico# esto es# se transforman en sintcticos.

9inal de fic*ero
6uando el analizador lexicogrfico (la funcin yylex!# en el intento de encontrar la siguiente pieza sintctica en el fic*ero de entrada (en el intento de acoplar un nue'o patrn! se encuentra con $ue eso es imposible a causa de $ue ya se *a llegado al final del fic*ero# de'uel'e un 'alor representati'o de esta situacin& el 'alor cero. "or esta razn# el n1mero cero no puede emplearse para representar una pieza sintctica# ni para indicar la presencia de un error.

También podría gustarte