You are on page 1of 28

Universidad Central Del Ecuador

Facultad De Ingeniera De Ciencias Fsicas Y Matemticas

Escuela De Ciencias

Lenguajes de Programacin Y Compiladores

Ma a !ara Ed"in #lcides

Cuarto $ %ercero

&''( $ &'')

C#*#C%E*+,%IC#, LE- . U/ 0E/E*#D1* DEL #/#LI2#D1* L3-IC1 Todos los procedimientos para la recuperacin de errores lexicogrficos son en la prctica mtodos especficos, y muy dependientes del lenguaje que se pretende compilar. Los auxilios de Lex escriben programas cuyos controlan flujo es dirigido por casos de expresiones regulares en la entrada cierta. Est bien preparado para las transformaciones de tipo de editor escritura y por segmentar entrada en preparacin para una rutina del parsing. La fuente de Lex es una mesa de expresiones regulares y los fragmentos del programa correspondientes. La mesa se traduce a un programa que lee un arroyo de la entrada, copindolo a un arroyo del rendimiento y di!idiendo la entrada en cordones que emparejan las expresiones dadas. "uando cada tal cordn se reconoce que el fragmento del programa correspondiente se ejecuta. El reconocimiento de las expresiones es reali#ado por un determinantico que el autmata finito generado por Lex. $e ejecutan los fragmentos del programa escritos por el usuario en el orden en el que las expresiones regulares correspondientes ocurren en el arroyo de la entrada. Y#CC La entrada de programa de computadora generalmente tiene alguna estructura% de &ec&o, cada programa de la computadora que &ace entrada puede pensarse de cmo definir un '' lenguaje(( de la entrada que acepta. )n idioma de la entrada puede ser tan complejo como un idioma de la programacin, o tan simple como una sucesin de n*meros. +nfortunadamente, los medios de la entrada usuales estn limitados, difciles de usar, y a menudo est flojo para !erificar sus entradas de !alide#. ,acc mantiene una &erramienta general describiendo la entrada a un programa de la computadora. El usuario de ,acc especifica las estructuras de su entrada, junto con el cdigo a ser in!ocado como cada tal estructura se reconoce. ,acc con!ierte semejante especificacin en un subprograma que el &an el dles el proceso de la entrada% frecuentemente, es con!eniente y destina para tener la mayora del flujo de mando en la aplicacin del usuario manejado por este subprograma. 0E/E*#D1*E, LE- Y Y#CC )n generador de anali#adores es un programa que acepta como entrada la especificacin de las caractersticas de un lenguaje L y produce como salida un anali#ador para L. La especificacin de entrada puede referirse a la lexicografa, la sintaxis o la semntica% el anali#ador resultante ser!ir para anali#ar las caractersticas especificadas.

Generador

E. Especificacin de las caractersticas del lenguaje L #. -nali#ador para L Los generadores Lex y ,acc sir!en, respecti!amente, para generar anali#adores lexicogrficos y anali#adores sintcticos para su apro!ec&amiento como partes de los compiladores de los lenguajes de programacin% estos usos de Lex y ,acc no son los *nicos, aunque s son los que aqu se consideran principalmente. /ara entender cabalmente el funcionamiento de los generadores de anali#adores, &ay que conocer la teora de compiladores relacionada con las tareas de anlisis de lenguajes. "uando se emplea el trmino Lex, se mencionan dos posibles significados. a0 )na notacin para especificar las caractersticas lexicogrficas de un lenguaje de programacin, b0 )n traductor de especificaciones lexicogrficas. Esta misma dualidad tambin es de aplicacin al trmino ,acc. E,4UEM# DE U,1 El esquema siguiente ilustra la manera de usar los generadores Lex y ,acc para obtener un anali#ador lxico sintctico de un lenguaje de programacin L, y de ejecutar el anali#ador obtenido. Los nombres que aparecen en el esquema significan. eLe5ic6l 7 es la especificacin de las caractersticas lexicogrficas del lenguaje L, escrita en Lex e,int687 es la especificacin de las caractersticas sintcticas del lenguaje L, escrita en ,acc le56886c7 es el anali#ador lexicogrfico de L generado por Lex% est constituido, en su parte principal, por una funcin escrita en " que reali#a las tareas de anlisis lexicogrfico basndose en autmatas regulares reconocedores de la forma de las pie#as sintcticas de L li9l7 es una librera asociada a Lex que contiene estructuras de datos y funciones a las que se puede &acer referencia desde el cdigo generado anLe,i. es el anali#ador generado% anali#a las caractersticas lexicogrficas y sintcticas especificadas del lenguaje L% acepta como entrada un programa escrito en L y comprueba si est codificado seg*n las especificaciones dadas / programa escrito en el lenguaje L.

1o es preciso que los nombres de los fic&eros de entrada para Lex y ,acc tengan una extensin determinada% los nombres de los fic&eros generados por Lex y ,acc son siempre los indicados, con independencia de cul sea el nombre de los fic&eros de entrada. 1:%E/CI;/ Y E!ECUCI;/ DEL #/#LI2#D1*

libl

liby

eLexic.l

lex.yy.c

lex
Compilador Montador

de C yacc e$int.y y.tab.c

anLe$i

2esultado 3el anlisis

El anali#ador lxico sintctico se obtiene tras la reali#acin de los siguientes pasos.

40 vi eLe5ic6l 7 edicin del fic&ero con las caractersticas lexicogrficas 50 vi e,int687 edicin del fic&ero con las caractersticas sintcticas 60 le5 eLe5ic6l7 traduccin de las caractersticas lexicogrficas 70 8acc e,int687 traduccin de las caractersticas sintcticas 80 cc le56886c 86ta96c $ll $l8 $o anLe,i7 compilacin del cdigo de los anali#adores generados 9El orden de pasos citado es una posibilidad, no una necesidad% se &a supuesto el uso del editor !i0. Los fic&eros sobre los que act*a el anali#ador lxico sintctico generado son 9sal!o que de manera explcita se indique otra cosa0 los pre definidos de entrada y de salida% as pues, la ejecucin del anali#ador obtenido puede &acerse de una las siguientes formas. anLe$i anLe$i :Entrada anLe$i :Entrada ;$alida $eg*n que se &aga o no re direccionamiento de los fic&eros de entrada y de salida pre definidos.

En el fic&ero 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 a&ora se considera la posibilidad ms sencilla. $i el programa anali#ado 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 alg*n error lexicogrfico o sintctico, se emite el mensaje syntax error 9ms adelante se justificar la ra#n por la que se emite este mensaje, tanto si se trata de un error lexicogrfico como si es uno sintctico0. P*10*#M#CI;/ DE #/#LI2#D1*E, MEDI#/%E LE-6 Le5 &a sido ampliamente usada para especificar anali#adores lxicos para una !ariedad de lenguajes. $e &ar referencia a la &erramienta como el compilador Le5, y a su especificacin de entrada como el lenguaje Le5. La discusin de una &erramienta existente nos permitir mostrar como la especificacin de patrones usando expresiones regulares puede estar combinada con acciones, como por ejemplo, crear entradas en una tabla de smbolos, expandir macros, o incluso generar documentacin automticamente. El programa Lex est dise<ado para ser utili#ado junto con el programa ,acc, que es un generador de anali#adores sintcticos.

Lex suele ser usado seg*n la siguiente figura.

/rimero, se prepara una especificacin de un anali#ador lxico creando un programa contenido, por ejemplo en el fic&ero prog.l, en lenguaje Lex. Entonces, prog.l se pasa a tra!s del compilador Lex para producir un programa en ", que por defecto se denomina lex.yy.c en el sistema operati!o )1+=. >ste consiste en una representacin tabular de un diagrama de transicin construido a partir de las expresiones regulares de prog.l, junto con una rutina estndar que usa la tabla de reconocimiento de lexemas. Las acciones asociadas con expresiones regulares en prog.l son tro#os de cdigo ", y son transcritas directamente a lex.yy.c. ?inalmente, lex.yy.c se pasa a tra!s del compilador " para producir un programa objeto, que por defecto se llama a.out, el cual es el anali#ador lxico que transforma una entrada en una secuencia de to@ens. )n programa Lex consta de tres secciones. <declaraciones= AA <reglas de traduccin= AA <procedimientos au5iliares= La seccin de declaraciones incluye declaraciones de !ariables, constantes y definiciones regulares. Las definiciones regulares son sentencias usadas como componentes de las expresiones regulares que aparecen en las reglas. Las reglas de traduccin de un programa Lex son sentencias de la forma. p4 Baccin4C p5 Baccin5C ... ... pn B accinn C

3onde cada pi es una expresin regular y cada accin i es un fragmento de programa, describiendo qu accin debe reali#ar el anali#ador lxico cuando el patrn pi se corresponde con un lexema. En Lex, las acciones estn escritas en ". La tercera seccin contiene cualesquiera procedimientos auxiliares que sean requeridos por las acciones. -lternati!amente, estos procedimientos pueden ser compilados separadamente y montados junto con el anali#ador lxico. )n anali#ador lxico creado por Lex funciona en concierto con un anali#ador sintctico de la siguiente manera. "uando es acti!ado por el anali#ador sintctico, el anali#ador lxico comien#a leyendo de su entrada un carcter a la !e#, &asta que encuentre el prefijo ms largo de la entrada que &a correspondido con una de las expresiones regulares p i. Entonces, ejecuta accin i, que tpicamente de!ol!er el control al parser. /ero, si no lo &ace, entonces el anali#ador lxico procede a buscar ms lexemas, &asta que una accin contenga una sentencia return o se lea el fic&ero completo. La b*squeda repetida de lexemas &asta una de!olucin explcita del control permite que el anali#ador lxico procese los espacios en blanco y comentarios con!enientemente. El anali#ador lxico de!uel!e un entero, que representa el to@en, al anali#ador sintctico. /ara pasar un !alor de atributo con informacin sobre el lexema, se puede usar una !ariable global llamada yyl!al. Esto se &ace cuando se use ,acc como generador del anali#ador sintctico. Los anali#adores lxicos, para ciertas construcciones de lenguajes de programacin, necesitan !er adelantadamente ms all del final de un lexema antes de que puedan determinar un to@en con certe#a. En Lex, se puede escribir un patrn de la forma r4Dr5, donde r4 y r5 son expresiones regulares, que significa que una cadena se corresponde con r 4, pero slo si est seguida por una cadena que se corresponde con r5. La expresin regular r5, despus del operador loo@a&ead EDE, indica el contexto derec&o para una correspondencia% se usa *nicamente para restringir una correspondencia, no para ser parte de la correspondencia. *ecuperacin de errores le5icogr>icos7 Los programas pueden contener di!ersos tipos de errores, que pueden ser.

Errores le5icogr>icos7 Fue !eremos a continuacin. Errores sintcticos7 /or ejemplo, una expresin aritmtica con mayor numero de parntesis de apertura que de cierre. Errores semnticas7 /or ejemplo, la aplicacin de un operador a un tipo de datos incompatible con el mismo. Errores lgicos7 /or ejemplo, un bucle sin final.

"uando se detecta un error, un compilador puede detenerse en ese punto e informar al usuario, o bien desec&ar una serie de caracteres del texto fuente y continuar con el anlisis, dando al final una lista completa de todos los errores detectados. En ciertas ocasiones es incluso posible que el compilador corrija el error, &aciendo una interpretacin co&erente de los caracteres ledos. En estos casos, el compilador emite una ad!ertencia, indicando la suposicin que &a tomado, y contin*a el proceso sin afectar a las sucesi!as fases de compilacin. Los errores lexicogrficos se producen cuando el anali#ador no es capa# de generar un to@en tras leer una determinada secuencia de caracteres. En general, puede decirse que los errores lexicogrficos son a los lenguajes de programacin lo que las faltas de ortografa a los lenguajes naturales. Las siguientes situaciones producen con frecuencia la aparicin de errores lexicogrficos. 4. Lectura de un carcter ?ue no pertenece al voca9ulario terminal previsto para el autmata6 Lo ms normal en este caso es que el autmata ignore estos caracteres extra<os y continu el proceso normalmente. /or ejemplo, pueden dar error en la fase de anlisis lexicogrfico la inclusin de caracteres de control de la impresora en el programa fuente para facilitar su listado. 5. 1misin de un carcter6 /or ejemplo, si se &a escrito EL$ en lugar de EL$E. 6. Se ha introducido un nuevo caracter. /or ejemplo, si escribimos EL$$E en lugar de EL$E. 7. @an sido permutados dos caracteres en el toAen anali ado . /or ejemplo, si escribiramos E$LE en lugar de EL$E. 8. Un carcter Ba sido cam9iado6 /or ejemplo, si se escribiera ELGE en !e# de EL$E. Las tcnicas de recuperacin de errores lexicogrficos se basan, en general, en la obtencin de los distintos sinnimos de una determinada cadena que &emos detectado como errnea. /or otra parte, el anali#ador sintctico es capa# en muc&os casos de a!isar al anali#ador lexicogrfico de cul es el to@en que espera que ste lea. /ara el ejemplo de borrado de un cracter, tenemos que los sinnimos de EL$E son EL$, ELE, E$E, y L$E. /or tanto, si incluimos en nuestro anali#ador una rutina de recuperacin de errores debidos a omisin de caracteres, cualquiera de estos sinnimos sera aceptado en lugar del lexema EL$E, se emitira la correspondiente ad!ertencia, y el proceso continuara asumiendo que se &a ledo el to@en :palHresHEL$E;. -nlogamente, podemos incluir rutinas para los dems casos. /or ejemplo, si el anali#ador lee el lexema E$LE, y no puede construir un to@en correcto para l

mismo, procedera a generar los sinnimos por intercambio de caracteres 9es decir, $ELE, EL$E o E$EL0 y comprobara si alguno de ellos es reconocible. En caso afirmati!o, genera el to@en correspondiente y ad!ierte al usuario del posible error y de su interpretacin automtica, continuando con el proceso.

F1*M# DE U/# E,PECIFIC#CI;/ LEE$F)EI- JE1E2-L )na especificacin Lex est compuesta por 6 secciones, tal y como se muestra en el siguiente esquema% la raya !ertical de la i#quierda representa el comien#o de las lneas del fic&ero texto de entrada, Es decir la posicin de la primera columna de cada lnea.

La correspondencia que se da entre las distintas partes de la especificacin de entrada y la estructura del fic&ero de salida% en esas explicaciones se &ar referencia a la siguiente figura que resume la relacin entre la entrada y la salida del traductor Lex.

lex.yy.c

/4
Especificacin escrita en lex %{ Lex CC

CC

/5
yylex () while
switch

%}

C&C C&& ........ .. ........ .. KK K.

C&C C&& ........ . KK K.

C&n

C&n

%% CD

CD

/6 /7

lex.yy.c

"ualquiera de las 6 secciones de una especificacin Lex puede estar ausente 9aunque la seccin de reglas es la fundamental, y su ausencia &ace que la especificacin resulte in*til0. El separador entre las secciones de definiciones y de reglas &a de estar presente, aunque ambas estn ausentes. El separador entre las secciones de reglas y de rutinas puede suprimirse cuando no &ay seccin de rutinas. 3entro de la seccin de definiciones, cualquiera de sus 5 partes puede estar presente o no. Todos los separadores &an de ponerse a partir de la primera columna. ,ECCI;/ DE DEFI/ICI1/E,6 C;DI01 DE DEFI/ICI1/E, Entre los delimitadores AB y AC se pone cdigo escrito en " que el traductor Lex traslada al fic&ero generado% ese traslado es literal y no se &ace comprobacin alguna% la correccin como tal cdigo " la !erificar el compilador de ". $e llama cdigo de definiciones porque es &abitual que est formado por definiciones de objetos a los que &ace referencia en el programa generado. El cdigo se traslada a la parte del principio del programa generado, por lo que queda colocado antes que el cdigo de las acciones asociadas a los patrones% as pues los nombres definidos aqu pueden ser referidos desde el cdigo de las acciones 9!ase el ejemplo 50. En el cdigo de definiciones suele ponerse. definiciones de constantes 9de macros0, declaraciones externas 9globales0, declaraciones Linclude 9para fic&eros con declaraciones0% en general, se coloca aqu el cdigo que deba de quedar al principio del programa generado escrito en ". En el esquema comparati!o entre la entrada y la salida es la parte representada por "4. ,ECCI;/ DE DEFI/ICI1/E,6 DEFI/ICI1/E, *E0UL#*E, Esta parte de la especificacin sir!e para asociar nombres a expresiones regulares% una !e# &ec&a una asociacin, se puede incorporar el nombre definido para la escritura de nue!as expresiones regulares. -s se consigue que las expresiones regulares se puedan escribir de manera ms legible y cmoda 9si son largas y complicadas0. La asociacin entre un nombre y una expresin regular se &ace escribiendo ambos en la misma lnea Men primer lugar el nombre y detrs la expresin regular separados ambos por al menos un espacio en blanco 9o tabulador0. El nombre debe ponerse a partir de la primera columna de la lnea. Los nombres se

%{
separacin nombr e expresin regular

%%
construyen seg*n las mismas normas de los identificadores en el lenguaje " 9con letras, dgitos y el carcter guin inferior% no pueden empe#ar por un dgito0. )na !e# definido un nombre, se puede usar de inmediato% esto es, se puede incorporar a la escritura de nue!as definiciones regulares que se pongan a continuacin y tambin en las expresiones regulares de la seccin de reglas. $i al escribir una expresin regular se quiere emplear un nombre pre!iamente definido, &a de ponerse ese nombre delimitado por lla!es, tal y como se &ace en las subexpresiones con nombre descritas en el captulo dedicado a las expresiones regulares Lex. $ea el siguiente ejemplo.

NAB N NO O O O O N NAC N N!ocal 9aPePiPoPu0 NletraIin Qa #R NpalabraIin BletraIinCS N NAA N NB!ocalCQT UR NBpalabraIinC% /ara determinar la expresin regular efecti!amente definida cuando en su escritura se &a incorporado alg*n nombre descrito con anterioridad, se &ace una sustitucin literal del nombre por la expresin regular asociada a l tal y como se &a explicado en el captulo dedicado a las expresiones regulares Lex. -s, en el ejemplo anterior las expresiones regulares definidas son. 9aPePiPoPu0QT UR Qa #RS, $i en el ejemplo anterior se pone la definicin sin los parntesis

!ocal entonces, la expresin regular B!ocalCQT UR representa

aPePiPoPu

aPePiPoPuQT UR

- continuacin se pone otro ejemplo de definiciones regulares. NAB N NO O O O O N NAC Nletra Ncifra Qa #R QT UR

Ncaracter BletraCPBcifraC N empleando la *ltima de ellas puede ponerse. BcaracterCS 9BcaracterC0S ,ECCI;/ DE *E0L#, Est formada por una secuencia de pares asociados. patrn, accin% el patrn es una expresin regular y la accin es un bloque de cdigo escrito en ". que representa que representa BletraCPBcifraCS 9BletraCPBcifraC0S

/4 /5 .............. ..... .............. ..... .............. ..... .............. .....

-4 -5

/q

-q

/atrones 9Expresiones regulares0

-cciones 9"digo "0

Lo que se pretende con la especificacin de estos pares es 9como ya se &a apuntado en la introduccin0. cuando en la parte del texto de entrada que en cada momento corresponda leer, se encuentra una secuencia de caracteres que se acopla 9se amolda, se ajusta0 a la expresin regular de uno de los patrones especificados, entonces se procede a la reali#acin de las operaciones indicadas por el cdigo de la accin asociada% tambin se sobrepasa 9se considera ya leda0 la secuencia de caracteres acoplada. Is adelante se explica la manera precisa con la que se selecciona un patrn entre todos los especificados. La forma de escribir las expresiones regulares y el cdigo " debe someterse a ciertas normas. La expresin regular de cada regla empie#a en la primera columna de la lnea,entre la expresin regular y el comien#o del cdigo de la accin debe de &aber al menos un espacio en blanco 9o tabulador0% precisamente el primero de esos espacios se toma como el metacarcter que marca el final de la expresin, $i el cdigo de una accin tiene ms de una sentencia o si se extiende a lo largo de !arias lneas, es preciso que !aya delimitado mediante lla!es% as pues, las lla!es delimitadoras pueden e!itarse cuando la accin est formada por una *nica instruccin escrita en la misma lnea donde se &a puesto la expresin regular% no obstante suele recomendarse poner siempre las lla!es delimitadoras

%%
Expresin regular $eparacin -ccin

para fa!orecer la legibilidad de la especificacin. La accin asociada a un patrn nunca puede Vestar !acaW% toda expresin regular &a de lle!ar aparejada una accin. $i la accin que corresponde es no

&acer nada, &a de ponerse el cdigo " que representa esa operacin. la sentencia !aca 9un simple punto y coma0. En el esquema que relaciona la entrada y la salida del traductor Lex, el cdigo de las acciones est representado por "54, "55, ..., "5n% estas partes de cdigo especificadas en la entrada se trasladan literalmente al cdigo de salida% quedan colocadas en el cuerpo de la funcin yylex, dentro de una sentencia sXitc& que selecciona la accin correspondiente al patrn acoplado. ,ECCI;/ DE *U%I/#, En esta seccin se incluye cdigo escrito en " que se traslada literalmente al fic&ero generado% lo que suele ponerse es el cdigo de las funciones a las que se &a &ec&o referencia desde el cdigo de las acciones de la seccin de reglas. -qu no &ay que poner cuidado en la colocacin del cdigo en las lneas y columnas, se trasladar manteniendo la colocacin y ser un texto de entrada para el compilador de ". En el esquema que relaciona la entrada y la salida del traductor Lex, el cdigo de esta seccin est representado por "6. En ese mismo esquema las partes de la salida representadas por P1, P2, P3 y P4 no interesan para lo que aqu se est exponiendo. P*10*#M# 0E/E*#D1 P1* Y#CC
-1YL+$+$ E$T2)"T)2-L

El problema que se pretende resol!er mediante el programa generado por ,acc consiste en la reali#acin de un anlisis estructural de un texto de entrada. El programa generado recibe como entrada una secuencia representati!a de los componentes elementales de un texto, y comprueba si esa secuencia se ajusta a la estructura definida por una gramtica de contexto independiente% los componentes elementales recibidos son los smbolos terminales de la gramtica. "on otras palabras. el programa generado por ,acc anali#a sintcticamente un texto% para ello, recibe como entrada la secuencia de pie#as sintcticas proporcionada por un anali#ador lexicogrfico encargado de la lectura del texto de entrada. $e trata, pues, de un anlisis jerrquico que complementa el anlisis lineal reali#ado por un programa generado por Lex. E/%*#D# Y ,#LID# P#*# EL %*#DUC%1* Y#CC En el siguiente esquema se muestra, de una manera simplificada, lo que constituye la entrada y la salida para el traductorDgenerador ,acc.

/rograma generado

Especificacin yyparse

...

... ..

yacc

9e$int.y0

9y.tab.c0

La entrada a ,acc es una especificacin sintctica 9estructural0 escrita en forma de gramtica de contexto independiente 9codificada de manera semejante a la notacin Z1? 1o ampliada0. Las gramticas son mecanismos adecuados para la especificacin de las caractersticas sintcticas de los lenguajes de programacin y se representan con una notacin textual fcil de procesar% por estos moti!os resultan apropiadas para emplearlas como entrada a ,acc para generar anali#adores sintcticos. La salida es un programa escrito en " cuya parte central es una funcin llamada yyparse que reali#a el anlisis sintctico de la secuencia de pie#as sintcticas recibidas. El algoritmo incorporado a la funcin lle!a a cabo un anlisis sintctico ascendente por despla#amiento y reduccin, seg*n el mtodo L-L2940. La gramtica de entrada a ,acc debe de cumplir la condicin L-L2940% el propio traductor comprueba que la gramtica proporcionada sea adecuada% si no lo es, se emiten los oportunos mensajes indicati!os. [a de notarse que la condicin L-L2940 es distinta de la condicin LL940 que se considera en los anali#adores descendentes. La gramtica de entrada a ,acc &a de ser exclusi!amente sintctica. se trata de generar un anali#ador sintctico% la descripcin de las caractersticas lexicogrficas no debe de considerarse aqu. -unque se !ol!er sobre ello, con!iene apuntar a&ora que en la notacin ,acc no se tiene una facilidad anloga a la notacin Z1? -mpliada para escribir gramticas de manera ms compacta. -unque en este momento no pueda entenderse el moti!o, para conseguir un funcionamiento ms efica# del anali#ador generado, con!iene que la gramtica de entrada proporcionada a ,acc sea recursi!a por la i#quierda% es decir, en caso de que la gramtica tenga que ser recursi!a, es preferible que lo sea por la i#quierda a que lo sea por la derec&a. El funcionamiento del anali#ador generado se apoya en. )na estructura de datos, la pila de estados, cuyo contenido es un reflejo de las situaciones por las que se !a pasando durante el proceso de anlisis,

)nas funciones de transicin 9las funciones goto y action, implementadas mediante tablas0 que son indicati!as de la e!olucin que debe tomar el proceso de anlisis conforme se !an recibiendo las sucesi!as pie#as sintcticas. LL#M#D#, # L# FU/CI;/ 0E/E*#D# P1* Y#CC Iediante una *nica llamada a la funcin yyparse se desencadena la ejecucin del anlisis sintctico de todo el texto de la entrada. Lo que ocurre &abitualmente es. desde yyparse se llama reiteradamente a un anali#ador lexicogrfico 9que debe ser una funcin de nombre yylex0, y la *nica llamada a yyparse se produce desde otra funcin de mayor ni!el jerrquico 9que suele ser una funcin main0. La funcin yyparse, como se precisar ms adelante, de!uel!e un !alor de tipo entero representati!o del resultado del anlisis sintctico efectuado.

F1*M# DE U/# E,PECIFIC#CI;/ Y#CC )na especificacin ,acc est formada por 6 secciones, tal y como se ilustra en el siguiente esquema% la raya !ertical de la i#quierda representa el comien#o de las lneas del fic&ero texto de entrada, es decir la posicin de la primera columna de cada lnea. /uede obser!arse que es por completo anloga a la forma de una especificacin Lex.

En el primer captulo ya se &a mostrado un ejemplo inicial de especificacin escrita en ,acc, que se puede tomar como referencia para las explicaciones de este captulo. En lo que sigue se explica la correspondencia que &ay entre las distintas partes de una especificacin de entrada y la estructura del correspondiente fic&ero de salida% en esas explicaciones se &ace mencin de la siguiente figura que refleja la relacin entre la entrada y la salida del traductor ,acc.

y.tab.c

Especificacin escrita en ,acc %{ ,acc

CC

CEDF CC

/4

C&

%}

/5

/6
%% C&

/7

Yyparse

La codificacin de una especificacin ,acc no es tan rgida como la de una especificacin Lex. podra decirse que la entrada a ,acc se escribe con un formato libre% no obstante, la costumbre y el estilo tpico de las especificaciones ,acc indican que. El separador de secciones AA y los delimitadores AB y AC se coloquen en la primera columna de una lnea, Los smbolos de la parte i#quierda de las producciones se empiecen a escribir a partir de la primera columna de una lnea.

)na especificacin ,acc &a de tener al menos una produccin en la seccin de reglas. Las secciones de definiciones y de rutinas pueden estar !acas% en caso de ausencia de la seccin de rutinas puede suprimirse el separador AA que marca el final de la seccin de reglas% el separador AA entre las secciones de definiciones y de reglas siempre &a de estar presente, aunque no exista la seccin de definiciones. ,ECCI;/ DE DEFI/ICI1/E, G C;DI01 DE DEFI/ICI1/E, $e trata de cdigo escrito en " y delimitado por los smbolos AB y AC% no es necesario que estos delimitadores se pongan a partir de la primera columna de una lnea, pero es la costumbre. El cdigo " de esta seccin suele estar formado por definiciones globales de objetos que se usan en otras partes del cdigo generado. Este cdigo se traslada literalmente al fic&ero de salida, al principio de cdigo generado. En el esquema que relaciona la especificacin y el fic&ero generado, este cdigo est representado por "4. ,ECCI;/ DE DEFI/ICI1/E, G DEFI/ICI1/E, DE L1, ,+M:1L1, En la seccin de definiciones tambin se incluyen di!ersas definiciones relati!as a los smbolos terminales y no terminales de la gramtica sintctica especificada con posterioridad en la seccin de reglas. "ada smbolo terminal se declara poniendo su nombre y un !alor numrico asociado a l% esta asociacin se define con objeto de fijar el !alor empleado en la comunicacin entre los anali#adores lexicogrfico y sintctico. En esta declaracin se emplea la palabra reser!ada Ato@en% as, por ejemplo, las declaraciones Ato@en nombre1 n4 Ato@en nombre2 n5 definen nombre1 y nombre2 como nombres de smbolos terminales de la gramtica sintctica, y asocian el !alor n4 al smbolo nombre1 y el !alor n5 al smbolo nombre2. Los !alores asociados mediante la declaracin Ato@en deben de concordar con los !alores que realmente de!uel!e el anali#ador lexicogrfico

9!alores que se &abrn definido para las pie#as sintcticas en la especificacin de Lex0. "on!iene insistir de nue!o en que &ay otra manera ms simple y ms segura de definir los !alores asociados a los smbolos terminales de la gramtica sintctica 9pie#as sintcticas en la especificacin lexicogrfica0, pero su descripcin se deja para ms adelante% la que de momento se emplea se considera ms didctica. Los nombres de los smbolos terminales pueden declararse en cualquier orden% los !alores que se asocian a los nombres pueden ser cualesquiera, y no necesariamente consecuti!os 9&ay alguna excepcin. el !alor numrico T representa que el anali#ador lexicogrfico &a alcan#ado el final del fic&ero, el !alor numrico 4 tiene un significado especial para el programa generado por ,acc0. -unque es prctica extendida poner en cada lnea una palabra reser!ada Ato@en para declarar un *nico nombre de smbolo, es posible poner estas declaraciones agrupadas de otras maneras. Los nombres dados a los smbolos terminales pueden construirse con letras 9min*sculas y may*sculas0, cifras decimales y el carcter guin inferior% una cifra no puede ser el primer carcter del nombre. El smbolo 9no terminal0 inicial de la gramtica se declara mediante la palabra reser!ada Astart% as la declaracin Astart nombre indica que se considere nombre como el smbolo inicial de la gramtica. Los nombres de los smbolos no terminales se construyen seg*n las mismas normas que las indicadas para los smbolos terminales. La declaracin Astart se puede colocar en cualquier parte de la seccin 9no es necesario que preceda o que siga a las declaraciones Ato@en0 y su presencia no es obligada 9si no se incluye, se considera como smbolo inicial de la gramtica el smbolo de la par te i#quierda de la primera regla que se ponga en la seccin de reglas0. 1tese que los smbolos no terminales de la gramtica sintctica no se declaran explcitamente. no estn anotados en la seccin de definiciones% en el traductor ,acc se presupone que son smbolos no terminales todos aquellos smbolos empleados en la escritura de la gramtica 9en la seccin de reglas0 y que no &an sido declarados de antemano como smbolos terminales. -l contrario que en la notacin Z1?, no se tiene una manera propia para escribir los smbolos no terminales% en ,acc los smbolos terminales y los no terminales se escriben seg*n las mismas normas citadas% se distinguen unos de otros porque los smbolos terminales se declaran y los smbolos usados pero no declarados se toman como no terminales.

[ay otras declaraciones relati!as a los smbolos de la gramtica que no se consideran aqu% son las que emplean las palabras reser!adas Aleft, Arig&t y Anonassoc. /1M:*E, DE L1, ,+M:1L1, DE L# 0*#MH%IC#6 En la notacin de ,acc no se emplean los caracteres : y ; para delimitar los nombres de los smbolos no terminales% ya se &a comentado antes cmo se escriben y cmo se distinguen entre s los smbolos terminales y no terminales.

,EP#*#CI;/ E/%*E L#, D1, P#*%E, DE U/# *E0L#6 En ,acc la separacin entre la parte i#quierda y la parte derec&a de una regla se indica mediante el carcter dos puntos% en la notacin Z1? esta separacin est representada mediante la secuencia de tres caracteres ..\.

*E0L#, C1/ L# MI,M# P#*%E I24UIE*D#6 /ara indicar que !arias reglas consecuti!as tienen la misma parte i#quierda, tanto en ,acc como en Z1? se emplea el carcter I.

P#*%E DE*EC@# 4UE E, L# P#L#:*# J#C+#6 En la notacin de ,acc la palabra !aca se representa mediante la ausencia de la parte derec&a% esto es, para indicar la presencia de la palabra !aca no se pone smbolo alguno 9precisamente la ausencia de smbolo es la representacin de la palabra !aca0% en la notacin Z1? la palabra !aca suele representarse con la letra griega ].

,EP#*#CI;/ E/%*E L1, ,+M:1L1, DE L# P#*%E DE*EC@#6 /ara indicar la separacin entre dos smbolos consecuti!os de la parte derec&a de una regla, en la notacin de ,acc &a de ponerse al menos un espacio en blanco 9o un tabulador, o incluso un final de lnea0% se puede decir que as ocurre tambin en la notacin Z1?.

M#*C# DE FI/#L DE *E0L#6 En una especificacin ,acc, no es preciso indicar explcitamente el punto donde termina una regla 9detrs del *ltimo smbolo de la parte derec&a0% no obstante, para fa!orecer la legibilidad de la gramtica, en el estilo &abitual de escritura se pone un punto y coma para indicar el final de una regla, o bien un punto y coma

detrs de la *ltima regla de una secuencia de reglas consecuti!as que tienen la misma parte i#quierda. En la notacin Z1? no se marca el final de las reglas. -s pues, el carcter punto y coma es un metasmbolo de la notacin ,acc. I/E-I,%E/CI# DE U/# /1%#CI;/ #MPLI#D#6 La notacin Z1? tiene dos !ariantes. -mpliada y 1o -mpliada% en la ampliada se usan metasmbolos para simplificar la escritura. En la notacin de ,acc no son de uso tales metasmbolos. $e podra resumir esta carencia de ,acc diciendo que una gramtica de entrada a ,acc &a de escribirse en notacin no ampliada. La escritura de las reglas de la gramtica es flexible 9puede codificarse en formato libre0% no obstante, ciertas prcticas se &an con!ertido en estilo &abitual de codificacin. /or ejemplo. cada regla se escribe 9si cabe0 en una lnea *nica y el smbolo no terminal de la parte i#quierda se escribe a partir de la primera columna. En general, el orden de colocacin de las reglas es indiferente% pero &ay casos especiales 9para gramticas que tienen ciertas peculiaridades0 que no se consideran aqu en los que el orden de colocacin de las reglas influye en el funcionamiento del anali#ador generado. - continuacin se exponen algunos ejemplos. "onsidrese la produccin, escrita en notacin Z1? -mpliada :Lista; ..\ id K L id M En primer lugar se transforma esta regla para dejarla en notacin Z1? 1o -mpliada

:Lista;

..\ id :2estoLista;

:2estoLista; ..\ L id :2estoLista; P]

Las producciones transformadas se escriben en la notacin ,acc de la siguiente manera.

Ato@en p+d ^ Ato@en p"oma 48 AA Lista . p+d 2estoLista % 2estoLista . p"oma p+d 2estoLista % %

,a se &a comentado que en las especificaciones sintcticas escritas en ,acc suelen resultar preferibles 9por cuestiones de eficacia en el funcionamiento del anali#ador generado0 las gramticas con producciones recursi!as por la i#quierda. La lista de identificadores separados entre s por comas que antes se &a especificado mediante la regla :Lista; ..\ id K L id M tiene una estructura que tambin puede expresarse en notacin Z1? 1o -mpliada mediante las producciones recursi!as por la i#quierda siguientes. :Lista; ..\ id P :Lista; L id que escritas con la notacin ,acc quedan as.

Lista . p+d % Lista p"oma p+d % "omo una ilustracin ms de la forma de escribir gramticas en ,acc, a continuacin se pone la gramtica de la especificacin sintctica del Ejemplo 6 9la declaracin de los nombres de los smbolos terminales ya se &a expuesto anteriormente0. AA Tipo . Tipo$imple % P p/untero p+d % P prTabla p-brir Tipo$imple p"errar pr3e Tipo % Tipo$imple . prEnteros % P pr"aracteres % P p1um p$eparador p1um % En otro estilo &abitual de escritura de las especificaciones ,acc el metacarcter punto y coma slo se coloca detrs de la *ltima regla del grupo que comparten la misma parte i#quierda% tambin se pueden incorporar comentarios escritos con la misma notacin que en el lenguaje ". $eg*n esto, los ejemplos anteriores tambin suelen escribirse de la siguiente manera. Lista. p+d 2estoLista % 2estoLista . p"oma p+d 2estoLista % D_ palabra !acia _D % Lista . p+d Lista p"oma p+d

% Tipo : TipoSimple | pPuntero pI | prTa!la p"!rir TipoSimple p#errar % TipoSimple : pr&nteros % | pr#aracteres % | p'um pSepara or p'um %

pr$e

Tipo

El traductor ,acc reali#a una serie de comprobaciones sobre la gramtica que se le proporciona como entrada% as, se comprueba. Fue todos los smbolos no terminales sean *tiles, Fue la gramtica sea L-L2940, Fue todas las reglas se empleen en alguna operacin de reduccin.

$i no se cumplen satisfactoriamente las condiciones comprobadas, se emiten mensajes indicati!os de las deficiencias encontradas% algunas deficiencias de la gramtica impiden que se genere el anali#ador% otras !eces se genera el anali#ador aunque se &ayan detectado deficiencias en la gramtica 9en estos casos se puede decir que el traductor resuel!e mediante la aplicacin de ciertos criterios los defectos encontrados al anali#ar la gramtica0. El traductor ,acc, a partir de las reglas de la gramtica, obtiene las funciones de transicin y de operacin relati!as a un autmata en el que apoya el algoritmo reconocedor 9el anali#ador sintctico0% estas funciones, implementadas mediante tablas, se trasladan al fic&ero generado. La funcin yyparse, que reali#a el anlisis del texto de entrada, es un algoritmo *nico e in!ariable para todos los anali#adores que se generan% desde esta funcin se consultan las tablas generadas en cada caso. /uede decirse que el anali#ador sintctico generado por ,acc est formado por un algoritmo y unas estructuras de datos% el algoritmo es el mismo para todas las gramticas, lo que cambia seg*n el lenguaje que se anali#a son las estructuras de datos. En el esquema que relaciona la entrada y la salida del traductor ,acc puede apreciarse que el cdigo de la funcin yyparse ocupa la parte final del fic&ero generado. ,ECCI;/ DE *U%I/#, En esta seccin se coloca cdigo escrito en ", que se traslada literalmente al fic&ero generado. )sualmente se ponen aqu rutinas de apoyo para el

tratamiento semntico% son funciones a las que se llama desde las acciones que pueden asociarse a las reglas de la gramtica. %*#%#MIE/%1 DE E**1*E, El anali#ador sintctico generado por ,acc detecta di!ersas situaciones de error que pueden presentarse% como ya se &a comentado la funcin yyparse de!uel!e Mpara las situaciones que aqu se consideran el !alor 4 si se encuentra un error. El anali#ador generado reali#a un tratamiento de errores simple. cuando se encuentra un error se pro!oca la terminacin del anlisis% as se considera aqu. 1o obstante, se pueden incluir en la especificacin de entrada rutinas dedicadas a la recuperacin de errores% la ejecucin de esas rutinas puede asociarse a distintas situaciones que susceptibles de presentarse durante el proceso de anlisis. En la librera de ,acc se tiene una funcin, de nombre yyerror, a la que se llama cuando se encuentra un error% la cabecera de esta funcin es. yyerror 9const c&ar _errmsg0 el parmetro de la funcin es un literal indicati!o de la clase de error que se &a encontrado% la ejecucin de esta funcin &ace que el mensaje comunicado se muestre por pantalla 9o por el fic&ero de salida que se tenga como pre definido0. Las dos clases de error ms significati!as detectadas por el anali#ador generado son. Error sintctico. Es el error que se presenta con mayor frecuencia. 9,a se &a dic&o antes que en las implementaciones reali#adas con Lex y ,acc, la presencia de un carcter no perteneciente al alfabeto se trata como si fuese un error sintctico0. En este caso, la llamada a yyerror desde el cdigo de la funcin generada yyparse es yyerror 9Vsyntax errorV0 3esbordamiento de la pila de estados. $i la pila de estados del anali#ador sintctico generado est implementada mediante una estructura esttica 9la modalidad de la implementacin depende de la !ersin de ,acc0, puede ocurrir que se sobrepase su capacidad durante el anlisis de la entrada. En este caso, la llamada a yyerror es yyerror 9Vyacc stac@ o!erfloXV0 La funcin yyerror se puede redefinir% para ello, &a de incluirse en la especificacin de entrada a ,acc 9en la seccin de rutinas0 una nue!a definicin de la funcin que tenga ese mismo nombre y el parmetro del tipo adecuado. -qu se propone una !ersin de yyerror que informa sobre la lnea en la que se &a encontrado el error y que proporciona el lexema actual 9en el momento en que se produce la deteccin del error0. - continuacin se da una posible !ersin.

yyerror 9c&ar _mensaje0 B printf 9E`nIensaje proporcionado.`nE0% printf 9E;;; As`n`nE, mensaje0% printf 9ELinea actual . Ad`nE, yylineno0% printf 9ELexema actual. As`n`nE, yytext0% printf 9E-nalisis suspendido.`n`nE0% C En este cdigo se &ace referencia a la !ariable de nombre yylineno% se trata de una !ariable de la librera de Lex que, al ser considerada como !ariable global, puede utili#arse desde el cdigo de una especificacin ,acc. En esta !ariable se lle!a la cuenta de las lneas ledas en el fic&ero de entrada% cada !e# que se detecta el final de una lnea, se incrementa en 4 el contenido de yylineno.

You might also like