Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES 1odo lengua[e de programacln tlene reglas que prescrlben la estructura slntctlca de programas blen lormados. Ln ascal, por e[emplo, un programa se compone de bloques, un bloque de proposlclones, una proposlcln de expreslones, una expresln de componentes lexlcos, y asl suceslvamente. Se puede descrlblr la slntaxls de las construcclones de los lengua[es de programacln por medlo de gramtlcas lndependlentes del contexto o notacln 8nl (lorma de 8ackus - naur). Las gramtlcas olrecen venta[as slgnlllcatlvas a los dlsenadores de lengua[es y programadores de complladores. una gramtlca da una especlllcacln slntctlca preclsa y lcll de entender de un lengua[e de programacln. A partlr de algunas clases de gramtlcas se puede construlr automtlcamente un anallzador slntctlco ellclente que determlne sl un programa luente est slntctlcamente blen lormado. una gramtlca dlsenada adecuadamente lmparte una estructura a un lengua[e de programacln utll para la traduccln de programas luente a cdlgo ob[eto correcto y para la deteccln de errores. Los lengua[es evoluclonan con el tlempo, adqulrlendo nuevas construcclones y reallzando tareas adlclonales. Lstas nuevas construcclones se pueden anadlr con ms lacllldad a un lengua[e cuando exlste una apllcacln basada en una descrlpcln gramatlcal del lengua[e L P4PL uL 4N4Ll24uOk 5lN14c1lcO Ln este modelo de compllador, el anallzador slntctlco obtlene una cadena de componentes lexlcos del anallzador lexlco, como se muestra en la llgura y comprueba sl la cadena pueda ser generada por la gramtlca del lengua[e luente. Se supone que el anallzador slntctlco lnlormar de cualquler error de slntaxls de ANALI SI S SI NTACTI CO lN1kOuucclON t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES manera lntellglble. 1amblen deberla recuperarse de los errores que ocurren lrecuentemente para poder contlnuar procesando el resto de su entrada. Los metodos empleados generalmente en los complladores se claslllcan como descendentes o ascendentes. Como sus nombres lndlcan, los anallzadores slntctlcos descendentes construyen rboles de anllsls slntctlco desde arrlba (la ralz) hasta aba[o (las ho[as), mlentras que los anallzadores slntctlcos ascendentes comlenzan en las ho[as y suben hacla la ralz. Ln ambos casos, se examlna la entrada al anallzador slntctlco de lzqulerda a derecha, un slmbolo a la vez. Los metodos descendentes y ascendentes ms ellclentes traba[an slo con subclases de gramtlcas, pero varlas de estas subclases, como las gramtlcas LL y L8, son lo sullclentemente expreslvas para descrlblr la mayorla de las construcclones slntctlcas de los lengua[es de programacln. Los anallzadores slntctlcos lmplantados a mano a menudo traba[an con gramtlcas LL1, por e[emplo, el metodo de la seccln 2.4 construye anallzadores slntctlcos para gramtlcas LL1. Los anallzadores slntctlcos para la clase ms grande de gramtlcas L8 se construyen normalmente con herramlentas automatlzadas. Monejo de rrores Sl un compllador tuvlera que procesar solo programa correctos, su dlseno e lmplantacln se slmpllllcarlan mucho. ero los programadores a menudo escrlben programas lncorrectos y un buen compllador deberla ayudar al programador a ldentlllcar y locallzar errores Se sabe que los programas pueden contener errores de muy dlverso tlpo. or e[emplo, los errores pueden ser: t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Lexlcos, como escrlblr mal un ldentlllcador, palabra clave u operador. Slntctlcos, como una expresln arltmetlca con parentesls no equlllbrados. Semntlcos, como un operador apllcando a un operando lncompatlble. Lglcos, como una llamada lnllnltamente recurslva. A menudo, gran parte de la deteccln y recuperacln en un compllador se centra en la lase de anllsls slntctlco. una razn es que muchos errores son de naturaleza slntctlca o se manlllestan cuando la cadena de componentes lexlcos que provlene de un anallzador lexlco desobedece las reglas gramatlcales que dellnen al lengua[e de programacln. Ll mane[ador de errores en un anallzador slntctlco tlene ob[etlvos lclles de establecer: uebe lnlormar de la presencla de errores con clarldad y exactltud. Se debe recuperar de cada error con la sullclente rapldez como para detectar errores posterlores. no debe retrasar de manera slgnlllcatlva el procesamlento de programas correctos. varlos metodos de anllsls slntctlco, como los metodos LL y L8, detectan un error lo antes poslble. Ls declr, tlenen la propledad del prell[o vlable, lo cual qulere declr que detectan la presencla de un error nada ms ver un prell[o de la entrada que no es prell[o de nlnguna cadena del lengua[e. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Muchas construcclones de los lengua[es de programacln tlenen una estructura lnherentemente recurslva que se puede dellnlr medlante gramtlcas lndependlentemente del contexto. or e[emplo, se puede tener una proposlcln condlclonal dellnlda por una regla como: Sl 51 y 52 son proposlclones y L es una expresln, entonces: ll then 51 else 52" es una proposlcln. no se puede especlllcar esta lorma de proposlcln condlclonal usando la notacln de las expreslones regulares . Sl utlllzamos la varlable slntctlca prop para denotar la clase de las proposlclones y expr para la clase de las expreslones, ya se puede expresar la proposlcln usando la produccln gramatlcal. ptop |f expt then ptop e|se ptop 1. Los termlnales son los slmbolos bslcos con que se lorman las cadenas. Componente Lexlco" es un slnnlmo de termlnal" cuando se trata de gramtlcas para lengua[es de programacln. (|f, then, e|se). 2. Los no termlnales son varlables slntctlcas que denotan con[untos de cadenas. (ptop y expt son no termlnales). Los no termlnales dellnen con[untos de cadenas que ayudan a dellnlr el lengua[es generado por la gramatlca. 3. Ln una gramtlca, un no termlnal es conslderado como el slmbolo lnlclal, y el con[unto de cadenas que representa es el lengua[e dellnldo por la gramtlca. 4. Las producclones de una gramtlca especlllcan como se pueden comblnar los termlnales y los no termlnales para lormar cadenas. Cada produccln consta de un no termlnal, seguldo por una llecha (a veces se usa el slmbolo ::==, en lugar de la llecha), segulda por una cadena de no termlnales y termlnales. 6romtico Libre de contexto t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES convenciones de Notocin ara evltar tener que establecer slempre que estos son los termlnales", estos son los no termlnales", etc., a partlr de ahora se emplearn las slgulentes convenclones de notaclones con respecto a las gramtlcas: 1. Lstos slmbolos son termlnales: a. Las prlmeras letras mlnusculas del allabeto, como a, b, c. b. Los slmbolos de los operador, como +, -, etc. c. Los slmbolos de puntuacln, como parentesls, coma, etc. d. Los dlgltos 0, 1, . 9. e. Cadenas en negrltas como |d o |f. 2. Lstos slmbolos son no termlnales: a. Las prlmeras letras mayusculas del allabeto, como A, 8, C. b. La letra 5, que cuando aparece suele ser el slmbolo lnlclal. c. Los nombres en curslvas mlnusculas, como expt o ptop. 3. Las ultlmas letras mlnusculas del allabeto, prlnclpalmente u,v,.., z. representan cadenas de termlnales. 4. Las ultlmas letras mayusculas del allabeto como \, , 2, representan slmbolos gramatlcales, es declr, termlnales o no termlnales. 3. Las letras grlegas mlnusculas , , , or e[emplo, representan slmbolos gramatlcales. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES jemp/o: La gramtlca con las slgulentes producclones dellne expreslones arltmetlcas slmples: Ln esta gramtlca los slmbolos termlnales son: ? los no termlnales son: expt y op y expt es el slmbolo lnlclal jemp/o: usando estas abrevlaturas se podrla en lorma conclsa la gramtlca del e[emplo anterlor. Las convenclones de notacln lndlcan que y A son no termlnales, con como slmbolo lnlclal. Ll resto de slmbolos son termlnales. jemp/o: La cadena - (ld + ld) es una lrase de la gramtlca anterlor, porque exlste la derlvacln. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES 4rbo/ de 4n/isis 5intctico y uerivociones un rbol de anllsls slntctlco se puede conslderar como una representacln grllca de una derlvacln que no muestra la eleccln relatlva al orden de sustltucln. jemp/o: Se consldera de nuevo la gramtlca anterlor de expreslones arltmetlcas. La lrase ld + ld * ld tlene las dos claras derlvaclones por la lzqulerda. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES 4mbiqedod: Se dlce que una gramtlca que produce ms de un rbol slntctlco para alguna lrase es amblgua. C dlcho de otro modo, una gramtlca amblgua es la que produce mas de una derlvacln por la lzqulerda o por la derecha de la mlsma lrase. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Ln todos los lengua[es de programacln con proposlclones condlclonales, se prellere el prlmer rbol slntctlco. La regla general es empare[ar cada else con el then sln empare[ar anterlor ms cercano". Lsta regla para ellmlnar amblguedades se puede lncorporar dlrectamente a la gramtlca. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES 4n/isis 5intctico uescendente con ketroceso Ll anllsls slntctlco descendente (ASu) lntenta encontrar entre las producclones de la gramtlca la derlvacln por la lzqulerda del slmbolo lnlclal para una cadena de entrada. L[emplo: Anallzar la cadena de entrada cad" dada la gramtlca slgulente: cad", se toma la prlmera produccln Anlisis Sintctico Descendente t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES cad", se toma la segunda produccln. slgulente ho[a del rbol A - cabd cad" se compara con la slgulente ho[a del rbol etlquetada con b". Como no concuerda, se lndlca el error y se vuelve a A para ver sl hay otra alternatlva no lntentada. cad", se toma la slgulente alternatlva que comlenza por a. slgulente ho[a del rbol A, - cad cad", colnclde d con d - anllsls exltoso t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES 4n/isis 5intctico uescendente con Predictivo Ll anallzador debe reallzar la prevlsln de la regla a apllcar slo con ver el prlmer slmbolo que produce para que el algorltmo tenga una comple[ldad llneal. L[emp|o: . Sent |f Lxpress then Sent . Sent wh||e Lxpress do Sent . Sent beg|n Sent end Lxlste slo una poslbllldad de derlvacln, segun que el prlmer slmbolo que haya en la entrada sea un ll, whlle o begln 4n/isis 5intctico uescendente con Predictivo Las gramtlcas que son susceptlbles de ser anallzadas slntctlcamente de lorma descendente medlante un anllsls predlctlvo y consultando un unlcamente un slmbolo de entrada pertenecen al grupo LL(1). A partlr de gramtlcas LL(1) se pueden construlr anallzadores slntctlcos descendentes predlctlvos (ASu), que son ASu sln retroceso. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES conjuntos de Prediccin Son con[untos de slmbolos termlnales Ayudan a predeclr que regla se debe apllcar para el no 1ermlnal que hay que derlvar. Se construyen a partlr de los slmbolos de las partes derechas de las producclones de la gramtlca. Ll anallzador consulta el slgulente slmbolo en la entrada. sl pertenece al con[unto de predlccln de una regla apllca esa regla, sl no da error. jemp/os de conjuntos de Prediccin Supngase la entrada babxcc", que se han leldo ya los slmbolos subrayados en babxcc", y la gramtlca es: A - a 8 c | x C | 8 8 - bA C - c Cue produccln debe tomar para segulr el anllsls? La cadena de derlvaclones ha sldo: A - 8 - bA - ba8c - babAc Ahora hay que segulr desarrollando la varlable A utlllzando los con[untos de predlccln. Como la slgulente letra es una .x. se ellge la segunda opcln (A - x C) La gramtlca t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES no cumple los requlsltos para LL(1) porque sl aparece una a" en la entrada hay dos poslbles opclones. Luego el anllsls: no puede ser predlctlvo y, la gramtlca no es LL(1). Clculo de los con[untos de predlccln Clculo de los prlmeros Clculo de los slgulentes c/cu/o de /os conjuntos de Prediccin Los con[untos de predlccln se calculan: en luncln de los prlmeros slmbolos que puede generar la parte derecha de la regla, y cuando la parte derecha puede generar la cadena vacla, en luncln de los slmbolos que pueden aparecer a contlnuacln de la parte lzqulerda de la regla en una lorma sentenclal derlvable del slmbolo lnlclal. ara poder dellnlr el con[unto de predlccln es necesarlo determlnar: conjunto de primeros calcular los prlmeros slmbolos que genera una cadena de termlnales y no termlnales conjunto de siquientes obtener los slmbolos que pueden segulr a un no termlnal en una lorma sentenclal. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES C|cu|o de |os pr|meros Sea una gramtlca uel.- Sl o es una lorma sentenclal compuesta por una concatenacln de slmbolos, 8lM() es el con[unto de termlnales (o \) que pueden aparecer lnlclando las cadenas que pueden derlvar de o. uel. lormal- keg|as: t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Gramt|ca C|cu|o de |os S|gu|entes Se apllca a no termlnales (_ n ) de la gramtlca (A) uevuelve el con[unto de termlnales que pueden aparecer a contlnuacln de A en alguna lorma sentenclal derlvada del slmbolo lnlclal y un slmbolo ($) que representa el llnal de la cadena de entrada. uel.- Sl A es un slmbolo lnlclal no termlnal de la gramtlca, SlC(A) es el con[unto de termlnales (y $) que pueden aparecer a contlnuacln de A en alguna lorma sentenclal derlvada del slmbolo lnlclal. uel. lormal t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES keg|as para e| C|cu|o de| con[unto de |os s|gu|entes c/cu/o de /os siquientes de /o qromtico: 6romtico t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES C|cu|o de |os con[untos de pred|cc|n La luncln 8Lu se apllca a producclones de la gramtlca (A -o ) devuelve un con[unto de predlccln que puede contener cualesqulera de los termlnales de la gramtlca y el slmbolo $, pero nunca puede contener \. Cuando el ASu tlene que derlvar un no 1ermlnal consulta el slmbolo de entrada y lo busca en los con[untos de predlccln de cada regla de ese no termlnal. sl los con[untos de predlccln son dls[untos, el AS podr construlr una derlvacln por la lzda. de la cadena de entrada. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES La Cond|c|n LL(1) Gramt|cas LL(1), se debe cump||r: Caracter|st|cas de |a cond|c|n LL(1) La secuencla de tokeos se anallza de lzqulerda a derecha. Slempre derlva el no termlnal que aparezca ms a la lzqulerda. Slo es necesarlo ver un tokeo de la secuencla de entrada para averlguar que regla de produccln segulr. L[emp|o de |a Gramt|ca LL(1) Sl se anade la regla 8 a t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES jCump|e esta gramt|ca |a cond|c|n LL(1)? Mod|f|cac|n de gramt|cas no LL(1) Lllmlnacln de la amblguedad lactorlzacln por la lzqulerda Lllmlnacln de la recurslvldad por la lzqulerda t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Caracter|st|cas Algunas caracterlstlcas garantlzan que una gramtlca no es LL(1): 8ecurslva por la lzqulerda Slmbolos comunes por la lzqulerda Amblgua Lxlsten metodos para modlllcarla y convertlrla en una gramtlca LL(1) L||m|nac|n de |a Amb|gedad Ms de un rbol slntctlco poslble. no exlste una metodologla para ellmlnarla 5o/ucin: replantearse el dlseno de la mlsma para encontrar una gramtlca no amblgua equlvalente (que genere el mlsmo lengua[e).
Iactor|zac|n por |a Izqu|erda:
Sl dos producclones alternatlvas de un slmbolo A emplezan lgual, no se sabr por cul de ellas segulr. 5o/ucin: reescrlblr las producclones de A para retrasar la declsln hasta haber vlsto lo sullclente de la entrada como para eleglr la opcln correcta. keg|a genera| para factor|zar por |a |zqu|erda: Lncontrar el prell[o ms largo comun a dos o ms producclones de A, pero slempre aquel que sea comun a ms producclones Sl exlste un prell[o comun ms corto en varlas producclones y otro ms largo en un par de ellas, hay que ellmlnar prlmero el ms corto comun a las varlas ( y= tal que || < | y |). t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES So|uc|n: sustltulr las producclones: Sea la gramtlca Sent - ll xpt then 5eot else 5eot endll Sent - ll xpt then 5eot endll Sent - ottos Solucln: sustltulrlo por dos producclones de la lorma t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES L||m|nac|n recurs|va por |a |zqu|erda: una gramtlca es recurslva por la lzqulerda. keg|a para mod|f|car una gramt|ca 8egla para modlllcar una gramtlca y de[e de ser recurslva por la lzqulerda. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES L[emp|o de una convers|n de una gramt|ca en LL(1) t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Ana||zador s|ntct|co descendente pred|ct|vo d|r|g|do por tab|a Modelo de un ASu no recurslvo dlrlgldo por tabla Modelo del anallzador slntctlco predlctlvo Construccln de la tablas de anllsls slntctlco rocedlmlento para construlr tablas de anllsls LL(1) Mensa[es de error de tlpo slntctlco Caracter|st|cas Ls otra lorma de construlr un ASu Construccln utlllzando una plla de slmbolos (termlnales y no termlnales) A la vlsta de un tokeo de preanllsls se buscar en la tabla de anllsls. rlmero construlr la tabla y despues reallzar el proceso de anllsls. Lxp||cac|n de| grf|co Ll programa tlene en cuenta A, el slmbolo de la clma de la plla, yo, el slmbolo en curso de la entrada. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Construcc|n de |as tab|as de an||s|s S|ntct|co t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES roced|m|entos para constru|r tab|as de an||s|s t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Ll ob[etlvo de un anllsls ascendente conslste en construlr el rbol slntctlco desde aba[o hacla arrlba, esto es, desde los tokeos hacla el axloma lnlclal, lo cual dlsmlnuye el numero de reglas mal apllcadas con respecto al caso descendente (sl hablamos del caso con retroceso) o amplla el numero de gramtlcas susceptlbles de ser anallzadas (sl hablamos del caso LL(1)). 1anto sl hay retroceso como sl no, en un momento dado, la cadena de entrada estar dlvldlda en dos partes, denomlnadas o y : : representa el trozo de la cadena de entrada (secuencla de tokeos) por consumlr: 1* . Colncldlr slempre con algun trozo de la parte derecha de la cadena de entrada. Como puede suponerse, lnlclalmente colnclde con la cadena a reconocer al completo (lncluldo el LCl del llnal). o: colncldlr slempre con el resto de la cadena de entrada, trozo al que se habrn apllcado algunas reglas de produccln en sentldo lnverso: o (n u 1)* or e[emplo, sl qulsleramos reconocer ld + ld + ld", partlendo de la gramtlca del cuadro Se comenzarla a construlr el rbol slntctlco a partlr del rbol vaclo (o = c) y con toda la cadena de entrada por consumlr ( = ld + ld + ld): y tras consumlr el prlmer tokeo: y ahora podemos apllcar la regla 3 hacla atrs, con lo que o es l: Anlisis Sintctico Ascendente t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES a lo que ahora se puede apllcar la regla 4, produclendo: Asl, poco a poco se va construyendo el rbol: Como puede verse, representa al rbol slntctlco vlsto desde arrlba conlorme se va construyendo ascendentemente: o es una lorma sentenclal ascendente. Cperac|ones en un ana||zador ascendente A medlda que un anallzador slntctlco va construyendo el rbol, se enlrenta a una conllguracln dlstlnta (se denomlna conllguracln al par -) y debe tomar una declsln sobre el slgulente paso u operacln a reallzar. 8slcamente se dlspone de cuatro operaclones dllerentes, y cada tlpo de anallzador ascendente se dlstlngue de los dems en base a la lntellgencla sobre cundo apllcar cada una de dlchas operaclones. Cualquler mecanlsmo de anllsls ascendente conslste en partlr de una conllguracln lnlclal e lr apllcando operaclones, cada una de las cuales permlte pasar de una conllguracln orlgen a otro destlno. Ll proceso llnallzar cuando la conllguracln t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES destlno llegue a ser tal que o represente al rbol slntctlco completo y en se hayan consumldo todos los tokeos. Las operaclones dlsponlbles son las slgulentes: 1. ACL1Ak: se acepta la cadena: EOF yS (axioma inicial). 2. kLCnA2Ak: la cadena de entrada no es vlida. 3. kLDUCIk: consiste en aplicar una regla de produccin hacia atrs a algunos elementos situados en el extremo derecho de . Por ejemplo, si tenemos la configuracin: 4.- DLSLA2Ak: consiste nicamente en quitar el terminal ms a la izquierda dey ponerlo a la derecha de. Por ejemplo, si tenemos la configuracin: Resumiendo, mediante reducciones y desplazamientos, tenemos que llegar a aceptar o rechazar la cadena de entrada. Antes de hacer los desplazamientos t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES tenemos que hacerles todas las reducciones posibles a, puesto que stas se hacen a la parte derecha de , y no por en medio. Cuando es el axioma inicial yes la tira nula (slo contiene EOF), se acepta la cadena de entrada. Cuando no es la tira nula o no es el axioma inicial y no se puede aplicar ninguna regla, entonces se rechaza la cadena de entrada. An||s|s ascendente con retroceso Al igual que ocurra con el caso descendente, este tipo de anlisis intenta probar todas las posibles operaciones (reducciones y desplazamientos) mediante un mtodo de fuerza bruta, hasta llegar al rbol sintctico, o bien agotar todas las opciones, en cuyo caso la cadena se rechaza. Retomemos a continuacin la gramtica del cuadro anterior y veamos el proceso que se sigue para reconocer la cadena id * id: Nota: Ntese como la cola de puede ser , g, F, etc., lo que hace que la regla F pueda aplicarse indefinidamente. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Este mtodo es ms eficiente que el descendente con retroceso puesto que consume los tokeos a mayor velocidad y, por tanto, trabaja con mayor cantidad de informacin a la hora de tomar cada decisin. No obstante resulta inviable para aplicaciones prcticas pues su ineficiencia sigue siendo inadmisible. An||s|s ascendente de gramt|cas Lk(1) En esta parte se introducir una tcnica eficiente de anlisis sintctico ascendente que se puede utilizar para procesar una amplia clase de gramticas de contexto libre. La tcnica se denomina anlisis sintctico LR(k). La abreviatura LR obedece a que la cadena de entrada es examinada de izquierda a derecha (en ingls, left-to- t|qbt), mientras que la R indica que el proceso proporciona el rbol sintctico mediante la secuencia de derivaciones a derecha (en ingls, k|qbtmost Jet|vot|oo) en orden inverso. Por ltimo, la k hace referencia al nmero de tokeos de pre-bsqueda utilizados para tomar las decisiones sobre si reducir o desplazar. Cuando se omite, se asume que k, es 1. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES l ool|s|s lk es ottoct|vo pot vot|os tozooes. Pueden reconocer la inmensa mayora de los lenguajes de programacin que puedan ser generados mediante gramticas de contexto-libre. El mtodo de funcionamiento de estos analizadores posee la ventaja de localizar un error sintctico casi en el mismo instante en que se produce con lo que se adquiere una gran eficiencia de tiempo de compilacin frente a procedimientos menos adecuados como puedan ser los de retroceso. Adems, los mensajes de error indican con precisin la fuente del error. El principal inconveniente del mtodo es que supone demasiado trabajo construir manualmente un analizador sintctico LR para una gramtica de un lenguaje de programacin tpico, siendo necesario utilizar una herramienta especializada para ello: un generador automtico de analizadores sintcticos LR. Esta tcnica, al igual que la del LL(1), basa su funcionamiento en la existencia de una tabla especial asociada de forma nica a una gramtica. Existen varias tcnicas para construir dicha tabla, y cada una de ellas produce un reemp/oto del mtodo principal. La mayora de autores se centra en tres mtodos principales. El primero de ellos, llamado LR sencillo (5lk, en ingls) es el ms fcil de aplicar, pero el menos poderoso de los tres ya que puede que no consiga producir una tabla de anlisis sintctico para algunas gramticas que otros mtodos s consiguen. El segundo mtodo, llamado LRcannico, es el ms potente pero el ms costoso. El tercer mtodo, llamado LR con examen por anticipado (look AbeoJ lk, en ingls), est entre los otros dos en cuanto a potencia y coste. El mtodo LALR funciona con las gramticas de la mayora de los lenguajes de programacin y, con muy poco esfuerzo, se puede implantar de forma eficiente. Bsicamente, un mtodo es ms potente que otro en funcin del nmero de gramticas a que puede aplicarse. Mientras ms amplio sea el espectro de gramticas admitidas ms complejo se vuelve el mtodo. Funcionalmente hablando, un analizador LR consta de dos partes bien diferenciadas: a) un programa de proceso y b) una tabla de anlisis. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES El programa de proceso posee, como se ver seguidamente, un funcionamiento muy simple y permanece invariable de analizador a analizador. Segn sea la gramtica a procesar deber variarse el contenido de la tabla de anlisis que es la que identifica plenamente al analizador. La figura siguiente muestra un esquema sinptico de la estructura general de una analizador LR. Como puede apreciarse en ella, el analizador procesa una cadena de entrada finalizada con el smbolo $ que representa el delimitador EOF. Esta cadena se lee de izquierda a derecha, y el reconocimiento de un solo smbolo permite tomar las decisiones oportunas (LR(1)). Adems, el algoritmo hace uso de una pila que tiene la forma: Donde el smbolo s m se encuentra en la cima tal y como se muestra en la figura. Cada uno de los Xi es un smbolo de la gramtica (Xi (N U T) *) y los srepresentan distintos estados del autmata asociado a la gramtica; al conjunto de estados lo denominaremos E: S i E. Cada estado s tiene asociado un smbolo X , excepto el S 0 que representa al estado inicial y que no tiene asociado smbolo ninguno. Los estados se utilizan para representar toda la informacin contenida en la pila y situada antes del propio estado. Consultando el estado en cabeza de la pila y el siguientetokeo a la entrada se decide qu reduccin ha de efectuarse o bien si hay que desplazar. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Por regla general una tabla de anlisis para un reconocedor LR consta de dos partes claramente diferenciadas entre s que representan dos tareas distintas, la tarea de transitar a otro estado (GOTO) y la tarea de qu accin realizar (ACCION). La tabla GOTO es de la forma E (N U T U {$}) y contiene estado de E, mientras que la tabla ACCION es de la forma E (N U T) y contiene una de las cuatro acciones que vimos en el apartado anterior. Suponiendo que en un momento dado el estado que hay en la cima dela pila es s m y el tokeo actual es a i , el funcionamiento del analizador LR consiste en aplicar reiteradamente los siguientes pasos, hasta aceptar o rechazar la cadena de entrada: 1. Consultar la entrada (s , a ) en la tabla de ACCION. El contenido de la casilla puede ser: Si se acepta o rechaza, se da por finalizado el anlisis, si se desplaza se mete a j en la pila, y si se reduce, entonces la cima de pila coincide con el consecuente (amn de los estados), y se sustituyepor A. 2. Una vez hecho el proceso anterior, en la cima de la pila hay un smbolo y un estado, por este orden, lo que nos dar una entrada en la tabla de GOTO. El contenido de dicha entrada se coloca en la cima de la pila. Formalmente se define una conf|gurac|n de un ana||zador Lk como un par de la forma: Es decir, el primer componente es el contenido actual de la pila, y el segundo la subcadena de entrada que resta por reconocer, siendo a i el tokeo de pre- bsqueda. Partiremos de esta configuracin general para el estudio que prosigue. As, formalmente, cada ciclo del algoritmo LR se describe como: 1.1.- Si ACCION(s m , a j ) =Desplazar, entonces se introduce en la pila el smbolo a i , produciendo: t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES A continuacin se consulta la entrada (s m ,a i ) de la tabla GOTO: GOTO(s m ,a i )=s m+1 , producindose finalmente: Pasando s m+1 a estar situado en cabeza de la pila y a i+1 el siguiente smbolo a explorar en la cinta de entrada. 1.2.- Si ACCION(s m ,a i ) =Reducir por A , entonces el analizador ejecuta la reduccin oportuna donde el nuevo estado en cabeza de la pila se obtiene mediante la funcin GOTO(s m-r , a i ) =s donde r es precisamente la longitud del consecuente. O sea, el analizador extrae primero 2.r smbolosde la pila (r estados y los r smbolos de la gramtica que cada uno tiene por debajo), exponiendo el estado s m-r en la cima. Luego se introduce el no terminal A (antecedente de la regla aplicada), produciendo: A continuacin se consulta la entrada (s m-r , a i ) de la tabla GOTO: GOTO(sm-r,A) =s m- r+1 , producindose finalmente: donde s m-r+1 es el nuevo estado en la cima de la pila y no se ha producido variacin en la subcadena de entrada que an queda por analizar. 1.3.- Si ACCION(s m ,a i ) =ACEPTAR, entonces se ha llegado a la finalizacin en el proceso de reconocimiento y el anlisis termina aceptando la cadena de entrada. 1.4-. Si ACCION(s m ,a i ) =RECHAZAR, entonces el analizador LR ha descubierto un error sintctico y se debera proceder en consecuencia activando las rutinas de recuperacin de errores. Como se ha comentado, una de las ventajas de este tipo de anlisis es que cuando se detecta un error, el tokeo errneo suele estar al final de o al principio de , lo que permite depurar con cierta facilidad las cadenas de entrada (programas). t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES La aplicacin de uno de estos cuatro pasos se aplica de manera reiterada hasta aceptar o rechazar la cadena (en caso de rechazo es posible continuar el reconocimiento si seaplica alguna tcnica de recuperacin de errores sintcticos). El punto de partida es la configuracin: donde s 0 es el estado inicial del autmata. Vamos a ilustrar con un ejemplo la aplicacin de este mtodo. Para ello partiremos de la gramtica del cuadro siguiente. Dicha gramtica tiene asociadas dos tablas una de ACCION y otra de GOTO. Por regla general, y por motivos de espacio, ambas tablas suelen fusionarse en una sola. Una tabla tal se divide en dos partes: unas columnas comunes a ACCION y GOTO, y otras columnas slo de GOTO. Las casillas de las columnas que son slo de GOTO contienen nmeros de estados a los que se transita; si estn vacas quiere decir que hay un error. Las columnas comunes a ambas tablas pueden contener: D-i: significa desplazar y pasar al estado i (ACCION y GOTO todo en uno, para ahorrar espacio). R j: significa reducir por la regla de produccin nmero j. En este caso debe aplicarse a continuacin la tabla GOTO. Aceptar: la gramtica acepta la cadena de terminales y finaliza el proceso de anlisis. En blanco: rechaza la cadena y finaliza el proceso (no haremos recuperacin de errores por ahora). La tabla asociada a la gramtica del cuadro anterior siguiendo los criterios anteriormente expuestos es: t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Supongamos ahora quese desea reconocer o rechazar la secuencia id*(id+0 id), y que el estado s 0 es, en nuestro caso, el 0. As, la siguiente tabla muestra un ciclo del algoritmo por cada fila. t Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica TEORIA DE COMPILADORES Ntese que con este mtodo, la pila hace las funciones de. La diferencia estriba en la existencia de estados intercalados: hay un estado inicial en la base de la pila, y cada smbolo de tiene asociado un estado. Ntese, adems, que cuando se reduce por una regla, el consecuente de la misma coincide con el extremo derecho de. Uno de los primeros pasos que se deben dar durante la construccin de un traductor consiste en la adecuada seleccin de la gramtica que reconozca el lenguaje. Y no es un paso trivial ya que, aunque por regla general existe una multitud de gramticas equivalentes, cuando se trabaja con aplicaciones prcticas las diferencias de comportamientos entre gramticas equivalentes adquiere especial relevancia.