Compiladores principios, técnicas y herramientas Segunda edición Upíler D« PEARSON A d d iso n Wesley Alfred V. Aho Monica S. Lam Ravi Sethi Jeffrey D. Ullman Compiladores principios, técnicas y herramientas S egunda ed ic ió n Compiladores principios, técnicas y herramientas S egunda ed ic ió n A lfred V. A h o C o lu m b ia U n iversity M o n ica S. Lam S ta n fo rd U n iversity Ravi Sethi A vaya JefFrey D . U llm an S ta n fo rd U n iversity TR A D UC C IÓ N A lfo n so V id al R o m ero E liz o n d o Ingeniero e n Electrónica y C om unicaciones REVISIÓN TÉCNICA Sergio F u en lab rad a V elazq u ez E dna M. M iranda C havez A dalberto R o b les V alad ez O sk ar A. G o m e z C o ro n el A cadem ia d e C om putacion U PIIC SA Instituto Politecnico N a cio n a l N o rm a R R offe S a m a n ieg o E lda Q u iro g a G o n z á le z D epartam ento d e C om putación Instituto Tecnológico y d e Estudios Superiores d e M onterrey C am pus M onterrey Jesús A lfo n so Esparza D epartam ento d e C om putación Instituto Tecnológico y d e Estudios Superiores d e M onterrey C am pus Estado d e M éxico PEARSON M é x ic o • A rg e n tin a • B rasil • C o lo m b ia • C o s ta R ic a • C h ile • E c u a d o r E spaña • G u a te m a la • P a n a m á • P e rú • P u e r to R i c o • U ru g u a y • V enezuela Datos de catalogación bibliográfica A H O ,A L F R E D V. COM PILADO RES. P R IN C IPIO S, T É C N IC A S Y H ERRAM IENTAS. Segunda edición PEARSON EDUCACIÓN, M éxico, 2008 ISBN: 978-970-26-1133-2 Área: Com putación Formato: 18.5 X 23.5 cm Páginas: 1040 A u th o rized tra n sla tio n from t h e E nglish language e d itio n , e n title d Compilers: Principles, techniques and tools, 2 nd edition b y Alfred V. Aho, M onica S. Lam Ravi Sethi, Jeffrey D . llllm a n , p u b lish e d b y P earson E d u catio n , Inc., p u b lis h in g as A ddison-W esley, C o p y rig h t © 2007. All rig h ts reserved. ISBN: 0321486811 TYaducción a u to riz a d a d e la ed ició n en id io m a inglés. Compilers: Principles, techniques and tools, 2nd edition d e Alfred V. Aho, M onica S. Lam Ravi Sethi, Jefrev D . llllm a n , p u b lic a d a p o r P earson E d u catio n , Inc., p u b lic a d a c o m o A ddisonWesley, C o p y rig h t © 2007. T o d o s los d e rech o s reservados. Esta ed ició n e n e s p a ñ o l es la ú n ic a a u to riz a d a . E d ició n en esp a ñ o l Editor: E d ito r d e d esarrollo: S upervisor d e p ro d u cció n : E d ició n en in g lés P u b lish er Executive E d ito r A cq u isitio n s E d ito r fro je c t E d ito r A ssociate M anaging E d itor Cover D esigner D igital Assets M anager M edia P ro d u cer S e n io r M ark etin g M anager M arketing A ssistan t S en io r A u th o r S u p p o rt/ T e ch n o lo g y S pecialist S en io r M a n u fac tu rin g Buyer C over Im age Luis M iguel C ru z C astillo e-m ail: T uis.cruz@ pearsoned.com B e rn ard in o G u tiérrez H e rn á n d e z E n riq u e T rejo H e rn á n d e z .T o b in M ichael H irsch M a tt G o ld ste in K atherine I Ia ru tu n ia n Jeffrey H o lc o m b Joyce C o se n tin o W ells M a rian n e G ro th B e th a n y T idd M ichelle Brown S arah M ilm ore Joe V etere C aro l M elville S cott U llm an o f S trange T onic P ro d u c tio n s (w w w .strag e to n ic .co m ) SEGU NDA E D IC IÓ N , 2 0 0 8 D. R. 2 0 0 8 p o r P earson E d u cació n d e M éxico, S.A. d e C.V. A tlaco m u lco 500 -5o. p iso Col. In d u stria l A to to 53519, N au ca lp a n d e Juárez, Edo. d e México C ám ara N a cio n al d e la In d u stria E d ito rial M exicana. Reg. N ú m . 1031. A ddison-W esley es u n a m arca registrada d e P earson E d u cació n d e M éxico, S.A. d e C.V. Reservados to d o s lo s derech o s. N i la to ta lid a d n i p a rte d e esta p u b lic a c ió n p u e d e n rep ro d u cirse, registrarse o tran sm itirse, p o r u n sistem a d e recu p eració n d e in fo rm a c ió n , e n n in g u n a fom >rma n i p o r n in g ú n m e d io , se a electró n ico , m ecánico, fo to q u ím ic o , m ag n ético o e le c tro ó p tic o , p o r fo to c o p ia , g rabación o cu alq u ier o tro , sin p e rm iso p revio p o r escrito d e l ed ito r. El p ré sta m o , alq u iler o cu a lq u ie r o tra fo rm a d e cesión d e u so d e este e je m p la r req u erirá ta m b ié n la a u to riz a c ió n d e l e d ito r o d e s u s rep resen tan tes. ISBN 10: 9 7 0-26-1133-4 ISBN 13: 978-970-26-1133-2 Im p reso en M éxico. Printed in Mexico. 1 2 3 4 5 6 7 8 9 0 - 11 1 0 0 9 08 PEARSON Prefacio D esd e la prim era ed ición d e e s te libro, en 1986, el m undo h a cam biado en form a considerable. Los lenguajes d e program ación han evolucionad o para presentar nuevos problem as d e com pi­ lación. Las arquitecturas com p u tacion ales ofrecen u na variedad d e reclusos, d e los cu ales el diseñ ador d e com piladores d eb e sacar v en ta ja . Tal v e z lo m ás in teresante se a q ue la venerable tecn ología d e la optim ización d e cód ig o h a en con trad o un uso fuera d e los com piladores. A hora s e u tiliza en herram ientas que buscan errores e n e l softw are, y lo q u e es m ás im portan te, buscan brechas d e seguridad en el cód igo existen te. Y gran p arte d e la tecn o lo g ía d e p u n ta (gram áti­ ca , exp resion es regulares, analizadores y trad u ctores orien tad os a la sin ta x is) tien e to d a v ía un am plio uso. P or en d e, la filosofía q ue m anejam os en la ed ició n anterior d e e s te libro no h a cam biado. R econocem os q ue só lo unos cu an tos lectores llegarán a crear (o in clu sive a m antener) un com ­ pilador para un lengu aje d e program ación im portan te. Sin em bargo, los m odelos, la teoría y los algoritm os asociados co n un com pilador p ueden aplicarse a u n a gran variedad d e problem as en e l diseño y desarrollo de softw are. P or lo ta n to , d esta ca m o s lo s problem as q ue se encuentran co n m ás frecuencia d u ran te e l d iseñ o d e un procesador d e lenguaje, sin im portar e l lenguaje origen n i la m áquina d e d estin o. C ó m o u tiliz a r e s te lib ro S e requieren cu an do m en os d os trim estres, o in clu so d o s sem estres, para cubrir to d o e l ma­ terial d e este libro (o a l m enos la m ayor parte). Lo ideal es cubrir la prim era m itad d e l tex to e n u n cu rso universitario y la seg u n d a m itad (que hace én fasis en la op tim iza ció n d e có d ig o ) en otro curso, a nivel p osgrad o o m aestría. H e a q u í u n a d escrip ción general d e los capítulos: E l ca p ítu lo 1 con tien e m aterial d e m otivación , y tam b ién p resen ta algu nos p u n to s so b re los an tecedentes d e la arquitectura com p u tacio n a l y los prin cip ios d e los lengu ajes d e program a­ ción. E l ca p ítu lo 2 d esarrolla un com p ilad or en m iniatu ra y p resen ta m uchos d e los co n cep to s im­ p ortantes, q u e se desarrollarán en los cap ítu lo s siguientes. E l com p ilad or en s í aparece en el apéndice. v vi Prefacio El ca p ítu lo 3 cubre e l an álisis léxico, las exp resion es regulares, las m áquinas d e esta d o fin ito y las herram ientas para generar exploradores. E ste m aterial es fun dam en tal para e l p rocesam ien­ to d e te x to d e to d o tipo. El ca p ítu lo 4 cubre los principales m éto d o s d e análisis, d e arriba-abajo (recursivo d escen dente, LL) y d e ab ajo-arriba (L R y su s variantes). El ca p ítu lo 5 introduce las ideas principales en las d efinicion es y las trad uccion es orien tad as a la sin taxis. El ca p ítu lo 6 to m a la teoría d el cap ítu lo 5 y m u estra cóm o usarla para generar có d ig o interm e­ d io para un lengu aje d e program ación ordinario. El ca p ítu lo 7 cubre los entornos en tiem p o d e ejecución, en esp ecia l la adm inistración d e la p ila en tiem p o d e ejecución y la recolección d e basura. El ca p ítu lo 8 tra ta d e la generación d e cód igo o b jeto . C ubre la con stru cción d e lo s bloques fundam entales, la gen eración d e cód ig o a partir d e la s expresiones y lo s bloques básicos, así com o las técn icas d e asign ación d e registros. El ca p ítu lo 9 introduce la tecnología d e la op tim iza ció n d e cód igo, incluyendo los diagram as d e flujo, los fram ew orks d e flujo d e d atos y los algoritm os itera tiv o s para resolver e sto s fra­ meworks. El cap ítu lo 10 cubre la op tim ización a nivel d e instrucciones. S e d e sta c a aquí la extra cció n d el paralelism o d e las secu en cias pequeñas d e in stru cciones, y cóm o program arlas en procesadores in dividu ales q ue puedan realizar m ás d e función a la vez. El ca p ítu lo 11 h ab la d e la d etección y exp lotació n d e l paralelism o a m ayor esca la . A quí, se d estacan los cód igos num éricos q ue cu en ta n con m uchos ciclo s estrech os q ue varían a través d e los arreglos m ultidim ensionales. El ca p ítu lo 12 ex p lic a e l an álisis entre p rocedim ientos. C ubre e l an álisis y uso d e alias e n los apuntadores, y e l análisis d e los flujos d e d a to s q ue to m a en c u en ta la secu en cia d e llam adas a p rocedim ien tos q ue llegan a un p u n to d ad o en e l cód igo. En C olum bia, H arvard y Stanford se han im partido cursos basados e n el m aterial d e este libro. E n C olum bia se ofrece d e m anera regular un curso a estu d ia n tes universitarios d e l ú ltim o año o estu d ian tes p ostgradu ados sobre los lengu ajes d e program ación y los traductores, usando e l m aterial d e los prim eros o ch o cap ítu los. A lgo q ue d esta ca d e este cu rso es un proyecto q ue d u ra to d o un sem estre, en e l cu a l los estu d ian tes trabajan en p eq ueños eq u ip o s para crear e im plem entar un p equeño lengu aje q ue ellos m ism os diseñan. Los lenguajes q u e crean los es­ tud iantes han abarcado diversos dom inios d e aplicaciones, incluyendo e l cálcu lo d e cu an tos, la sín tesis d e m úsica, los gráficos de com putadora, ju egos, op eracion es co n m atrices y m uchas o tra s áreas m ás. Los estu d ia n tes u tilizan generadores d e com p o n en tes d e com piladores com o A N T L R , L e x y Y acc, y las técn icas d e traducción orien tad as a la sin ta x is q ue se describen en los cap ítu los 2 y 5 para con stru ir su s com piladores. Tam bién se ofrece u n curso d e segu im ien to para graduados, q ue se en fo ca e n e l m aterial q ue v ien e en lo s cap ítu los 9 a 12, en d ond e se en fa tiza la gen eración y op tim ización d e cód ig o para las m áquinas con tem poráneas, incluyendo los procesadores d e redes y las arquitecturas con m últiples procesadores. En Stanford, un curso introductorio d e un tetram estre apenas cubre el m aterial q ue v ien e en los capítulos 1 a 8, aunque hay u na introducción a la optim ización d e cód igo global d el cap ítulo 9. En e l segundo curso d e com piladores se cubren los capítulos 9 a 12, adem ás d el m aterial avanzado Prefacio v ii sobre la recolección d e basura d el cap ítulo 7. Los estu diantes utilizan un sistem a llam ado Joeq, basado en Java y desarrollado p or la com unidad local, para im plem entar los algoritm os d e análisis d e los flujos d e datos. R e q u is ito s p r e v io s E l lector d eb e poseer cierto “con ocim ien to orien tad o a las cien cia s com p u tacion ales” , lo que in clu ye por lo m enos un segu n d o curso sobre program ación, ad em ás d e cursos sobre estru ctu ­ ras d e d a to s y m atem áticas d iscretas. E s ú til tener un co n o cim ien to so b re varios lenguajes de program ación. E je rc ic io s E ste libro con tien e gran can tid ad d e ejercicios para ca si to d a s las seccion es. P a ra indicar los ejercicios difíciles, o p artes d e ellos, u tiliza m o s un sign o d e adm iración. Los ejercicios to d a v ía m ás d ifíciles tien en d ob le sign o d e adm iración. T a r e a s e n lín e a d e G r a d ia n c e U n a n u eva característica d e la segu n d a ed ición es q ue h ay un con ju n to com p lem en tario de tareas en línea, las cu ales u tilizan u n a tecn o lo g ía d esarrollada p or G radiance C orp. Los instruc­ tores p ueden asignar esta s tareas a s u clase; lo s estu d ia n tes q u e no esté n inscritos en u n a clase p ueden inscribirse en u na “clase óm n ib u s” q u e les p erm ita realizar las tareas co m o tu to ria l (sin u na clase cread a por un in stru ctor). Las preguntas d e G radiance tie n e n la m ism a apariencia que las preguntas ordinarias, só lo q ue se m uestrean su s solu ciones. Si realiza u n a elección inco­ rrecta, recibe asesoría, o retroalim entación, específica para ayudarle a corregir su error. Los pro­ fesores usuarios d e este libro pueden utilizar G radiance com o apoyo a su s cla ses, y ca d a alum no que com pre el libro p uede ob tener un cód igo para acceder a los ejercicios d e su profesor. Para m ayor inform ación co n su lte a su representante d e Pearson E ducación o v isite e l sitio W eb de e s te libro. C abe aclarar q ue e s ta inform ación e s tá e n inglés. S o p o r te e n W o r ld W id e W e b E n e l sitio W eb d e este libro: www.pearsoneducacion.net/aho E n con trará u n a fe d e erratas, q ue actu alizarem os a m ed ida q u e vayam os d etecta n d o los errores, y m ateriales d e respaldo. E speram os ten er d isp on ib les lo s ap un tes para ca d a curso relaciona­ d o co n com piladores a m ed id a q ue lo im partam os, incluyendo tareas, solu ciones y exám enes. P lan eam os publicar tam b ién descrip ciones d e los com piladores im p ortan tes escrito s por sus im plem entadores. C abe d estacar q ue tod o el m aterial y este sitio s e en cu en tran en inglés. A g r a d e c im ie n to s E l arte d e la p ortad a fu e realizado por S. D . U llm an d e S trange T onic P rod uctions. John B e n tle y nos proporcionó m uchos com entarios so b re varios ca p ítu lo s d esd e un borrador anterior d e e s te libro. R ecibim os valiosos com entarios y fe d e erratas de: D om enico B ianculli, v iii Prefacio P eter B osch, M arcio B u ss, M arc Eaddy, S tep h en Edw ards, V ib h a v G arg, K im H azelw ood, Gaurav Kc, W ei Li, M ike S m ith , A rt Stam ness, K rysta Svore, O livier T ardieu y Jia Zeng. A gra­ decem os en gran m edida la ayu da d e tod as esta s personas. D esde luego, los errores restantes son nuestros. A dem ás, M on ica quisiera agradecer a su s colegas en el eq u ipo d e l com pilador S U IF por una lección d e 18 años sobre e l proceso d e com pilación: G erald A igner, D zintars A vots, Sam an A m arasinghe, Jennifer A nderson, M ichael Carbin, G erald C heong, A m er D iw an, R obert French, Anwar G huloum , M ary Hall, John Hennessy, D avid H eine, Shih-W ei Liao, A m y L im , B enjam in Livshits, M ichael M artin, Dror M aydan, T od d M owry, Brian Murphy, Jeffrey O p linger, K aren P ieper, M artin R inard, O latunji R uw ase, C on stan tin e Sapuntzakis, Patrick Sathyanathan, M ichael Sm ith, S teven T jiang, C hau-W en T seng, C hristopher U nkel, John W haley, R obert W ilson, C hristopher W ilson, y M ichael W olf. A . V . A ., C hatham N J M. S. L., M enlo P ark CA R. S., Far H ills N J J. D . U ., S tanford C A Junio, 2 0 0 6 T abla de contenido P refacio 1 v In trod u cción 1.1 1.2 1.3 1.4 1.5 1.6 1 P rocesadores d e le n g u a je ............................................................................................................ 1.1.1 E jercicios para la sección 1 .1 ..................................................................................... L a estru ctu ra d e un c o m p ila d o r .............................................................................................. 1 3 4 1.2.1 A nálisis d e lé x ic o ............................................................................................................. 1.2.2 A nálisis s in t á c t ic o .......................................................................................................... 1.2.3 A nálisis s e m á n tic o .......................................................................................................... 1.2.4 G eneración d e cód ig o in term ed io ............................................................................ 1.2.5 O ptim ización d e c ó d i g o .............................................................................................. 1.2.6 G eneración d e c ó d ig o .................................................................................................... 1.2.7 A dm inistración d e la ta b la d e s ím b o lo s .............................................................. 1.2.8 E l agrupam iento d e fases en p a s a d a s .................................................................... 1.2.9 H erram ientas d e construcción d e co m p ila d o res................................................ L a evolución d e los lengu ajes d e p rogram ación ................................................................. 1.3.1 E l avance a los lenguajes d e alto n iv e l................................................................. 1.3.2 Im pactos en el c o m p ila d o r ........................................................................................ 1.3.3 Ejercicios para la sección 1 .3..................................................................................... L a cien cia d e construir u n co m p ila d o r.................................................................................. 1.4.1 M odelado en e l diseño e im plem entación d e co m p ila d o r e s.......................... 1.4.2 L a cien cia d e la op tim iza ció n d e c ó d ig o .............................................................. A plicaciones d e la tecn o lo g ía d e c o m p ila d o r e s ................................................................. 1.5.1 Im plem entación de lenguajes d e program ación d e a lto n iv e l..................... 1.5.2 O p tim izaciones para las arquitecturas d e c o m p u t a d o r a s ........................... 1.5.3 D iseño d e nuevas arquitecturas d e c o m p u ta d o r a s.......................................... 1.5.4 Traducciones d e program as........................................................................................ 1.5.5 H erram ientas d e p rod u ctivid ad d e s o f tw a r e ...................................................... F undam entos d e los len gu ajes d e p r o g ra m a c ió n .............................................................. 1.6.1 L a d istin ción entre está tic o y d in á m ic o .............................................................. 1.6.2 E ntorn os y e s t a d o s ....................................................................................................... 1.6.3 A lcance está tico y estructu ra d e b lo q u e s ........................................................... 1.6.4 C ontrol d e acceso e x p líc ito ......................................................................................... 1.6.5 A lcance d in ám ico............................................................................................................. 1.6.6 M ecanism os p ara el paso d e parám etros.............................................................. 5 8 8 9 10 10 11 11 12 12 13 14 14 15 15 15 17 17 19 21 22 23 25 25 26 28 31 31 33 ix X Tabla d e contenido 1.6.7 U so d e a l i a s ...................................................................................................................... 1.6.8 E jercicios p ara la sección 1 .6 ..................................................................................... R esu m en d el cap ítu lo 1 ................................................................................................................ R eferencias para el ca p ítu lo 1 .................................................................................................... 35 35 36 38 U n trad u ctor sim ple orien tad o a la sintaxis 2.1 In tr o d u c c ió n ...................................................................................................................................... 2.2 D efinición d e s in ta x is ..................................................................................................................... 2.2.1 D efinición d e g r a m á t ic a s ............................................................................................ 39 40 42 42 2.2.2 D e r iv a c io n e s...................................................................................................................... 2.2.3 Á rboles d e análisis s in t á c t ic o ................................................................................... 2.2.4 A m b ig ü e d a d ...................................................................................................................... 2.2.5 A sociativid ad d e los o p e r a d o r e s ............................................................................. 2.2.6 P recedencia d e o p e r a d o r e s ......................................................................................... 2.2.7 Ejercicios para la sección 2.2 ...................................................................................... Traducción orientada a la sin ta x is........................................................................................... 2.3.1 N otación p o s tfija ............................................................................................................. 2.3.2 A trib utos s in t e t iz a d o s .................................................................................................. 2.3.3 D efiniciones sim ples orientadas a la s in ta x is ...................................................... 2.3.4 Recorridos d e los á r b o le s ............................................................................................ 2.3.5 Esquem as d e tra d u cció n ............................................................................................... 2.3.6 Ejercicios p ara la sección 2 .3 ..................................................................................... A nálisis s in t á c t ic o .......................................................................................................................... 2.4.1 A nálisis sin tá ctico tip o a r r ib a -a b a jo ..................................................................... 2.4.2 A nálisis sin tá ctico p red ictivo...................................................................................... 2.4.3 C uándo usar las producciones e .............................................................................. 2.4.4 D iseño d e un analizador sin tá ctico p r e d ic tiv o ................................................... 2.4.5 R ecursividad a la izqu ierda......................................................................................... 2.4.6 Ejercicios para la sección 2.4 ...................................................................................... U n traductor para las expresiones s im p le s .......................................................................... 2.5.1 S intaxis a b stra cta y c o n c r e t a ................................................................................... 2.5.2 A dap tación d el esqu em a de t r a d u c c ió n .............................................................. 2.5.3 P roced im ien tos para los no term in a les.................................................................. 2.5.4 Sim plificación d el t r a d u c to r ...................................................................................... 44 45 47 48 48 51 52 53 54 56 56 57 60 60 61 64 65 66 67 68 68 69 70 72 73 2.5.5 E l program a c o m p le t o ................................................................................................. A nálisis lé x ic o ................................................................................................................................... 2.6.1 E lim inación d e esp acio e n b lanco y c o m e n ta r io s............................................. 2.6.2 L ectura a d e la n ta d a ....................................................................................................... 2.6.3 C o n s t a n te s ......................................................................................................................... 2.6.4 R econocim ien to d e palabras clave e id en tifica d o res....................................... 2.6.5 U n analizador l é x i c o ..................................................................................................... 2.6.6 E jercicios para la sección 2 .6 ..................................................................................... T ablas d e s í m b o l o s ........................................................................................................................ 2.7.1 T ab la d e sím b olos por alcan ce................................................................................... 2.7.2 E l uso d e las tablas d e s ím b o lo s ............................................................................. 74 76 77 78 78 79 81 84 85 86 89 1.7 1.8 2 2.3 2.4 2.5 2.6 2.7 Tabla d e contenido 2.8 G eneración d e cód ig o in term ed io.............................................................................................. 2.8.1 D os tip os d e representaciones in te r m e d ia s ........................................................ 2.8.2 C onstrucción d e árboles s in tá c tic o s ....................................................................... 2.8.3 C om probación e s tá tic a ................................................................................................. 2.8.4 C ódigo d e tres d ir e c c io n e s ........................................................................................ 2.8.5 Ejercicios para la sección 2 .8 ..................................................................................... R esum en d el cap ítulo 2 ................................................................................................................ 91 91 92 97 99 105 105 A nálisis lé x ic o 3.1 L a función d el analizador l é x i c o .............................................................................................. 3.1.1 C om paración en tre análisis léxico y análisis sin tá c tic o ................................. 3.1.2 Tokens, p atrones y l e x e m a s ..................................................................................... 3.1.3 A tributos para los to k e n s ........................................................................................... 3.1.4 Errores léx ico s.................................................................................................................. 3.1.5 Ejercicios para la sección 3 .1 ..................................................................................... 3.2 U so d e búfer e n la e n tr a d a ......................................................................................................... 3.2.1 Pares d e b ú f e r e s ............................................................................................................ 3.2.2 C en tin ela s........................................................................................................................... 3.3 Especificación d e los t o k e n s ....................................................................................................... 3.3.1 C adenas y len gu ajes....................................................................................................... 3.3.2 O peraciones en los len gu ajes..................................................................................... 3.3.3 E xp resion es reg u la res................................................................................................... 3.3.4 D efiniciones regulares.................................................................................................... 3.3.5 E x ten sion es d e las expresiones r e g u la r e s ........................................................... 3.3.6 E jercicios para la sección 3 .3 ..................................................................................... 3.4 R econocim ien to d e t o k e n s .......................................................................................................... 3.4.1 D iagram as d e tran sición d e e s ta d o s ....................................................................... 3.4.2 R econocim ien to d e las palabras reservadas y los id en tifica d o res............ 3.4.3 F inalización d el b o s q u e jo ........................................................................................... 3.4.4 A rq uitectura d e u n analizador léxico b asado en diagram as d e tran sición d e e s t a d o s .................................................................................... 3.4.5 Ejercicios para la sección 3 .4 ..................................................................................... 3.5 E l generador d e analizadores léxicos L e x ............................................................................. 3.5.1 U so d e L e x ........................................................................................................................ 3.5.2 E stru ctu ra d e los program as en L e x ................................................................... 3.5.3 R esolución d e co n flictos en L e x ............................................................................... 3.5.4 E l operador a d e la n ta d o ............................................................................................. 109 109 110 111 112 113 114 115 115 116 116 117 119 120 123 124 125 128 130 132 133 2.9 3 XI 3.6 3.5.5 Ejercicios para la sección 3 .5 ..................................................................................... A u tóm atas f i n i t o s ........................................................................................................................... 3.6.1 A u tóm atas fin ito s no d eter m in ista s....................................................................... 3.6.2 Tablas d e tra n sició n ....................................................................................................... 3.6.3 A ceptación d e las cad en as d e en trad a m ediante los a u tó m a ta s................. 3.6.4 A u tóm atas finitos d e te r m in is ta s ............................................................................. 3.6.5 E jercicios para la sección 3 .6 .................................................................................... 134 136 140 140 141 144 144 146 147 147 148 149 149 151 XII Tabla d e contenido 3.7 D e las exp resion es regulares a los a u t ó m a ta s .................................................................... 3.7.1 C onversión d e un A F N a A F D ............................................................................... 3.7.2 Sim ulación d e u n A F N ................................................................................................. 3.7.3 E ficien cia d e la sim ulación d e u n A F N ................................................................. 3.7.4 C onstrucción d e un A F N a partir d e una exp resión r e g u la r..................... 3.7.5 E ficien cia d e los algoritm os d e p rocesam ien to d e c a d e n a s ........................ 3.7.6 E jercicios para la sección 3 .7 ..................................................................................... D iseño d e un generador d e analizadores l é x i c o s .............................................................. 3.8.1 L a estru ctu ra d e l analizador g e n e r a d o ................................................................. 3.8.2 C oincid en cia d e p atrones con base e n los A F N s ............................................. 3.8.3 A F D s p ara analizadores léx ico s................................................................................ 3.8.4 Im plem entación d el operador d e p rea n á lis is..................................................... 3.8.5 Ejercicios para la sección 3 .8 ..................................................................................... O ptim ización d e los buscadores por concordancia d e p atrones basados en A F D ......................................................................................................................................... 3.9.1 E stad os significativos d e un A F N .......................................................................... 3.9.2 Funciones calcu ladas a partir d el árbol s in t á c t ic o .......................................... 3.9.3 C álculo d e anulable, p rim era p o s y id tim a p o s..................................................... 3.9.4 C álculo d e s ig u ie n te p o s .............................................................................................. 3.9.5 C onversión d irecta d e una expresión regular a un A F D .............................. 152 152 156 157 159 163 166 166 167 168 170 171 172 3.9.6 M inim ización d el núm ero d e estad os d e un A F D .......................................... 3.9.7 M inim ización d e esta d o s e n los analizadores l é x i c o s .................................... 3.9.8 Intercam bio d e tiem p o por espacio en la sim ulación d e un A F D ............. 3.9.9 Ejercicios p ara la sección 3 .9 ..................................................................................... R esu m en d el cap ítu lo 3 ............................................................................................................... R eferencias para el ca p ítu lo 3 .................................................................................................... 180 184 185 186 187 189 A nálisis sin táctico 4 .1 In tro d u cció n ....................................................................................................................................... 4.1.1 L a función d el analizador sin tá c tic o ....................................................................... 191 192 192 4 .1 .2 R epresentación d e g ra m á tica s................................................................................... 4 .1 .3 M anejo d e los errores sin tá c tic o s ............................................................................. 4 .1 .4 E strategias p ara recuperarse d e los errores........................................................ G ram áticas libres d e co n tex to .................................................................................................... 4.2.1 L a definición form al d e una gram ática libre d e c o n t e x t o ........................... 4 .2 .2 C onvenciones d e n o ta c ió n ........................................................................................... 193 194 195 197 197 198 4 .2 .3 4 .2 .4 4 .2 .5 4 .2 .6 4 .2 .7 199 201 203 204 3 .8 3.9 3.10 3.11 4 4 .2 4 .3 D e r iv a c io n e s..................................................................................................................... Á rb oles d e an álisis sin tá ctico y d eriv a cio n es..................................................... A m b ig ü e d a d ..................................................................................................................... Verificación d el lenguaje generado por una g r a m á tic a ................................. C om paración entre gram áticas libres d e con tex to y expresiones r e g u la r e s....................................................................................... 4.2.8 Ejercicios para la sección 4 .2 ..................................................................................... E scritu ra d e u n a g r a m á t ic a ....................................................................................................... 4.3.1 C om paración entre análisis léxico y análisis sin tá c tic o ................................. 4 .3 .2 E lim inación d e la a m b ig ü e d a d ................................................................................ 173 173 175 176 177 179 205 206 209 209 210 Tabla d e contenido 4.3.3 4.3.4 4 .3 .5 4 .3.6 x iii E lim in ación d e la recursividad por la izquierda................................................ F actorización por la izq u ierd a ................................................................................... C onstrucciones d e lenguajes que no so n libres d e co n tex to ......................... E jercicios para la sección 4 .3 ...................................................................................... 212 214 215 216 4 .4 A nálisis sin tá ctico d e sc e n d e n te ................................................................................................ 4.4.1 A nálisis sin táctico d e d escen so r e c u r s iv o ............................................................ 4.4.2 P R IM E R O y S IG U IE N T E ......................................................................................... 4.4.3 G ram áticas L L ( 1 ) .......................................................................................................... 4 .4 .4 A nálisis sin táctico predictivo n o r e c u r s iv o ......................................................... 4 .4 .5 R ecuperación d e errores en el análisis sin tá ctico p r e d ic tiv o ...................... 4 .4.6 E jercicios para la sección 4 .4 ...................................................................................... 217 219 220 222 226 228 231 4 .5 A nálisis sin tá ctico a sc e n d e n te ................................................................................................... 4.5.1 R e d u c c io n e s ...................................................................................................................... 4 .5 .2 P o d a d e m a n g o s ............................................................................................................. 4 .5 .3 A nálisis sin táctico d e d e sp la za m ie n to -r ed u c ció n ............................................. 4 .5 .4 C onflictos d urante el análisis sin tá ctico d e d esplazam iento-reducción . 4.5.5 Ejercicios para la sección 4 .5 ...................................................................................... 233 234 235 236 238 240 4 .6 Introducción al análisis sin táctico LR: SL R (L R s im p le ) ............................................ 4.6.1 ¿Por q u é analizadores sin tácticos L R ? .................................................................. 4.6.2 L os elem en tos y el a u tó m a ta L R (0 )....................................................................... 4.6.3 E l algoritm o d e análisis sin táctico L R ................................................................. 4 .6 .4 C onstrucción d e ta b la s d e análisis sin tá ctico S L R .......................................... 4.6.5 P refijos v i a b l e s ................................................................................................................ 4.6.6 Ejercicios para la sección 4 .6 ..................................................................................... 241 241 242 248 252 256 257 4 .7 A nalizadores sin táctico s L R m ás p o d e r o s o s ....................................................................... 4.7.1 E lem en tos L R (1) can ón icos......................................................................................... 4 .7 .2 C onstrucción d e con jun tos d e elem entos L R (1 )................................................ 4 .7 .3 Tablas d e análisis sin tá ctico L R (1) can ón ico...................................................... 4 .7 .4 C onstrucción d e ta b la s d e análisis sin tá ctico L A L R .................................... 4 .7 .5 C onstrucción eficien te d e tab las d e an álisis sin tá ctico L A L R ................... 4 .7 .6 C om p actación d e las ta b la s d e an álisis sin tá ctico L R .................................. 4.7.7 E jercicios para la sección 4 .7 ..................................................................................... 259 260 261 265 266 270 275 277 4.8 U so d e 4.8.1 4 .8.2 4 .8 .3 4 .8.4 278 279 281 283 285 4 .9 G eneradores d e analizadores sin tá c tic o s............................................................................... 287 4.9.1 E l generador d e analizadores sin táctico s Y acc...................................................287 4 .9 .2 U so d e Y acc con gram áticas a m b igu as.................................................................. 291 4 .9 .3 C reación d e analizadores léxicos d e Yacc co n L e x .......................................... 2 9 4 4 .9 .4 R ecuperación d e errores en Y a c c ............................................................................. 295 4.9.5 Ejercicios para la sección 4 .9 ..................................................................................... 297 4 .1 0 R esum en del cap ítulo 4 ................................................................................................................ 297 4.11 R eferencias para e l ca p ítu lo 4 .................................................................................................... gram áticas am bigu as....................................................................................................... P reced en cia y asociatividad para resolver c o n f lic t o s .................................... L a am bigüedad d e l “else co lgan te” ....................................................................... R ecuperación d e errores en el análisis sin tá ctico L R .................................... E jercicios para la sección 4 .8 ...................................................................................... 300 x iv 5 Tabla d e contenido T raducción orientada p o r la sin ta x is 5.1 D efin iciones d irigidas por la s in ta x is ....................................................................................... 5.1.1 A trib utos heredados y s in t e t iz a d o s ....................................................................... 5.1.2 E valuación d e u n a definición d irig id a p or la sin ta x is en los 303 304 304 n od os d e un árbol d e análisis s in t á c t ic o .................................................... 5.1.3 E jercicios para la sección 5 .1 ...................................................................................... Ó rdenes d e evalu ación para las d efinicion es dirigidas por la s i n t a x i s ................... 5.2.1 G ráficos d e d e p e n d e n c ia s ............................................................................................ 5.2.2 O rden d e e v a l u a c ió n .................................................................................................... 5.2.3 D efin iciones con atrib u tos sin te tiz a d o s................................................................. 5.2.4 D efin iciones con atrib u tos h ere d a d o s.................................................................... 5.2.5 R eglas sem án ticas co n efectos adicionales c o n tr o la d o s.................................. 5.2.6 E jercicios para la sección 5 .2 ...................................................................................... A plicaciones d e la trad ucción orien tad a por la s in t a x is ............................................... 5.3.1 C onstrucción d e árboles d e análisis s in tá c tic o .................................................. 5.3.2 L a estru ctu ra d e t i p o s .................................................................................................. 306 309 310 310 312 312 313 314 317 318 318 321 5.3.3 Ejercicios para la sección 5 .3 ...................................................................................... Esquem as d e traducción orientados por la s in t a x is ........................................................ 5.4.1 Esquem as d e traducción p o s t f ij o s .......................................................................... 5.4.2 Im plem entación d e esqu em as d e traducción orientados a la sin ta x is p o stfijo co n la p ila d el analizador s in t á c t ic o ................. 5.4.3 E squem as d e traducción orien tad os a la sin ta x is co n acciones den tro d e las p r o d u c c io n e s .............................................................................. 5.4.4 E lim inación d e la recursividad por la izquierda d e lo s esquem as d e traducción orientados a la sin ta x is ....................................................... 5.4.5 Esquem as d e traducción orientados a la sin ta x is p ara definiciones co n atrib utos heredados por la iz q u ie r d a ................................................. 5.4.6 Ejercicios para la sección 5 .4 ...................................................................................... Im plem entación d e definiciones dirigidas por la sin ta x is co n atributos heredados por la iz q u ie r d a ................................................................................................ 5.5.1 Traducción d urante e l análisis sin tá ctico d e d escen so recursivo................ 5.5.2 G eneración d e cód igo a l in s ta n te ............................................................................. 5.5.3 Las definiciones dirigidas por la sin ta x is co n a trib u to s heredados por la izquierda y e l an álisis sin tá ctico L L .............................................. 5.5.4 A n álisis sin tá ctico ascen dente d e las d efinicion es d irigidas por la sin ta x is co n atrib utos heredados p or la izq u ierd a ............................. 5.5.5 Ejercicios para la sección 5 .5 ...................................................................................... R esu m en d el ca p ítu lo 5 ............................................................................................................... R eferencias para el ca p ítu lo 5 .................................................................................................... 323 323 324 5.2 5.3 5.4 5.5 5.6 5.7 6 325 327 328 331 336 337 338 340 343 348 352 353 354 G en eración de cód igo in term ed io 357 6.1 V ariantes d e los árboles s in t á c t ic o s ........................................................................................ 358 6.1.1 Grafo d irigido acíclico para las e x p r e s io n e s ...................................................... 359 6.1.2 E l m étod o núm ero d e valor para construir G D A s .......................................... 360 6.1.3 E jercicios para la sección 6 .1 ..................................................................................... 362 Tabla d e contenido 6.2 6.3 6.4 6.5 6.6 6.7 6.8 C ódigo d e tres d ir e c c io n e s ......................................................................................................... 6.2.1 D irecciones e in str u c c io n e s........................................................................................ 6.2.2 C u á d ru p lo s........................................................................................................................ 6.2.3 T r ip le ta s.............................................................................................................................. 6.2.4 F orm a d e asignación in dividu al e s tá tic a .............................................................. 6.2.5 Ejercicios para la sección 6 .2 ..................................................................................... T ip o s y d eclaracion es.................................................................................................................... 6.3.1 E xp resion es d e t i p o s .................................................................................................... 6.3.2 E q uivalen cia d e t i p o s .................................................................................................... 6.3.3 D e c la r a c io n e s ................................................................................................................... 6.3.4 D istrib u ción d el alm acenam iento p ara los nom bres lo ca les.......................... 6.3.5 Secuencias d e las d ecla ra c io n e s................................................................................ 6.3.6 C am pos en registros y c la s e s ..................................................................................... 6.3.7 E jercicios para la sección 6 .3 ..................................................................................... T raducción d e e x p r e s io n e s .......................................................................................................... 6.4.1 O peraciones d en tro d e e x p r e s io n e s ....................................................................... 6.4.2 T raducción in c r e m e n ta l.............................................................................................. XV 363 364 366 367 369 370 370 371 372 373 373 376 376 378 378 378 380 6.4.3 D ireccionam iento d e los elem en tos d e un arreglo.............................................. 381 6.4.4 T raducción d e referencias a a r r e g l o s .................................................................... 383 6.4.5 E jercicios para la sección 6 .4 ..................................................................................... 384 C om probación d e t i p o s ................................................................................................................ 386 6.5.1 R eglas para la com probación d e t i p o s ................................................................. 387 6.5.2 C onversiones d e t ip o s .................................................................................................... 388 6.5.3 Sobrecarga d e funciones y o p e r a d o r e s ................................................................. 390 6.5.4 Inferencia d e tip o s y funciones p o lim ó r fic a s..................................................... 391 6.5.5 U n algoritm o para la u n ifica ció n ............................................................................. 395 6.5.6 Ejercicios para la sección 6 .5 ..................................................................................... 398 Flujo d e co n tro l................................................................................................................................. 399 6.6.1 E xp resion es b o o le a n a s ................................................................................................. 399 6.6.2 C ódigo d e corto c ir c u ito .............................................................................................. 400 6.6.3 Instrucciones d e flu jo d e c o n tr o l............................................................................. 401 6.6.4 Traducción d el flujo d e con trol d e las expresiones b o o le a n a s .................. 403 6.6.5 E v ita r g o to s re d u n d a n te s........................................................................................... 405 6.6.6 V alores b oléan os y cód ig o d e sa lto .......................................................................... 408 6.6.7 E jercicios para la sección 6 .6 ..................................................................................... 408 Parcheo d e retroceso (b a c k p a tc h ).......................................................................................... 410 6.7.1 G eneración d e cód ig o d e u n a pasada, m ed ian te parcheo d e retroceso . 410 6.7.2 T écn ica d e parcheo d e retroceso para las exp resion es b o o le a n a s ..............411 6.7.3 In strucciones d e flujo d e c o n t r o l............................................................................. 413 6.7.4 In strucciones break, con tin u é y g o t o .................................................................... 416 6.7.5 E jercicios para la sección 6 .7 ..................................................................................... 417 In strucciones sw itc h ........................................................................................................................ 418 6.8.1 T raducción d e las instrucciones sw itc h ................................................................. 419 6.8.2 Traducción orien tad a por la sin ta xis d e las instrucciones s w itc h .............420 6.8.3 E jercicios para la sección 6 .8 ..................................................................................... 421 xvi Tabla d e contenido 6.9 6.10 6.11 7 C ódigo interm edio para p roced im ien to s.............................................................................. 422 R esu m en d el ca p ítu lo 6 .............................................................................................................. 424 R eferencias para el ca p ítu lo 6 ................................................................................................... 425 E ntornos e n tiem p o de eje cu ció n 7.1 O rganización d el a lm a ce n a m ie n to .......................................................................................... 7.1.1 A sign ación d e alm acenam iento e s tá tic a y d in á m ic a ....................................... 7.2 A sign ación d e espacio en la p i l a ............................................................................................ 7.2.1 Á rb oles d e a ctiv a c ió n .................................................................................................... 7.2.2 R egistros d e activ a ció n ................................................................................................. 427 427 429 430 430 433 7.2.3 S ecu en cias d e llam ad as................................................................................................. 7.2.4 D a to s d e lon gitu d variable en la p ila .................................................................... 7.2.5 E jercicios para la sección 7 .2 ..................................................................................... A cceso a los d a to s no locales en la p i l a .............................................................................. 7.3.1 A cceso a los d atos sin p rocedim ien tos a n id a d o s ............................................. 7.3.2 P rob lem as co n los p rocedim ien tos a n id a d o s ..................................................... 7.3.3 U n lenguaje co n declaraciones d e p rocedim ien tos a n id a d o s ..................... 7.3.4 P rofundidad d e a n id a m ie n to ..................................................................................... 7.3.5 E n lace d e a c c e s o ............................................................................................................ 7.3.6 M anipulación d e los en laces d e a c c e s o ................................................................. 7.3.7 E nlaces d e acceso para los parám etros d e p r o c e d im ie n to s......................... 7.3.8 E structu ra d e d a to s D is p la y ..................................................................................... 7.3.9 Ejercicios para la sección 7 .3 ..................................................................................... A dm in istración d el m o n tícu lo .................................................................................................. 7.4.1 E l adm inistrador d e m e m o r ia .................................................................................. 436 438 440 441 442 442 443 443 445 447 448 449 451 452 453 7.4.2 7.4.3 7.4.4 454 455 457 7.3 7.4 7.5 7.6 7.7 L a jerarquía d e m em oria d e una c o m p u ta d o r a ............................................... Localidad en los p r o g r a m a s ..................................................................................... R educción d e la fr a g m e n ta c ió n ............................................................................... 7.4.5 S olicitu des d e d esasignación m a n u a l.................................................................... 460 7.4.6 Ejercicios para la sección 7 .4 ..................................................................................... 463 Introducción a la recolección d e b a s u r a .............................................................................. 463 7.5.1 M etas d e d iseñ o para los recolectores d e b a s u r a ............................................. 7.5.2 C apacidad d e a lca n ce.................................................................................................... 7.5.3 R ecolectores d e basura con con teo d e r e fe r e n c ia s .......................................... 7.5.4 Ejercicios para la sección 7 .5 .................................................................................... Introducción a la recolección b asad a e n el rastreo.......................................................... 7.6.1 U n recolector b ásico “m arcar y lim piar” ........................................................... 7.6.2 A bstracción b á sica .......................................................................................................... 7.6.3 O ptim ización d e “m arcar y lim piar” .................................................................... 7.6.4 R ecolectores d e basura “m arcar y com pactar” ................................................. 7.6.5 R ecolectores d e c o p ia .................................................................................................... 7.6.6 C om paración d e c o sto s................................................................................................. 7.6.7 Ejercicios para la sección 7 .6 ..................................................................................... R ecolección d e basura d e p ausa c o r t a ................................................................................. 7.7.1 R ecolección d e basura in c r e m e n ta l....................................................................... 464 466 468 470 470 471 473 475 476 478 482 482 483 483 Tabla d e contenido x v ii 7.7.2 A nálisis d e cap acidad alcance in c r e m e n ta l........................................................ 485 7.7.3 F undam entos d e la recolección p a rcia l................................................................. 487 7.7.4 R ecolección d e b asu ra g en er a cio n a l....................................................................... 488 7.7.5 E l algoritm o d el t r e n ................................................................................................... 490 7.7.6 Ejercicios para la sección 7 .7 ..................................................................................... 493 7.8 T em as avanzados sobre la recolección d e b a su r a ................................................................ 494 7.8.1 R ecolección d e b asu ra paralela y co n cu rren te.................................................. 495 7.8.2 R eubicación parcial d e o b j e t o s ................................................................................ 497 7.8.3 R ecolección conservadora p ara lengu ajes in s e g u r o s ........................................ 498 7.8.4 R eferencias d éb iles......................................................................................................... 498 7.8.5 Ejercicios para la sección 7 .8 ..................................................................................... 499 7.9 R esum en d el cap ítulo 7 ................................................................................................................ 500 7.10 R eferencias para e l ca p ítu lo 7 .................................................................................................... 502 8 G en eración de código 8.1 C uestiones sobre el d iseñ o d e un generador d e c ó d ig o ................................................... 8.1.1 E n trad a d el generador d e c ó d ig o ............................................................................ 8.1.2 E l program a d estin o ...................................................................................................... 8.1.3 Selección d e in stru ccio n es........................................................................................... 8.1.4 A signación d e registro s................................................................................................. 8.1.5 Orden d e e v a l u a c ió n .................................................................................................... 8.2 E l lenguaje d e s t i n o ......................................................................................................................... 8.2.1 U n m odelo sim p le d e m áqu ina d e s tin o ................................................................. 8.2.2 C ostos d el program a y las in stru cciones.............................................................. 8.2.3 Ejercicios para la sección 8 .2 ..................................................................................... 8.3 D irecciones en el cód ig o d e s t i n o .............................................................................................. 8.3.1 A signación e s t á t i c a ....................................................................................................... 8.3.2 A signación d e p ila .......................................................................................................... 8.3.3 D irecciones para lo s nom bres en tiem p o d e e j e c u c ió n ................................. 8.3.4 Ejercicios para la sección 8 .3 ..................................................................................... 8.4 B loques básicos y grafos d e flu jo ............................................................................................. 8.4.1 B loques b á sic o s................................................................................................................ 8.4.2 Inform ación de sigu iente u s o ..................................................................................... 8.4.3 G rafos d e f l u j o ............................................................................................................... 8.4.4 R epresentación d e los grafos d e f lu j o .................................................................... 8.4.5 C ic lo s.................................................................................................................................... 8.4.6 Ejercicios para la sección 8 .4 ..................................................................................... 8.5 O ptim ización d e los bloques b á s i c o s ...................................................................................... 8.5.1 L a representación en G D A d e los bloques b á s ic o s ......................................... 8.5.2 B úsqueda de subexpresiones locales c o m u n e s .................................................. 8.5.3 E lim inación d el cód igo m u e r t o ............................................................................... 8.5.4 E l uso d e identidades a lg e b r a ic a s ......................................................................... 8.5.5 R epresentación d e referencias a arreglos.............................................................. 8.5.6 A signaciones d e apuntadores y llam adas a p rocedim ien tos.......................... 8.5.7 R eensam blado d e los bloques b ásicos a partir d e los G D A s ..................... 8.5.8 E jercicios para la sección 8 .5 ..................................................................................... 505 506 507 507 508 510 511 512 512 515 516 518 518 520 522 524 525 526 528 529 530 531 531 533 533 534 535 536 537 539 539 541 Tabla d e contenido 8.6 U n generador d e cód igo s im p le ............................................................................................... 8.6.1 D escriptores d e registros y d ire cc io n e s................................................................ 8.6.2 E l algoritm o d e generación d e c ó d ig o .................................................................. 8.6.3 D iseño d e la función obtenR eg................................................................................. 8.6.4 Ejercicios para la sección 8 .6 ................................................................................... O ptim ización d e m irilla (p e e p h o le )...................................................................................... 8.7.1 E lim inación d e instrucciones redundantes d e carga y alm acenam iento 8.7.2 E lim inación d e cód ig o in a lc a n z a b le ..................................................................... 8.7.3 O p tim izaciones d el flujo d e c o n t r o l..................................................................... 8.7.4 Sim plificación algebraica y reducción por fu e r z a ........................................... 8.7.5 U so d e características específicas d e m á q u in a ................................................. 8.7.6 Ejercicios para la sección 8 .7 ................................................................................... R epartición y asignación d e registro s................................................................................... 8.8.1 R epartición glob al d e r e g is t r o s .............................................................................. 8.8.2 C onteos d e u s o .............................................................................................................. 8.8.3 A signación d e registros para ciclos e x te r n o s .................................................... 8.8.4 A signación d e registros m ed iante la coloración d e g r a f o s ........................... 8.8.5 Ejercicios para la sección 8 .8 ................................................................................... Selección de instrucciones m ed iante la rescritura de árboles..................................... 8.9.1 Esquem as d e traducción d e á r b o le s ..................................................................... 8.9.2 G eneración d e cód igo m ed iante e l revestim iento d e un árbol d e en tra d a .................................................................................................................. 8.9.3 C oincidencias d e los p atrones m ed iante el análisis s in t á c t ic o ................. 8.9.4 R u tin as para la com probación s e m á n tic a .......................................................... 8.9.5 P roceso gen eral para igualar á r b o le s .................................................................. 8.9.6 Ejercicios p ara la sección 8 .9 ................................................................................... G eneración d e cód igo óp tim o para las e x p r e s io n e s ...................................................... 8.10.1 N úm eros d e E r s h o v ..................................................................................................... 8.10.2 G eneración d e cód igo a partir de árboles d e expresión etiq u etad os . . . 8.10.3 E valuación d e expresiones co n un su m inistro insuficiente d e reg istro s. 8.10.4 Ejercicios para la sección 8 .1 0 ................................................................................. G eneración d e cód igo d e program ación d in á m ic a ......................................................... 8.11.1 E valuación c o n tig u a ..................................................................................................... 8.11.2 E l algoritm o d e program ación d in á m ic a ............................................................ 8.11.3 Ejercicios para la sección 8 .1 1 ................................................................................. R esu m en d el ca p ítu lo 8 ............................................................................................................. R eferencias para el ca p ítu lo 8 .................................................................................................. 560 563 565 565 567 567 567 568 570 572 573 574 575 577 578 579 O p t i m iz a c i o n e s i n d e p e n d i e n t e s d e l a m á q u in a 9.1 Las fuentes principales d e o p tim iz a c ió n .............................................................................. 9.1.1 C ausas d e redu n dan cia............................................................................................... 9.1.2 U n ejem plo abierto: Q u ic k s o r t .............................................................................. 9.1.3 Transform aciones que preservan la se m á n tica ................................................. 9.1.4 Subexpresiones com u nes g l o b a l e s ........................................................................ 9.1.5 Propagación d e c o p ia s ................................................................................................ 9 .1 .6 E lim inación d e cód ig o m u erto ................................................................................. 583 584 584 585 586 588 590 591 8.7 8.8 8.9 8.10 8.11 8.12 8.13 542 543 544 547 548 549 550 550 551 552 552 553 553 553 554 556 556 557 558 558 Tabla d e contenido 9.2 9.3 9.4 x ix 9.1.7 M ovim ien to d e c ó d i g o ................................................................................................. 9.1.8 V ariables d e inducción y reducción en f u e r z a .................................................. 9.1.9 E jercicios para la sección 9 .1 ..................................................................................... In trodu cción al análisis d el flujo d e d a t o s .......................................................................... 9.2.1 L a ab stracción d e l flujo d e d a to s ............................................................................. 9.2.2 E l esq u em a d el análisis d e l flujo d e d a to s ........................................................... 9.2.3 E squem as d el flujo d e d a to s en bloques b á s i c o s ............................................. 9.2.4 D efiniciones d e alcan ce.................................................................................................. 9.2.5 A nálisis d e variables v i v a s ......................................................................................... 9.2.6 E xp resion es d is p o n ib le s .............................................................................................. 9.2.7 R esu m en .............................................................................................................................. 592 592 596 597 597 599 600 601 608 610 614 9.2.8 Ejercicios para la sección 9 .2 ..................................................................................... F undam entos d el análisis d el flujo d e d a t o s ........................................................................ 9.3.1 S e m i-la ttic e s ...................................................................................................................... 9.3.2 Funciones d e tr a n sfe r e n c ia ........................................................................................ 9.3.3 E l algoritm o iterativo para los m arcos d e trab ajo g e n e r a le s...................... 9.3.4 Significado d e una solu ción d e u n flujo d e d a t o s ............................................ 9.3.5 Ejercicios para la sección 9 .3 ..................................................................................... Propagación d e c o n s ta n te s ........................................................................................................... 615 618 618 623 626 628 631 632 9.4.1 9.5 9.6 V alores d el flujo d e d a to s para el m arco d e trabajo d e propagación d e c o n s ta n te s ........................................................................................................... 9.4.2 La reunión para e l m arco d e trabajo d e propagación d e co n sta n tes . . 9.4.3 Funciones d e transferencia p ara el m arco d e tra b a jo d e propagación d e co n sta n te s............................................................................................................ 9.4.4 M on otonía e n el m arco d e trabajo d e propagación d e con stan tes . . . . 9.4.5 L a d istrib u tivid ad d el m arco d e trab ajo d e propagación d e con stantes 9.4.6 Interpretación d e los resu ltad os............................................................................... 9.4.7 Ejercicios para la sección 9 .4 ..................................................................................... E lim inación d e redundancia p a rcia l......................................................................................... 9.5.1 L os orígenes d e la re d u n d a n cia ................................................................................ 9.5.2 ¿P u ed e elim inarse to d a la redundancia?.............................................................. 9.5.3 E l prob lem a d el m ovim ien to d e cód ig o d iferido............................................... 9.5.4 A nticipación d e las ex p re sio n es................................................................................ 9.5.5 E l algoritm o d e m ovim ien to d e cód igo d ife r id o ............................................... 9.5.6 Ejercicios para la sección 9 .5 ..................................................................................... C iclos en los grafos d e f l u j o ........................................................................................................ 9.6.1 D o m in a d o res..................................................................................................................... 9.6.2 O rdenam iento “primero en profundidad” ........................................................... 9.6.3 A ristas en un árbol d e exp an sión co n b ú sq u ed a en p ro fu n d id a d ............. 9.6.4 A ristas p osteriores y cap a cid a d d e r e d u c c ió n ................................................... 9.6.5 P rofundidad d e un grafo d e flu jo ............................................................................. 9.6.6 C iclos n a tu rales................................................................................................................ 9.6.7 V elocidad de convergencia d e los algoritm os d e flujos d e d atos iter a tiv o s.................................................................................................................... 9.6.8 E jercicios para la sección 9 .6 ..................................................................................... 633 633 634 635 635 637 637 639 639 642 644 645 646 655 655 656 660 661 662 665 665 667 669 XX Tabla d e contenido 9.7 A n álisis b asado en r e g io n e s ...................................................................................................... 9.7.1 R e g io n e s.............................................................................................................................. 9.7.2 Jerarquías d e regiones p ara grafos d e flujo r e d u c ib le s ................................. 9.7.3 G eneralidades d e un an álisis b asado en r e g io n e s............................................. 9.7.4 S up osiciones necesarias sobre las funciones tr a n sfo r m a c ió n ..................... 9.7.5 U n algoritm o para el an álisis basado en r e g io n e s .......................................... 9.7.6 M anejo d e grafos d e flujo n o r e d u c ib le s.............................................................. 9.7.7 Ejercicios para la sección 9 .7 ..................................................................................... A nálisis s im b ó lic o .......................................................................................................................... 9.8.1 E xpresiones afines d e las variables d e r e fere n c ia ............................................. 9.8.2 Form ulación d el problem a d e flujo d e d a t o s ..................................................... 9.8.3 A nálisis sim b ólico basado en r e g io n e s ................................................................. 9.8.4 Ejercicios para la sección 9 .8 ..................................................................................... R esu m en d el ca p ítu lo 9 ............................................................................................................... R eferencias para el ca p ítu lo 9 ................................................................................................... 672 672 673 676 678 680 684 686 686 687 689 694 699 700 703 P aralelism o a n ivel de in stru cción 10.1 A rquitecturas d e p r o c e sa d o r e s................................................................................................. 10.1.1 C analizaciones d e instrucciones y retrasos d e bifurcación........................... 10.1.2 E jecución c a n a liz a d a .................................................................................................... 10.1.3 E m isión d e varias in stru ccio n es............................................................................... 10.2 R estricciones d e la program ación d el c ó d ig o ...................................................................... 10.2.1 D ep en dencia d e d a t o s ................................................................................................. 10.2.2 B ú sq u ed a d e dependencias en tre accesos a m e m o r ia .................................... 10.2.3 C oncesiones entre el uso d e registros y el p a r a le lis m o ................................. 10.2.4 O rdenam iento d e fases en tre la asignación d e registros y la program ación d e c ó d i g o ............................................................................ 10.2.5 D ep en dencia d el c o n tr o l.............................................................................................. 10.2.6 Soporte d e ejecución e s p e c u la tiv a .......................................................................... 10.2.7 U n m odelo d e m áquina básico.................................................................................. 10.2.8 Ejercicios para la sección 1 0 .2 .................................................................................. 10.3 P rogram ación d e bloques b á s i c o s ........................................................................................... 10.3.1 Grafos d e d ep en dencia d e d a t o s ............................................................................. 10.3.2 P rogram ación por lista d e bloques b á s ic o s ........................................................ 10.3.3 Ó rdenes topológicos prior i z a d o s ............................................................................. 10.3.4 Ejercicios para la sección 1 0 .3 .................................................................................. 10.4 P rogram ación d e cód igo g lo b a l................................................................................................ 10.4.1 M ovim iento d e cód ig o p r im it iv o ............................................................................. 10.4.2 M ovim iento d e cód ig o h a cia a r r ib a ....................................................................... 10.4.3 M ovim iento d e cód ig o h a cia ab ajo.......................................................................... 10.4.4 A ctualización d e las d ep en dencias d e d a t o s ..................................................... 10.4.5 A lgoritm os d e program ación g lo b a l....................................................................... 10.4.6 T écnicas avanzadas d e m ovim iento d e c ó d ig o .................................................. 10.4.7 Interacción co n los program adores d in á m ic o s .................................................. 10.4.8 Ejercicios para la sección 1 0 .4 .................................................................................. 707 708 708 709 710 710 711 712 713 9.8 9.9 9.10 10 716 716 717 719 720 721 722 723 725 726 727 728 730 731 732 732 736 737 737 Tabla d e contenido 11 XXI 10.5 C analización por softw are............................................................................................................. 10.5.1 I n tr o d u c c ió n ..................................................................................................................... 10.5.2 C analización d e los ciclo s m ediante softw are..................................................... 10.5.3 A signación d e reclu so s y generación d e c ó d ig o ................................................ 10.5.4 C iclos d e ejecu ción c r u z a d a ..................................................................................... 10.5.5 O b jetivos y restricciones d e la canalización por so ftw a r e ........................... 10.5.6 U n algoritm o d e can alización por so ftw a r e......................................................... 10.5.7 P rogram ación d e grafos d e d ep en d en cia d e d a to s a cíclico s........................ 10.5.8 P rogram ación d e grafos d e d ep en d en cia c í c li c o s ............................................ 10.5.9 M ejoras a los algoritm os d e c a n a liz a c ió n ........................................................... 10.5.10 E xp ansión m odular d e v a r ia b le s ............................................................................ 10.5.11 Instrucciones c o n d icio n a le s....................................................................................... 10.5.12 Soporte d e hardware para la canalización por s o f tw a r e ............................. 10.5.13 E jercicios para la sección 1 0 .5 .................................................................................. 10.6 R esum en d el cap ítu lo 1 0 ............................................................................................................. 10.7 R eferencias para e l ca p ítu lo 1 0 ................................................................................................. 738 738 740 743 743 745 749 749 751 758 758 761 762 763 765 766 O p tim ización para e l p aralelism o y la localidad 11.1 C oncep tos b á s ic o s ........................................................................................................................... 11.1.1 M u ltip ro cesa d o res.......................................................................................................... 11.1.2 Paralelism o en las a p lic a c io n e s ................................................................................ 11.1.3 Paralelism o a nivel de c ic lo ........................................................................................ 11.1.4 L ocalid ad d e los d a t o s ................................................................................................. 11.1.5 In trodu cción a la teoría d e la transform ación a fín ........................................... 11.2 M u ltiplicación d e m atrices: un ejem p lo d e t a lla d o ........................................................... 11.2.1 E l algoritm o d e m ultiplicación d e m atrices........................................................ 11.2.2 O p tim iz a c io n e s................................................................................................................ 11.2.3 Interferencia d e la c a c h é .............................................................................................. 11.2.4 Ejercicios para la sección 1 1 .2 .................................................................................. 11.3 E spacios d e iteracion es................................................................................................................... 11.3.1 C onstrucción d e espacios d e iteraciones a partir d e anidam ientos d e c i c l o s .................................................................................................................... 11.3.2 Orden d e ejecu ción para los anidam ientos d e c ic lo s ........................................ 11.3.3 Form ulación d e m atrices d e d e sig u a ld a d e s........................................................ 11.3.4 Incorporación d e co n sta n tes s im b ó lic a s .............................................................. 11.3.5 C ontrol d el ord en d e e j e c u c ió n ................................................................................ 11.3.6 C am bio d e e j e s ................................................................................................................ 11.3.7 E jercicios para la sección 1 1 .3 .................................................................................. 11.4 ín d ices d e arreglos a f in e s ............................................................................................................. 11.4.1 A ccesos a fin e s ................................................................................................................... 11.4.2 A ccesos afines y no afines en la p r á c t i c a ........................................................... 11.4.3 Ejercicios para la sección 1 1 .4 .................................................................................. 11.5 R eutilización de d a t o s ................................................................................................................... 11.5.1 T ip o s d e reu tilización .................................................................................................... 11.5.2 R eutilización p rop ia....................................................................................................... 769 771 772 773 775 777 778 782 782 785 788 788 788 788 791 791 793 793 798 799 801 802 803 804 804 805 806 Tabla d e contenido 11.5.3 11.5.4 R eu tilización esp acial p rop ia................................................................................... R eu tilización d e g r u p o ............................................................................................... 809 811 11.5.5 E jercicios para la sección 1 1 .5 ................................................................................ A nálisis d e dependencias d e d a to s d e a r r e g lo s ................................................................ 11.6.1 D efinición d e la d ep en dencia d e d a to s d e los accesos a a r r e g lo s ........... 11.6.2 P rogram ación lineal e n t e r a ...................................................................................... 11.6.3 L a p ru eb a d e l G C D ..................................................................................................... 11.6.4 H eurística para resolver program as lin eales e n te r o s..................................... 11.6.5 Solución d e program as lin eales en tero s g en era les........................................... 11.6.6 R esu m en ............................................................................................................................ 11.6.7 E jercicios para la sección 1 1 .6 ................................................................................ 11.7 B ú sq u ed a d el paralelism o sin sin cro n iza ció n ...................................................................... 11.7.1 U n ejem plo in tr o d u cto rio ......................................................................................... 11.7.2 P articionam ientos d e esp acio a f í n ........................................................................ 11.7.3 R estricciones d e partición d e e s p a c io .................................................................. 11.7.4 R esolución d e restricciones d e partición d e e s p a c io ..................................... 11.7.5 U n algoritm o sim p le d e generación d e c ó d ig o ................................................. 11.7.6 E lim inación d e iteraciones v a cía s.......................................................................... 11.7.7 E lim inación d e las pruebas d e los ciclo s m ás in t e r n o s ............................... 11.7.8 Transform aciones d el cód ig o f u e n t e ..................................................................... 11.7.9 Ejercicios para la sección 1 1 .7 ................................................................................ 11.8 Sincronización en tre ciclos p a r a le lo s ..................................................................................... 11.8.1 U n núm ero co n sta n te d e sin cronizaciones......................................................... 11.8.2 Grafos d e dependencias d el p r o g r a m a ............................................................... 11.8.3 T iem p o je r á r q u ic o ........................................................................................................ 11.8.4 E l algoritm o d e p aralelización................................................................................. 11.8.5 Ejercicios para la sección 1 1 .8 ................................................................................ 11.9 C analizaciones.................................................................................................................................... 11.9.1 ¿Q ué es la ca n alización ?............................................................................................ 11.9.2 Sobrerrelajación su cesiv a (Succesive O ver-R elaxation , SOR): un ejem plo.................................................................................................................. 11.9.3 C iclos com p letam en te p e r m u ta b le s ..................................................................... 11.9.4 C analización d e ciclos com p letam en te p erm u ta b les..................................... 11.9.5 Teoría g e n e r a l................................................................................................................ 11.9.6 R estricciones d e partición d e t ie m p o .................................................................. 11.9.7 R esolución d e restricciones d e partición d e tiem p o m ediante el L em a d e F a r k a s ................................................................................................ 11.9.8 Transform aciones d e c ó d i g o ................................................................................... 11.9.9 P aralelism o co n sincronización m í n i m a ............................................................ 11.9.10 Ejercicios para la sección 1 1 .9 ................................................................................ 11.10 O p tim izaciones d e lo c a lid a d ...................................................................................................... 11.10.1 Localidad tem poral d e los d a to s c a lc u la d o s ................................................... 11.10.2 C ontracción d e a r r e g lo s ............................................................................................ 11.10.3 Intercalación d e p a r t ic io n e s ................................................................................... 11.10.4 R eunión d e to d o s los co n cep to s.............................................................................. 11.10.5 Ejercicios para la sección 1 1 .1 0 ............................................................................. 814 815 816 817 818 820 823 825 826 828 828 830 831 835 838 841 844 846 851 853 853 854 857 859 860 861 861 11.6 863 864 864 867 868 872 875 880 882 884 885 885 887 890 892 Tabla d e contenido x x ill 11.11 O tros u sos d e las transform aciones afin es............................................................................ 893 11.11.1 M áquinas con m em oria d is t r ib u id a ..................................................................... 894 11.11.2 P rocesad ores q u e em iten m últiples in stru ccio n es........................................... 895 11.11.3 In strucciones co n vectores y S I M D ..................................................................... 895 11.11.4 P r e o b te n c ió n ................................................................................................................... 896 11.12 R esum en d el cap ítu lo 1 1 .......................................................................................................... 897 11.13 R eferencias para e l ca p ítu lo 1 1 ............................................................................................... 899 12 A nálisis in terp roced ural 12.1 12.2 12.3 12.4 12.5 12.6 C oncep tos b á s ic o s ......................................................................................................................... 12.1.1 G rafos d e lla m a d a s ..................................................................................................... 12.1.2 S ensibilidad al c o n t e x t o ............................................................................................ 12.1.3 C adenas d e lla m a d a s .................................................................................................. 12.1.4 A nálisis sen sib le al co n tex to b asado en la c lo n a c ió n .................................. 12.1.5 A nálisis sen sib le al co n tex to b asado en el r e s u m e n ..................................... 12.1.6 E jercicios para la secció n 1 2 .1 ................................................................................ ¿Por q u é análisis interprocedural?......................................................................................... 12.2.1 In vocación d e m étodos v ir tu a le s .......................................................................... 12.2.2 A nálisis d e alias d e a p u n ta d o r e s........................................................................... 12.2.3 P a r a le liz a c ió n ................................................................................................................. 12.2.4 D etección d e errores d e softw are y v u ln e r a b ilid a d e s.................................. 12.2.5 In yección d e cód ig o S Q L ......................................................................................... 12.2.6 D esb ord am ien to d e b ú f e r .......................................................................................... U n a representación lógica d el flujo d e d a to s ...................................................................... 12.3.1 Introducción a D a talo g ............................................................................................... 12.3.2 R eglas d e D a t a l o g ........................................................................................................ 12.3.3 P redicad os intensionales y e x t e n s io n a le s ......................................................... 12.3.4 E jecución d e program as en D a ta lo g ..................................................................... 12.3.5 E valuación increm ental d e program as en D a ta lo g ........................................ 12.3.6 R eglas problem áticas en D a ta lo g ........................................................................... 12.3.7 Ejercicios para la sección 1 2 .3 ................................................................................. U n algoritm o sim p le d e análisis d e a p u n ta d o re s.............................................................. 12.4.1 Por qué e s d ifícil el análisis d e a p u n ta d o r e s .................................................... 12.4.2 U n m odelo para apuntadores y referencias....................................................... 12.4.3 Insensibilidad a l flu jo .................................................................................................. 12.4.4 L a form ulación en D a ta lo g ...................................................................................... 12.4.5 U so d e la inform ación d e los t ip o s ........................................................................ 12.4.6 Ejercicios para la sección 1 2 .4 ................................................................................. A nálisis interprocedural insensible al c o n t e x t o ................................................................ 12.5.1 E fectos d e la invocación a u n m é t o d o ............................................................... 12.5.2 D escubrim iento d el grafo d e llam adas en D a ta lo g ........................................ 12.5.3 C arga d in ám ica y reflex ió n ....................................................................................... 12.5.4 Ejercicios para la sección 1 2 .5 ................................................................................. A nálisis d e apuntadores sensible al c o n t e x t o ................................................................... 12.6.1 C ontextos y cadenas d e lla m a d a s ........................................................................ 12.6.2 Agregar co n tex to a las reglas d e D a ta lo g ......................................................... 903 904 904 906 908 910 911 914 916 916 917 917 917 918 920 921 921 922 924 927 928 930 932 933 934 935 936 937 938 939 941 941 943 944 945 945 946 949 x x iv Tabla d e contenido 12.7 12.8 12.9 A 12.6.3 O bservaciones ad icion ales acerca d e la se n sib ilid a d ..................................... 12.6.4 E jercicios p ara la sección 1 2 .6 ................................................................................. Im plem en tación e n D a ta lo g m ed ian te B D D s .................................................................. 12.7.1 D iagram as d e decision es b inarios........................................................................... 12.7.2 Transform aciones en B D D s ...................................................................................... 12.7.3 R ep resen tación d e las relaciones m ediante B D D s ........................................ 12.7.4 O p eracion es relaciónales com o op eracion es B D D ........................................ 12.7.5 U so d e B D D s p ara el análisis tip o “a p u n ta a” .............................................. 12.7.6 Ejercicios para la sección 1 2 .7 ................................................................................. R esu m en d el ca p ítu lo 1 2 ........................................................................................................... R eferencias para el ca p ítu lo 1 2 ............................................................................................... U n front-end com p leto 965 A .l E l lenguaje d e cód ig o fu e n te .................................................................................... 965 A .2 M a i n .................................................................................................................................. 966 A .3 A .4 A .5 A .6 A .7 A .8 A .9 B 949 950 951 951 953 954 954 957 958 958 961 A nalizador lé x ico ........................................................................................................... Tablas d e sím b olos y t i p o s ...................................................................................... C ódigo interm edio para las e x p r e s io n e s ............................................................ C ódigo d e sa lto para las exp resion es b o o lea n a s.............................................. C ódigo interm edio para las in stru ccio n e s.......................................................... A nalizador s in t á c t ic o .................................................................................................. Creación d el fr o n t-e n d ............................................................................................... 967 970 971 974 978 981 986 B úsqueda de soluciones linealm ente in d ep en d ien tes 989 ín d ice 993 C a p ít u lo 1 Introducción L os lenguajes d e program ación son n otaciones q u e d escrib en los cálcu los a la s personas y las m áquinas. N u estra p ercep ción d e l m undo en q ue viv im o s d ep en d e d e los len g u a jes d e pro­ gram ación, y a q u e tod o e l softw are q ue se eje cu ta e n tod as las com p u tad oras se escribió en algún lengu aje d e program ación. Pero antes d e p od er ejecu tar u n program a, prim ero d eb e tra­ d ucirse a un form ato en e l q ue u na com p u tad ora p ueda ejecutarlo. Los sistem a s d e softw are q ue se encargan d e e s ta traducción se llam an com piladores. E ste libro tra ta acerca d e cóm o d iseñ ar e im plem entar com p ilad ores. A q u í descubrirem os q u e p od em os utilizar unas cu an tas ideas b ásicas para construir trad uctores para u na am plia variedad d e lenguajes y m áquinas. A dem ás d e los com piladores, lo s principios y las técn ica s para su d iseñ o se p ueden aplicar a ta n to s d om in ios d istin to s aparte, q ue es probable q ue un cien tífico com p u tacion al las reutilice m uchas veces en e l transcurso d e s u carrera profesional. E l e stu d io d e la escr itu ra d e los com p ilad ores s e rela cio n a co n los lengu ajes d e program a­ ción, la arquitectura d e las m áquinas, la teo ría d e lengu ajes, los algoritm os y la ingeniería de softw are. E n e s te ca p ítu lo prelim inar presentarem os las d istin ta s form as d e los traductores d e lengua­ je, proporcionarem os u n a d escrip ción gen eral d e a lto nivel so b re la estru ctu ra d e un com pilador ordinario, y hablarem os sobre las ten dencias e n lo s lengu ajes d e program ación y la arquitectura d e m áquinas q ue d a n form a a los com piladores. Incluirem os algunas ob servacion es sobre la relación entre el d iseñ o d e los com piladores y la teo ría d e las cien cia s co m p u ta cio n a les, y un esq u em a d e las ap licacion es d e tecn ología sobre los com piladores q u e van m ás allá d e la com ­ pilación. Term inarem os con u n a breve d escrip ción d e los co n cep to s cla v e d e los lenguajes de program ación que necesitarem os para nuestro estu d io d e los com piladores. 1.1 P ro c e s a d o re s d e le n g u a je D ich o e n form a sim p le, u n com p ilad or es un program a q ue p uede leer un program a en un len­ g u a je (el lengu aje fu en te) y traducirlo en un program a eq u ivalen te en o tro lengu aje (el lengu aje d estin o ); v ea la figura 1.1. U n a función im p ortan te d el com pilador es reportar cualquier error e n el program a fu en te q ue d etec te d urante el proceso d e traducción. 1 2 Capítulo 1. Introducción programa fuente i ______ Compilador programa destino F igu ra 1.1: U n com pilador Si el program a d estin o es u n program a ejecu ta b le en len gu aje m áquina, en to n ces e l usuario puede ejecu tarlo para procesar las entradas y producir salidas (resultados); v ea la figura 1.2. entrada salida F igu ra 1.2: E jecución d el program a d e d estin o U n in té rp re te es otro tip o com ú n d e procesador d e lenguaje. E n v e z d e producir un progra­ m a d estin o com o u n a traducción, el intérprete nos d a la apariencia d e ejecu tar d irectam ente las op eracion es especificadas en el program a d e origen (fu en te) co n la s en trad as proporcionadas por e l usuario, com o se m uestra e n la figura 1.3. programa fuente Intérprete salida entrada F igu ra 1.3: U n intérprete El p rogram a d estin o en lengu aje m áquina q ue p rod uce un com pilador es, p o r lo general, m ás rápido q ue un intérprete al m om ento d e asignar las en trad as a las sa lid a s. N o o b sta n te, por lo regular, e l intérprete p uede ofrecer m ejores d ia g n ó stico s d e error q u e un com pilador, y a q ue eje cu ta e l program a fuente in stru cción p or instrucción. E j e m p lo 1 .1 : L os procesadores d el lengu aje Java com binan la com pilación y la interpretación, com o se m uestra en la figura 1.4. U n program a fuente en J a v a p u ed e com pilarse prim ero en un form ato interm edio, llam ado bytecodes. D esp u és, u n a m áq u in a virtu al lo s interpreta. U n bene­ ficio d e e s te arreglo es q ue los b ytecod es q ue s e com pilan e n u na m áquina p ueden interpretarse en o tra , tal vez a través d e u na red. P ara p od er lograr un p rocesam ien to m ás rápido d e las entradas a las salid as, algunos com ­ piladores d e Java, con ocid os com o com piladores ju s t-in -tim e (ju sto a tie m p o ), traducen los bytecod es en len gu aje m áquina ju sto an tes d e ejecu tar el program a interm edio p a ra procesar la en trad a. □ 1.1 3 Procesadores d e lenguaje programa fuente salida F igu ra 1.4: U n com pilador híbrido A d em ás d e un com pilador, pueden requerirse otro s program as m ás para la creación d e un program a d estin o ejecu tab le, com o s e m u estra e n la figura 1.5. U n program a fuente p uede di­ vidirse en m ód u los gu ard ados en archivos separados. L a tarea d e recolectar el program a d e ori­ g en se co n fía algunas veces a u n program a separado, llam ad o preprocesador. E l preprocesador tam b ién p uede expandir algu nos fragm entos d e có d ig o ab reviados d e uso frecuente, llam ados m acros, en in stru cciones d e l lengu aje fuente. D esp ués, e l program a fuente m odificado se a lim en ta a u n com pilador. E l com p ilad or puede producir u n program a d estin o en en sam blador com o su sa lid a , y a q ue es m ás fácil producir e l lengu aje ensam blador com o salid a y e s m ás fácil s u depuración. A con tinu ación, e l lenguaje ensam blador se p rocesa m ed ian te un program a llam ad o en sa m b la d o r, e l cu a l p rod uce cód igo m áq u in a relocalizable com o su salida. A m enudo, los program as e x te n so s se com p ilan e n partes, p or lo q ue ta l vez haya que en lazar (vincular) el cód igo m áq u in a relocalizab le con otro s archivos o b je to relocalizables y archivos d e b ib lioteca p ara producir e l cód ig o q u e se ejecu te en realidad en la m áquina. E l en la za d o r resuelve las d irecciones d e m em oria extern a s, en d ond e el có d ig o en un archivo p uede hacer referencia a u n a ubicación e n o tro archivo. E n ton ces, e l cargador reú n e to d o s los archivos o b je to ejecu tab les en la m em oria para s u ejecución. 1.1.1 E je r c ic io s p a r a la s e c c ió n 1.1 E j e r c ic io 1 .1 .1 : ¿C uál es la diferencia en tre u n com p ilad or y un intérprete? E j e r c ic io 1 .1 .2 : ¿C uáles so n las ven ta ja s d e (a) u n com p ilad or so b re un intérprete, y (b) las d e un intérprete sob re un com pilador? E j e r c ic io 1 .1 .3 : ¿Q ué ven tajas h ay p ara u n siste m a d e p rocesam ien to d e lengu ajes en e l cual e l com p ilad or produce lengu aje ensam blador en v e z d e len gu aje m áquina? E j e r c ic io 1 .1 .4 : A u n com p ilad or q ue traduce un len gu aje d e a lto nivel a o tro lengu aje de a lto nivel se le llam a traductor d e sou rce-to-sou rce. ¿Q ué v en tajas h ay en cu a n to al u so d e C com o lengu aje d estin o para u n com pilador? E j e r c ic io 1 .1 .5 : D escrib a algunas d e las tareas q u e n ecesita realizar un ensam blador. 4 Capítulo 1. Introducción programa fuente código m áquina destino Figura 1.5: U n siste m a d e p rocesam ien to d e lenguaje 1.2 L a e s tr u c tu r a d e u n c o m p ila d o r H asta este punto, h em os tra ta d o al com p ilad or com o u n a c a ja sim p le q u e m a p ea un program a fuente a u n program a d estin o con eq u ivalen cia sem án tica. Si abrim os e s ta c a ja u n p o c o , podre­ m os ver q ue hay d os procesos en e s ta asignación: an álisis y sín tesis. La p arte del a n álisis d iv id e el program a fuente en com p o n en tes e im pon e u na estructu ra gram atical sob re ellas. D esp u és u tiliza e s ta estru ctu ra para crear u n a representación interm edia d el program a fuente. Si la p arte d el an álisis d e te c ta q u e e l program a fu en te e s tá m al form ado en cu an to a la sin taxis, o q ue no tien e u n a sem á n tica co n siste n te, en ton ces d eb e proporcionar m ensajes inform ativos para q u e e l usuario p u ed a corregirlo. L a p arte d el an álisis tam bién reco lecta inform ación sobre e l program a fuente y la a lm a cen a en u n a estru ctu ra d e d a to s lla ­ m ad a tabla de sím b o lo s, la cual se p asa ju n to co n la representación in term ed ia a la parte d e la síntesis. La p arte d e la sín te sis con stru ye el program a d estin o d esea d o a p artir d e la representación interm edia y d e la inform ación en la ta b la d e sím b olos. A la p arte d e l análisis s e le llam a co ­ m únm ente el fro n t-e n d d el com pilador; la parte d e la sín tesis (propiam ente la trad u cción ) es e l back-end. Si exam in am os e l proceso d e com p ilación co n m ás d eta lle, podrem os ver q u e o p era com o u na secu en cia d e fa se s, c a d a u n a d e las cu ales transform a u na representación d el program a fuente e n otro. E n la figura 1.6 se m uestra u na d escom p osición típ ica d e un com p ilad or en fases. E n la p ráctica varias fases pueden agruparse, y las representaciones interm edias entre las 1.2 La estructura d e un compilador 5 flujo d e caracteres código máquina destino * F igura 1.6: F ases d e un com pilador fases agrupadas n o n ecesitan construirse d e m anera ex p lícita . L a ta b la d e sím b olos, q u e alm a­ c e n a inform ación sob re tod o e l program a fuente, s e u tiliza en tod as las fases d el com pilador. A lgunos com piladores tien en u n a fase de op tim iza ció n d e có d ig o in depend iente d e la m áquina, en treelfro n t-en d y e l back-end. E lp ro p ó sito d e es ta o p tim iza ció n esrea liza r transform aciones sobre la representación interm edia, para q ue e l back-end p u ed a producir u n m ejor program a d estin o d e lo que hubiera producido co n u na representación in term ed ia sin optim izar. C om o la op tim i­ zación es op cion al, p uede faltar u na d e las d os fases d e op tim ización d e la figura 1.6. 1 .2 .1 A n á lis is d e lé x ic o A la prim era fase d e un com pilador se le llam a a n á lisis d e léxico o escaneo. E l analizador d e léxico lee el flu jo d e caracteres q ue com p on en el program a fu en te y los agru p a en secu en cias signifi­ 6 Capítulo 1. Introducción ca tiv a s, con ocidas com o lexem as. P ara cad a lexem a, e l analizador léxico produce com o sa lid a un token d e la forma: ( n om bre-token , va lo r-a trib u to ) q ue p a sa a la fase sigu ien te, e l an álisis d e la sin ta x is. E n e l token, e l prim er co m p o n en te n o m ­ bre-token es un sím b olo ab stracto q ue se u tiliza d u ran te e l an álisis sin tá ctico , y e l segundo com p on en te va lo r-a trib u to ap u n ta a u na en trad a en la ta b la d e sím b olos para e s te token. La inform ación d e la en trad a en la ta b la d e sím b olos se n ecesita para el an álisis sem án tico y la generación d e cód igo. Por ejem p lo, su p o n g a q ue un program a fuente co n tien e la instrucción d e asignación: p o s i c i o n = i n i c i a l + v e l o c id a d * 6 0 (1.1) Los caracteres en e s ta asignación p odrían agruparse en los sigu ientes lexem as y m apearse a los sig u ien tes tokens q ue se p asan al analizador sintáctico: 1. p o s i c i o n e s un lexem a q ue s e asign a a un tok en (id , 1 ), en d on d e ¡ d es un sím b olo abs­ tracto q ue representa la p alabra id e n tific a d o r y 1 ap un ta a la en trad a e n la ta b la d e sím ­ bolos para p o s i c i o n . L a en trad a en la ta b la d e sím b olos para un identificador con tien e inform ación acerca d e éste , com o su nom bre y tipo. 2. E l sím b olo d e asignación = es un lexem a q ue se asign a al token ( = ) . C om o e s te token no n ecesita un valor-atribu to, hem os om itid o el segu n d o com p on en te. P odríam os haber u tilizad o cualquier sím b olo ab stracto com o a s i g n a r para e l nom bre-token, pero por con ven iencia d e n otación hem os o p ta d o por usar e l m ism o lexem a com o el nom bre para el sím b olo abstracto. 3. i n i c i a l e s un lexem a q ue s e asign a al token (id , 2 ), en d on d e 2 a p u n ta a la en trad a en la ta b la d e sím b olos p ara i n i c i a l . 4. + es un lexem a q ue s e asig n a al token ( + ) . 5. v e l o c i d a d es un lexem a q ue se asign a al token ( id , 3 ), e n d o n d e 3 a p u n ta a l a en trad a en la ta b la d e sím b olos para v e lo c id a d . 6. * es un lexem a q ue s e asig n a al token (*). 7. 60 es u n lexem a q u e s e asign a al token (6 0 ).1 El analizador léxico ignora los espacios en blanco q u e separan a los lexem as. La figura 1.7 m u estra la representación d e la in stru cción d e asignación (1.1) d esp u és d el análisis léxico com o la secu en cia d e tokens. ( id , 1) (=> ( id , 2) ( + ) ( id , 3) (*) (60) (1.2) En e s ta representación, los nom bres d e lo s tok en s = , + y * son sím b olos ab stra cto s p a ra los operadores d e asignación, su m a y m ultiplicación, resp ectivam en te. 'H a b la n d o e n se n tid o té c n ic o , p a r a e l lex em a 6 0 fo rm aríam o s u n to k en co m o ( n ú m e r o , 4 ), e n d o n d e 4 a p u n ta a la ta b la d e sím b o lo s p a r a la re p re se n ta c ió n in te r n a d e l en te ro 6 0 , p e ro d e ja re m o s la explicación d e los to k e n s p a r a los nú­ m ero s h a s ta e l c a p ítu lo 2. E n e l c a p ítu lo 3 h ab larem o s so b re las té c n ic a s p a r a la c o n stru cció n d e an alizad o res léxicos. La estructura d e un compilador ( id , 1) p o s ic io n + ( id , 2) in ic ia l ^ * ( id , 3 ) ^60 v e l o c id a d _________ *_________ A nalizador sem án tico T a b l a d e s ím b o l o s ~TT~ ( id , 1 ) ^ ( id , 2) ^ (id , 3 ) in tto flo a t T 60 G enerador d e cód igo interm edio + t i = i n t t o f l o a t (6 0 ) t 2 = id 3 * t i t 3 = id 2 + t 2 id l = t3 ___________ *___________ O ptim izador d e código t i = id 3 * 6 0 .0 i d l = id 2 + t i ♦ G enerador d e código * LDF MULF LDF ADDF STF R2, id 3 R2, R 2, # 6 0 .0 R1, id 2 R l, R l, R2 i d l , Rl Figura 1.7: T raducción d e u n a in stru cción d e asignación 8 1 .2 .2 Capítulo 1. Introducción A n á lis is s in tá c tic o La segu n d a fase d e l com pilador e s el an álisis sin tá c tic o o parsing. E l parser (analizador sin tác­ tico ) u tiliza los prim eros com p onentes d e los tokens producidos por el analizador d e léxico para crear u n a representación in term ed ia en form a d e árbol que d escrib a la estru ctu ra gram atical d el flujo d e tokens. U na representación típ ica es e l árbol sin tá c tic o , en el cu al ca d a nodo in te­ rior representa u n a operación y los h ijos d e l n od o representan los argum entos d e la operación. En la figura 1.7 se m uestra un árbol sin táctico para el flujo d e tokens (1.2) com o sa lid a d el analizador sin táctico. E ste árbol m u estra e l orden en el q u e d eb en llevarse a ca b o las op eracion es e n l a sigu ien te asignación: p o s i c i o n = i n i c i a l + v e l o c id a d * 60 El árbol tien e u n n od o interior etiq u eta d o com o * , co n (¡d, 3) com o s u h ijo izquierdo, y el en tero 60 com o s u hijo derecho. E l n od o (id, 3) representa e l identificador v e l o c id a d . E l nodo etiq u etad o com o * hace exp licito q ue prim ero d eb em os m ultiplicar el valor d e v e l o c id a d por 60. E l nodo etiq u eta d o com o + in d ica q u e d eb em o s sum ar e l resultado d e e s ta m ultiplicación al valor d e i n i c i a l . L a raíz d e l árbol, q ue se e tiq u e ta com o = , in dica q ue d eb em os alm acenar e l resu ltad o d e e s ta su m a en la u bicación para e l identificador p o s i c i o n . E ste ord en am ien to d e op eracion es es con sisten te co n las convenciones usuales d e la aritm ética, las cu a les n os indican q ue la m u ltip licación tien e m ayor p reced en cia que la su m a y, p o r en d e, d eb e realizarse antes que la sum a. Las fases sigu ien tes d e l com pilador u tilizan la estru ctu ra gram atical para ayudar a analizar e l program a fuente y generar el program a d estin o. E n el ca p ítu lo 4 u tilizarem os gram áticas libres d e co n tex to para especificar la estru ctu ra gram a tica l d e los lengu ajes d e program ación, y hablarem os sobre los algoritm os para con stru ir analizadores sin tá ctico s eficien tes d e m anera au tom ática, a partir d e ciertas cla ses d e gram áticas. E n lo s cap ítu los 2 y 5 verem os q ue las d efinicion es orien tad as a la sin ta x is p ueden ayudar a especificar la traducción d e la s con stru c­ cion es d e l len gu aje d e program ación. 1 .2 .3 A n á lis is s e m á n tic o El an alizador se m á n tic o u tiliza el árbol sin tá ctico y la inform ación e n la ta b la d e sím b olos para com probar la co n sisten cia sem á n tica d el program a fu en te con la definición d el lengu aje. T am ­ bién recop ila inform ación sobre el tip o y la guarda, y a s e a en e l árbol sin tá ctico o en la ta b la d e sím b olos, para usarla m ás tarde d u ran te la generación d e có d ig o interm edio. U n a p arte im portan te d e l an álisis sem án tico e s la com probación (ve rifica c ió n ) d e tip o s , en d on d e e l com pilador verifica q ue ca d a operador ten g a operandos que coincidan . Por ejem plo, m uchas d efinicion es d e lenguajes d e program ación requieren q u e e l ín d ice d e u n arreglo se a entero; e l com p ilad or d eb e reportar un error si se u tiliz a un núm ero d e p u n to flo ta n te para indexar e l arreglo. La esp ecificación d el len gu aje p uede p erm itir cierta s conversiones d e tip o co n o cid a s com o coerciones. P or ejem p lo, p uede aplicarse un operador binario aritm ético a un par d e en teros o a un par d e núm eros d e punto flotan te. Si e l operador s e ap lica a u n núm ero d e punto flo ta n te 1.2 La estructura d e un compilador 9 y a u n entero, el com p ilad or p uede convertir u obligar a q u e se co n v ierta en un núm ero de p u n to flotan te. D ich a conversión aparece en la figura 1.7. S u p on ga q u e p o s i c i o n , i n i c i a l y v e l o c id a d se han declarado com o núm eros d e p u n to flo ta n te, y q ue el lex em a 6 0 por s í so lo form a un en te­ ro. E l com probador d e tip o e n e l analizador sem á n tico d e la figura 1.7 d escubre q ue se aplica e l operador * al núm ero d e p u n to flotan te v e l o c i d a d y al en tero 60. E n e s te caso, el entero p u ed e convertirse en u n núm ero d e punto flo ta n te. O bserve e n la figura 1.7 q ue la sa lid a del analizador sem án tico tien e un nodo adicional para e l operador i n t t o f l o a t , q u e con vierte de m anera e x p líc ita su argum ento tip o en tero en un núm ero d e p u n to flotan te. E n el ca p ítu lo 6 hablarem os sobre la com probación d e tip os y e l an álisis sem án tico. 1 .2 .4 G e n e r a c ió n d e c ó d ig o in te r m e d io E n el p roceso d e traducir un program a fuente a có d ig o d estin o , un com p ilad or p uede construir u na o m ás representaciones in term ed ias, las cu a les pueden tener u n a variedad d e form as. Los árb oles sin tá ctico s so n u n a form a d e representación interm edia; por lo general, s e u tiliza n du­ rante e l an álisis sin tá ctico y sem ántico. D esp u és d e l análisis sin táctico y sem án tico d e l program a fu en te, m uchos com piladores ge­ neran u n nivel bajo ex p lícito , o u n a representación in term ed ia sim ilar a l có d ig o m áquina, que p od em os considerar com o u n program a para u n a m áq u in a ab stracta. E s ta representación in­ term ed ia d e b e ten er d os propiedades im portantes: d eb e ser fácil d e producir y fácil d e traducir e n la m áquina d estin o. E n e l ca p ítu lo 6, consideram os u na form a in term ed ia llam ad a código d e tres direccio n es, que co n siste en u n a secu en cia d e instrucciones sim ilares a ensam blador, co n tres op eran d os p or ins­ tru cción. C ad a op eran d o p uede actu ar com o u n registro. L a sa lid a d el generador d e có d ig o in­ term edio en la figura 1.7 co n siste en la secu en cia d e có d ig o d e tres direcciones. ti t2 t3 id = i n t t o f l o a t (6 0 ) = id 3 * t i = id 2 + t 2 l = t3 (1.3) H ay varios p un tos q ue vale la p en a m encionar sobre la s instrucciones d e tres direcciones. En prim er lugar, ca d a in stru cción d e asignación d e tres direcciones tiene, p or lo m enos, un operador d e l lado derecho. P or en d e, esta s in stru cciones corrigen e l orden e n e l q ue s e v a n a realizar las operaciones; la m u ltip licación v a an tes q ue la sin n a en e l program a fuente (1 .1 ). E n segundo lugar, e l com pilador d eb e generar un nom bre tem poral para guardar e l valor calcu lado por u n a instrucción d e tres direcciones. E n tercer lugar, algunas “in stru cciones d e tres d irecciones” com o la prim era y la ú ltim a e n la secu en cia (1.3) anterior, tien en m enos d e tres operandos. E n e l cap ítu lo 6 hablarem os sobre las represen taciones in term ed ias principales q ue se u tili­ zan e n los com piladores. E l ca p ítu lo 5 introduce la s técn ica s p a ra la traducción d irigid a p or la sin taxis, las cu ales s e aplican en e l cap ítu lo 6 para la com probación d e tip o s y la gen eración de cód ig o interm edio en las con stru cciones com unes d e los lengu ajes d e program ación, com o las exp resion es, las con stru ccion es d e con trol d e flujo y las llam adas a procedim ientos. 10 1 .2 .5 Capítulo 1. Introducción O p tim iz a c ió n d e c ó d ig o La fase d e op tim ización d e cód igo in depend iente de la m áquina tra ta d e m ejorar el cód igo in­ term edio, d e m anera q ue se p rod uzca un mejor có d ig o d estin o . Por lo general, mejor sign ifica m ás rápido, pero p ueden lograrse otros o b je tiv o s, co m o un có d ig o m ás corto, o u n có d ig o d e d estin o q ue con su m a m enos poder. P or ejem p lo, un algoritm o d irecto g en era el có d ig o inter­ m edio (1.3), usando u n a instrucción para cad a operador en la representación tip o árbol q ue produce e l analizador sem ántico. U n algoritm o sim p le d e generación d e cód igo interm edio, seg u id o d e la op tim iza ció n d e có ­ d igo, e s u n a m anera razonable d e ob ten er un buen có d ig o d e d estin o . E l op tim izad or p uede d e­ ducir q ue la conversión d el 60, d e en tero a p u n to flotan te, p u ed e realizarse d e u n a v e z por to d a s en tiem p o d e com p ilación, por lo q ue se p uede elim inar la operación ¡ n t t o f l o a t su stitu y en d o e l en tero 60 por el núm ero d e p u n to flotan te 60.0. Lo que es m ás, t 3 s e u tiliz a só lo una vez para tran sm itir su valor a i d l , para que el op tim izad or p u ed a transform ar (1.3) en la sigu ien te secu en cia m ás corta: t i = id 3 * 6 0 . 0 i d l = id 2 + t i (1.4) H ay u n a gran variación e n la can tid ad de op tim iza ció n d e có d ig o q ue realizan los d istin tos com piladores. E n aq uellos q ue realizan la m ayor o p tim iza ció n , a lo s q ue se les d en o m in a com o “com piladores op tim izad ores” , s e in vierte m ucho tiem p o e n e s ta fase. H ay op tim izacion es sim p les q ue m ejoran en form a considerable e l tiem p o d e ejecución d e l p rogram a d estin o , sin reducir d em asiad o la velocid ad d e la com p ilación. Los ca p ítu lo s 8 en ad elan te hablan con m ás d eta lle sobre las op tim izacion es in d ep en d ien tes y d ep en d ien tes d e la m áquina. 1 .2 .6 G e n e r a c ió n d e c ó d ig o El generador d e cód ig o recibe com o en trad a u n a representación in term ed ia d e l program a fuen­ t e y la asign a al lengu aje d estin o. Si el lengu aje d estin o es có d ig o m áquina, se seleccion an registros o u bicacion es (localidades) d e m em oria para ca d a u n a d e las variables q ue u tiliza el program a. D esp ués, las instrucciones in term ed ias se traducen en secu en cia s d e instrucciones d e m áq u in a q ue realizan la m ism a tarea. U n asp ecto crucial d e la gen eración d e cód igo es la asignación ju ic io sa d e los registros para guardar las variables. Por ejem p lo, usando los registros R1 y R2, e l có d ig o in term ed io en (1.4) p o d ría traducirse en e l sigu ien te cód igo d e m áquina: IDF MULF LDF ADDF STF R 2, R2, R 2, # 6 0 .0 R 1, R l, id l, id 3 R l, i d 2 (1.5) R2 Rl El prim er op eran d o d e ca d a in stru cción esp ecifica u n d estin o . L a F e n ca d a instrucción nos in d ica q ue tra ta con núm eros d e p u n to flotan te. E l có d ig o en (1.5) carga el co n ten id o d e 1.2 La estructura d e un compilador 11 la dirección id 3 en e l registro R2, y d esp u és lo m u ltip lica con la co n sta n te d e p u n to flo ta n te 60.0. E l # in d ica que e l núm ero 60.0 se va a tratar co m o u na co n sta n te inm ediata. L a tercera in stru cción m ueve id 2 a l registro R1 y la c u a rta lo su m a a l valor q ue s e h ab ía calcu lado antes e n el registro R2. Por últim o, el valor en e l registro R1 se alm acena en la dirección d e i d l , por lo q ue e l cód igo im p lem en ta en form a correcta la in stru cción d e asign ación (1 .1 ). E l ca p ítu lo 8 tra ta acerca d e la gen eración d e código. E n e s ta exp licación sobre la g en eración d e có d ig o h em os ignorado u n a cu estió n im portan ­ te: la asign ación d e esp acio d e alm acenam iento para los id en tificadores en e l program a fuente. C om o verem os e n el ca p ítu lo 7, la organ ización d el esp a c io d e a lm acen am ien to en tiem p o d e ejecu ción d ep en d e d e l len gu aje q ue s e e s té co m p ilan d o. Las d ecisio n es sob re la a sign ación de esp a c io d e alm acen am ien to s e realizan d u ra n te la g en eración d e c ó d ig o interm edio, o durante la gen eración d e cód igo. 1 .2 .7 A d m in is tr a c ió n d e la t a b l a d e s ím b o lo s U n a fun ción esen cial d e un com p ilad or e s registrar lo s nom bres d e la s variables q u e se utilizan e n e l program a fuente, y recolectar inform ación so b re varios atrib u tos d e ca d a nom bre. E stos atrib u tos p ueden proporcionar inform ación acerca d el espacio d e alm acenam iento q u e se asigna para u n nom bre, s u tip o , s u alcance (en q ué p arte d e l program a p u ed e usarse s u valor), y en e l caso d e los nom bres d e p rocedim ientos, cosas com o el núm ero y los tip o s d e su s argum en­ to s, e l m étod o para pasar ca d a argum ento (por ejem p lo, p or valor o p o r referencia) y e l tipo d evu elto. L a ta b la de sím b olos es u n a estru ctu ra d e d a to s q ue co n tien e un registro para c a d a nombre d e variable, co n ca m p o s p ara los atrib u tos d el nom bre. L a estru ctu ra d e d a to s d eb e diseñar­ s e d e tal form a q u e p erm ita al com p ilad or buscar e l registro para ca d a nom bre, y alm acenar u ob ten er d a to s d e ese registro con rapidez. E n e l ca p ítu lo 2 hablarem os sobre la s tab las de sím b olos. 1 .2 .8 E l a g r u p a m ie n t o d e fa s e s e n p a s a d a s E l tem a sobre las fases tien e q ue ver con la organización lógica d e un com pilador. E n u na implem en tación , las activid ad es d e varias fases p ueden agruparse e n u n a p a sa d a , la cu a l lee un archivo d e en trad a y escribe en u n archivo d e salida. Por ejem plo, las fases correspondientes al front-end d e l análisis léxico, análisis sin tá ctico , análisis sem án tico y gen eración d e cód igo interm edio p odrían agruparse e n u n a so la pasada. L a op tim iza ció n d e có d ig o p o d ría ser una p asad a op cion al. E n tonces p od ría haber u n a p a sa d a d e back-end, co n sisten te e n la generación d e cód igo para una m áquina de d estin o específica. A lgu n as coleccion es d e com p ilad ores s e han cread o e n base a representaciones interm edias d iseñ ad as co n cu id ado, las cu a les p erm iten q u e e l front-end para u n len gu aje esp ecífico se in tercon ecte co n e l back-end para c ie r ta m áq u in a d estin to . C on esta s coleccio n es, p od em os producir com p ilad ores p ara d istin to s lengu ajes fu en te para u n a m áq u in a d estin o , m ed ia n te la com b in ación d e d istin to s front-end con su s back-end p a ra esa m á q u in a de d estin o . D e m anera sim ilar, p od em os producir com p ilad ores para d istin ta s m áqu inas d estin o , m ed ian te la com bi­ n ación d e un front-end con back-end para d istin ta s m áquinas d estin o . 12 Capítulo 1. Introducción 1 .2 .9 H e r r a m i e n t a s d e c o n s tr u c c ió n d e c o m p ila d o r e s A l igual q ue cualquier desarrollador d e softw are, e l desarrollador d e com piladores p uede u tili­ zar para s u beneficio los en torn os d e desarrollo d e softw are m odernos q ue con tien en herram ien­ tas com o ed itores d e lenguaje, depuradores, ad m in istrad ores d e version es, profilers, am bientes seguros d e prueba, etcétera. A dem ás d e esta s herram ientas generales para e l desarrollo d e softw are, se han creado otras herram ientas m ás esp ecializad as para ayudar a im plem entar las diversas fases d e un com pilador. E stas herram ientas u tilizan lenguajes esp ecializad os para especificar e im plem entar com ­ p on en tes específicos, y m uchas u tilizan algoritm os b a sta n te sofisticad os. Las herram ientas más ex ito sa s son las q ue o cu lta n los d eta lles d el algoritm o d e generación y producen com p onentes q ue pueden integrarse con facilidad al resto d el com pilador. A lgu nas herram ientas d e con stru c­ ción d e com piladores d e u so com ú n son: 1. G en eradores d e an alizadores sin tá c tic o s (p a rse rs), q ue producen d e m anera a u to m á tica analizadores sin tá ctico s a partir d e u n a d escrip ción gram atical d e un len gu aje d e progra­ m ación. 2. G en eradores d e escán eres, q ue producen analizadores d e léxicos a partir d e u na descrip­ ción d e los tokens d e un len gu aje utilizan do exp resion es regulares. 3. M otores de tradu cción o rie n ta d o s a la sin ta x is, q ue p rod ucen coleccion es d e ru tinas para recorrer u n árbol d e an álisis sin tá ctico y generar código interm edio. 4. G en eradores d e gen eradores d e código, q u e producen un generador d e có d ig o a partir de u na colección de reglas para traducir ca d a operación d el len gu aje interm edio en el lengu aje m áquina para u n a m áquina d estin o. 5. M otores de a n á k sis d e flu jo s de d a to s , q u e facilitan la recopilación d e inform ación d e cóm o se tran sm iten los valores d e u na p arte d e un program a a ca d a u n a d e las o tra s par­ te s. E l an álisis d e los flujos de d a to s es u n a parte clave en la op tim iza ció n d e código. 6. K its ( con ju n tos) d e h erra m ien ta s para la con stru cció n de co m p ila d o res, q ue proporcionan un con ju n to integrado d e ru tinas para construir varias fases d e un com pilador. A lo largo d e este libro, describirem os m uchas d e e s ta s herram ientas. 1.3 L a e v o lu c ió n d e los le n g u a je s d e p ro g ra m a c ió n Las prim eras com p utadoras electrón icas aparecieron en la d éca d a d e 1940 y se program aban en lengu aje m áquina, m ed ian te secu en cias d e O’s y l ’s q ue indicaban d e m anera ex p líc ita a la com p utadora las op eracion es que d eb ía ejecutar, y en q ué orden. Las o p eracion es en s í eran d e m uy bajo nivel: m over d a to s d e u n a ubicación a otra, su m ar e l con ten ido d e d os registros, com parar d o s valores, etcétera. E s tá d em á s d ecir, q ue e s te tip o d e program ación era lenta, ted io sa y p rop en sa a errores. Y u n a vez escritos, lo s program as eran d ifíciles d e com prender y m odificar. 1.3 La evolución d e los lenguajes d e programación 1 .3 .1 13 E l a v a n c e a lo s le n g u a je s d e a lto n iv e l E l prim er p aso h acia los lengu ajes d e program ación m ás am igables para las p erson as fue el desarrollo d e los lenguajes ensam bladores a in icios d e la d éca d a d e 1950, los cu ales usaban m nem ónicos. A l principio, las instrucciones en un len gu aje ensam blador eran sólo representaciones m nem ón icas d e las instrucciones d e m áquina. M ás ad elan te, s e agregaron m acro instruccio­ n es a los lenguajes ensam bladores, p ara q u e un program ador p ud iera definir abreviaciones pa­ ram e trizadas para las secu en cias d e u so frecuente d e las instrucciones d e m áquina. U n p aso im p ortan te h acia los lengu ajes d e a lto nivel se h izo en la seg u n d a m itad d e la d éca d a d e 1950, co n e l desarrollo d e Fortran para la com p u ta ció n cien tífica, C obol p a ra e l pro­ cesam ien to de d a to s d e negocios, y Lisp para la co m p u ta ció n sim bólica. La filosofía d e esto s lengu ajes era crear n otacion es d e a lto nivel con las q ue los program adores pudieran escribir con m ás facilidad los cálcu los num éricos, las ap licacion es d e negocios y los program as sim bólicos. E sto s lengu ajes tuvieron ta n to é x ito q u e sigu en en uso hoy en día. E n las sigu ien tes décad as se crearon m uchos lengu ajes m ás con características innovadoras para facilitar q ue la program ación fuera m ás n atu ral y m ás robusta. M ás ad elan te, en este ca­ p ítu lo, hablarem os sobre ciertas características clave q u e son com u n es para m uchos lenguajes d e program ación m odernos. E n la actu alid ad ex iste n m iles d e lengu ajes d e program ación. P u ed en clasificarse e n una variedad d e form as. U n a d e ellas e s p or generación. Los lenguajes d e p rim e ra g en era ció n son los lengu ajes d e m áquina, los d e segunda gen era ció n son lo s lenguajes en sam bladores, y los de tercera g en era ció n so n los lengu ajes d e alto nivel, com o Fortran, C obol, L isp, C, C + + , C # y Java. Los lenguajes de cu a rta g en era ció n son d iseñ ados para ap licacion es específicas com o N O M A D para la generación d e reportes, SQ L para las co n su lta s en bases d e d a to s, y PostScript para el form ato d e texto. E l térm ino lenguaje d e qu inta g en era ció n se ap lica a lo s lenguajes basados en lógica y restricciones, com o P rolog y O PS5. O tra d e las clasificacion es d e los lengu ajes u tiliza el térm in o im p era tivo para los lenguajes e n los q u e un program a esp ecifica cóm o se v a a realizar u n cálcu lo, y d eclarativo para los len­ g u a jes en los q ue un program a esp ecifica qué cá lcu lo se v a a realizar. Los lengu ajes co m o C, C + + , C # y Java son lengu ajes im perativos. E n los lenguajes im perativos h ay u n a n oción de e sta d o d e l program a, ju n to co n instrucciones q u e m odifican e se esta d o . Los lengu ajes funcio­ nales com o ML y Haskell, y los lengu ajes d e ló g ica d e restricción com o P rolog, s e consideran a m en u d o com o lenguajes declarativos. E l térm in o lenguaje v o n N eu m a n n se ap lica a lo s lengu ajes d e program ación cu y o m o d elo se b asa en la arquitectura d e com p utadoras d escrita p or von N eum ann. M uchos d e lo s lenguajes d e la actualidad, com o Fortran y C, son lenguajes von N eum ann. U n lenguaje o rie n ta d o a o b je to s es u no q u e so p o rta la program ación orien ta d a a o b jeto s, u n estilo d e program ación en el q ue un program a co n siste en u n a colección d e o b je to s que in teractú an en tre sí. Sim ula 67 y S m alltalk so n d e los prim eros lenguajes orien tad os a o b jeto s im p ortan tes. Los lengu ajes com o C + + , C # , J a v a y R u b y so n los lenguajes orien tad os a ob je­ to s m ás recientes. Los lenguajes d e secu en cia s de com andos (sc rip tin g ) so n lenguajes interpretados con opera­ d ores d e a lto nivel d iseñ ados para “im ir” cálcu los. E sto s cá lcu lo s s e con ocían e n un principio com o “secuencias d e com andos (s c r ip ts ) ” . A w k, JavaS cript, P erl, P H P , P y th o n , R u b y y T cl so n ejem plos populares d e lenguajes de secu en cias d e com andos. L os program as escritos en 14 Capítulo 1. Introducción lenguajes d e secu en cias d e com an dos so n a m enudo m ás co rto s q ue lo s program as eq u ivalen tes escritos en lenguajes com o C. 1 .3 .2 I m p a c to s e n e l c o m p ila d o r D esd e s u d iseñ o , lo s lengu ajes d e p rogram ación y los co m p ilad ores está n ín tim a m en te rela­ cionados; los avan ces en los len gu ajes d e p rogram ación im pu sieron n uevas d em a n d a s sob re los escritores d e com p ilad ores. É sto s ten ía n q u e idear algoritm os y rep resen tacion es para traducir y d ar so p o rte a las n uevas cara cterística s d el len g u a je. D esd e la d éca d a d e 1940, la arq u itectu ra d e com p u tad oras h a ev olu cion ad o tam b ién . Los escritores d e com p ilad ores no só lo tu vieron q u e rastrear las n uevas cara cterística s d e u n len g u a je, sin o q u e ta m b ién tu v ie­ ron q ue idear algoritm os d e tra d u cció n p a ra aprovechar a l m á xim o las n uevas ca ra cterística s d e l hardw are. Los com p ilad ores p ueden ayudar a prom over e l uso d e lengu ajes d e alto n iv el, al m inim i­ zar la sob recarga d e ejecu ción de los p rogram as escr ito s en esto s len gu ajes. Los co m p ila d o ­ res tam b ién so n im prescin dib les a la hora d e h acer efectiv a s la s arq u itecturas co m p u ta cio n a les d e a lto ren d im ien to en las ap licacion es d e usuario. D e hecho, e l rend im iento d e un siste m a co m p u tacion al es ta n d ep en d ien te d e la tecn o lo g ía d e com p ilad ores, q ue ésto s s e u tiliza n com o una herram ienta para evaluar los co n cep to s sob re la arq u itectu ra an tes d e crear u na co m p u ­ tadora. Escribir com p ilad ores e s u n reto. U n com p ilad or p or s í so lo es un program a ex ten so . A de­ m ás, m uchos sistem a s m odernos d e procesam iento d e lenguajes m anejan varios lenguajes fuen­ te y m áquinas d estin o d en tro d el m ism o framework; es decir, sirven com o coleccion es d e com piladores, y es probable q ue co n sistan en m illon es d e líneas d e código. E n con secu en cia, las buenas técn icas d e ingeniería d e softw are son esen ciales p a ra crear y evolucionar lo s procesa­ dores m odernos d e lenguajes. U n com pilador d eb e traducir en form a correcta e l con ju n to p o ten cia lm en te in finito d e pro­ gram as q ue p odrían escribirse en e l lengu aje fuente. E l prob lem a d e generar e l có d ig o d estin o ó p tim o a partir d e un program a fuente es indecidible; p or en d e, los escritores d e com piladores d eb en evaluar las con cesion es acerca d e los problem as q ue se d eb en atacar y la h eu rística q ue se d eb e utilizar para lidiar co n e l problem a d e generar cód igo eficiente. U n estu d io d e los com piladores e s tam b ién u n estu d io so b re cóm o la teoría se en cu en tra con la práctica, com o verem os en la sección 1.4. El propósito d e e s te libro es en señar la m etod o lo g ía y las ideas fun dam en tales q ue se u tili­ zan e n e l d iseñ o d e los com piladores. E ste libro no tien e la intención d e enseñar to d o s lo s algo­ ritm os y técnicas q ue p odrían usarse para construir un siste m a d e p rocesam ien to d e lenguajes d e vanguardia. N o o b sta n te , los lectores d e e s te te x to adquirirán e l co n o cim ien to b ásico y la com prensión para aprender a construir u n com p ilad or co n rela tiv a facilidad. 1 .3 .3 E je rc ic io s p a r a la s e c c ió n 1.3 E j e r c ic io 1 .3 .1 : Indique cu á l d e los sigu ien tes térm inos: a) im perativo d ) orien tad o a o b je to s g ) d e cu a rta generación b) d eclarativo e) funcional h) secu en cias d e com andos c) v o n N eum ann f) d e tercera generación 1.4 La ciencia d e construir un compilador 15 s e ap lican a los sigu ientes lenguajes: 1) C 6 ) L isp 1.4 2) C + + 7 ) ML 3) C obol 8) Perl 4 ) Fortran 9) P y th o n 5) Java 10) V B . L a c ie n c ia d e c o n s tr u ir u n c o m p ila d o r E l d iseñ o d e com piladores e s tá lleno d e b ellos ejem p los, en d o n d e se resuelven problem as com ­ p licados d el m undo real m ed ian te la abstracción d e la esen cia d el problem a en form a m atem á­ tica. É sto s sirven com o excelen tes ilustraciones d e có m o pueden usarse las abstracciones para resolver problem as: se to m a u n problem a, se form ula u n a ab stracción m a tem á tica q ue capture las características clave y se resuelve utilizan do técnicas m atem áticas. L a form ulación d el pro­ b lem a d eb e tener bases y u na sólid a com prensión d e las características d e los p rogram as de com p utadora, y la solu ción d eb e validarse y refinarse en form a em pírica. U n com p ilad or d eb e aceptar to d o s los program as fuente conform e a la especificación del lenguaje; e l con ju n to d e program as fuente e s in finito y cualquier program a p u ed e ser m uy largo, p osiblem en te form ado por m illon es d e líneas d e cód igo. C ualquier transform ación que realice el com p ilad or m ientras trad u ce u n program a fu en te d eb e preservar e l sign ificad o del program a q u e se e s tá com p ilan do. Por en d e, los escritores d e com piladores tien en in fluencia no só lo sobre los com piladores q ue crean , sin o en to d o s lo s program as q ue com p ilan su s com pi­ ladores. E s ta cap acidad hace q ue la escritu ra d e com piladores se a en esp ecia l gratificante; no ob sta n te, tam b ién hace q u e el desarrollo de los com p ilad ores s e a to d o un reto. 1 .4 .1 M o d e la d o e n e l d is e ñ o e im p le m e n ta c ió n d e c o m p ila d o r e s E l estu d io d e los com piladores e s p rin cip alm en te un estu d io d e la form a en q ue d iseñ am os los m o­ d elos m atem áticos apropiados y elegim os los algoritm os correctos, a l tiem p o q ue logram os equi­ librar la necesidad d e u n a gen eralid ad y p od er co n la sim p leza y la eficiencia. A lgu n os d e los m od elos m ás b ásicos so n la s m áquinas d e esta d o s finitos y las expresiones regulares, q u e verem os e n el cap ítu lo 3. E sto s m odelos so n ú tiles para describir las u nidades de léxico d e los program as (palabras clave, identificadores y d em á s) y para describir lo s algoritm os q u e u tiliza e l com pilador para reconocer esas unidades. A dem ás, en tre lo s m odelos esen ciales se en cu en tran las gram áticas libres d e co n tex to , q ue se u tilizan para describir la estru ctu ra sin tác­ tic a d e los lengu ajes d e program ación, com o el an idam iento d e los paréntesis o las instrucciones d e control. E n el ca p ítu lo 4 estu diarem os las gram áticas. D e m anera sim ilar, los árboles so n un m od elo im portan te para representar la estru ctu ra d e los program as y su trad ucción a cód igo o b jeto , com o verem os en e l ca p ítu lo 5. 1 .4 .2 L a c ie n c ia d e la o p tim iz a c ió n d e c ó d ig o E l térm in o “op tim ización ” e n el d iseñ o d e com piladores se refiere a lo s in ten tos q u e rea liza un com p ilad or p or producir cód igo q u e s e a m ás eficien te q ue e l có d ig o ob v io . P or lo ta n to , “o p ti­ m ización ” es u n térm in o eq u ivocad o, y a q ue no h ay form a e n q ue s e p ueda garantizar q u e el cód ig o producido por un com p ilad or s e a ta n rápido o m ás rápido q ue cualquier o tro cód igo que realice la m ism a tarea. 16 Capítulo 1. Introducción En los tiem p os m odernos, la op tim ización d e có d ig o q ue realiza u n com pilador s e h a vu elto tan to m ás im portan te com o m ás com p leja. E s m ás com p leja d eb ido a q ue las arquitecturas d e los procesadores se han vu elto m ás com plejas, con lo q ue ofrecen m ás op ortu n id ad es d e m ejorar la form a en q ue se ejecu ta e l cód igo. E s m ás im p o rta n te, y a q ue la s com p u tad oras paralelas m asivas requieren d e u n a op tim ización considerable, pues d e lo contrario s u rend im iento sufre por grad os d e m agnitu d. Con la p osible prevalencia d e las m áquinas m ultinúcleo (com pu tad o­ ras co n chips q ue con tien en gran d es núm eros d e p rocesad ores), to d o s lo s com piladores tendrán q ue enfrentarse a l problem a d e aprovechar las m áquinas con m últiples procesadores. Es d ifícil, s i no es q ue im posible, construir un com p ilad or ro b u sto a partir d e “arreglos” . Por en d e, s e h a generado u na teoría ex te n sa y ú til sobre el prob lem a d e op tim izar cód igo. El uso d e u na base m a tem ática rigurosa nos p erm ite m ostrar q ue u n a op tim iza ció n es correcta y q ue produce e l efecto d eseab le para to d a s las p osibles entradas. E m p eza n d o e n el ca p ítu lo 9, verem os d e q u é m anera so n necesarios los m odelos com o grafos, m atrices y p rogram as lineales si e l com p ilad or d eb e producir un cód ig o b ien op tim izado. Por o tro lado, no e s su ficiente só lo co n la pura teoría. A l igual q u e m uchos p rob lem as d el m undo real, no h ay resp uestas perfectas. D e hecho, la m ayoría d e las p regu n tas q ue hacem os en la op tim ización d e un com p ilad or so n indecidibles U n a d e las h abilidad es m ás im p ortan tes en e l d iseñ o d e los com piladores es la d e form ular e l problem a adecuado a resolver. P a ra em pezar, n ecesitam os u n a b uena com prensión d el com p ortam ien to d e los program as, ju n to co n un pro­ ceso ex te n so d e exp erim en tación y evalu ación para validar nuestras intuiciones. Las o p tim izacion es d e com piladores d eb en cum plir con los sig u ien tes o b je tiv o s d e diseño: • L a op tim ización d eb e ser correcta; es decir, d eb e preservar el sign ificad o d el program a com pilado. • L a op tim ización d eb e m ejorar e l rendim iento d e m uchos program as. • E l tiem p o d e com pilación d eb e m antenerse e n un valor razonable. • E l esfu erzo d e ingeniería requerido d eb e ser adm inistrable. Es im posible hacer m ucho én fasis en la im p orta n cia d e esta r en lo correcto. E s trivial escri­ bir un com p ilad or q ue genere cód igo rápido, ¡si e l có d ig o generado no n ecesita esta r correcto! Es tan d ifícil op tim izar los com piladores en form a apropiada, q ue n os atrevem os a decir q ue ¡ningún com pilador op tim izador e s tá libre d e errores! Por en d e, e l o b jetiv o m ás im p ortan te en la escritu ra d e un com pilador es q u e s e a correcto. El segu n d o o b je tiv o es q u e e l com p ilad or d eb e tener efectivid ad a la h o ra d e m ejorar el rendim iento d e m uchos program as d e entrada. P or lo general, e l rendim iento in d ica la v eloci­ dad d e ejecu ción d e l program a. E n esp ecia l en las ap licacion es incrustadas, tam bién p u ed e ser con ven iente m inim izar el tam añ o del cód igo gen erado. Y en e l ca so d e los d isp o sitiv o s m óviles, tam bién es con ven ien te q ue e l cód igo reduzca el con su m o d e energía. Por lo general, las m ism as op tim izacion es q ue agilizan e l tiem p o d e ejecu ción tam bién ahorran energía. A dem ás d e l ren­ d im ien to, los asp ecto s d e cap acidad d e u so com o el reporte d e errores y la depuración tam bién son im portantes. En tercer lugar, d eb em os lograr q ue el tiem p o d e com p ilación se a corto para p od er sopor­ tar un ciclo rápido d e desarrollo y depuración. E ste requerim iento se h a v u elto m ás fácil de 1.5 Aplicaciones d e la tecnología d e compiladores 17 cu m plir a m ed ida q ue las m áquinas s e hacen m ás rápidas. A m enudo, un p rogram a prim ero se desarrolla y se d ep u ra sin op tim izacion es. N o sólo se reduce e l tiem p o d e com p ilación, sin o que, lo m ás im portan te, los program as no o p tim iza d o s so n m ás fáciles d e depurar, y a q ue las op tim i­ zacion es q ue in trod u ce un com pilador, por lo com ún, oscurecen la relación en tre e l có d ig o fuente y e l cód igo o b jeto . A l activar las op tim iza cio n es en el com pilador, algu nas v eces s e exp on en nuevos problem as en el program a fuente; en con secu en cia, h ay q ue probar o tra vez e l cód igo op tim izad o. A lgu n as veces, la necesidad d e p ru eb a adicional im pide e l u so d e op tim izacion es e n aplicaciones, en esp ecia l si su rendim iento n o e s crítico. P or ú ltim o, un com pilador e s un siste m a com plejo; d eb em os m antener este siste m a sim ple, para asegurar q ue los co sto s d e ingeniería y d e m anten im ien to d el com p ilad or sea n m anejables. E x iste un núm ero in finito d e op tim izacion es d e program as q ue p odríam os im plem entar, y se requiere d e m uy p o c o esfuerzo para crear u n a op tim iza ció n correcta y efectiv a . D eb em os dar prioridad a las op tim izacion es, im plem en tan do só lo las q ue con lleven a lo s m ayores beneficios e n los program as fu en te q ue en con trem os en la práctica. P or lo tan to, al estu d iar los com piladores no só lo aprendem os a construir uno, sin o tam bién la m etod ología gen eral p ara resolver problem as com p lejos y abiertos. E l m éto d o q u e se utilice e n el desarrollo d e los com piladores im plica ta n to teoría com o exp erim en tación . P or lo general, em p ezam os form ulando el problem a segú n nuestras in tu iciones acerca d e cu áles so n la s cu es­ tio n es im portantes. 1.5 A p lic a c io n e s d e la te c n o lo g ía d e c o m p ila d o re s E l d iseñ o d e com p ilad ores no e s só lo acerca d e los com piladores; m uchas personas u tilizan la tecn o lo g ía q ue aprenden al estu d ia r com p ilad ores en la escu ela y nunca, h ablando en sen ­ tid o estr icto , han escrito (n i siq u iera p arte d e) u n com p ilad or p a ra u n len gu aje d e progra­ m ación im p ortan te. L a tecn o lo g ía d e com p ilad ores tie n e tam b ién o tro s u sos im portan tes. A d em ás, e l d iseñ o d e com p ilad ores im p a cta en otra s áreas d e las cien cia s co m p u ta cio n a les. En e s ta sección verem os u n repaso acerca d e las in teraccion es y ap licacion es m á s im p ortan tes d e e s t a tecn ología. 1 .5 .1 I m p le m e n ta c ió n d e le n g u a je s d e p r o g r a m a c ió n d e a lto n iv e l U n lengu aje d e program ación d e a lto nivel define u na abstracción d e program ación: el progra­ m ador exp resa un algoritm o u sand o e l lengu aje, y e l com pilador d eb e traducir el program a en el len gu aje d e d estin o. Por lo general, es m ás fácil program ar en los lengu ajes d e program ación d e a lto nivel, aunque so n m en os eficientes; e s decir, los p rogram as d estin o se ejecu tan con más len titu d . Los program adores q u e u tilizan un lengu aje d e b a jo nivel tien en m ás con trol sobre u n cálcu lo y p ueden, e n principio, producir có d ig o m ás eficien te. Por desgracia, los program as d e m enor nivel so n m ás d ifíciles d e escribir y (peor aún) m enos p ortables, m ás propensos a errores y m ás d ifíciles d e m antener. L a op tim iza ció n d e los com piladores in clu ye técn ica s para m ejorar e l rendim iento d e l cód igo gen erado, con las cu ales se d esp la za la in eficien cia q u e dan las ab stracciones d e a lto nivel. 18 Capítulo 1. Introducción E j e m p lo 1 .2 : L a palabra clave r e g i s t r o e n el lenguaje d e program ación C es uno d e los pri­ m eros ejem plos d e la interacción entre la tecnología d e los com piladores y la evolución d e l len­ guaje. C uan do el lengu aje C se creó a m ediados d e la d éca d a d e 1970, era necesario dejar q ue un program ador controlara q u é variables d el program a d eb ían residir en los registros. E ste control y a no fue necesario cu an do se desarrollaron las técnicas efectivas d e asignación d e recursos, por lo cu a l la m ayoría d e los program as m odernos y a n o u tilizan e s ta característica d el lenguaje. D e h echo, los program as q u e u tilizan la p alab ra cla v e r e g i s t r o ( r e g i s t e r ) p u ed en p er­ der eficiencia, d eb ido a que, p or lo general, los program adores n o so n los m ejores ju eces e n las cu estion es d e bajo n ivel, com o la asign ación d e registros. L a elecció n ó p tim a en la asignación d e registros d ep en d e en gran p arte d e las cu estio n es esp ecífica s so b re la arquitectura d e u na m áquina. Las decision es d e la adm inistración d e recursos com o cablear (distribuir) a bajo nivel podrían d e hecho afectar el rendim iento, en esp ecia l s i e l program a se eje cu ta en m áquinas d istin ta s a la m áquina para la cu a l se escribió. □ Los d iversos cam bios en cu an to a la elección p opu lar d e lenguajes d e program ación han sid o orien tad os al au m en to en los niveles d e abstracción. C fue e l lengu aje d e program ación d e sistem a s predom inante en la d éca d a d e 1980; m uchos d e los nuevos proyectos q ue em p eza ­ ron e n la d éca d a d e 1990 eligieron a C + + ; Java, q ue s e introdujo en 1995, ga n ó p opularidad con rap id ez a finales d e la d écad a d e 1990. Las ca racterísticas nuevas d e lo s lengu ajes d e pro­ gram ación q u e se introdujeron en ca d a generación incitaron a realizar nuevas investigaciones en la op tim ización d e los com p ilad ores. A con tinu ación verem os la s generalidades acerca d e las principales características d e los lengu ajes q ue han estim u lad o avances considerables en la tecn ología d e los com piladores. P rácticam en te to d o s los lengu ajes d e program ación com u nes, in clu yen d o a C, Fortran y C obol, so p ortan los tip o s d e d a to s d e con jun tos definidos por e l usuario, com o los arreglos y las estructuras, y el flujo d e con trol d e a lto nivel, com o los ciclos y las invocaciones a procedim ien­ to s. Si só lo tom am os ca d a in stru cción d e alto nivel u operación d e acceso a d a to s y la traduci­ m os d irectam en te a cód ig o m áquina, el resu ltad o sería m uy ineficiente. Se h a desarrollado un cu erpo d e op tim izacion es de com pilador, con ocid o com o o p tim iza c io n e s de flu jo d e d a to s , para analizar e l flujo d e d a to s a través d e l program a y elim inar la s redundancias en es ta s instruc­ ciones. Son efectivas p ara generar cód igo q u e se asem eje a l cód igo q u e escribe un program ador exp erim en tad o a un n ivel m ás bajo. La orientación a ob jetos se introdujo por prim era v ez en Sim ula en 1967, y se h a incorporado en lenguajes com o Sm alltalk, C + + , C # y Java. Las ideas claves d e la orientación a o b jeto s son: 1. L a ab stracción d e d atos, y 2. L a h erencia d e propiedades, d e las cu ales se ha d escu b ierto q ue facilitan el m an ten im ien to d e los program as, y lo s hacen m ás m odulares. Los program as orien tad os a o b je to s son diferentes d e lo s program as escrito s en m uchos otros len gu ajes, y a q ue co n siste n d e m uchos m ás p ro ced im ien to s, pero m ás pequeños (a los cu ales se les llam a m éto d o s, en térm in os d e orien tación a o b jeto s). Por en d e, la s op tim iza ­ cion es d e los com piladores d eb en ser cap aces d e realizar bien su tra b a jo a través d e los lím ites d e los p rocedim ien tos d el program a fuente. E l uso d e p rocedim ien tos en línea, q ue v ien e siendo cu an do se su stitu y e la llam ad a a un procedim iento p or s u cuerpo, es m uy ú til e n este caso. Tam bién se han desarrollado op tim izacion es para agilizar los en víos d e los m étod os virtuales. 1.5 Aplicaciones d e la tecnología d e compiladores 19 J ava tien e m uchas ca racterísticas q ue fa cilitan la program ación, m uchas d e las cu a les se han in trodu cido an teriorm ente e n otros lengu ajes. E l lengu aje J a v a ofrece seguridad en los tip os; es d ecir, un o b je to n o p uede usarse co m o o b je to d e u n tip o q u e no e s té relacionado. T o d o s los accesos a los arreglos se verifican para asegurar q u e se en cu en tren d en tro d e lo s lí­ m ite s d el arreglo. Java n o tien e apuntadores y no p erm ite la a ritm ética d e apuntadores. T ien e u n a h erram ien ta in tegrad a para la recolección d e basura, la cu a l lib era d e m a n era a u to m á tica la m em oria d e variables q ue y a no s e en cu en tran e n uso. M ientras q u e e sta s ca racterísticas facilitan e l p roceso d e la program ación, p rovocan u n a sob recarga e n tiem p o d e ejecu ción . Se han d esarrollado o p tim izacion es e n e l com p ilad or p a ra reducir la sobrecarga, por ejem p lo, m e­ d ia n te la elim in ación d e las com p rob acion es d e ran go innecesarias y la asign ación d e o b jeto s a los q u e n o s e p u ed e acceder m ás a llá d e u n p ro ced im ien to e n la p ila, en v e z d e l heap . Tam ­ bién se han desarrollado algoritm os efectiv o s para m inim izar la sob recarga d e la recolección d e basura. A dem ás, J a v a e s tá d iseñ ad o p ara d ar so p o rte al có d ig o p o rtab le y m óvil. Los p rogram as se d istrib u yen com o b ytecod es d e Java, e l cu a l d eb e interpretarse o com p ilarse en có d ig o nativo e n form a dinám ica, es decir, en tiem p o d e ejecu ción . L a com pilación d in á m ica tam bién s e ha estu d ia d o e n o tro s co n tex to s, e n d ond e la inform ación s e ex tra e d e m anera d in á m ica e n tiem po d e ejecu ción , y se u tiliza para producir u n có d ig o m ás op tim iza d o . E n la op tim iza ció n dinám i­ c a , es im portan te m inim izar e l tiem p o d e com p ilación, y a q ue form a p arte d e la sob recarga en la ejecu ción . U n a téc n ic a d e uso com ú n es só lo com pilar y o p tim iza r las partes d e l program a q u e se van a ejecu tar co n frecuencia. 1 .5 .2 O p tim iz a c io n e s p a r a la s a r q u i t e c t u r a s d e c o m p u ta d o r a s L a rápida evolución de las arquitecturas d e com p utadoras tam b ién nos h a llevado a u na insacia­ b le d em an d a d e n u eva tecn o lo g ía d e com p ilad ores. C asi tod os los sistem a s d e a lto rendim iento aprovechan las d os m ism as técn icas básicas: paralelism o y jera rq u ía s de m e m o ria . P odem os encontrar el paralelism o en varios niveles: a n ivel de in stru cc ió n , en d o n d e varias operaciones s e ejecu ta n al m ism o tiem p o y a n ivel d e p ro cesa d o r, e n d o n d e d istin to s su bp rocesos d e la m ism a aplicación se ejecu tan e n d istin to s hilos. Las jerarquías d e m em oria son u n a resp u esta a la lim itación b ásica d e q u e p od em os con stru ir un alm acenam iento m uy rápido o m u y extenso, pero n o un alm acenam iento q ue s e a ta n to rápido com o extenso. P a r a le lis m o T o d o s los m icroprocesadores m odernos ex p lo ta n el paralelism o a nivel d e instrucción. Sin em ­ bargo, e s te paralelism o p u ed e o cu ltarse al program ador. Los program as s e escriben com o si to d a s las instrucciones se ejecu taran en secuencia; e l hardware verifica en form a d in á m ica las d ep en d en cias e n e l flujo secu en cial d e instrucciones y las eje cu ta e n paralelo siem p re q ue sea posible. E n algunos casos, la m áq u in a in clu ye un program ador (scheduler) d e hardware que p u ed e m odificar e l ord en d e las instrucciones para aum entar el paralelism o en e l program a. Y a s e a q ue e l hardware reordene o no las in stru cciones, lo s com piladores pueden reordenar las in stru cciones para q u e e l paralelism o a nivel de instrucción sea m ás efectivo. E l paralelism o a nivel d e instrucción tam b ién p uede aparecer d e m anera ex p líc ita en e l con­ ju n to d e instrucciones. Las m áquinas V L IW (Very Long In struction W ord, P alabra d e instrucción 20 Capítulo 1. Introducción m uy larga) tien en instrucciones q ue p ueden ejecu tar varias op eracion es en paralelo. E l Intel IA 64 es un ejem p lo d e ta l arquitectura. T odos los m icroprocesadores d e a lto rend im iento y propósito gen eral incluyen tam bién instrucciones que p ueden operar sob re un vector d e d a to s al m ism o tiem p o . Las técn ica s d e los com p ilad ores se han desarrollado p a ra generar có d ig o d e m anera a u tom ática para d ich as m áquinas, a partir d e program as secuenciales. Los m ultiprocesadores tam bién s e han v u elto frecuentes; in clu so es com ún q ue h a sta las com p utadoras p ersonales ten gan m ú ltip les procesadores. Los program adores pueden escribir có d ig o m ultih ilo para los m ultiprocesadores, o có d ig o e n paralelo q u e u n com p ilad or p uede generar d e m anera au tom ática, a partir d e program as secu en ciales. D ich o com p ilad or o c u lta d e los program adores los d eta lles sobre cóm o encontrar el paralelism o en un program a, d istri­ buir los cálcu los en la m áquina y m inim izar la sincronización y los cá lcu lo s entre ca d a procesa­ dor. M uchas ap licacion es d e com p u tación cien tífica y d e ingeniería hacen u n u so intensivo d e los cálcu los y p ueden beneficiarse m ucho con e l p rocesam ien to en paralelo. Se han desarrollado técnicas d e paralelización para traducir d e m anera a u to m á tica los program as cien tíficos en có d ig o p ara m ultiprocesadores. J e r a r q u ía s d e m e m o r ia U n a jerarquía d e m em oria co n siste en varios niveles d e alm acenam iento co n d istin ta s v elocid a­ d es y tam añ os, en d on d e e l nivel m ás cercano al procesador es el m ás rápido, pero ta m b ién el m ás pequeño. E l tiem p o prom edio d e acceso a m em oria d e un program a se reduce si la m ayoría d e su s accesos se satisfacen a través d e los niveles m ás rápidos d e la jerarquía. T an to e l parale­ lism o com o la ex isten cia d e u n a jerarquía d e m em oria m ejoran e l rendim iento p o te n c ia l d e u na m áquina, pero e l com p ilad or d eb e aprovecharlos d e m anera efectiv a p a ra p od er producir un rend im iento real en u n a aplicación. Las jerarquías d e m em oria se en cu en tran en to d a s las m áquinas. Por lo gen eral, un proce­ sador tien e un p equeño núm ero d e registros q ue co n sisten en cien to s d e b y tes, varios niveles d e cach é q ue con tien en d esd e k ilobytes h a sta m egab ytes, m em oria física q ue co n tien e d esd e m egab ytes h a sta g igab ytes y, por ú ltim o, alm acenam iento secu nd ario q u e co n tien e gigab ytes y m ucho m ás. D e m anera correspondiente, la velocid a d d e los accesos en tre lo s niveles adyacen­ te s d e la jerarq uía p uede diferir p o r d os o tres órd en es d e m agnitud. A m enudo, el rendim iento d e un siste m a se Um ita n o só lo a la velocid ad d el procesador, sin o tam b ién p o r el rendim ien­ to d el su b siste m a d e m em oria. A unque d esd e u n principio los com piladores s e han en focad o en op tim izar la ejecu ción d el procesador, ahora se pone m ás én fasis en lograr q u e la jerarq uía d e m em oria s e a m ás efectiva. El u so efectivo d e los registros es q u iz á e l p rob lem a in dividu al m ás im portan te en la o p ti­ m ización d e u n program a. A diferencia d e los registros q ue tien en q ue adm inistrarse d e m a­ nera e x p líc ita en e l softw are, las cachés y las m em orias físicas está n o cu lta s d el con ju n to de instrucciones y e l hardware se en carga d e adm inistrarlas. L a ex p erien cia n os h a dem ostrado q ue las directivas d e adm inistración d e cach é q u e im p lem en ta e l hardware no son efectiv a s en algunos casos, en esp ecial co n e l cód ig o cien tífico q ue tien e estru ctu ras d e d a to s e x te n sa s (por lo general, arreglos). E s p osib le m ejorar la efectivid ad d e la jerarquía d e m em oria, cam biando la d istrib u ción de los d atos, o cam biando el orden d e las instrucciones q u e acceden a los d a to s. Tam bién p od em os cam b iar la d istrib ución del cód ig o para m ejorar la efectiv id a d d e las cachés d e instrucciones. 1.5 Aplicaciones d e la tecnología d e compiladores 1 .5 .3 21 D is e ñ o d e n u e v a s a r q u i t e c t u r a s d e c o m p u ta d o r a s E n los prim eros d ía s d el d iseñ o d e arquitecturas d e com putadoras, los com piladores s e desarro­ llaron d esp u és d e haber cread o las m áquinas. E so h a cam biado. D esd e q ue la program ación en lengu ajes d e alto nivel es la norm a, e l rendim iento d e un siste m a com p u tacion al se determ in a n o só lo p or su velocidad en general, sin o tam b ién por la form a en que los com piladores pue­ d en ex p lo ta r su s características. Por en d e, en el desarrollo d e arquitecturas d e com putadoras m odernas, los com piladores s e desarrollan en la e ta p a d e d iseñ o d el procesador, y se u tiliza el cód ig o com p ilad o, q ue se eje cu ta e n sim uladores, para evaluar las características propuestas sob re la arquitectura. R IS C U n o d e los m ejores ejem p los con ocid os sobre cóm o lo s com piladores influenciaron e l diseño d e la arquitectura d e com p utadoras fue la invención d e la arquitectura R ISC (R educed Instru ction -S et C om puter, C om p utad ora co n con ju n to reducido d e in stru cciones). A n tes d e e s ta invención, la ten d en cia era desarrollar con jun tos d e instrucciones c a d a v e z m ás com plejos, d estin a d o s a facilitar la program ación en ensam blador; esta s arquitecturas se denom inaron C ISC (C om p lex In struction-Set C om puter, C om p utad ora con con ju n to com plejo d e instruccio­ n es). P or ejem plo, los con jun tos d e instrucciones C ISC incluyen m odos d e d ireccionam iento de m em oria com p lejos para soportar los accesos a las estru ctu ras d e d a to s, e in stru cciones para invocar procedim ientos q ue guardan registros y pasan p arám etros e n la pila. A m enudo, las optim izaciones d e com piladores pueden reducir e s ta s instrucciones a un peque­ ño núm ero d e operaciones m ás sim ples, elim inando las redundancias presentes en las instrucciones com plejas. Por lo tanto, es conveniente crear conjuntos sim ples d e instrucciones; los com pilado­ res pueden utilizarlas con efectivid ad y el hardware es m ucho m ás sencillo d e optim izar. L a m ayoría d e las arquitecturas d e procesadores d e p rop ósito general, com o Pow erPC , SPA R C , M IP S , A lp h a y P A -R IS C , s e basan en e l co n cep to R ISC . A un qu e la arq u itectura x86 (el m icroprocesador m ás popular) tien e u n con ju n to d e instrucciones C ISC , m uchas d e las ideas desarrolladas para las m áquinas R IS C s e u tiliza n en la im plem en tación d e l procesador. A d em ás, la m anera m ás efectiv a d e usar u n a m áq u in a x 8 6 d e a lto rendim iento e s u tilizar sólo su s in stru cciones sim ples. A r q u i t e c t u r a s e s p e c ia l iz a d a s E n las ú ltim a s tres décad as se han propuesto m uchos co n cep to s sobre la arquitectura, en tre los cu a les s e incluyen las m áquinas d e flujo d e d a to s, la s m áquinas V L IW (Very L ong Instruction W ord, P alab ra d e in stru cción m uy larga), los arreglos S IM D (Single In stru ctio n , M últiple D ata, U n a s o la instrucción, varios d a to s) d e procesad ores, lo s arreglos sistólicos, los m ultiprocesadores con m em oria com p artid a y los m ult i pro ces ado res co n m em oria d istribuida. E l desarrollo de cad a uno d e e sto s con cep tos arq u itectónicos se acom p añó por la in vestigación y e l desarrollo d e la tecn ología de com piladores correspondiente. A lgu n as d e esta s ideas han incursionado e n los d iseñ o s d e las m áquinas en b eb idas. D ebido a q ue p ueden cab er sistem a s com p letos en u n so lo ch ip , los procesadores y a n o n ecesitan ser u nidades prim arias preem paquetadas, sin o q ue p ueden personalizarse p a ra lograr una mejor efectivid ad en co sto para u n a aplicación esp ecífica. Por en d e, a diferencia d e los procesado­ res d e p rop ósito general, e n d on d e las eco n o m ía s d e esca la han llevado a las arquitecturas 22 Capítulo 1. Introducción com p u tacion ales a convergir, los procesadores d e ap licacion es específicas exh ib en u n a diversi­ dad d e arquitecturas com p utacion ales. L a tecn olo g ía d e com piladores se n ecesita no só lo para dar sop orte a la program ación para esta s arquitecturas, sin o tam bién p a ra evaluar los d iseñ os arq u itectónicos propuestos. 1 .5 .4 T r a d u c c io n e s d e p r o g r a m a s M ientras que, p or lo general, p en sam os en la com pilación com o u na traducción d e un lengu aje d e a lto nivel al n ivel d e m áquina, la m ism a tecn o lo g ía p uede aplicarse para realizar trad uccio­ nes en tre d istin to s tip o s d e lenguajes. A con tinu ación se m uestran algunas d e las aplicaciones m ás im p ortan tes d e las técn icas d e trad u cción d e program as. T r a d u c c ió n b in a r ia La tecn ología d e com piladores p uede utilizarse para trad ucir e l có d ig o b inario para u n a m áqui­ n a al cód igo binario para o tra m áquina d istin ta , con lo cu a l se p erm ite a u na m áquina ejecu tar los program as q ue originalm ente eran com p ilad os para o tro con ju n to d e instrucciones. V arias com p añías d e com p u tación han utilizado la tecn o lo g ía d e la traducción binaria p a ra increm en­ tar la d isp on ib ilid ad d e softw are en su s m áquinas. E n esp ecia l, d eb ido al d o m in io en e l m ercado d e la com p u tad ora personal x 8 6 , la m ayoría d e los títu lo s d e softw are e s tá n d isp on ib les com o có d ig o x86. S e han desarrollado trad u ctores binarios p a ra convertir có d ig o x 8 6 en có d ig o A l­ pha y Sparc. A dem ás, T ran sm eta Inc. u tilizó la trad ucción b inaria en su im plem en tación d el conjunto d e instrucciones x86. E n vez d e ejecu tar el com plejo con ju n to de instrucciones x86 d irectam ente en el hardware, el procesador T ransm eta C rusoe es u n procesador V L IW q ue se b a sa en la traducción b inaria para convertir e l cód igo x 8 6 en có d ig o V L IW n ativo. La traducción b inaria tam b ién p uede usarse para ofrecer co m p a tib ilid a d inversa. C uando el procesador en la A pple M acin tosh se cam b ió d el M otorola M C 68040 al P ow erPC en 1994, se utilizó la trad ucción b inaria para perm itir q ue los procesadores P ow erPC ejecutaran el cód igo heredado d e l M C 68040. S ín t e s is d e h a r d w a r e N o sólo la m ayoría d el softw are e s tá escrito en lengu ajes d e alto nivel; incluso h a sta la m ayoría d e los d iseñ os d e hardware se describen en lenguajes d e descrip ción d e hardware d e a lto n iv el, com o V erilog y V H D L (Very H igh-Speed In tegrated C ircuit Hardware D escription L enguaje, Lenguaje d e d escrip ción d e hardware d e circu itos integrados d e m uy a lta velo cid a d ). Por lo general, los d iseñ os d e hardware se d escrib en e n e l nivel d e transferencia d e registros (R T L ), en d on d e las variables representan registros y las exp resion es representan la ló g ica com binacional. Las herram ientas d e sín tesis d e hardware trad u cen la s descripciones RTL d e m anera au tom á­ tica en com p uertas, las cu a les a su vez se asignan a tran sistores y, en un m om ento dado, a un esq u em a físico. A diferencia d e los com piladores para los lenguajes d e program ación, esta s he­ rram ientas a m enudo requieren horas para op tim izar e l circuito. Tam bién ex iste n técn ica s para traducir d iseñ os a niveles m ás altos, com o a l nivel d e co m p ortam ien to o funcional. In té r p r e te s d e c o n s u lta s d e b a se s d e d a to s A dem ás d e especificar e l softw are y el hardware, los lenguajes so n ú tiles en m uchas o tra s apli­ cacion es. P or ejem plo, los lengu ajes d e co n su lta , en esp ecia l SQ L (Stru ctured Q uery Lenguage, 1.5 Aplicaciones d e la tecnología d e compiladores 23 L enguaje d e co n su lta estru ctu ra d o ), se u tiliza n para realizar búsquedas e n bases d e d a to s. Las co n su lta s en las bases d e d a to s co n siste n en predicados q u e con tien en operadores relaciónales y b oolean os. P u ed en interpretarse o com pilarse e n com an dos para buscar registros en u na base d e d a to s q ue cu m p lan con ese predicado. S im u la c ió n c o m p ila d a L a sim u lación e s u na técn ica gen eral q ue se u tiliza en m uchas d isciplinas cien tíficas y d e in­ gen iería p ara com prender un fenóm eno, o para validar un d iseño. P or lo general, las entradas d e los sim uladores incluyen la descrip ción d el diseño y los p arám etros específicos d e en trad a para esa ejecu ción esp ecífica d e la sim ulación. Las sim u lacion es p ueden ser m uy co sto sa s. Por lo general, n ecesitam os sim ular m uchas altern ativas d e d iseñ o p osib les en m uchos conjuntos d istin to s d e en trad a, y cad a exp erim en to p uede tardar d ía s en com p letarse, en u na m áquina d e a lto rendim iento. E n vez d e escribir un sim ulador para interpretar e l d iseñ o, es m ás rápido com pilar el diseño para producir cód igo m áq u in a q ue sim u le e se d iseñ o específico en form a n ativa. L a sim u lación com p ilad a p uede ejecu tarse m uchos grados de m agnitu d m ás rápido que u n m étod o b asado e n un intérprete. L a sim u lación co m p ilad a se u tiliz a en m uchas herram ientas d e a lta tecn o lo g ía q ue sim ulan d iseñ os escritos en Verilog o V H D L. 1 .5 .5 H e r r a m i e n t a s d e p r o d u c tiv id a d d e s o f tw a r e S in d uda, los program as son los artefactos d e ingeniería m ás com p licad os q ue se hayan produ­ cid o jam ás; co n sisten en m uchos, m uchos d eta lle s, ca d a u no de los cu a les d eb e corregirse para q u e el program a funcione por co m p leto . C om o resu ltad o, los errores proliferan e n los progra­ mas; ésto s p ueden hacer q ue un siste m a falle, producir resultados incorrectos, dejar u n sistem a vulnerable a los ataqu es d e seguridad, o in clu so p ueden llevar a fallas ca ta stró fica s en sistem as críticos. L a prueba es la téc n ic a principal para localizar errores en los program as. U n en foqu e com p lem en tario interesante y p rom etedor es utilizar el análisis d e flujos de d a to s para localizar errores d e m anera e s tá tic a (es decir, an tes d e q ue s e ejecu te el program a). E l an álisis d e flujos d e d a to s p uede buscar errores a lo largo d e to d a s las rutas p o sib les d e eje­ cu ción , y n o só lo aquellas ejercidas p or los co n ju n to s d e d a to s d e en trad a, com o en e l ca so del p roceso d e p ru eb a de un program a. M uchas d e la s técn ica s d e análisis d e flujos d e d a to s, q u e se desarrollaron e n u n principio para las op tim izacion es d e los com p ilad ores, p ueden usarse para crear herram ientas q ue ayu den a los program adores e n su s tareas d e ingeniería d e softw are. E l problem a d e encontrar tod os los errores en los program as es indicidible. P u ed e diseñarse u n an álisis d e flujos d e d a to s para advertir a los program adores acerca d e to d a s las posibles in stru ccion es q ue violan u n a categoría esp ecífica d e errores. Pero s i la m ayoría d e e s ta s ad­ verten cias son falsas alarm as, los usuarios no utilizarán la herram ienta. P or en d e, los d etec­ tores p rácticos de errores e n gen eral no so n só lid o s ni está n com p letos. E s d ecir, tal v e z no en cu en tren to d o s los errores en e l program a, y no s e garan tiza q ue to d o s los errores reportados sean errores verdaderos. Sin em bargo, se han desarrollado diversos an álisis está tic o s q ue han d em ostrad o ser efectiv o s para buscar errores, com o el realizar referencias a apuntadores nulos o p reviam ente liberados, e n p rogram as reales. E l hecho d e q ue los d etecto res d e errores pue­ dan ser p oco sólid os los hace con sid erablem en te d istin to s a las op tim izacion es d e cód igo. Los op tim izad ores d eb en ser conservadores y n o pueden alterar la sem á n tica d e l program a, bajo n in gu n a circunstancia. 24 Capítulo 1. Introducción P ara d ar equilibrio a e s ta sección, va m o s a m encionar varias form as en las q ue e l análisis de los program as, b asado en técn icas q ue se desarrollaron originalm ente para o p tim iza r el cód igo en los com piladores, h a m ejorado la p rod u ctivid ad d e l softw are. D e esp ecia l im portan cia son las técnicas q ue d etecta n en form a e s tá tic a cu an d o un program a p o d ría tener u n a vulnerabili­ dad d e seguridad. C o m p r o b a c ió n ( v e r if i c a c ió n ) d e t ip o s La com probación d e tip o s e s u na técn ica efectiv a y bien esta b lec id a para ca p ta r las inconsis­ ten cias en los program as. P or ejem p lo, p uede usarse p a ra d etecta r errores e n d ond e se aplique una operación al tip o incorrecto d e o b je to , o s i los p arám etros q u e se pasan a u n p rocedim iento no coinciden co n su firm a. E l an álisis d e los program as p uede ir m ás allá d e só lo encontrar los errores d e tip o , an alizan d o e l flujo d e d a to s a través d e u n program a. Por ejem p lo, si a un apuntador s e le asign a n u i l y se desreferencia ju sto desp ués, e s evid en te q ue e l program a tien e un error. La m ism a tecn o lo g ía p uede utilizarse para d etecta r u n a variedad d e huecos d e seguridad, en d on d e un ata ca n te proporciona u n a ca d en a u o tro tip o d e d a to s q ue el program a u tiliz a sin cuidado. U n a cad en a proporcionada por e l usuario p o d ría etiq u etarse co n el tip o d e ‘‘p eligro­ sa ”. S i no se verifica e l form ato apropiado d e la cad en a, en ton ces s e d eja com o “p eligrosa” , y si u n a cad en a d e e s te tip o p uede influenciar e l flujo d e con trol d e l cód igo en cierto p u n to d el program a, en ton ces hay u na falla p oten cial en la seguridad. C o m p r o b a c ió n d e lím it e s Es m ás fácil com eter errores cu an do s e program a en un len gu aje d e b a jo nivel q ue e n uno d e alto nivel. Por ejem p lo, m uchas brechas d e seguridad en los sistem a s se p rod ucen d eb ido a los d esb ord am ien tos en las en trad as y salidas d e d e los program as escrito s e n C. C om o C no com ­ prueba los lím ites d e los arreglos, es resp onsab ilidad d e l usuario asegurar q ue no s e acced a a los arreglos fuera d e los lím ites. Si n o se com p ru eb a q ue los d a to s su m in istrad os por e l usuario pueden llegar a d esbordar u n elem en to, el program a p o d ría caer en el truco d e alm acenar los d a to s d el usuario fuera d el esp acio asociado a este elem en to. U n a tacan te p o d r ía m anipular los d a to s d e en trad a q u e hagan que e l program a se co m p o rte en form a errón ea y com p rom eta la seguridad del sistem a. S e han desarrollado técn icas para encontrar lo s d esb ord am ien tos d e búfer en los program as, pero con un é x ito lim itado. Si el program a se h ub iera escrito en un lengu aje seguro q u e in clu y a la com probación a u to ­ m á tica d e los rangos, e s te problem a n o habría ocurrido. E l m ism o an álisis d e l flujo d e d a to s que se u tiliza para elim inar las com probaciones d e rango redundantes p odría usarse tam b ién para localizar los d esb ord am ien tos probables d e un elem en to. S in em bargo, la principal diferencia es q ue a l n o p od er elim inar u na com probación d e rango só lo s e produciría un p equeño increm ento en e l tiem po d e ejecución, m ientras q ue el no identificar un desb ord am ien to p o ten cia l d el búfer podría com prom eter la seguridad d e l sistem a. Por en d e, aunque e s adecuado u tilizar técnicas sim p les para o p tim izar las com p rob acion es de rangos, los an álisis sofisticad os, com o el rastreo d e los valores d e los apuntadores entre un p rocedim ien to y otro, son necesarios para ob tener resu ltad os d e a lta calidad en las herram ientas p ara la d etecció n d e errores. 1.6 Fundamentos d e los lenguajes d e programación 25 H e r r a m ie n t a s d e a d m in is t r a c ió n d e m e m o r ia L a recolección d e basura es otro ex celen te ejem p lo d e la con cesión entre la eficien cia y una com binación d e la facilidad de uso y la confiabilidad d el softw are. L a adm inistración au tom á­ tic a d e la m em oria elim in a to d o s los errores d e ad m in istración d e m em oria (por ejem p lo, las “fu gas d e m em oria”) , q ue son u n a fuente im p ortan te d e problem as en los program as en C y C + + . Se han desarrollado varias herram ientas para ayudar a los program adores a d etectar los errores d e ad m in istración de m em oria. Por ejem plo, P urify es u na herram ienta q u e se em p lea m ucho, la cual c a p ta en form a d in ám ica los errores d e ad m in istración d e m em oria, a m edida que ocurren. Tam bién se han desarrollado herram ientas q ue ayu dan a identificar algu nos de esto s problem as en form a estática. 1.6 F u n d a m e n to s d e los le n g u a je s d e p ro g ra m a c ió n E n e s ta sección hablarem os sobre la term in ología m ás im p ortan te y las d istin cio n es q ue apa­ recen en e l estu d io d e los lenguajes d e program ación. N o e s nuestro o b jetiv o abarcar to d o s los con cep tos o tod os los lengu ajes d e program ación populares. A sum im os q ue e l lector e s tá fam iliarizado por lo m enos con u no d e los lenguajes C , C + + , C # o Java, y q ue ta l v e z con o zca otros. 1 .6 .1 L a d is tin c ió n e n t r e e s tá tic o y d in á m ic o U n a d e las cu estio n es m ás im p ortan tes a las q ue nos enfrentam os al d iseñ ar un com pilador para un len gu aje es la d e q ué d ecision es p uede realizar el com p ilad or acerca d e u n programa. Si u n lengu aje u tiliza u na d irectiva q ue p erm ite al com pilador decidir sobre u na cu estió n , en­ to n c e s d ecim os q ue el lengu aje u tiliza u n a d irectiv a e stá tic a , o q ue la cu estió n p u ed e decidirse e n tiem po de com pilación . Por otro lad o, se d ice q ue u na d irectiv a que sólo p erm ite realizar u na d ecisión a la hora d e ejecu tar e l program a e s u n a á r e c tiv a d in á m ic a , o q u e requiere una d ecisión en tiem p o d e ejecución. U n a d e las cu estion es en las q ue n os d eb em os d e concentrar e s en e l alcance d e las declara­ cion es. E l alcance d e u na d eclaración d e x e s la región d e l program a en la q u e lo s usos d e a; se refieren a e s ta declaración. U n len gu aje u tiliza e l alcance e s tá tic o o alcance léxico s i e s posible d eterm in ar el alcance d e u na declaración co n só lo ver e l program a. E n cualquier o tro caso, el len gu aje u tiliza u n alcance din ám ico. C on e l alcance d in ám ico, a m ed id a q ue s e eje cu ta e l pro­ gram a, e l m ism o u so d e x p o d r ía referirse a u n a d e varias declaraciones d istin ta s d e x. L a m ayoría d e los lenguajes, com o C y Java, u tiliza n el alcance está tic o . E n la sección 1.6.3 hablarem os sobre éste. E j e m p lo 1 .3 : C om o otro ejem p lo de la d istin ció n entre está tico y d inám ico, con sid ere el u so d e l térm in o “sta tic ” segú n s e ap lica a los d a to s e n la declaración d e u n a cla se en Java. En Java, u n a variable es u n nom bre p ara u na u bicación en m em oria q ue se u tiliza para alm acenar u n valor d e d atos. A qu í, “sta tic ” no s e refiere al alcance d e la variable, sino a la habilidad del com p ilad or para d eterm in ar la ubicación en m em oria e n la q ue p u ed e encontrarse la variable declarada. U n a d eclaración como: p u b lic s t a t i c i n t x; 26 Capítulo 1. Introducción hace d e x u n a variable d e c la se e in d ica q ue sólo h ay u na co p ia d e x, sin im portar cu á n to s o b je to s se creen d e e s ta clase. Lo q ue es m ás, el com p ilad or p uede d eterm inar u n a ubicación en m em oria e n la q ue se alm acene e s te en tero x. E n co n tra ste, si se hubiera o m itid o la palabra “sta tic ” d e e s ta declaración, en to n ces ca d a o b je to d e la cla se ten d r ía s u propia u bicación en la q ue s e guardara x , y el com pilador no p od ría d eterm inar to d o s esto s lugares an tes d e ejecu tar e l program a. □ 1 .6 .2 E n t o r n o s y e s ta d o s O tra d istin ción im p ortan te q ue d eb em os hacer al hablar so b re los lengu ajes d e program ación es si lo s cam bios q u e ocurren a m ed ida q ue e l program a se eje cu ta afectan a los valores d e los elem en tos d e d a to s, o si afectan a la interpretación d e los nom bres para eso s d a to s. Por ejem plo, la ejecución d e u n a asignación com o x = y + 1 cam b ia e l valor d en o ta d o por el nom bre x D icho en form a m ás específica, la asign ación cam b ia e l valor en cualquier ubicación d e n o ta d a por x Tal vez se a m enos claro q ue la ubicación d en ota d a p or x p uede cam biar en tiem po d e ejecu­ ción. Por ejem plo, com o vim os en e l ejem plo 1.3, si a: no es u n a variable está tica (o d e “cla se”), entonces ca d a ob jeto d e la clase tiene su p rop ia ubicación para u na instancia d e la variable x. En este caso, la asignación para x puede cam biar cualquiera d e esas variables d e “instancia” , d ep en ­ diendo del ob jeto en el q ue se aplique un m étodo q ue con ten ga e s a asignación. estado entorno nombres ubicaciones (variables) valores F igura 1.8: A sign ación d e d o s eta p a s, d e nom bres a valores La asociación d e nom bres co n u bicacion es en m em oria (el alm acén) y d esp u és co n valores p uede describirse m ediante d o s asignaciones q ue cam b ian a m ed ida q ue se eje cu ta e l program a (vea la figura 1.8): 1. E l e n to rn o es u na asignación d e nom bres a ubicaciones d e m em oria. C om o la s variables se refieren a ubicaciones ( “1-va lú es” en la term in ología d e C ), p odríam os definir d e m a­ nera a ltern ativa u n en torn o com o u n a asign ación d e nom bres a variables. 2. E l esta d o es u n a asign ación d e las u bicacion es en m em oria a su s valores. E s d ecir, el estad o asign a 1-values a su s correspondientes r-values, en la term in o lo g ía d e C. Los entornos cam bian d e acuerdo a las reglas d e alcance d e un lenguaje. E j e m p lo 1 .4 : C on sid ere e l fragm ento d e un program a en C en la figura 1.9. E l en tero i se d eclara com o u na variable global, y tam bién se d eclara com o u na variable local para la función /. C uando / se ejecu ta, el en torn o s e a ju sta d e m anera q ue el nom bre i s e refiera a la ubica­ ción reservada p ara la i q ue es local para f y cualquier u so d e i, com o la asignación i = 3 q ue 1.6 Fundamentos d e los lenguajes d e programación 27 in t i ; / * i g lo b a l */ v o id f ( . . . ) { in t i ; /* i lo c a l */ i = 3; /* u so de l a i lo c a l * / x = i + 1; /* u so de l a ¿ g lo b a l * / } F igu ra 1.9: D o s d eclaraciones d e l nom bre i s e m uestra en form a ex p líc ita , se refiere a e s a ubicación. Por lo general, a la i local s e le otorga u n lugar en la p ila e n tiem p o d e ejecución. C ad a vez q ue se eje cu ta u na función g d istin ta d e f lo s u sos d e i n o p ueden referirse a la i q u e es local para /. L os u sos d el nom bre i en g d eb en esta r dentro d e l alcance d e algu na o tra declaración d e i. U n ejem p lo es la in stru cción x = i+ 1 m ostrada e n form a ex p lícita , la cu a l se en cu en tra d en tro d e un procedim iento cu y a definición n o se m uestra. L a i en i + 1 se refiere su p u estam en te a la i global. A l igual que en la m ayoría d e lo s lenguajes, las declaraciones en C d eb en an tepon er s u u so, por lo q ue u n a fu n ció n q u e e s té antes d e la i g lo b a l n o p u e d e hacer referencia a ella. □ Las asignaciones d e en torn o y de e sta d o en la figura 1.8 so n d inám icas, pero h ay unas c u a n ta s excepciones: 1. C om paración en tre enlace está tic o y d in á m ic o d e los nom bres co n la s ubicaciones. La m ayoría d e la vin cu lación d e los nom bres con las u bicacion es es d inám ica, y verem os varios m éto d o s p ara e s ta v in cu lación a lo largo d e e s ta sección . A lgu n as declaraciones, com o la i g lo b a l en la figura 1.9, p ueden recibir u n a ubicación e n m em oria u n a so la vez, a m ed id a q ue el com p ilad or g en era e l có d ig o o b jeto .2 2. C om paración en tre enlace está tic o y d in á m ic o d e las ubicaciones con los valores. Por lo general, e l en lace d e las ubicaciones con lo s valores (la seg u n d a e ta p a en la figura 1.8) es d in ám ica tam bién, y a q ue n o p od em os con ocer e l valor e n u na ubicación sin o h a sta ejecu­ tar e l program a. Las co n sta n tes d eclarad as so n u n a excep ción . P or ejem p lo, la siguiente definición en C: # d e f in e ARRAYSIZE 1000 2T écn icam ente, e l co m p ilad o r d e C a s ig n a rá u n a ubicación e n m e m o ria v ir tu a l p a r a la i global, d eja n d o la re sp o n ­ sa b ilid a d a l c a rg a d o r y a l s is te m a o p e ra tiv o d e d e te r m in a r e n q u é p a r te d e la m em o ria física d e la m á q u in a s e u b ic a rá i Sin em b arg o , no deb em o s p reo cu p arn o s p o r las c u e stio n e s d e “reu b icació n ” ta le s com o é s ta s, q u e no tie n e n im pacto so b re la co m p ilación. E n vez d e ello, tra ta m o s e l espacio d e direcciones q u e u tiliz a e l co m p ilad o r p a r a s u código d e s a lid a co m o s i o to r g a ra las ubicaciones d e m em o ria física. 28 Capítulo 1. Introducción N o m b r e s , id e n tif ic a d o r e s y v a r ia b le s A un qu e los térm inos “nom bre” y ‘V ariable” a m enudo se refieren a lo m ism o, lo s uti­ lizam os co n cu id ad o para diferenciar en tre los nom bres e n tiem p o d e com p ilación y las ubicaciones en tiem p o d e ejecución d en otad as p or los nom bres. U n id e n tific a d o r es u na cad en a d e caracteres, p or lo gen eral letras o d íg ito s, q ue se refiere a (identifica) u n a en tidad , com o un o b je to d e d a to s, u n p rocedim iento, u na clase o un tip o. T o d o s los identificadores son nom bres, p ero n o to d o s los nom bres son identifi­ cadores. Los nom bres tam bién pueden ser expresiones. P or ejem plo, e l nom bre x .y podría d en otar e l cam p o y d e u n a estru ctu ra d en o ta d a por x. A quí, x y y so n identificadores, m ientras q ue x .y es u n nom bre, p ero n o u n identificador. A los nom bres co m p u esto s com o x .y s e les llam a nom bres calificados. U n a variable se refiere a una ubicación esp ecífica en m em oria. E s com ú n q u e e l m ism o identificador se d eclare m ás d e u n a vez; cad a u n a d e esa s declaraciones in trodu ce una nu eva variable. A u n cu an do ca d a identificador se d ecla ra só lo u n a vez, un identificador q ue se a local para un procedim iento recursivo hará referencia a la s d istin ta s ubicaciones d e m em oria, e n d istin ta s ocasiones. en laza el nom bre ARRAYSIZE con e l valor 1000 en form a está tic a . P od em os determ inar e s te en la ce an alizan d o la instrucción, y sab em o s q u e e s im posible q u e e s ta vin cu lación cam b ie cu an d o s e ejecu te el program a. 1 .6 .3 A lc a n c e e s tá tic o y e s t r u c t u r a d e b lo q u e s La m ayoría d e los lengu ajes, in clu yen d o a C y su fam ilia, u tiliza n e l alcance está tic o . L as reglas d e alcance p ara C s e basan e n la estru ctu ra d e l programa; e l alcance d e u na declaración s e d e­ term in a en form a im plícita, m ed ian te e l lugar en e l q ue aparece la d eclaración en e l program a. Los lenguajes posteriores, com o C + + , J ava y C # , tam bién proporcionan un con trol ex p lícito sobre los alcances, a través d el uso d e palabras cla v e com o p u b l i c , p r í v a t e y p r o t e c t e d . En e s ta sección con sid eram os las reglas d e alcance está tic o p a ra un len gu aje con bloques, en d ond e u n bloque es u n a agrupación d e declaraciones e in stru cciones. C u tiliza las llaves { y } para delim itar un bloque; e l u so alternativo d e b e g i n y e n d para e l m ism o fin se rem on ta h a sta A lgol. E j e m p lo 1 .5 : P ara u na prim era aproxim ación, la d irectiv a d e alcance e stá tic o d e C es la siguiente: 1. U n program a en C co n siste en u na secu en cia d e declaraciones d e nivel su perior d e varia­ b les y funciones. 2. L as funciones p ueden contener declaraciones d e variables, e n d on d e la s variables incluyen variables locales y parám etros. E l alcance d e u na d eclaración d e e s te tip o se restringe a la fun ción en la q u e aparece. 1.6 Fundamentos d e los lenguajes d e programación 29 P r o c e d im ie n to s , fu n c io n e s y m é to d o s P ara evitar d ecir “p rocedim ien tos, funciones o m éto d o s” c a d a vez q ue querem os hablar sobre un subprogram a q ue p ueda llam arse, nos referiremos, por lo general, a to d o s ellos com o “p roced im ien tos” . L a excep ción es q ue al hablar en form a e x p líc ita d e los progra­ m as en lenguajes com o C, q u e só lo tien en funciones, n os referirem os a ellos com o “fun cio­ nes” . O , s i h ablam os sob re u n len gu aje co m o Java, q u e só lo tien e m étodos, utilizarem os ese térm ino. P or lo general, u n a función devu elve u n valor d e algún tip o (el “tip o d e r e to m o ”), m ientras q ue un procedim iento no d evu elv e ningún valor. C y los lenguajes sim ilares, que sólo tien en funciones, tratan a los procedim ientos com o funciones con un tip o d e retorno esp ecial “v oid ” , para indicar q ue n o h ay valor d e reto m o . L os lengu ajes orien tad os a o b ­ jeto s com o Java y C + + u tilizan el térm in o “m éto d o s”. É sto s pueden com p ortarse com o funciones o p rocedim ientos, pero s e asocian con u na cla se específica. 3. E l alcance d e u n a d eclaración d e n iv el su perior d e u n nom bre x c o n siste en to d o e l pro­ gram a q ue le sigu e, con la excep ción d e las in stru cciones q ue s e en cu en tran dentro d e u na función q ue tam b ién tien e u n a d eclaración d e x. Los d etalles adicionales en relación co n la d irectiva d e alcance e s tá tic o d e C tratan con las declaraciones d e variables d en tro d e instrucciones. E xam in arem os d ich as d eclaraciones a con ­ tin u ación y e n e l ejem p lo 1.6. □ E n C , la sin ta x is d e los b loqu es se d a en base a lo siguiente: 1. U n tip o d e in stru cción e s un bloque. Los bloqu es p u ed en aparecer en cualquier p arte en la q ue puedan aparecer otros tip o s d e instrucciones, com o las in stru cciones d e asigna­ ción. 2. U n b loqu e es u na secu en cia d e declaraciones q ue v a seg u id a d e u na secu en cia d e instruc­ ciones, tod as rodeadas por llaves. O bserve q ue e s ta sin ta x is p erm ite anidar b lo q u es, u no d en tro d e otro. E s ta propiedad de an idam iento se co n o ce com o estru ctu ra de bloques. L a fam ilia C d e lengu ajes tien e estructu ra d e bloques, con la excep ción d e q ue u n a función tal vez no se d efin a dentro d e otra. D ecim os q ue u na declaración D “p erten ece” a un bloque B, s i B es e l bloque an idad o m ás cercano q u e con tien e a D\ es d ecir, D s e en cu en tra d en tro d e 2?, pero no d en tro d e cualquier b loqu e q ue e s té an idad o d en tro d e B. L a regla d e alcance e stá tic o para las d eclaraciones d e variables e n un len gu aje estructurado por bloques es la siguiente: Si la declaración D d el nom bre x p ertenece al b loqu e B , entonces el alcance d e D es tod o B , ex cep to para cualquier bloque B ' anidado a cualquier profundidad den tro d e B , en donde x se vu elve a declarar. A quí, x s e vu elve a declarar e n B ' s i alguna o tr a declaración D r d el m ism o nom bre x p erten ece a B '. 30 Capítulo 1. Introducción U na form a eq u ivalen te d e exp resar e s ta regla e s en focán dose e n un uso d e un nom bre x. D igam os q ue B u B ¿ ,..., B k sean to d o s los bloqu es q ue rodean e s te u so d e x, en d ond e B k e s el m ás peq ueño, an idad o d en tro de q ue a s u vez se a n id a dentro d e ¿ V 2, y a sí en lo su cesivo. H ay q ue buscar la i m ás grande d e t a l form a q ue h aya u n a d eclaración d e arque p erten ezca a B¡. E ste u so d e a; se refiere a la d eclaración en B {. D e m anera alternativa, e s te u so d e a; se en cu en tra d en tro d e l alcance d e la d eclaración en B¡. main() { int a = 1; int b = 1; { int b = 2; B '2 { int a = 3; cout « a « b; ^int b = 4; cout « a « b; B3 > { b4 } cou t « } ^ cou t « a « b; a <<^b; } F igu ra 1.10: B loq u es en un program a en C + + E j e m p lo 1 .6 : E l program a en C + + d e la figura 1.10 tien e cu a tro bloques, co n varias defini­ cion es d e las variables a y b. C om o ay u d a d e m em oria, ca d a d eclaración inicializa s u variable con el núm ero d e l bloque al q u e p ertenece. Por ejem p lo, con sid ere la declaración i n t a = 1 e n e l bloque B\. Su alcance es to d o 2?i, ex cep to los b loqu es an idados (ta l vez co n m ás profundidad) d en tro d e B i q ue ten g a n su propia declaración d e a. B¿, q ue e s tá an idad o ju sto d en tro d e B h no tien e u n a d eclaración d e a, pero Bz sí. B \ no tien e u n a declaración d e a, por lo q u e e l b lo q u e £3 es e l único lugar e n to d o el program a q u e se en cu en tra fuera d e l alcance d e la d eclaración d el nom bre a q ue p erten ece a B \. E sto es, el alcance incluye a f í 4 y a to d o B¿, e x c e p to la parte d e B¿ q u e se en cu en tra d en tro d e £ 3. L os alcances d e las cin co declaraciones s e sin tetiza n e n la figura 1.11. D esd e o tro p u n to d e v ista , vam os a considerar la instrucción d e sa lid a en el bloque B4 y a en lazar las variables a y b q ue s e u tilizan a h í co n las declaraciones apropiadas. L a lista d e b loques circun dan tes, en orden d e m enor a m ayor tam añ o, es B \, B¿, B \. O bserve q ue £ 3 no rodea al p u n to en cu estión . B4 tien e u na declaración d e 6, p or lo q ue e s a e s ta d eclaración a la q ue e s te uso d e b hace referencia, y el valor d e b q u e se im prim e es 4. Sin em bargo, B4 n o tien e u na declaración d e a, por lo que ahora analizam os B¿. E se bloque n o tien e u n a d eclaración d e 1.6 Fundamentos d e los lenguajes d e programación 31 DECLARACIÓN ALCANCE in in in in in B \ — B3 — B2 B 2 — B,\ Bs b4 t t t t t a b b a b = = = = = 1; 1; 2; 3; 4; F igu ra 1.11: A lcan ces d e la s d eclaraciones en el ejem p lo 1.6 a tam p oco, p or lo q ue con tinu am os con B i. Por fortuna, hay u n a declaración i n t a = 1 que p ertenece a e se bloque, p or lo que el valor d e a q ue s e im prim e es 1. S i no hubiera d ich a decla­ ración, e l program a tendría error. □ 1 .6 .4 C o n t r o l d e a c c e s o e x p líc ito Las clases y las estru ctu ras introducen un nuevo alcance para su s m iem bros. Si p es un o b jeto d e u na clase con u n cam p o (m iem bro) x , en ton ces e l uso d e x e n p . x se refiere al ca m p o x en la definición d e la clase. E n an alogía con la estru ctu ra d e b loqu es, el alcance d e la declaración d e u n m iem bro x e n u n a clase C se e x tie n d e a cualquier su b cla se C \ ex cep to si O tien e u na d e ­ claración local d el m ism o nom bre x. M ediante e l u so d e palabras clave com o p u b l i c , p r í v a t e y p r o t e c t e d , los lenguajes orien tad os a o b je to s com o C + + o J ava proporcionan u n con trol ex p lícito so b re el acceso a los nom bres d e los m iem bros en u na supérelase. E sta s palabras cla v e so p o rta n el encapsulam ien to m ed ian te la restricción d e l acceso. Por en d e, los nom bres privados reciben d e m anera in tencio­ n al u n alcance q ue incluye só lo las declaraciones d e los m étod os y las d efinicion es asociadas con e s a clase, y con cualquier clase “am iga” (friend: e l térm in o d e C + + ) . Los nom bres protegidos so n accesibles para las su b clases. L os nom bres p ú b licos son accesibles d esd e e l ex terio r d e la clase. E n C + + , la definición d e u n a clase p uede esta r separada d e las d efinicion es d e algunos o de to d o s su s m étod os. Por lo tan to, u n nom bre x asociado con la cla se C p u ed e tener u n a región d e l cód igo q ue se en cu en tra fuera d e s u alcance, se g u id a d e o tra región (la definición d e u n mé­ to d o ) q u e se en cu en tra d en tro d e su alcance. D e hecho, las regiones d en tro y fuera d el alcance p ueden alternar, h a sta q u e se hayan d efinido tod os los m étodos. 1 .6 .5 A lc a n c e d in á m ic o T écn icam ente, cualquier d irectiva d e alcance es d in á m ica s i se b a sa en u n factor o factores que puedan con ocerse só lo cu an do se ejecu te e l program a. S in em bargo, e l térm in o alcance d in á m i­ co s e refiere, p or lo general, a la sigu ien te directiva: e l u so de u n nom bre x s e refiere a la decla­ ración d e x e n el p rocedim ien to q ue se haya llam ad o m ás recientem ente con d ich a declaración. E l alcance d in ám ico d e e s te tip o aparece sólo en situ a cio n es esp eciales. V am os a considerar d o s ejem plos d e d irectivas dinám icas: la exp a n sió n d e m acros e n el preprocesador d e C y la resolución d e m étod os en la program ación orien ta d a a ob jetos. 32 Capítulo 1. Introducción D e c la r a c io n e s y d e fin ic io n e s Los térm inos aparentem ente sim ilares “declaración” y “definición” para los con ceptos de los lenguajes d e program ación, son en realidad b astan te d istin tos. Las declaraciones nos hablan acerca d e los tip os d e cosas, m ientras q ue las definiciones n os hablan sobre su s va­ lores. Por en d e, i n t i es u n a declaración d e ¿, m ientras q ue i = 1 es u na definición d e i La diferencia es m ás considerable cu an d o tratam os con m éto d o s u o tro s procedim ien­ to s. E n C + + , u n m étod o se d eclara en la definición d e u na clase, prop orcionan do los tip os d e los argu m en tos y el resultado d el m éto d o (que a m enudo s e le co n o ce com o la firm a d e l m étod o). D esp u és el m étod o se d efin e (es decir, se prop orciona e l cód igo para ejecu tar e l m étod o) e n o tro lugar. D e m anera sim ilar, es com ú n definir u na función d e C en un archivo y d eclararla en otros archivos, e n d ond e se u tiliza e s ta función. E j e m p lo 1 .7 : E n el program a en C d e la figura 1.12, el identificador a es u n a m acro q ue representa la exp resión (x + 1). Pero, ¿qué es x l N o p od em os resolver x d e m anera está tic a , es decir, e n térm in os d el tex to d el program a. # d e f i n e a (x + 1 ) i n t x = 2; v o id b O { i n t x = 1 ; p r i n t f ( " ‘/ ¿Tui", a ) ; > v o id c ( ) { p r i n t f a ) ; > v o i d m a in ( ) { b ( ) ; c ( ) ; } F igu ra 1.12: U na m acro p ara la cual se d eb e calcu lar el alcance d e su s nom bres en form a dinám ica D e hecho, para poder interpretar a s , d eb em os usar la regla d e alcance d in ám ico ordinaria. E xam in am os tod as las llam adas a funciones q u e se en cu en tran activas, y to m a m o s la función q ue s e h aya llam ado m ás recien tem ente y q u e te n g a u n a declaración d e x. A e s ta d eclaración es a la q ue s e refiere x En e l ejem p lo de la figura 1.12, la función m a in prim ero llam a a la fun ción b. A m ed ida q ue b se ejecu ta, im prim e e l valor d e la m acro a. C om o d eb em o s su stitu ir ( x + 1 ) p or a, resol­ vem os e s te uso d e x co n la d eclaración i n t x = 1 en la función 6. L a razón es q u e b tien e u na declaración d e x, p or lo q ue el térm in o ( x + 1) e n p r i n t f en 6 se refiere a e s ta x Por en d e, el valor q ue se im prim e es 1. U n a vez q ue b term in a y q ue s e hace la llam ad a a c, d eb em os im prim ir d e nuevo el valor d e la m acro a. N o o b sta n te , la ú n ica x accesible p ara c e s la x g lob al. Por lo ta n to , la instrucción p r i n t f e n c se refiere a e s ta declaración d e x, y se im prim e e l valor d e 2. □ La resolución d in ám ica d e l alcance tam bién es esen cia l para los p rocedim ien tos polim órfico s, aquellos q ue tien en d o s o m ás d efinicion es para el m ism o nom bre, d ep en d ien d o só lo d e los 1.6 Fundamentos d e los lenguajes d e programación 33 A n a lo g ía e n t r e e l a lc a n c e e s tá tic o y d in á m ic o A unque p od ría haber cualquier núm ero d e d irectivas está tic a s o d in á m ica s para e l alcan­ ce, h ay u n a in teresan te relación entre la regla d e alcance e stá tic o norm al (estructurado por b loques) y la d irectiva d inám ica norm al. E n cierto se n tid o , la regla d inám ica es para el tiem p o lo q ue la regla e s tá tic a es para e l espacio. M ientras q u e la regla e s tá tic a nos pide buscar la declaración cu ya unidad (bloque) s e a la m ás cercana en rodear la ubica­ ción física d el uso, la regla d inám ica nos pide que busquem os la d eclaración cu y a unidad (invocación a un p rocedim ien to) s e a la m ás cerca n a en rodear e l m om ento d e l uso. tip o s d e los argum entos. E n algu nos lengu ajes co m o ML (v ea la secció n 7 .3 .3 ), e s p osible deter­ m inar los tip os e n form a e s tá tic a para to d o s lo s u sos d e los nom bres, e n cu y o ca so e l com pilador p uede su stitu ir ca d a u so d el nom bre d e un procedim iento p por u n a referencia al cód igo para el procedim iento apropiado. N o o b sta n te , en o tro s lenguajes com o J a v a y C + + , hay m om entos e n los q ue el com p ilad or n o p uede realizar e s a d eterm inación. E j e m p lo 1 .8 : U n a ca racterística d istin tiv a d e la program ación orien ta d a a o b je to s es la habi­ lidad d e ca d a o b je to d e invocar el m étod o apropiado, e n resp uesta a un m ensaje. E n o tra s pa­ labras, el p rocedim ien to al que se llam a cu a n d o se eje cu ta x .m () d ep en d e d e la cla se d el o b jeto d en otad o por x e n e se m om ento. A con tinu ación se m uestra un ejem p lo típico: 1. H ay u n a clase C co n u n m étod o llam ad o ra(). 2. D e s u na su b clase d e C, y D tien e su propio m éto d o llam ado ra(). 3. H ay u n u so d e m d e la form a x .m () , e n d on d e a; es un o b je to d e l a cla se C. P or lo general, es im posible saber e n tiem po d e com pilación si x será d e la cla se C o d e la su b cla se D . S i la aplicación d e l m éto d o ocurre varias v eces, es m uy probable q u e algu nas se realicen co n o b je to s d en o ta d o s p or x , q ue e s té n en la cla se C pero no en D, m ientras q ue otras estarán e n la clase D . N o e s sin o h a sta e l tiem p o d e ejecución q u e se p u ed e decidir cu á l defi­ n ición d e m es la correcta. Por en d e, el cód ig o generado por e l com pilador d eb e d eterm in ar la clase d el o b je to x , y llam ar a u no d e los d o s m éto d o s llam ados m . □ 1 .6 .6 M e c a n is m o s p a r a e l p a s o d e p a r á m e t r o s T od os los len gu ajes d e program ación tien en u na n oción d e u n procedim ien to, pero p ueden di­ ferir en cu an to a la form a e n q u e e s to s p roced im ien tos reciben su s argu m en tos. E n e s ta sección vam os a considerar cóm o s e asocian los p arám etros a ctu a le s (los p arám etros q ue se u tilizan e n la llam ad a a un p rocedim ien to) co n los p a rá m e tro s fo rm a le s (los q ue se u tiliza n en la d efi­ n ición d e l p roced im ien to). E l m ecanism o q ue s e u tilice será el q u e d eterm in e la form a en que e l cód igo d e secu en cia d e llam ad as tratará a los parám etros. L a gran m ayoría d e los lengu ajes u tiliza n la “lla m a d a p or valor” , la “llam ad a por referencia” , o am bas. V am os a exp lica r esto s térm in os, ju n to co n o tro m éto d o co n ocid o com o “llam ad a por nom bre” , q ue es principalm ente d e in terés histórico. 34 Capítulo 1. Introducción L la m a d a p o r v a lo r En la llam ada p o r v a lo r, e l parám etro actu al s e e v a lú a (si es u n a exp resión ) o se co p ia (si es una variable). E l valor se co lo ca en la ubicación que p ertenece al correspondiente parám etro form al d el p rocedim ien to al q ue se llam ó. E ste m étod o se u tiliz a en C y en Java, ad em ás d e ser u na op ción com ú n en C + + , así com o en la m ayoría d e los d em á s lenguajes. L a llam ada p o r valor tien e e l efecto d e q ue tod o el cálcu lo q ue involucra a los p arám etros form ales, y q u e realiza e l procedim iento a l q ue se llam ó, es local para ese procedim ien to, y los parám etros a ctu ales en s í no p ueden m odificarse. Sin em bargo, observe q ue en C p o d e m o s pasar un apuntador a u n a variable p a ra p erm itir q ue e l p rocedim ien to al q u e se llam ó m odifique la variable. D e igual form a, los nom bres d e arreglos q u e se p asan com o p arám etros en C , C + + o Java, ofrecen al p rocedim ien to q ue se llam ó lo q ue es en efecto un apuntador, o u na referencia a l m ism o arreglo. P or en d e, si a es el nom bre d e u n arreglo d el p rocedim ien to q ue hace la llam ada, y se p a sa p o r valor al correspon­ d ien te parám etro form al x , en ton ces u n a asign ación ta l com o x [ i ] = 2 en realidad m od ifica e l elem en to d e l arreglo a[2]. L a razón es que, aunque x o b tien e u n a c o p ia d e l valor d e a, ese valor es en realidad u n apuntador al inicio d el área d e m em oria en d on d e s e en cu en tra el arreglo llam ado a. D e m anera sim ilar, en Java m uchas variables son en realidad referencias, o apuntadores, a las cosas q ue representan. E sta ob servación s e ap lica a los arreglos, la s cad en as y los o b je to s d e tod as las clases. A ún y cu an do Java u tiliza la llam ad a p or valor en form a exclu siva, ca d a vez q ue pasam os e l nom bre d e un o b je to a un procedim iento al q ue se lla m ó , e l valor q ue recibe ese procedim iento es, en efecto, un apuntador al o b jeto . E n con secu en cia, e l procedim iento al q ue se llam ó p uede afectar al valor d e l o b je to en sí. L la m a d a p o r r e f e r e n c ia En la llam ada p o r re fe ren cia , la dirección del parám etro actu al se p a sa al procedim iento al q ue se llam ó com o e l valor d el corresp ond ien te p arám etro form al. Los u sos d e l parám etro form al en e l có d ig o d e l procedim iento al que se llam ó se im plem en tan sigu iend o e s te apuntador h a sta la ubicación in d icad a p or e l procedim iento q u e h izo la llam ada. Por lo ta n to , la s m odificaciones al parám etro form al aparecen com o cam b ios para el parám etro actual. N o o b sta n te , s i e l parám etro a ctu a l es u n a expresión, en ton ces é s ta s e e v a lú a an tes d e la llam ad a y s u valor s e alm acena en su p rop ia ubicación. Los cam bios a l parám etro form al cam ­ bian e s ta u bicación, pero no p u ed en tener efecto sobre los d a to s d e l procedim iento q ue hizo la llam ada. La llam ad a por referencia s e u tiliza para los p arám etros “r e í” en C + + , y es u n a o p ció n en m uchos otros lengu ajes. E s casi esen cial cu an do el parám etro form al es un o b jeto , arreglo o estru ctu ra grande. L a razón es q u e la llam ada estr icta p or valor requiere q ue e l p rocedim ien to q ue hace la llam ad a cop ie tod o el p arám etro actu a l en el esp a cio q ue p erten ece al correspon­ d ien te p arám etro form al. E ste proceso de cop iad o se vu elve ex te n so cu a n d o el parám etro es grande. C om o d ijim os a l hablar sob re la llam ad a por valor, lo s lenguajes com o J a v a resuelven e l problem a d e pasar arreglos, cad en as u otros o b je to s cop ian d o só lo u na referencia a eso s o b jeto s. El efecto es q ue J ava s e co m p o rta com o si usara la llam ad a p or referencia para cualquier co sa q ue n o s e a un tip o básico com o en tero o real. 1.6 Fundamentos d e los lenguajes d e programación 35 L la m a d a p o r n o m b r e H ay un tercer m ecanism o (la llam ad a p or nom bre) q ue s e u tilizó en uno d e los prim eros lengua­ je s d e program ación: A lgol 60. E ste m ecanism o requiere q ue e l p rocedim ien to al q ue se llam ó s e ejecu te com o si el p arám etro actu al se su stitu y er a literalm en te p or e l p arám etro form al en su cód igo, com o si e l procedim iento form al fuera u na m acro q ue represen ta al parám etro actual (cam biando los nom bres locales en el procedim iento al q ue se llam ó, para q u e sean d istin to s). C uan do el parám etro actu a l es u n a exp resión en vez d e u n a variable, s e producen ciertos com ­ p ortam ien tos no in tu itivos, razón por la cu a l e s te m ecanism o no es p opu lar hoy en día. 1 .6 .7 U s o d e a lia s H ay u n a con secu en cia in teresante d e l paso p or parám etros tip o llam ad a por referencia o d e su sim u lación , com o en Jav a , en d o n d e las referencias a lo s o b je to s s e pasan por valor. E s posible q u e d os p arám etros form ales puedan referirse a la m ism a ubicación; se d ice q u e d ich as variables so n alias u na d e la otra. C om o resultado, d os variables cualesquiera, q ue d a n la im presión de recibir su s valores d e d o s parám etros form ales d istin to s, pueden convertirse en alias una d e la otra, tam bién. E j e m p lo 1 .9 : S u p on ga q ue a e s un arreglo q ue p erten ece a u n procedim iento p, y q ue p llam a a otro p rocedim ien to q(x,y) con u na llam ad a q(a ,a ). S u p o n g a ta m b ién q ue los parám etros se pasan p o r valor, pero q ue los nom bres d e los arreglos so n en realidad referencias a la ubicación e n la q ue se alm acena e l arreglo, com o e n C o los lengu ajes sim ilares. A hora, las variables x y y s e han con vertido en alias u n a d e la otra. E l p u n to im p ortan te es q u e si d en tro d e q h ay una asign ación x [1 0 ] = 2, en ton ces e l valor d e y[10] tam b ién s e con vierte en 2. □ R esu lta q ue es esen cial com prender el u so d e los alias y los m ecanism os q ue lo s crean s i un com p ilad or va a op tim izar un program a. C om o verem os al inicio d e l ca p ítu lo 9, h ay m uchas situ acion es en las q ue sólo p od em os op tim izar cód igo si p o d em o s esta r seguros d e q ue ciertas variables no so n alias. Por ejem p lo, p odríam os d eterm inar q ue x = 2 es e l único lugar e n el q u e s e asig n a la variable x. D e ser así, en ton ces p od em os su stitu ir el u so d e x por el uso d e 2; por ejem plo, su stitu im o s a = x+ 3 por el térm in o m ás sim p le a = 5. P ero su p o n g a q ue h ay o tra variable y q u e sirve com o alias para x E n tonces u na asign ación y = 4 p o d r ía ten er e l efecto inesperado d e cam biar a x. E sto tam b ién p o d ría significar q ue sería un error su stitu ir a = x+3 por a = 5, y a q ue el valor correcto d e a p o d ría ser 7. 1 .6 .8 E je r c ic io s p a r a la s e c c ió n 1 .6 E j e r c ic io 1 .6 .1 : P ara el cód ig o e n C estructu rad o p o r bloqu es d e la figura 1 .1 3 (a ), indique los valores asign ados a w , x, y y ¿ E j e r c ic io 1 .6 .2 : R ep ita e l ejercicio 1.6.1 para e l có d ig o d e la figura 1.13(b ). E j e r c ic io 1 .6 .3 : P ara el cód ig o estru ctu ra d o p or b loqu es d e la figura 1.14, su p o n ien d o el alcan ce e stá tic o u su al d e las d eclaraciones, d é el alcance para ca d a u n a d e las d o ce declara­ cion es. 36 Capítulo 1. Introducción i n t w, x , y , z ; i n t i = 4 ; i n t j = 5; { i n t j = 7; i = 6; w = i + j; i n t w, x , y , z; i n t i = 3; i n t j = 4 ; { i n t i = 5; w = i + j; > x = i + j; { i n t j = 6; i = 7; x = i + j; { in t i = } 8; y = i + j; y =i + j; } } z = i + j; z = i + j; (a) C ódigo para el ejercicio 1.6.1 (b ) C ódigo para e l ejercicio 1.6.2 F igu ra 1.13: C ódigo estructu rad o p or bloques { in t w, x , y , z ; { in t x , z; { in t w, x; } { i n t w, x ; { in t y , z; /* /* /* B lo c k B1 * / B lo c k B2 * / B lo c k B3 * / } /* /* B lo c k B4 * / B lo c k B5 * / } > > F igu ra 1.14: C ódigo estru ctu rad o por bloques para e l ejercicio 1.6.3 E jercicio 1.6.4: ¿Q ué im prim e el sigu ien te cód ig o en C? # d e f in e a (x+1) i n t x = 2; v o i d b O { x = a ; p r i n t f ("üdX n", x ) ; > v o i d c O { i n t x = 1 ; p r i n t f C '/d X n 11) , a ; > v o i d m a in O { b ( ) ; c ( ) ; } 1.7 R e s u m e n d e l c a p ítu lo 1 ♦ P rocesadores de lenguaje. U n en torn o d e desarrollo integrado d e softw are in clu ye m uchos tip os d istin to s d e procesadores d e lenguaje, com o com piladores, intérpretes, ensam bla­ dores, enlazadores, cargadores, depuradores, profilers. ♦ Fases del com pilador. U n com pilador o p era com o u na secu en cia d e fases, ca d a u na d e las cu ales transform a e l program a fu en te d e u n a representación in term ed ia a otra. 1 .7 Resumen d el capítulo 1 37 ♦ L enguajes m á qu in a y en sam blador. Los lenguajes m áquina fueron los lenguajes d e pro­ gram ación d e la prim era generación, segu id os d e lo s lengu ajes ensam bladores. L a progra­ m ación en esto s lengu ajes requería d e m ucho tiem p o y esta b a p ro p en sa a errores. ♦ M odelado en el diseñ o d e com piladores. E l d iseñ o d e com piladores es u n a d e las fases en las q u e la teoría ha ten ido e l m ayor im pacto sobre la p ráctica. E n tre los m od elos q ue se han en con trad o d e u tilid ad se encuentran: au tó m a ta s, gra m á tica s, exp resion es regulares, árboles y m uchos otros. ♦ O ptim iza ció n d e código. A un qu e e l cód igo no p u ed e verdaderam ente “op tim izarse” , e s ta cien cia d e m ejorar la eficien cia d el cód ig o e s ta n to com p leja com o m uy im portan te. C ons­ titu y e u n a gran parte d e l estu d io d e la com pilación. ♦ L enguajes de a lto n iv e l A m edida q ue transcurre el tiem p o , los lengu ajes d e program a­ ción se encargan ca d a vez m ás d e las tareas q u e se dejaban antes al program ador, com o la adm inistración d e m em oria, la com probación d e co n sisten cia en los tip o s, o l a ejecu­ ción d el cód igo en paralelo. ♦ C om piladores y arqu itectu ra de com pu tadoras. L a tecn o lo g ía d e com p ilad ores ejerce una influencia sobre la arquitectura d e com p utadoras, así com o tam b ién se ve in fluenciada por los avances en la arquitectura. M uchas innovaciones m odernas e n la arquitectura d ep en ­ d en d e la cap acid ad d e los com piladores para extraer d e los program as fuente las opor­ tun idad es d e usar con efectivid ad las cap acid ad es d el hardware. ♦ P ro d u ctivid a d y segu ridad del softw are. L a m ism a tecn o lo g ía q u e p erm ite a los com ­ piladores op tim izar e l cód igo p uede usarse para u na variedad d e tareas d e an álisis de program as, q u e van d esd e la d etecció n d e errores com unes en los program as, h a sta el d escub rim iento d e q ue u n program a es vulnerable a u no d e los m uchos tip o s d e intrusio­ nes q u e han d escu b ierto los “hackers” . ♦ Reglas d e alcance. E l alcance d e u n a d eclaración d e x es e l co n tex to en e l cu a l lo s usos d e £ s e refieren a e s ta declaración. U n lengu aje u tiliza e l alcance e s tá tic o o alcance léxico si e s p osible d eterm inar el alcance d e u n a d eclaración co n só lo analizar e l program a. En cualquier otro caso, e l lengu aje u tiliza un alcance din ám ico. ♦ E n torn os. L a asociación d e nom bres co n u bicacion es en m em oria y d esp u és co n los v a lo ­ res puede describirse en térm inos d e en to rn o s, los cu ales asign an los nom bres a la s ubi­ cacion es en m em oria, y los e sta d o s, q ue asignan las u bicacion es a su s valores. ♦ E stru ctu ra d e bloques. S e d ice q ue los lenguajes q ue p erm iten anidar bloques tien en es­ tru ctu ra de bloques. U n nom bre x en u n bloque anidado B se en cu en tra en e l alcance d e u n a declaración D de x en un b loqu e circundante, s i no e x iste o tr a d eclaración d e x en u n b loqu e interm edio. ♦ P aso d e pará m etro s. Los parám etros se p asan d e un procedim iento q ue hace la llam ada al procedim iento q u e es llam ado, y a s e a por valor o p or referencia. C uando se pasan ob ­ jeto s gran d es p or valor, los valores q ue s e pasan so n en realidad referencias a los m ism os ob jetos, lo cu a l resu lta e n u n a llam ad a p or referencia efectiva. 38 Capítulo 1. Introducción ♦ Uso de alias. C uan do los p arám etros se p a sa n (d e m anera efectiv a ) por referencia, d os parám etros form ales pueden referirse al m ism o o b jeto . E s ta p osibilid ad p erm ite q ue un cam b io e n u n a variable cam b ie a la otra. 1.8 R e fe re n c ia s p a r a el c a p ítu lo 1 P ara el desarrollo d e los lenguajes d e program ación q ue se crearon y han esta d o en uso d esd e 1967, incluyendo Fortran, A lgol, Lisp y Sim ula, vea [7]. P a ra lo s lenguajes q ue se crearon para 1982, in clu yen d o C , C + + , P ascal y S m alltalk, vea [1]. La C olección d e com p ilad ores d e G N U , gcc, es u n a fuente popular d e com piladores d e có d ig o fuente ab ierto para C, C + + , Fortran, J a v a y o tro s lenguajes [2]. P h o en ix es un k it d e herram ientas para con stru ir com piladores q ue proporciona un fram ew ork integrado para construir las fases d e an álisis d e l program a, gen eración de có d ig o y op tim iza ció n d e có d ig o d e los com piladores q ue verem os e n e s te libro [3]. P ara ob ten er m ás inform ación acerca d e los co n cep to s d e los lengu ajes d e program ación, recom endam os [5,6]. P ara ob tener m ás inform ación sobre la arq u itectura d e com putadoras y el im pacto q ue tiene en la com p ilación, sugerim os [4]. 1. Bergin, T . J. y R . G . G ib son , H isto ry o f P ro g ra m m in g L angu ages, A C M P ress, N ueva Y ork, 1996. 2. h t t p : / / g c c . g n u . o r g / . 3. h t t p : / / r e s e a r c h . m i c r o s o f t . c o m /p h o e n i x /d e f a u lt . a s p x . 4. Hennessy, J. L. y D . A . P atterson , C om pu ter O rg a n iza tio n a n d D esig n : The H a r d w a r e / S oftw are In terfa c e , M organ-K aufm ann, San Francisco, C A , 2004. 5. S co tt M. L ., P rogram m in g Language P ra g m a tics, segunda ed ició n , M organ-K aufm ann, San Francisco, C A , 2006. 6. S ethi, R ., P rogram m ing L anguages: C oncepts a n d C o n stru c ts, A ddison-W esley, 1996. 7. W exelb lat, R . L ., H isto ry o f P rogram m in g L angu ages, A cad em ic P ress, N u ev a York, 1981. C a p ít u lo 2 U n traductor simple orientado a la sintaxis E ste ca p ítu lo e s u n a introducción a las técn ica s d e com p ilación q u e verem os e n los cap ítu los 3 a 6 d e e s te libro. P re sen ta las técn icas m ediante e l desarrollo d e un program a funcional en Java q u e traduce instrucciones represen tativas d e un len gu aje d e program ación en un cód igo d e tres direcciones, una representación interm edia. E n e s te ca p ítu lo harem os én fasis en e l fronten d d e un com p ilad or, en esp ecia l en e l an álisis d e léxico, e l an álisis sin tá ctico (parsing), y la gen eración d e cód igo interm edio. E n los cap ítu lo s 7 y 8 verem os cóm o generar instrucciones de m áq u in a a partir d el cód igo d e tres direcciones. E m pezarem os co n algo peq ueño, creando un trad uctor orientado a la sin ta x is q ue asigna exp resion es aritm éticas infijo a exp resion es p ostfijo. D esp ués exten d erem os e s te trad uctor para q u e asign e fragm entos d e cód ig o (com o s e m u estra e n la figura 2 . 1 ) a un có d ig o d e tres direc­ cio n es d e la form a q ue s e p resen ta en la figura 2.2. E l trad u ctor fu n cion al en J a v a aparece en e l ap én d ice A . E l u so d e J a v a es co n ven ien te, pero n o esen cia l. D e h ech o, las ideas en e s te ca p ítu lo so n anteriores a la creación d e J a v a y d e C. int i; int j; float[100] a; float v; float x; while ( true ) { do i = i+1; while ( a[i] < v ); do j = j-1; while ( a[j] > v ); if ( i>= j ) break; x = a[i]; a [i] = a[j]; a[j] = x; } > F igu ra 2.1: U n fragm ento d e có d ig o q u e s e v a a traducir 39 40 Capítulo 2. 1 2 3 4 5 G 7 8 9 10 11 12 13 14 Un traductor sim ple orientado a la sintaxis i = i + 1 ti = a C i ] if ti < v goto j = j - 1 t2 = a [ j ] if t2 > v goto ifFalse i >= j goto 14 x = a [ i ] t3 = a [ j ] a [ i ] = t3 a [ j ] = x goto 1 F igu ra 2.2: C ódigo interm edio sim plificado para e l fragm ento d el program a d e la figura 2.1 2.1 In tro d u c c ió n La fase d e análisis d e un com pilador d escom p on e un program a fuente e n p iezas com p o n en tes y produce u na representación interna, a la cu a l se le co n o ce co m o có d ig o interm edio. L a fa se d e sín tesis trad uce el cód ig o interm edio en e l program a destino. El an álisis s e organ iza d e acuerdo co n la “sin ta x is” d e l lengu aje q u e se v a a com pilar. La sin ta xis d e un lengu aje d e program ación describe e l form ato apropiado d e su s program as, m ien­ tras q ue la se m á n tica d e l lengu aje d efine lo q ue su s program as significan; es d ecir, lo q ue hace ca d a program a cu an d o se ejecu ta. P ara especificar la sin ta x is, en la secció n 2.2 presentam os una notación d e u so popular, llam ad a gram áticas sin c o n tex to o B N F (Form a d e B ackus-N aur). Con las n otacion es q ue se tien en disponibles, e s m ucho m ás d ifícil describir la sem á n tica d e un lengu aje q ue la sin taxis. P ara especificar la sem án tica, deb erem os, p o r lo ta n to , usar descripcio­ nes inform ales y ejem p los sugerentes. A dem ás d e especificar la sin ta x is d e un len gu a je, se puede u tilizar u n a gra m á tica libre d e co n tex to para ayudar a guiar la trad ucción d e los program as. E n la secció n 2.3 presentam os una técn ica d e com p ilación orien tad a a la gram ática, co n o cid a com o tradu cción o rien ta d a a la sin ta xis. E n la sección 2 .4 presentam os e l an álisis sin tá ctico (parsing). El resto d e e s te ca p ítu lo es u na g u ía rápida a través d e l m odelo d e un front-end d e u n com ­ pilador en la figura 2.3. E m p ezam os co n e l analizador sin tá ctico . Por cu estió n d e sim plicidad, consideram os la traducción orien tad a a la sin ta x is d e las exp resion es infijas al form ato p ostfijo, una n otación e n la cu a l los operadores aparecen d esp u és d e su s op erandos. P or ejem p lo , el form ato p ostfijo d e la exp resión 9 — 5 + 2 e s 95 - 2 + . L a trad ucción al form ato p o stfijo es lo b astan te co m p leta com o para ilustrar e l an álisis sin tá ctico , y a la v e z lo b astan te sim p le com o para q ue se p ueda m ostrar el traductor p or com p leto e n la secció n 2.5. E l traductor sim p le m aneja exp resion es com o 9 - 5 + 2, q u e co n sisten en d íg ito s separados p or sign os p o sitiv o s y negativos. U n a razón para em pezar con dichas exp resion es sim p les es q ue el analizador sin ­ tá ctico p uede trab ajar d irectam en te co n los caracteres in dividu ales p a ra lo s op erad ores y los operandos. 2.1 In trod ucción 41 F igu ra 2.3: U n m odelo d e u na front-end d e un com pilador U n analizador léxico p erm ite q ue un trad u ctor m aneje instrucciones d e varios caracteres com o identificadores, q ue se escriben com o secu en cias d e caracteres, pero se tratan co m o uni­ d a d es con ocid as com o tokens durante e l análisis sin táctico; p or ejem p lo , en la exp resión c u e n t a + 1 , e l identificador c u e n t a se tra ta com o u n a unidad. E l analizador léxico en la sección 2.6 p erm ite q ue aparezcan núm eros, identificadores y “espacio e n blanco” (esp acios, tabu ladores y caracteres d e n u eva línea) d en tro d e las expresiones. A con tinu ación, consideram os la gen eración d e có d ig o interm edio. E n la figura 2.4 se ilus­ tran d os form as d e cód ig o interm edio. U n a form a, co n o cid a com o árboles sin tá c tic o s a b stra cto s o sim p lem en te árboles sin tá c tic o s, representa la estru ctu ra sin tá ctica jerárq uica d e l program a fuente. E n el m odelo d e la figura 2 .3 , el analizador sin tá ctico p roduce un árbol sin tá ctico , que s e trad uce p osteriorm en te en cód igo d e tres direcciones. A lgunos com piladores com binan el an álisis sin táctico y la generación d e cód ig o interm edio en un solo com p onente. d o - w h ile i = i + 1 ti - a [ i ] if ti < v goto 1 c u erp o (b) a s i g n a c ió n / \ \ / i + / \ i 1 (a) F igu ra 2.4: C ódigo interm edio para “do i = i + l ; w h i le ( a [ i ] < v ) ; ” L a raíz d e l árbol sin tá ctico ab stracto en la figura 2 .4 (a ) representa un ciclo d o-w hile com ­ p leto. E l hijo izquierdo d e la raíz represen ta e l cu erpo d e l ciclo, q ue co n siste só lo d e la asig­ n ación i = i + l ; . E l hijo d erech o d e la raíz representa la con d ición a [ i ] <v. E n la sección 2.8(a) aparece u na im plem en tación d e los árboles sin tácticos. 42 Capítulo 2. Un traductor sim ple orientado a la sintaxis La o tr a representación in term ed ia com ún, q ue se m uestra en la figura 2 .4 (b), es u na secu en ­ c ia d e instrucciones d e “tres d irecciones” ; e n la figura 2.2 aparece un ejem p lo m ás co m p leto. E sta form a d e cód ig o interm edio recib e su nom bre d e las in stru cciones d e la form a x = y o p 2 , en d ond e o p es un operador binario, y y z son las d irecciones para los op erandos, y x es la dirección d el resultado d e la operación. U n a in stru cción d e tres d irecciones llev a a ca b o cuando m enos u na operación, p or lo general, un cálcu lo, u n a com paración o u na bifurcación. En e l ap én d ice A reunim os las técn icas d escritas en e s te ca p ítu lo para crear un front-end d e un com pilador en Java. L a interfaz trad u ce las instrucciones e n in stru cciones e n lengu aje ensam blador. 2.2 D efin ició n d e s in ta x is En e s ta sección presentam os u na n otación (la “gra m á tica libre d e co n tex to ” , o sim p lem en te “gra m ática”) q ue se u tiliza para especificar la sin ta x is d e un lengu aje. U tilizarem os las gram á­ tica s a lo largo d e este libro para organizar los front-ends d e los com piladores. U n a g ra m á tica d escrib e en form a n atu ral la estru ctu ra jerárquica d e la m ayoría d e las ins­ trucciones d e un len gu aje d e program ación. P or ejem plo, u n a in stru cción if-else en J a v a p uede ten er la sigu ien te forma: i f ( expr ) in str e l s e instr E sto e s , u na in stru cción if-else es la con caten a ció n d e la p a lab ra clave ¡f, un paréntesis abierto, u n a expresión, u n paréntesis cerrado, u n a in stru cció n , la p alabra cla v e e l s e y o tra instrucción. M ediante e l u so de la variable ex p r para d en otar u n a exp resión y la variable in s tr para d en otar u na instrucción, e s ta regla d e estru ctu ración p u ed e expresarse d e la sigu ien te manera: in s tr -► i f ( expr ) in s tr e l s e in s tr en d o n d e la flech a s e lee com o “p uede tener la form a” . A d ich a regla se le llam a producción. En u n a producción, los elem en tos léxicos com o la palabra clave i f y los paréntesis s e llam an term in ales. Las variables com o ex p r e in s tr representan secu en cia s d e term in ales, y se lla ­ m an no term in ales. 2 .2 .1 D e fin ic ió n d e g r a m á tic a s U n a gram ática libre de co n tex to tien e cu a tro com ponentes: 1. U n con ju n to d e sím b olos term in a le s, a los q ue algu nas veces se les co n o ce com o “tokens” . Los term in ales so n los sím b olos elem en tales d el lengu aje d efin id o por la gram ática. 2. U n con ju n to d e no te rm in a le s, a las q u e algu nas v eces s e les co n o ce com o ‘V ariables sin tá ctica s” . C ad a no term inal represen ta un con ju n to d e cad en as o term inales, d e una form a q ue describirem os m ás adelante. 3. U n con ju n to d e produ ccion es, e n d ond e ca d a producción co n siste en un no term in al, llam ad a encabezado o lado izq u ie rd o d e la producción, u na flecha y u n a se cu en cia d e 2.2 DeGnición d e sintaxis 43 C o m p a r a c ió n e n t r e t o k e n s y te r m in a l e s En un com p ilad or, e l analizador léxico lee lo s caracteres d el program a fuente, los agrupa en u nidades con sign ificad o léxico llam adas lexem as, y p rod uce com o sa lid a tokens que representan esto s lexem as. U n tok en co n siste en d os com p on en tes, e l nom bre d e l token y un valor d e atrib uto. L os nom bres d e los tokens so n sím b olos ab stractos q ue u tiliza el analizador sin tá ctico para su análisis. A m enudo, a e sto s to k en s les llam am os te rm in a le s, y a q ue aparecen com o sím b olos term inales en la gra m á tica para un lengu aje d e progra­ m ación. E l valor d e atrib uto, si e s tá p resen te, es u n apuntador a la ta b la d e sím bolos q ue con tien e inform ación adicional acerca d e l token. E s ta inform ación adicional n o forma p arte d e la gram ática, por lo q ue e n n uestra exp licación sobre e l an álisis sin tá ctico , a m enudo n os referim os a los tokens y los term in ales com o sinónim os. term inales y no term in ales, llam ad a cuerpo o lado derecho d e la producción. L a intención in tu itiv a d e u n a producción es especificar u na d e las form as escrita s d e u n a instrucción; si e l n o term inal d e l en cab ezad o representa a u n a instrucción, en to n ces e l cu erpo repre­ se n ta u na form a e scr ita d e la instrucción. 4 . U n a d esign ación d e u n a d e los no term inales com o e l sím b olo in ic ia l P ara especificar las gram áticas presentam os su s producciones, e n d on d e prim ero s e listan las producciones para el sím b olo inicial. Sup onem os que los d ígitos, lo s sign os com o < y <=, y las cad en as en n egritas com o w h i l e son term inales. U n nom bre en cu rsiva e s un n o term i­ nal, y se p uede asum ir q ue cualquier nom bre o sím b olo q ue n o e s té en cursiva es un term in al.1 P or con ven iencia d e n otación, las producciones con el m ism o n o term inal q ue el en cab ezado p ueden agrupar su s cu erpos, co n los cu erpos altern ativos separados p or e l sím b olo |, q ue leem os com o “o ” . E j e m p lo 2 .1 : Varios ejem p los en este cap ítu lo u tilizan exp resion es q ue co n sisten en d íg ito s y sig n o s p ositivos y negativos; por ejem p lo, las ca d en a s com o 9 -5 + 2 , 3 - 1 o 7. D eb id o a q ue debe aparecer un sign o p ositivo o n egativo en tre d o s d íg ito s, n os referim os a ta le s exp resion es com o “listas d e d íg itos separados por sig n o s p ositiv o s o n egativos” . L a sig u ien te gra m á tica describe la sin ta x is d e esta s expresiones. L as producciones son: Usta Usta + d íg ito (2.1) Usta Usta - d íg ito (2.2) Usta -*■ d íg ito - * d íg ito (2.3) 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (2.4) 1 U tilizarem os le tra s individuales e n c u rsiv a p a r a fines adicionales, e n esp ecial c u a n d o estu d ie m o s las g ra m á tic a s co n d e ta lle e n e l c a p ítu lo 4. P o r eje m p lo , vam os a u sa r X , Y y Z p a r a h a b la r so b re u n sím bolo q u e p u ed e s e r o no te rm in a l. No o b s ta n te , cu a lq u ie r nom bre e n c u rsiv a q u e c o n te n g a d o s o m ás c a ra c te re s se g u irá re p re se n ta n d o un no te rm in a l. 44 Capítulo 2. Un traductor sim ple orientado a la sintaxis Los cu erpos d e las tres producciones con la lis ta n o term in al com o en cab ezad o pueden agru­ parse d e la sigu ien te m anera equivalente: lista -► Usta + díg ito | Usta - d íg ito \ dígito D e acuerdo con n uestras con ven ciones, los term in ales d e la g ra m á tica so n los siguientes sím bolos: + - 0 1 2 3 4 5 6 7 8 9 Los no term in ales so n los nom bres en cu rsiva Usta y d íg ito , en d ond e lista e s e l sím b olo inicial, y a q u e su s prod uccion es s e d a n prim ero. □ D ecim os q ue u n a producción es para un no term in al, si e l no term inal es e l en ca b eza d o d e la producción. U n a cad en a d e term inales es u n a secu en cia d e cero o m ás term inales. L a ca d en a d e cero term inales, escrita com o e, s e llam a cad en a v a c ía .2 2 .2 .2 D e riv a c io n e s U n a gram ática deriva cad en as em p ezan d o co n el sím b olo inicial y su stitu y en d o en form a repe­ tid a un no term inal, m ediante el cuerpo d e u n a producción para e s e no term in al. Las cadenas d e term in ales q ue pueden derivarse d el sím b olo inicial d el lenguaje d efinido p or la gram ática. E j e m p lo 2 .2 : El lengu aje d efinido p or la g ra m á tica d e l ejem p lo 2.1 co n siste en lista s d e d ígi­ tos separadas por sign os p ositivos y negativos. Las d iez producciones para e l d íg ito no term inal le perm iten representar a cu alq uiera d e los term inales 0, 1 , . . . , 9. D e la producción (2.3), un d íg ito p or s í so lo e s u n a lista . Las producciones (2.1) y (2.2) exp resan la regla q ue estab lece q ue cualquier lista segu id a de u n signo p o sitiv o o n egativo, y desp ués d e otro d ígito, form a u na nueva lista. Las p roducciones (2.1) a (2.4) son tod o lo q ue n ecesitam os para definir e l len gu aje deseado. Por ejem plo, p od em os deducir q ue 9 -5 + 2 es u n a lis ta d e la sigu ien te manera: a) 9 es u n a Usta p o r la producción (2 .3 ), y a q u e 9 es un dígito. b) 9 - 5 es u n a Usta p or la producción (2 .2 ), y a q ue 9 es u n a Usta y 5 es un dígito. c) 9 -5 + 2 es una Usta por la producción (2 .1 ), y a q ue 9 - 5 es u na Usta y 2 es un dígito. □ E j e m p lo 2 .3 : U n tip o d e lista algo d istin to es la lis ta d e p arám etros en la llam ad a a u na función. E n Java, los p arám etros se encierran entre p aréntesis, com o e n la llam ad a max(x,y) d e la fu n ción max co n los p arám etros x y y. U n m atiz d e d ich as lista s es q u e u n a lista v a cía d e parám etros p u ed e en con trarse en tre los term inales ( y ). P od em os em pezar a desarrollar u na gra m ática para d ich as secu en cias co n las sigu ien tes producciones: t é c n i c a m e n t e , e p u ed e s e r u n a c a d e n a d e c e ro sím bolos d e cu a lq u ie r a lfa b e to (colección d e sím bolos). 2.2 Definición d e sintaxis 45 la m a d a param sopc p a ra m s -► -► -► ¡d ( p a ra m so p c ) p a ra m s \ e param s , pa ra m | pa ra m O bserve q ue e l segu n d o cu erpo p osible para param sopc ( “lista d e parám etros o p cio n a les”) es €, q ue representa la cad en a vacía d e sím b olos. E s decir, p aram sopc p uede su stitu irse p or la cad en a vacía, por lo q u e u n a llam ada p uede con sistir e n un nom bre d e función, seg u id o d e la ca d en a de d os term in ales ( ) . O bserve q ue las producciones p a ra p a ra m s so n análogas para las d e Usta en e l ejem p lo 2 .1 , co n una co m a en lugar d el operador aritm ético + o - , y param e n vez d e dígito. N o hem os m ostrado las producciones para pa ra m , y a q u e los p arám etros son en realidad ex ­ presiones arbitrarias. E n breve hablarem os sobre las producciones apropiadas para las diversas con stru ccion es d e los lengu ajes, com o exp resion es, in stru cciones, etcétera . □ E l an álisis sin tá c tic o (parsin g) es e l p rob lem a de tom ar u na ca d en a d e term inales y averi­ guar cóm o derivarla a partir d el sím b olo inicial de la g ra m á tica , y si no p u ed e derivarse a partir d e este sím b olo, en ton ces h ay q u e reportar lo s errores d en tro d e la cadena. E l an álisis sin tác­ tico e s u no de los problem as m ás fundam entales en to d o lo relacionado co n la com pilación; los principales m éto d o s para e l an álisis sin tá ctico se describen e n el ca p ítu lo 4. E n e s te ca p ítu lo , por cu estió n d e sim plicidad, em p ezam os con program as fuente com o 9 -5 + 2 e n lo s q ue ca d a ca­ rácter es un term inal; e n general, un program a fuente tien e lex em a s d e varios caracteres q ue el analizador léxico agrupa e n tokens, cu y o s prim eros co m p o n en tes so n los term inales procesados por e l analizador sin táctico. 2 .2 .3 Á r b o le s d e a n á lis is s in tá c tic o U n árbol d e análisis sin táctico m uestra, en form a gráfica, la m anera en q u e el sím b olo inicial d e u na g ra m á tica deriva a u n a cad en a en e l lengu aje. Si e l no term inal A tien e u na producción A - + X Y Z , en to n ces u n árbol d e an álisis sin tá ctico p o d ría tener un nodo interior etiq u etad o com o A , co n tres hijos llam ados X , Y y Z, d e izquierda a derecha: A / X I\ Y Z D e m anera form al, d a d a u n a gram ática libre d e co n tex to , un árbol d e an á h sis sin tá c tic o de acuerdo con la g ra m á tica es un árbol con las sig u ien tes propiedades: 1. L a raíz se etiq u e ta co n e l sím b olo inicial. 2. C ad a h oja se etiq u e ta co n un term in al, o co n e. 3. C ad a n od o interior se etiq u e ta co n u n no term inal. 4. S i A es e l no term inal q ue etiq u eta a cierto nodo interior, y X h X 2, . . X n son las etique­ tas d e los hijos d e e se nodo d e izquierda a derecha, en ton ces d eb e haber u n a producción A -► X 1X 2 • • • X n. A quí, ca d a u n a d e las etiq u etas X \, X 2, . . . , X n representa a un sím bolo 46 Capítulo 2. Un traductor sim ple orientado a la sintaxis T e r m in o lo g ía d e á r b o le s Las estru ctu ras d e d a to s tip o árbol figuran d e m anera p rom inente en la com pilación. • U n árbol con siste e n uno o m ás nodos. Los nodos p ueden tener etiq u eta s, q ue en este libro, por lo general, serán sím b olos d e la gram ática. A l dibujar un árbol, con frecuencia representam os los n od os m ediante esta s etiq u e ta s solam en te. • Sólo uno d e los nodos e s la raíz. T o d o s los nodos, ex cep to la raíz, tien en un padre único; la raíz n o tien e padre. A l dibujar árboles, colo ca m o s e l padre d e u n nodo en cim a d e ese nodo y dibujam os u na lín ea en tre ellos. E n ton ces, la raíz e s e l nodo m ás a lto (superior). • Si el nodo iV es e l padre d el nodo M, en ton ces M e s h ijo d e N. L os h ijos d e nuestro nodo se llam an h erm an os. T ien en un orden, p a rtien d o desde la izq u ie rd a , por lo que al dibujar árboles, ordenam os los hijos d e u n n o d o d a d o en e s ta form a. • U n nodo sin hijos se llam a h oja. L os otro s n od os (los q ue tien en uno o m ás hijos) son nodos in teriores. • U n descen dien te d e u n nodo N e s y a s e a el m ism o N , u n hijo d e JV, un hijo d e un hijo d e N , y a sí en lo su cesivo, p ara cualquier núm ero d e niveles. D ecim os q ue el nodo N e s u n an cestro d el n od o M, s i M es d escen diente d e N. q ue p u ed e ser o n o un term inal. C om o un ca so esp ecia l, si A e es u n a producción, en ton ces un nodo etiq u etad o com o A p uede tener un solo hijo, etiq u eta d o com o e. E j e m p lo 2 .4 : L a d erivación d e 9 -5 + 2 en el ejem p lo 2 .2 s e ilu stra m ed ian te el árbol e n la figura 2.5. C ad a nodo en e l árbol se etiq u e ta m ediante u n sím b olo d e la gram ática. U n nodo interior y su h ijo corresponden a u n a producción; e l nodo interior corresponde al en cab eza­ d o d e la producción, el hijo corresponde al cuerpo. En la figura 2 .5 , la raíz se etiq u e ta com o lista, e l sím b olo inicial d e la g ra m á tica en e l ejem ­ plo 2.1. Los h ijos d e la raíz s e etiq u etan , d e izquierda a derecha, com o lista , + y dígito. O bserve que h sta h sta + dígito es u n a producción en la gram ática del ejem p lo 2.1. E l h ijo izquierdo d e la raíz e s sim ilar a la raíz, con u n hijo etiq u eta d o com o - en vez d e +. L os tres nodos etiq u eta d o s com o d íg ito tien en ca d a u no un hijo q ue s e etiq u e ta m ediante un d ígito. □ D e izquierda a derecha, las hojas d e u n árbol d e an álisis sin tá ctico form an la d eriva ció n d el árbol: la cad en a q ue se gen era o d eriva d el n o term inal en la raíz d el árbol d e an álisis sin tác­ tico. E n la figura 2 .5 , la d erivación es 9 -5 + 2 ; por con ven iencia, tod as las h ojas se m uestran en e l nivel inferior. Por lo tan to, no es necesario alinear las h ojas d e esta form a. C ualquier árbol 2.2 Definición d e sintaxis 47 lista lista dígito \ lista dígito dígito 9 F igu ra 2.5: Á rb ol d e an álisis sin tá ctico para 9 -5 + 2 , d e acuerdo con la gram ática e n el ejem p lo 2.1 im p arte u n orden n atu ral d e izquierda a d erech a a su s hojas, con base en la id ea d e q u e si X y Y so n dos hijos con e l m ism o padre, y X e s tá a la izquierda d e Y, en to n ces to d o s lo s descendientes d e X está n a la izquierda d e los d escen d ien tes d e Y. O tra definición d e l len gu aje generado por u na gra m á tica es com o e l con ju n to d e cad en as q ue p uede generar cierto árbol d e an álisis sin tá ctico . A l p roceso d e encontrar u n árbol d e aná­ lisis sin táctico p ara u na cad en a d ad a d e term in ales s e le llam a a n a liza r sin tá c tic a m e n te esa cadena. 2 .2 .4 A m b ig ü e d a d Tenem os q ue ser cu id adosos al hablar sobre la estru ctu ra d e u na cad en a, d e acuerdo a u n a gra­ m ática. U n a gram ática p uede tener m ás d e un árbol d e análisis sin tá ctico q ue genere u na cad en a d ad a d e term inales. S e d ice q ue d ich a gram ática es am bigua. P a ra m ostrar q ue u n a gra m á tica es am bigua, tod o lo q ue d eb em os hacer es buscar u na ca d en a d e term inales q ue se a la derivación d e m ás d e u n árbol d e análisis sin táctico. C om o u n a ca d en a con m ás d e u n árbol d e análisis sin táctico tien e, por lo general, m ás d e un significado, d eb em os diseñar gram áticas no am biguas para las aplicaciones d e com p ilación, o utilizar gram áticas am biguas con reglas adicionales para resolver las am bigüedades. E j e m p l o 2 .5 : S u p on ga q ue u tilizam os u n a so la cadena no term inal y q u e no diferenciam os en tre los d ígitos y las listas, com o en e l ejem p lo 2.1. P odríam os haber escrito la sig u ien te gra­ m ática: cadena -► cadena + cadena \ cadena - cadena | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 M ezclar la n oción d e d íg ito y k sta en la cadena n o term in al tien e sen tid o superficial, y a q ue un d íg ito in dividu al es un caso esp ecial d e u n a ksta. N o ob sta n te, la figura 2 .6 m u estra q ue u n a exp resión com o 9 -5 + 2 tien e m ás d e un árbol d e an álisis sin tá ctico con e s ta gram ática. Los d os árboles p a ra 9 -5 + 2 corresponden a las dos form as d e aplicar paréntesis a la expresión: ( 9 - 5 ) + 2 y 9 - ( 5 + 2 ) . E ste segu n d o u so d e los par rén tesis proporciona a la expresión e l valor inesperado d e 2, e n vez d e l valor ordinario d e 6. La g ra m á tica d e l ejem p lo 2.1 no p erm ite e s ta interpretación. □ 48 Capítulo 2. Un traductor sim ple orientado a la sintaxis cadena / cadena / cadena 9 i i / + cadena i i cadena 2 9 \ ~ cadena \ l cadena 5 \ - / cadena cadena i \ + cadena 5 2 F igu ra 2.6: D o s árboles d e an álisis sin tá ctico para 9 -5 + 2 2 .2 .5 A s o c ia tiv id a d d e lo s o p e r a d o r e s Por convención, 9+5+2 es eq u ivalen te a (9 + 5 )+ 2 y 9 - 5 - 2 es eq u ivalen te a ( 9 - 5 ) - 2 . C uando un op eran d o com o 5 tien e operadores a su izquierda y a su derecha, s e requieren convenciones para decidir q ué operador se ap lica a e se operando. D ecim os q ue el operador + se a socia por la izquierda, porque un op eran d o con sign os p ositivo s e n am bos lados d e él p ertenece al operador q ue e s tá a s u izquierda. E n la m ayoría de los lengu ajes d e program ación, los cu atro operadores aritm éticos (sum a, resta, m ultiplicación y d ivisión ) so n a sociativos por la izquierda. A lgunos operadores com u nes, com o la exp on en cia ció n , son a sociativos p or la derecha. C om o otro ejem p lo, el operador d e asign ación = e n C y su s descen dientes es a so cia tiv o p or la derecha; es d ecir, la expresión a=b=c se tra ta d e la m ism a form a q ue la exp resión a = (b = c ). Las cad en as com o a=b=c con un operador asocia tiv o p or la d erech a se generan m ediante la sigu ien te gram ática: derecha - + letra - * letra = derecha | letra a | b | • •• | z El con traste en tre u n árbol d e análisis sin tá ctico para un operador aso cia tiv o por la izquier­ d a com o - , y un árbol d e an álisis sin tá ctico para un operador a so cia tiv o p or la d erech a com o =, se m uestra en la figura 2.7. O bserve q u e e l árbol d e análisis sin tá ctico p a ra 9 - 5 - 2 crece hacia abajo y a la izquierda, m ientras que el árbol d e an álisis sin tá ctico para a=b=c crece h acia abajo y a la derecha. 2 .2 .6 P re c e d e n c ia d e o p e ra d o re s C onsidere la expresión 9+ 5*2. H ay d os p osib les interpretaciones d e e s ta expresión: (9 + 5 ) * 2 o 9 + -(5*2). Las reglas d e asociativid ad para + y * se aplican a las ocurrencias d el m ism o opera­ dor, p or lo que no resuelven e s ta am bigüedad. Las reglas q ue d efinen la p reced en cia relativa d e los operadores so n necesarias cu an do hay m ás d e un tip o d e operador presente. D ecim os q ue * tien e m a y o r p receden cia q ue +, s i * recibe su s op eran d os antes q u e +. E n la aritm ética ordinaria, la m ultiplicación y la d iv isió n tien en mayor p reced en cia q ue la su m a y la resta. Por lo ta n to , * recibe e l 5 tan to e n 9+ 5*2 co m o en 9*5+2; es decir, las exp resion es son eq u ivalen tes a 9 + (5 * 2 ) y ( 9 * 5 )+ 2 , respectivam ente. 2.2 Definición d e sintaxis 49 lista / lista / hsta i i \ dígito / letra i \ “ dígito i i / dígito 2 a letra \ - derecha = 5 derecha i \ = derecha b 9 letra c F igu ra 2.7: Á rboles d e análisis sin tá ctico para las g ra m áticas a sociativas p or la izquierda y por la derecha E j e m p lo 2 .6 : P od em os construir u na gram á tica para exp resion es aritm éticas a partir d e una ta b la q ue m uestre la asociatividad y la p reced en cia d e los operadores. E m p ezam os co n los cu a tro operadores aritm éticos com unes y u n a ta b la d e precedencia, m ostrand o los operadores e n orden de m enor a mayor precedencia. Los operadores e n la m ism a lín ea tie n e n la m ism a asociativid ad y precedencia: asociativo por la izquierda: asociativo por la derecha: + * / C ream os d o s n o term in ales llam adas e x p r y te r m para los d os niveles d e precedencia, y un n o term inal adicional llam ado fa c to r para generar u nidades básicas e n las expresiones. Las u nidades b ásicas en las exp resion es son d íg ito s y exp resion es entre paréntesis. fa c to r -► d íg ito | ( ex p r) A hora considerem os los operadores binarios, * y / , q ue tien en la m ayor precedencia. C om o esto s operadores asocian por la izquierda, la s p roducciones so n sim ilares a la s d e las lista s que asocian por la izquierda. te r m | | te r m * fa c to r te r m / fa c to r fa c to r D e m anera sim ilar, ex p r g en era listas d e térm inos separados por los operadores aditivos: ex p r —> e x p r + te r m e x p r - te rm te rm P or lo tan to, la gram ática resu ltan te es: expr te r m fa c to r —»■ ex p r + te r m \ e x p r - te r m \ te rm —> te r m * f a c to r \ te r m / f a c to r \ fa c to r —> d ig it o I ( e x p r ) 50 Capítulo 2. Un traductor sim ple orientado a la sintaxis G e n e r a liz a c ió n d e la g r a m á t i c a d e e x p r e s io n e s d e l e je m p lo 2 .6 P od em os considerar un factor com o u n a expresión q u e no p uede “separarse” m ediante ningún operador. A l usar el térm in o “separar” , querem os indicar q u e al colocar un opera­ dor en seg u id a d e cualquier factor, e n cualquier lado, n in gu n a p iez a d el factor, ex cep to en su totalid ad , se con vertirá en un operando d e e se operador. Si el factor es u na expresión con paréntesis, ésto s la p rotegen con tra d ich a “separación” , m ientras q ue s i el factor es un so lo op eran d o, n o puede separarse. U n térm ino (que no s e a tam b ién u n factor) es u n a expresión q ue p u ed e separarse m ediante los operadores d e la m ayor precedencia: * y / , pero no m ed ian te los operadores d e m enor precedencia. U n a expresión (que no se a u n térm in o o factor) p u ed e separarse m ediante cualquier operador. P od em os generalizar e s ta id ea con cualquier núm ero n d e niveles d e precedencia. N e­ cesitam os n + 1 no term inales. E l prim ero, com o f a c to r e n el ejem p lo 2 .6 , n u n ca podrá separarse. Por lo general, los cu erpos d e producciones para e s ta no term inal so n sólo o p eran d os individuales y exp resion es con paréntesis. E n ton ces, para ca d a nivel d e pre­ cedencia h ay un n o term inal q ue represen ta a las exp resion es q ue pueden separarse sólo m ediante operadores en e se n ivel, o e n u no superior. Por lo general, la s p rod uccion es para e s ta no term inal tien en cu erpos q ue representan los u sos d e los operadores e n ese nivel, m ás u n cu erpo q u e só lo e s la no term inal para e l sig u ien te nivel superior. Con e s ta gram ática, u na expresión es u n a lista d e térm inos separados por los sign os + o - , y un térm in o es u na lista d e factores separados p or los sign os * o / . O bserve q ue cualquier expresión con paréntesis es u n factor, a sí q ue co n los paréntesis p od em os desarrollar expre­ sion es q ue ten gan un anidam iento co n profundidad arbitraria (y árboles co n u na profundidad arb itraria). □ E j e m p lo 2 .7 : L as palabras clave nos p erm iten reconocer instrucciones, y a q ue la m ayoría d e ésta s em p iezan co n u n a p alabra clave o un carácter especial. Las ex cep cio n es a e s ta regla incluyen las asignaciones y las llam adas a procedim ientos. Las instrucciones definidas p or la g ra m á tica (am bigua) e n la figura 2 .8 so n legales en Java. En la prim era p rod ucción para in s tr , e l term inal ¡d representa a cualquier id en tific a d o s Las producciones para expresión n o se m uestran. L as in stru cciones d e asign ación especificadas por la prim era producción son legales en Java, aunque J a v a tr a ta a = co m o un operador d e asigna­ ción q ue p uede aparecer d en tro d e u na expresión. P or ejem plo, J a v a p erm ite a=b=c, m ientras q ue e s ta gram ática no. El no term inal in s tr s g en era u na lista p osib lem en te v a cía d e instrucciones. L a seg u n d a pro­ d ucción para in s tr s gen era la lista v a cía e. L a prim era p roducción gen era u n a lista p osib lem en te v a cía d e instrucciones segu id as por u na instrucción. La colocación d e los sign os d e p u n to y co m a e s su til; aparecen al final d e ca d a cu erpo q ue no term in a en in str. E ste en foqu e e v ita la acum ulación d e p un tos y com as d esp u és d e instruc­ cion es com o if y w hile, q ue term inan con su b in stru ccion es anidadas. C uan do la subinstrucción an idad a se a u n a in stru cción o un d o-w h ile, se generará u n p u n to y co m a com o parte d e la su bin stru cción. □ 2.2 Definición d e sintaxis 51 in s tr in strs —>■ | [ [ j | i d = expresión ; ¡ f ( ex p resió n ) in s tr i f = ex p resió n ; in s tr e l s e in s tr w h i l e ( ex p resió n ) in s tr d o in s tr w h i l e ( ex p resió n ) { in s tr s } -> ; in s tr s in s tr I e F igu ra 2.8: U n a g ra m á tica para u n su b co n ju n to d e instrucciones d e Java 2 .2 .7 E je r c ic io s p a r a la s e c c ió n 2 .2 E j e r c ic io 2 .2 .1 : C onsidere la sigu ien te g ra m á tica libre d e contexto: 5 -¥ 5 5 + | a) M uestre cóm o p uede generarse 5 5 * | a la ca d en a aa+ a* m ed ian te e s ta gram ática. b) C onstruya un árbol d e an álisis sin táctico para e s ta cadena. c) ¿Q ué lengu aje gen era e s ta gram ática? J u stifiq ue s u resp uesta. E j e r c ic io 2 .2 .2 : ¿Q ué len gu aje se g en era m ediante las sig u ien tes gram áticas? E n ca d a caso, justifiq ue su respuesta. a) 5 -> 0 5 1 1 0 1 b) 5 +5 5 | -5 5 c) S -> d) 5 —> a 5 b 5 e) 5 -¥ | a S ( 5 ) 5 | e | b 5 a 5 | e a | S+S | 55 |5 * |(5) E j e r c ic io 2 .2 .3 : ¿C uáles d e las gram áticas e n el ejercicio 2 .2 .2 so n am biguas? E j e r c ic io 2 .2 .4 : C on stru ya gram áticas libres d e co n tex to n o am biguas para ca d a u no d e los sigu ien tes lengu ajes. E n cad a caso m uestre q ue su gra m á tica e s correcta. a) E xp resion es aritm éticas en notación prefija. b ) L istas asociativas por la izquierda d e identificadores separados por com as. c) L istas asocia tiv a s p or la d erech a d e identificadores separados por com as. d) E xp resion es aritm éticas d e en teros e identificadores co n lo s cu a tro operadores binarios +> ", *, /- 52 Capítulo 2. Un traductor sim ple orientado a la sintaxis ! e) A gregue e l operador unario d e su m a y d e resta a los operadores aritm éticos d e (d). E j e r c i c i o 2 .2 .5 : a) M uestre q ue tod as las cad en as binarias generadas por la sigu ien te gra m á tica tien en v a ­ lores q u e pueden d ividirse en tre 3. S ugeren cia: U se la inducción en el núm ero d e nodos en u n árbol d e an álisis sin táctico. num -* 11 | 1001 | num 0 | num num b) ¿L a gram ática g en era to d a s las cad en as binarias co n valores d iv isib les entre 3? E j e r c i c i o 2 . 2 .6 : C onstruya u na gram ática libre d e co n tex to para los núm eros rom anos. 2.3 T ra d u c c ió n o r ie n ta d a a la s in ta x is La traducción orien tad a a la sin ta x is s e realiza u niend o reglas o fragm entos d e u n program a a la s producciones en u na gram ática. P or ejem p lo, con sid ere u n a expresión e x p r gen erad a por la sigu ien te producción: ex p r -+ e x p r i + term A quí, e x p r es la su m a d e las d o s su b exp resion es expri y term . E l su b ín d ice en ex p ri se u tiliza só lo p ara diferenciar la in sta n c ia de ex p r en el cu erpo d e la producción, d e l en ca b eza d o d e la producción. P od em os trad ucir e x p r exp lotan d o su estru ctu ra , com o en e l sig u ie n te seu d o có digo: trad ucir expr\\ trad ucir term; m anejar +; M ediante u na variante d e e s te seu d ocód igo, vam os a construir un árbol sin tá ctico para ex p r en la sección 2.8, creando árboles sin tá ctico s para expri y te r m , y desp ués m anejarem os e l + con stru yén dole un nodo. P or con ven iencia, e l ejem p lo en e s ta secció n e s la trad ucción d e las exp resion es infijas a la n otación postfijo. E sta sección in trod u ce d os co n cep to s relacionados con la trad ucción orien ta d a a la sin ­ taxis: • A trib u to s. U n a trib u to es cualquier can tid ad asociad a con u n a con stru cción d e program a­ ción. A lgu nos ejem p los d e atrib u tos son los tip o s d e d a to s d e las expresiones, el núm ero d e instrucciones en e l cód ig o generado, o la ubicación d e la prim era in stru cción en e l có ­ d igo generado para u na con stru cción, en tre m uchas o tra s p osibilid ades. C om o utilizam os sím b olos d e la gram ática (no term in ales y term inales) p a ra representar las con stru cciones d e program ación, exten d em os la n oción d e los atrib u tos, d e las con stru cciones a los sím ­ b olos q u e las representan. 2.3 Traducción orientada a la sintaxis • 53 E squem as d e tradu cción (o rien ta d a a la sin ta x is). U n esquem a d e tradu cción e s u na nota­ ción para unir los fragm entos d e un program a a las producciones d e u na gram ática. Los fragm entos d el program a se ejecu tan cu a n d o se u tiliz a la producción d urante e l análisis sin táctico. E l resultado com binado d e to d a s es ta s ejecu cion es d e los fragm entos, e n el orden inducido p or el an álisis sin táctico , produce la trad ucción d e l program a al cu a l se ap lica e s te proceso d e an álisis/sín tesis. U tilizarem os las trad uccion es orien tad as a la sin ta x is a lo largo d e e s te ca p ítu lo para tradu­ cir las exp resion es infijas en n otación postfija, para evaluar exp resion es y para construir árboles sin tá ctico s para las con stru cciones d e program ación. E n el ca p ítu lo 5 aparece u n a discusión m ás d eta lla d a sobre los form alism os orien tad os a la sin taxis. 2 .3 .1 N o ta c ió n p o s tf ija Los ejem p los en e s ta sección m anejan la traducción a la n otación p ostfija. L a n o ta ció n p o stfija para u na exp resión E p uede definirse d e m anera in d u ctiva, com o se m u estra a continuación: 1. Si E es una variable o co n sta n te, en to n ces la n otación p o stfija para E es la m ism a E. 2. Si E es u n a exp resión d e la form a E x o p E¿, en d ond e o p es cualquier operador binario, en ton ces la n otación p ostfija p ara E es E [ E'2 o p , en d on d e E [ y son las notaciones p ostfija para E \ y 2%, resp ectivam en te. 3. Si i? e s u na expresión con paréntesis d e la form a ( £ i ) , en ton ces la n otación p o stfija para E e s la m ism a q ue la n otación p o stfija para E i. E j e m p lo 2 .8 : L a notación p o stfija para ( 9 - 5 ) + 2 es 9 5 -2 + . E s decir, la s traducciones d e 9, 5 y 2 son las m ism as co n sta n tes, e n base a la regla (1). E n ton ces, la traducción d e 9 - 5 es 9 5 e n base a la regla (2 ). L a trad u cción d e ( 9 - 5 ) e s la m ism a en base a la reg la (3 ), H abiendo trad ucido la su bexpresión co n paréntesis, p od em os aplicar la reg la (2) a to d a la exp resión , con ( 9 - 5 ) e n el papel d e E \ y 2 en el p ap el d e Eh, p a ra ob ten er e l resultado 9 5 -2 + . C om o o tro ejem plo, la n otación p ostfija para 9 - ( 5 + 2 ) es 9 5 2 + -. E s d ecir, prim ero se tradu­ c e 5+2 a 52+, y e s ta exp resión s e con vierte en e l segu n d o argum ento d el sign o n egativo. □ N o se n ecesitan paréntesis en la n otación p o stfija , d eb ido a q u e la p o sició n y la a rid a d (núm ero d e argum entos) d e los operadores só lo p erm iten u na d ecod ificación d e u n a expresión p ostfija. E l ‘‘tru co ” es explorar varias veces la ca d en a p o stfija p artien do d e la izquierda, h asta encontrar un operador. D esp ués, se b u sca a la izquierda el núm ero apropiado d e operandos, y se agrupa e s te operador co n su s op erandos. S e ev a lú a e l operador co n los op eran d os y se su stitu y en por el resu ltad o. D espués se rep ite e l proceso, con tinu and o a la d erech a y buscando otro operador. E j e m p lo 2 .9 : C onsidere la exp resión p o stfija 9 5 2 + -3 * . Si exp loram os partiendo d e la iz­ quierda, prim ero en con tram os el sign o p ositiv o . Si b uscam os a s u izquierda en con tram os los op eran d os 5 y 2. Su sum a, 7, su stitu y e a 52+ y ten em o s la ca d en a 9 7 - 3 * . A hora, e l operador 54 Capítulo 2. Un traductor sim ple orientado a la sintaxis d e m ás a la izquierda es e l sign o n egativo, y su s op eran d os son 9 y 7. Si los su stitu im o s por el resultado d e la r e sta nos q u ed a 23*. P or ú ltim o, e l sig n o d e m u ltip licación se a sig n a a 2 y 3, lo cu a l produce e l resultado d e 6. □ 2 .3 .2 A t r i b u t o s s in te tiz a d o s La id ea d e asociar can tid ad es co n con stru ccion es d e program ación (por ejem plo, valores y tip o s con exp resion es) p uede expresarse e n térm inos d e gram áticas. A sociam os los atrib utos co n los no term in ales y term inales. D esp ués, u nim os reglas a las p roducciones d e la gram ática; e sta s reglas d escrib en la form a en q ue se calculan los atrib utos en eso s n od os d e l árbol d e análisis sin tá ctico en d ond e la producción en cu estió n se u tiliz a p a ra relacionar u n n o d o co n su s hijos. U na defin ición o rie n ta d a a la sin ta x is se asocia: 1. C on ca d a sím b olo d e gram ática, u n con ju n to d e atrib utos. 2. C on ca d a producción, u n con ju n to d e reglas se m á n tica s para calcu lar los valores d e los atrib u tos asociados con los sím b olos q u e aparecen e n la producción. Los atrib u tos p ueden evaluarse d e la sigu ien te form a. Para u n a ca d en a d e en trad a x d ada, se con stru ye un árbol de an álisis sin tá ctico p ara x. D esp ués, se aplican la s reglas sem án ticas para evaluar los atrib u tos en ca d a n od o d el árbol de an álisis sin tá ctico , com o se in dica a con ­ tinuación. S u p on ga q ue un n od o N en un árbol d e an álisis sin tá ctico se e tiq u e ta m ed ian te e l sím b olo de gra m ática X . E scribim os X . a para d en otar el valor d el a trib u to a d e X en e se nodo. A un árbol d e análisis sin tá ctico q ue m uestra los valores d e los atrib u tos en ca d a nodo se le co n o ce com o árbol d e an álisis sin tá ctico an otado. P or ejem p lo, la figura 2 .9 m uestra un árbol d e análisis sin tá ctico an otad o para 9 -5 + 2 co n un atrib u to t asociad o con los n o term inales ex p r y t e r m El valor 9 5 -2 + d e l atrib u to e n la raíz es la n otación p o stfija p a ra 9 -5 + 2 . E n breve verem os cóm o se calcu lan esta s expresiones. expr.t = 95-2+ expr.t = 9 term .t = 9 cxpr.t = 9 5 - + te rra l = 2 - term.1 = 5 2 5 9 F igu ra 2.9: Valores d e los atrib utos en los n od os de un árbol d e análisis sin tá ctico Se d ice q ue u n atributo e s tá sin te tiza d o si s u valor en e l nodo JV d e un árbol d e análisis sin tá ctico se d eterm in a m ediante los valores d e los atrib u tos d e l hijo d e N y d el m ism o N. Los atrib u tos sin tetizad os tien en la a tractiva propiedad d e q u e p u ed en evaluarse d u ra n te un 2.3 Traducción orientada a la sintaxis 55 recorrido d e abajo h acia arriba transversal d e un árbol d e an álisis sin tá ctico . E n la sección 5.1.1 hablarem os sobre otro tip o im p ortan te d e atributo: el a trib u to “heredado” . D e m anera inform al, los atrib u tos heredados tien en su valor en un nodo d e un árbol d e an álisis sin táctico q u e se d eterm in a m ed ian te los valores d e los atrib utos en el m ism o nodo, e n su padre y en sus herm anos d e l árbol. E j e m p lo 2 .1 0 : E l árbol d e análisis sin táctico a n otad o e n la figu ra 2.9 s e b a sa en la definición orien tad a a la sin ta x is d e la figu ra 2.10 para traducir exp resion es q u e co n sisten en d íg ito s s e ­ parados por los sig n o s p o sitiv o o n egativo, a la n otación p ostfija. C ad a n o term inal tien e un atrib u to t co n valor d e cad en a, e l cu a l representa a la n otación p o stfija para la exp resión gene­ rada por e s a n o term inal e n un árbol d e análisis sin tá ctico . E l sím b olo || en la reg la sem á n tica e s e l operador para la con caten ación d e cadenas. P r o d u c c ió n Reg la s s e m á n t ic a s expr —>expr1 + term expr —>exjyrj - term expr—>term expr.t exffr.t expr.t term term -* 0 term .t = tenrut = '0 ' —» 1 teim —^ 9 term ,t = '9 ' = = = expr^.t expr^.t term .t || || term .t term .t || 'V '1 ' F igu ra 2.10: D efinición orien tad a a la sin ta x is para la trad ucción d e infija a p ostfija L a form a p o stfija d e un d íg ito es el m ism o dígito; p or ejem p lo, la regla sem á n tica asociada co n la producción te rm -► 9 d efin e a te r m .t com o e l m ism o 9, ca d a vez q ue se u tiliza e s ta pro­ d u cción en un n od o d e u n árbol d e an álisis sin tá ctico . Los o tro s d íg ito s se traducen d e m anera sim ilar. C om o otro ejem plo, cu an do s e aplica la producción e x p r -► te r m , el v a lo r d e te r m .t se con vierte en e l valor d e e x p r .t L a producción ex p r -► e x p n + te r m deriva a u na exp resión q ue co n tien e un operador de siu n a.3 E l op eran d o izquierdo d el operador d e su m a se prop orciona m ed ian te exp n , y el op e­ rando derecho m ediante term . L a regla sem án tica pjyr.t = expr^t || term .t || V aso cia d a co n e s ta producción con stru ye e l valor d e l a trib u to ex p r.t m ed ian te u n a con catenación d e las form as postfijas e x p n .t y te r m .t d e los op eran d os izquierdo y derecho, respectivam ente, y d esp u és ad ju nta el sig n o d e sum a. E sta regla e s u na form alización d e la d efinición d e “expre­ sió n p o stfija ”. □ 3 E n é s t a y e n m uchas o tr a s re g la s, e l m ism o n o te rm in a l (e n e s te caso , expr) a p arece v arias veces. E l p ro p ó sito del su b ín d ic e 1 e n expr¡ e s d ife re n c ia r la s d o s o c u rre n c ia s d e expren la p ro d u c c ió n ; e l “ 1” no fo rm a p a r te d e l n o te rm in a l. P a r a o b te n e r m ás d e ta lle s c o n su lte e l c u a d ro titu la d o “U sos d e u n no te rm in a l p a r a d iferen c ia r convenciones”. 56 Capítulo 2. Un traductor sim ple orientado a la sintaxis U s o s d e u n n o t e r m i n a l p a r a d if e r e n c ia r c o n v e n c io n e s A m enudo, en las reglas ten em os la necesidad d e diferenciar en tre varios u sos d e l m ism o no term inal e n e l en cab ezad o y cu erpo d e u n a producción; para ilustrar e sto , v ea e l ejem ­ plo 2.10. La razón es q ue en e l árbol d e an álisis sin tá ctico , d istin to s n od os etiq u etad os p or e l m ism o n o term in al, p or lo general, tien en d istin to s valores para su s traducciones. N osotros vam os a adoptar la sigu ien te convención: e l no term in al aparece sin subíndice en el en cab ezad o y co n d istin to s su b ín d ices e n e l cuerpo. Todas son ocurrencias d el m is­ m o no term inal, y e l su bín d ice n o form a p arte d e su nom bre. N o o b sta n te, h ay q ue alertar al lector sobre la diferencia en tre los ejem p los d e traducciones específicas, en d ond e se utiliza e s ta convención, y las producciones genéricas com o A -> X \ ... , X „, en donde las X con su bín d ices representan u n a lista arbitraria d e sím b olos d e gram ática, y n o son in stancias d e un n o term inal específico llam ado X . 2 .3 .3 D e fin ic io n e s s im p le s o r i e n t a d a s a la s in ta x is La definición orien tad a a la sin ta x is e n e l ejem p lo 2.10 tien e la sig u ien te propiedad im portante: la ca d en a que representa la trad u cción d el no term inal e n e l en cab ezad o d e ca d a producción es la con caten ación d e las trad uccion es d e los no term inales en el cu erpo d e la producción, en e l m ism o orden q u e en la producción, co n algu nas cad en as ad icion ales op cio n a les entrelazadas. U n a definición orien tad a a la sin ta x is co n e s ta propiedad s e d en o m in a com o sim ple. E j e m p lo 2 .1 1 : C onsidere la prim era p rod ucción y reg la sem á n tica d e la figura 2.10: P ro d u c c ió n e x p r -► ex p n + te r m r e g la s e m á n tic a ^ ^ e x p r .t = e x p n .t || te r m .t || V A quí, la trad ucción ex p r.t es la con caten ación d e las trad uccion es d e ex p r i y te r m , seguid a por e l sím b olo +. O bserve q u e expr\ y te r m aparecen en e l m ism o o rd en , tan to e n e l cu erpo d e la producción com o en la regla sem án tica. N o h ay sím b olos ad icion ales an tes o en tre su s trad uc­ ciones. E n e s te ejem p lo, e l único sím b olo adicional ocurre al final. □ C uando h ablem os sobre los esqu em as d e traducción, verem os q u e p u ed e im plem entarse u na definición sim p le orien tad a a la sin taxis con só lo im prim ir las ca d en a s adicionales, en el orden en e l q ue aparezcan e n la definición. 2 .3 .4 R e c o r r id o s d e lo s á r b o le s U tilizarem os los recorridos d e los árboles para describir la ev alu ación d e los atrib u tos y esp e­ cificar la ejecución d e los fragm entos d e cód igo e n u n esq u em a d e trad ucción . U n recorrido d e un árbol em p ieza en la raíz y v is ita cada n odo d el árbol en cierto orden. 2.3 Traducción orientada a la sintaxis 57 U n recorrido d e l tip o p rim e ro en p ro fu n d id a d em p ieza en la raíz y v is ita en form a recursiva los h ijos d e c a d a n od o e n cualquier orden, no necesariam ente d e izquierda a derecha. S e llam a “prim ero en profundidad1' d eb ido a q ue v isita cu a n d o p u ed a a u n hijo d e u n nodo q ue n o haya sid o visitad o, d e m anera q ue v is ita a los nodos q u e esté n a cier ta d ista n c ia ( “profundidad”) de la raíz lo m ás rápido q ue pueda. E l procedim iento v isita r(N ) e n la figura 2.11 es u n recorrido prim ero en profundidad, e l cual v isita a los hijos d e u n nodo en e l orden d e izquierda a derecha, com o se m uestra en la figura 2.12. E n e s te recorrido hem os in clu id o la acción d e evaluar las trad uccion es e n c a d a nodo, ju sto an tes d e term inar con e l n od o (es decir, d esp u és d e q ue se hayan calcu lado las traducciones e n e l hijo). E n general, las acciones asociadas co n un recorrido p ueden ser cualquier c o sa que elijam os, o n in gu n a acción en sí. p r o c e d u r e v is ita r (nodo N ) { f o r ( ca d a h ijo (C d e N , d e izquierda a d erech a ) { v is ita r (C); } evaluar las reglas sem án ticas en e l nodo N; } F igu ra 2.11: U n recorrido tip o “prim ero en profundidad” d e un árbol F igu ra 2.12: E jem plo d e u n recorrido tip o “prim ero en profundidad” d e un árbol U n a definición orien tad a a la sin taxis no im pon e u n ord en específico p a ra la evaluación d e los atrib utos e n u n árbol d e análisis sin táctico; cualquier orden d e evaluación q ue calcule u n atrib u to a d esp u és d e tod os los d em á s atrib u tos d e los q ue a d ep en d a e s aceptable. Los atrib u tos sin tetiza d o s p ueden evaluarse d urante cualquier recorrido d e abajo-arriba; es decir, u n recorrido q u e evalúe los atrib u tos en un n o d o d esp u és d e haber evalu ad o lo s atrib u tos de su s hijos. E n general, ta n to con los atrib utos sin tetiza d o s com o co n los heredados, la cu estión acerca d e l orden d e evaluación e s b asta n te com pleja; vea la secció n 5.2. 2 .3 .5 E s q u e m a s d e tr a d u c c i ó n L a definición orien tad a a la sin ta x is en la figura 2.10 gen era u n a traducción uniendo cad en as com o atrib u tos para los nodos en el árbol d e análisis sin tá ctico . A hora considerarem os un mé­ to d o alternativo q u e no n ecesita m anipular cadenas; p roduce la m ism a traducción en form a increm ental, m ed ian te la ejecución d e fragm entos d el program a. 58 Capítulo 2. Un traductor sim ple orientado a la sintaxis R e c o r r id o s p r e o r d e n y p o s to r d e n Los recorridos e n preorden y p ostorden so n d os ca so s especiales d e recorridos tip o “pri­ m ero en profundidad” , en los cu ales se v isita n los hijos d e ca d a n o d o d e izquierda a derecha. A m enudo, recorrem os u n árbol para realizar cierta acción esp ecífica e n ca d a nodo. Si la acción se realiza cu an do v isita m o s a u n n o d o p or prim era vez, en to n ces p od em os referim os al recorrido com o u n recorrido en preorden . D e m anera sim ilar, si la acción se realiza ju sto antes d e dejar u n n odo por ú ltim a v ez , en ton ces d ecim os q ue es u n recorrido en p o sto rd en d el árbol. E l procedim iento m sita r{N ) en la figura 2.11 e s un ejem p lo d e un recorrido postorden. Los recorridos en preorden y p ostorden d efinen los ord en am ien tos corresp ond ien tes en los nodos, co n base en el m om ento en e l q ue s e v a a realizar u na acción en un nodo. El recorrido en preorden d e un (sub )árbol con raíz en el n o d o N co n siste e n N , seguid o por los recorridos preorden d e los su bárboles d e cad a uno d e su s hijos, si ex isten , em p ezand o d esd e la izquierda. E l recorrido en p o sto r d e n d e un (sub )árbol con raíz en N co n siste en los recorridos en p ostorden d e cad a uno d e los su bárboles d e los h ijo s d e N , s i ex isten , em p ezan d o d esd e la izquierda, segu id os d el m ism o N. U n esq u em a d e trad ucción orien tad o a la sin ta x is es u n a n otación para especificar u na traducción, u niend o los fragm en tos d e u n program a a las producciones en u na gram ática. Un esq u em a d e trad ucción es com o u n a definición orien tad a a la sin ta x is, só lo q u e e l orden d e evaluación d e las reglas sem án ticas se esp ecifica en form a ex p lícita . Los fragm entos d e u n program a in crustad os d en tro d e lo s cu erpos d e las producciones se llam an accion es sem á n tica s. L a p osición e n la q ue d eb e ejecu tarse u na acción se m uestra en ce­ rrada en tre llaves y se escrib e d en tro d e l cu erpo d e producción, com o en e l sig u ien te ejem plo: r e sto -► + te rm { p r in t(V )} re sto i V erem os esa s reglas a la hora d e considerar u n a form a a ltern a tiv a d e gra m á tica para las e x ­ presiones, en d o n d e el no term inal llam ad a re sto representa “to d o ex c ep to e l prim er térm in o d e u n a exp resión ”. E n la sección 2.4.5 hablarem os so b re e s ta form a d e gram ática. D e n uevo, el su bín d ice e n re sto i diferencia e s ta in stan cia del no term inal re sto en e l cu erpo d e la producción, d e la in stan cia d e r e sto e n el en cab ezad o d e la producción. A l dibujar un árbol d e an álisis sin tá ctico para un esq u em a d e trad ucción , para indicar u na acción le con stru im os un hijo ad icion al, con ectad o m ediante u n a línea p un teada al n o d o que corresponde a la c a b ez a d e la producción. Por ejem p lo, la p orción d e l árbol d e an álisis sin tác­ tico para la producción y acción anteriores se m uestra en la figura 2.13. E l n o d o para u n a ac­ ción sem á n tica n o tien e hijos, p o r lo que la acción se realiza la prim era vez q u e se ve el nodo. E j e m p lo 2 .1 2 : E l árbol d e an álisis sin táctico en la figura 2 .14 tiene instrucciones “print” en h ojas adicionales, las cu ales se adjuntan m ed ian te líneas p un teadas a los n od os interiores d el árbol d e an álisis sin táctico. E l esq u em a d e traducción aparece en la figura 2.15. L a gra m á tica su byacen te genera exp resion es q ue co n sisten en d íg ito s separados p or los sign os p o sitivo y ne- 2.3 Traducción orientada a la sintaxis 59 resto + tcrm {p r in t(V )} restoi F igu ra 2.13: Se con stru ye u n a h o ja adicional para u n a acción sem á n tica g a tiv o . Las accion es in crustad as en los cu erpos d e producción traducen d ich as exp resion es a la n otación postfija, siem p re y cu an do realicem os un recorrido d el tip o “prim ero e n profundidad” d e izquierda a d erech a d e l árb ol, y ejecu tem os ca d a in stru cción “p rin t” a m ed id a q u e v isitem o s su s hojas. expr . ' s . expr expr - term I / term / 9 + 5 {printC'-')} tcrm 2 {print('+/)} {printf7^ ) } \ {print(/5/)} \ {print (79 0 } F igu ra 2.14: A ccion es p a ra traducir 9 -5 + 2 a 9 5 -2 + expr —> cxpr± + te rm {p rin t (/+/) } exjjr expr -> exp ri - te r m te rm {p rin t ( '- ') } tcrm —► 0 term -> 1 ta in 9 {print('O')} {print ('l')} {p rin t('9 ')} F igu ra 2.15: A cciones para traducir a la notación p o stfija L a raíz d e la figura 2.14 representa la prim era producción e n la figura 2.15. E n un recorrido en p ostord en , prim ero realizam os to d a s las accion es en el su b á rb o l d e m ás a la izquierda d e la raíz, para el operando izquierdo, tam bién etiq u eta d o ex p r com o la raíz. D esp ués v isita m o s la h o ja + en la cu al no hay acción. D esp u és realizam os la s accion es en el subárbol p a ra e l operan­ d o derecho te rm y, p or ú ltim o, la acción sem á n tica {p rin t('+')} en el n o d o adicional. C om o las producciones para te rm só lo tien en un d ígito en el lado derecho, la s acciones para las producciones im prim en e se d ígito. N o es necesario n ingú n tip o d e sa lid a p a ra la producción e x p r -► te r m , y sólo se n ecesita im prim ir e l operador e n la acción para ca d a u n a d e las pri- 60 Capítulo 2. Un traductor sim ple orientado a la sintaxis m eras d os producciones. A l ejecu tarse d u ran te u n recorrido en p ostorden d el árbol d e análisis sin tá ctico, las accion es e n la figura 2.14 im prim en 9 5 -2 + . □ O bserve que, aunque los esquem as en las figuras 2.10 y 2.15 p rod ucen la m ism a traducción, la con stru yen en form a distinta; la figu ra 2.10 ad ju n ta ca d en a s com o atrib utos a los nodos en e l árbol d e an álisis sin tá ctico , m ientras q ue e l esq u em a en la figura 2 .15 im prim e la traducción en form a increm ental, a través d e accion es sem ánticas. Las accion es sem án ticas en el árbol de an álisis sin tá ctico en la figura 2.14 traducen la expre­ sión infija 9 -5 + 2 a 9 5 -2 + , im prim iendo ca d a carácter e n 9 -5 + 2 só lo u n a vez, sin u tilizar espacio d e alm acenam iento para la traducción d e las subexpresiones. C uando se crea la sa lid a en form a increm ental d e e s te m odo, el orden en e l que se im prim en los caracteres e s im portante. La im plem en tación d e un esq u em a d e trad ucción d eb e asegurar q ue las accion es sem án ticas se realicen en e l orden en el q ue aparecerían d urante un recorrido p ostorden d e un árbol d e análisis sin táctico. L a im plem en tación en realidad n o n ecesita construir un árbol d e análisis sin tá ctico (a m enudo n o lo hace), siem p re y cu a n d o asegure q u e las accion es sem án ticas se realizan com o si con stru yéram os un árbol d e an álisis sin tá ctico y desp ués ejecu táram os las accion es d urante un recorrido postorden. 2 .3 .6 E je rc ic io s p a r a la s e c c ió n 2 .3 E j e r c i c i o 2 . 3 .1 : C on stru ya un esq u em a d e traducción orien tad o a la sin ta x is, q u e traduzca exp resion es aritm éticas d e la n otación infija a la n otación prefija, en la cu a l un operador apare­ ce antes d e su s operandos; p or ejem p lo, - x y e s la n otación prefija para x - y. P rop orcion e los árboles d e an álisis sin tá ctico an otad os para las entradas 9 -5 + 2 y 9 -5 * 2 . E j e r c i c i o 2 . 3 .2 : C on stru ya un esq u em a d e trad ucción orien tad o a la sin taxis, q u e traduzca exp resion es aritm éticas d e la n otación p ostfija a la notación infija. P rop orcion e los árboles de análisis sin tá ctico an otad os para las en trad as 9 5 - 2 * y 9 5 2 * -. E j e r c i c i o 2 . 3 .3 : C on stru ya un esq u em a d e trad ucción orien tad o a la sin taxis, q u e traduzca en teros a núm eros rom anos. E j e r c i c i o 2 . 3 .4 : C on stru ya un esq u em a d e traducción orien tad o a la sin taxis, q u e traduzca núm eros rom anos a enteros. E j e r c i c i o 2 . 3 .5 : C on stru ya un esq u em a d e traducción orien tad o a la sin taxis, q u e traduzca exp resion es aritm éticas p ostfijo a su s exp resion es aritm éticas infijas equivalentes. 2.4 A n álisis s in tá c tic o El an álisis sin tá ctico (parsing) e s el proceso d e d eterm inar cóm o p uede generarse u n a ca d en a d e term in ales m ed ian te u n a gram ática. A l hablar so b re e s te problem a, es m ás ú til pensar en q ue se v a a construir un árbol d e an álisis sin táctico , aun cu a n d o un com pilador ta l v e z no lo co n stru ya en la práctica. N o ob sta n te, un analizador sin tá ctico d eb e ser ca p az d e construir el árbol en prin cip io, o d e lo contrario n o se p uede garantizar q ue la trad ucción s e a correcta. 2.4 A nálisis sin táctico 61 E s ta sección in trodu ce un m éto d o d e an álisis sin tá ctico co n o cid o com o “d escen so rectu­ siv o ” , e l cu a l p uede usarse ta n to para e l an álisis sin tá ctico , com o p a ra la im p lem en tación de trad u ctores orien tad os a la sin taxis. E n la sig u ien te secció n aparece u n program a co m p leto en Java, q ue im p lem en ta e l esq u em a de trad u cción de la figura 2.15. U n a a ltern a tiv a v ia b le es usar una herram ien ta d e softw are para generar u n trad uctor d irecta m en te d e u n esq u em a de trad ucción . L a sección 4 .9 d escrib e d ich a herram ienta: Yacc; p uede im plem en tar el esq u em a d e trad ucción d e la figu ra 2.15 sin n ecesid ad d e m odificarlo. P ara cualquier gram ática libre d e co n tex to , hay u n analizador sin tá ctico q u e s e tarda, com o m áxim o, u n tiem p o 0 ( n 3) en analizar u n a ca d en a d e n term in ales. Pero, por lo general, el tiem p o cú b ico e s d em asiad o costoso. Por fortuna, para los lengu ajes d e p rogram ación reales p o ­ d em o s d iseñ ar u n a gram ática q ue p u ed a analizarse co n rapidez. Los algoritm os d e tiem p o lineal b a stan para analizar en esen cia to d o s los lenguajes q u e surgen e n la práctica. Los analizadores sin tá ctico s d e los lengu ajes d e program ación ca si siem p re realizan u n esca n eo d e izquierda a derech a sobre la en trad a, buscando por ad elan tad o un term inal a la vez, y con stru yen do las p iezas d e l árbol de an álisis sin tá ctico a m ed ida q ue avanzan. L a m ayoría d e los m étod os d e an álisis sin tá ctico se adaptan a u n a d e d o s clases, llam adas m éto d o s d escen den te y ascen den te. E sto s térm inos se refieren a l orden e n el q u e se construyen los n od os e n el árbol d e an álisis sin táctico . E n los analizadores tip o descen dente, la cons­ trucción em p ieza en la raíz y p rocede h acia las hojas, m ientras q ue e n los analizadores tipo ascen dente, la construcción em p ieza en las h ojas y p rocede hacia la raíz. L a popularidad de los analizadores tip o arriba-abajo s e d eb e a q ue pueden construirse analizadores eficien tes con m ás facilidad a m ano, m ediante m éto d o s d escen d en tes. N o ob sta n te, el análisis sin tá ctico tipo ascen dente p u ed e m anejar u na clase m ás e x te n sa d e gram áticas y esquem as d e traducción, por lo q u e las herram ientas d e softw are para generar analizadores sin tá ctico s d irecta m en te a partir d e las gram áticas u tilizan co n frecu en cia é s te m étodo. 2 .4 .1 A n á lis is s in tá c tic o tip o a r r ib a - a b a j o P ara introducir e l an álisis sin tá ctico tip o arriba-abajo, considerem os u n a gram ática q u e se a d a p ta bien a e s ta clase d e m étodos. M ás ad elan te e n e s ta sección, considerarem os la cons­ trucción d e los analizadores sin tá ctico s d escen dentes e n general. L a gra m á tica en la figura 2.16 gen era un su b con jim to d e las instrucciones d e C o Java. U tilizam os los term in ales en n egrita i f y f o r para las palabras clave “i f ” y “f o r ” , resp ectivam en te, p a ra enfatizar q ue e sta s secuen­ cia s d e caracteres se tratan co m o unidades, es decir, com o sím b olos term in ales individuales. A dem ás, e l term inal e x p r represen ta expresiones; u na gra m á tica m ás co m p leta u tilizaría un n o term inal ex p r y ten d ría producciones p a ra e l no term inal expr. D e m anera sim ilar, o t r a s es u n term inal q u e represen ta a otras con stru cciones d e instrucciones. L a con stru cción d escen d en te d e un árbol d e an álisis sin tá ctico com o e l d e la figura 2.17 se realiza em p ezan d o co n la raíz, etiq u eta d a c o n e l no term inal in icial in s tr , y realizando en form a rep etid a los sigu ien tes d os pasos: 1. E n e l n od o N , etiq u eta d o co n el no term inal A , se seleccio n a u n a d e las producciones para A y se con stru yen hijos en N para los sím b olos en e l cu erpo d e la producción. 2. Se en cu en tra e l sigu ien te n od o en el q ue se v a a construir un su bárbol, p or lo gen eral, el no term inal no exp an did o d e m ás a la izquierda d e l árbol. 62 Capítulo 2. in s tr -► | Un traductor sim ple orientado a la sintaxis exp r ; i f ( e x p r ) in s tr f o r ( expropc ; expropc ; e x p r o p c ) in s tr o tra s expropc -* e expr F igu ra 2.16: U n a gram ática para algu nas in stru cciones en C y Java e exp r exp r o tra s F igu ra 2.17: U n árbol d e análisis sin táctico, d e acuerdo co n la gra m á tica en la figura 2.16 P ara algu nas gram áticas, los pasos anteriores pueden im plem entarse d urante un so lo esca ­ neo d e izquierda a d erech a d e la ca d en a d e entrada. E l term in al actu al esca n eo en la en trad a se co n o ce con frecuencia com o el sím b olo d e prea n á lisis. E n un principio, el sím b olo preanálisis es e l prim er (es d ecir, el d e m ás a la izquierda) term inal d e la ca d en a d e en trad a. L a figura 2.18 ilu stra la con stru cción d e l árbol d e an álisis sin tá ctico en la figura 2 .17 para la siguiente ca d en a d e entrada: fo r ( ; e x p r ; e x p r ) o tr a s En u n principio, el term inal f o r es e l sím b olo d e preanálisis, y la p arte co n o cid a d e l árbol d e análisis sin tá ctico co n siste en la raíz, etiq u eta d a co n e l n o term inal inicial in s tr en la figura 2.1 8 (a). E l o b je tiv o es con stru ir el resto d el árbol d e análisis sin tá ctico d e ta l form a q ue la ca d en a gen erad a por e l árbol d e an álisis sin tá ctico coin cid a con la ca d en a d e entrada. P ara q ue ocu rra u n a coincidencia, e l n o term inal in s tr en la figura 2 .1 8 (a) d eb e derivar una ca d en a q ue em p iece co n el sím b olo de preanálisis f o r . E n la g ra m á tica d e la figura 2.16, sólo hay u na producción para in s tr q ue p u ed e derivar dicha cadena, por lo q u e la seleccion am os y con stru im os los hijos d e la raíz, etiq u etad os co n los sím b olos en el cu erpo d e la producción. E s ta exp an sión del árbol d e an álisis sin táctico se m uestra en la figura 2 .1 8 (b ). C ada u n a d e las tres in stantáneas en la figura 2.18 tien e flechas q ue m arcan el sím b olo d e preanálisis en la en trad a y el n od o en el árbol d e análisis sin tá ctico q ue se e s tá considerando. U n a v ez q ue se con stru yen los hijos en un nodo, a con tinu ación con sid eram os e l hijo d e m ás a la izquierda. E n la figura 2 .1 8 (b ), los hijos acab an d e con stru irse e n la raíz, y s e e s tá considerando e l hijo d e m ás a la izquierda, etiq u eta d o con fo r . C uando e l nodo q ue s e e s tá con sid erand o en e l árbol d e an álisis sin tá ctico es para u n ter­ m inal, y é s te coin cid e co n el sím b olo d e p reanálisis, en ton ces avan zam os ta n to en el árbol d e análisis sin tá ctico com o en la entrada. E l sigu ien te term in al en la en trad a se con vierte e n el 2.4 A nálisis sintáctico , , (a) 63 ÁRBOL DE in str ANÁLISIS | SINTÁCTICO ------------------------------------------------------------------------------------------------ENTRADA fo r ( ; ÁRBOL DE exp r ; exp r ) o tr a s ; exp r ) o tr a s instr (b) ENTRADA ÁRBOL DE for i ( ; exp r instr F igu ra 2.18: A nálisis sin táctico tip o d escen d en te m ientras s e ex p lo ra la e n tra d a d e izquierda a derecha nuevo sím b olo d e preanálisis, y s e con sid era e l sig u ien te hijo e n e l árbol d e an álisis sin táctico. E n la figura 2 .1 8 (c ), la flech a e n e l árbol d e análisis sin tá ctico h a avanzado al sigu ien te hijo d e la raíz y la flech a en la en trad a h a avanzado al sig u ien te term inal, q ue es ( . U n avance m ás llevará la flech a en el árbol d e análisis sin tá ctico al h ijo etiq u eta d o co n el n o term in al expropc, y llevará la flecha en la en trad a al term inal ;. E n e l nodo n o term inal etiq u eta d o com o expropc, repetim os e l p roceso d e seleccionar una producción para u n no term inal. Las producciones co n e com o el cu erpo ( “producciones e”) requieren un tratam ien to especial. Por e l m om ento, las u tilizarem os co m o u n a o p ció n predeter­ m in ad a cu an do no puedan usarse otras producciones; regresarem os a ella s en la sección 2.4.3. C on el n o term inal expropc y e l sím b olo d e preanálisis;, s e u tiliz a la producción 6, y a q u e ; no coin cid e con la o tr a ú n ica producción para expropc, q u e tien e la term inal e x p r com o cuerpo. E n general, la selección de u n a producción para u n no term inal p u ed e requerir d e l proceso d e p ru eb a y error; es d ecir, tal vez ten gam os q ue probar u na producción y retroceder para probar otra, si la prim era no es adecuada. U n a producción es in adecu ada si, desp ués d e usarla, 64 Capítulo 2. Un traductor sim ple orientado a la sintaxis no p od em os com p letar el árbol para q ue coin cid a c o n la ca d en a d e entrada. S in em bargo, no es necesario retroceder en un caso esp ecia l im p ortan te con ocid o com o análisis sin tá ctico predictivo, el cu a l verem os a con tinu ación. 2 .4 .2 A n á lis is s in tá c tic o p r e d ic tiv o El a n álisis sin tá c tic o d e descen so re cu rsiv o es un m éto d o d e análisis sin tá ctico d escen dente, en e l cu a l se u tiliza u n con ju n to d e procedim ientos recursivos para procesar la entrada. U n pro­ ced im ien to se asocia co n ca d a no term in al d e u na gram ática. A q u í considerarem os u na form a sim p le d e análisis sin tá ctico d e d escen so recursivo, con ocid o com o an álisis sin tá c tic o p re d ic tiv o , en e l cu a l e l sím b olo d e preanálisis d eterm in a sin am bigüedad e l flujo d e con trol a través d el cu erpo d e l p rocedim ien to para ca d a n o term in al. L a secu en cia d e llam adas a procedim ientos d urante el an álisis d e u na en trad a d efin e e n form a im p lícita u n árbol d e análisis sin tá ctico para la en trad a, y p uede usarse para crear un árbol d e an álisis sin tá ctico ex p líc ito , si se d esea. El analizador sin tá ctico predictivo en la figura 2.19 co n siste en procedim ientos p a ra las no term in ales i n s tr y expropc d e la gram ática en la figura 2.16, ju n to co n un procedim iento adicional llam ad o coin cid ir, el cu a l s e u tiliza para sim plificar e l có d ig o p a ra in s tr y expropc. El p rocedim ien to c o in c id ir(t) com para su argum ento t co n el sím b olo d e preanálisis y avan za al sig u ien te term inal d e en trad a s i coinciden. P or en d e, c o in c id ir ca m b ia el valor d e la variable p rea n á lisis, u na variable glo b a l q ue con tien e e l term inal d e en trad a q ue s e acab a d e explorar. El an álisis sin táctico em p ieza con una llam ad a d el procedim iento para e l n o term in al inicial, in str. C on la m ism a en trad a q ue en la figura 2.18 preanálisis es e n un principio el prim er fo r term inal. E l p rocedim ien to in s tr eje cu ta el cód ig o corresp ond ien te a la sig u ien te producción: in s tr f o r ( expropc ; expropc ; expropc ) in s tr En el cód ig o para e l cu erpo d e la producción (es decir, el ca so f o r d el p rocedim ien to in str), ca d a term inal s e relaciona con e l sím b olo d e preanáilisis, y ca d a no term inal con d u ce a u na llam ad a d e su procedim iento, en la sigu ien te secu en cia d e llam adas: co in c id ir (fo r ); c o in c id ir ('('); expropc(); c o in c id ir ^ ;r)\ expro p c(); c o in c id ir ('j 7); exp ro p c(); c o in c id ir(O'); in s tr ()\ El an álisis sin tá ctico predictivo se b asa e n inform ación acerca d e los prim eros sím b olos q ue pueden generarse m ediante e l cu erpo d e u na producción. D icho en form a m ás precisa, vam os a su p on er q u e a es u na cad en a d e sím b olos d e la gra m á tica (term in ales y no term in ales). D e­ finim os PRJMERO(a) com o e l con ju n to d e term in ales q ue aparecen com o los prim eros sím bolos d e u na o m ás cad en as d e term inales generadas a partir d e a . S i a e s e o p uede generar a e, en ton ces a tam b ién e s tá en PRIMERO ( a ). Los d etalles d e cóm o se ca lcu la PRIMERO ( a ) se en cu en tran en la sección 4 .4 .2 . A q u í vam os a usar el razonam iento “ad h oc” para d ed ucir los sím b olos en PRIMERO (a ); por lo general, a em p ieza co n un term inal, q u e p or en d e e s e l único sím b olo en PRíM ERO(a), o em p ieza c o n un no term in al cu yos cu erp os d e producciones em p iezan co n term in ales, en cu y o ca so esto s term i­ nales so n los ú nicos m iem bros d e PRIMERO(a). Por ejem p lo, co n resp ecto a la gram ática d e la figura 2.16, lo s sig u ien tes son cá lcu lo s co ­ rrectos d e PRIMERO. 2.4 A nálisis sin táctico 65 void in s tr Q { sw itch ( p re a n o lisis ) { ca se e x p r : co in c id ir ( e x p r ) ; co in c id ir break; ca se if: co in c id ir ( if ) ; co in c id ir ('('); co in c id ir ( e x p r ) ; co in c id ir (0 '); m s ír (); break; ca se f o r ; c o in c id ir ( f o r ) ; c o in c id ir('(r); e x p ro p cQ ; c o in c id ir(';'); erpropc(); c o in c id ir(';'); erpropcQ; c o in c id ir(')'); tns¿r(); break; ca se o t r a s ; co in c id ir ( o t r a s ) ; break; default: r e p o r ta r (" e r r o r d e s i n t a x i s " ) ; } } v oid expropcQ { if ( p re a n á lisis = = e x p r ) co in c id ir ( e x p r ) ; } v oid c o in c id ir( term inal ¿) { if ( p rea n á lisis = = ¿ ) p re a n o lisis = siguienteT erm inal; else r e p o r ta r (" e r r o r d e s i n t a x i s " ) ; } F igu ra 2.19: S eu docódigo para un analizador sin tá ctico predictivo P R IM E R O (in str) P R IM E R O (e x p r ; ) = = { e x p r , if , f o r , o t r a s } { e x p r} Los PRIMEROS con jun tos d eb en con sid erarse si hay d o s prod uccion es A a y A ¡3. S i ignoram os las producciones e p o r el m om ento, e l an álisis sin tá ctico p red ictivo requiere que PRIMERO(a) y PRIMERO((3) esté n separados. A sí, p uede usarse e l sím b olo d e preanálisis para d ecidir qué producción utilizar; si e l sím b olo d e preanálisis e s tá en PRIMERO(a), se u tiliza a . E n caso con trario, s i e l sím b olo de preanálisis e s tá en PRIMERO( 0 ),se u tiliza ¡3. 2 .4 .3 C u á n d o u s a r la s p r o d u c c io n e s e N u estro analizador sin táctico predictivo u tiliza u na p rod ucción e com o valor predeterm inado si n o s e p u ed e u tilizar otra producción. C on la en tra d a d e la figura 2.18, d esp u és d e relacionar los term in ales f o r y ( , el sím b olo de preanálisis es ; . E n e s te p u n to s e hace u na llam ad a a expropc, y s e eje cu ta e l cód igo 66 Capítulo 2. Un traductor sim ple orientado a la sintaxis if ( prea n á h sis = = e x p r ) co in cid ir ( e x p r ) ; en s u cuerpo. E l no term inal expropc tien e d os prod uccion es, con los cu erpos e x p r y e. El sím b olo d e preanálisis “;” no coin cid e con e l term inal e x p r , por lo q ue no se p uede aplicar la producción co n e l cu erpo e x p r . D e hecho, el p rocedim ien to regresa sin cam biar el sím b olo d e preanálisis o hacer cualquier o tr a cosa. H acer n ad a corresp ond e a aplicar u na producción e. En form a m ás general, considere u na variante d e las producciones en la figura 2.16, en don ­ d e expropc gen era un no term inal d e u na expresión en v ez d el term in al e x p r : expropc —y ex p r e Por en d e, expropc gen era u na expresión usando e l no term inal ex p r o g en era e. M ientras se a n aliza expropc, si el sím b olo de preanáhsis no se en cu en tra en PRJMERO(expr), en ton ces se u tiliza la producción e. P ara ob ten er m ás inform ación sobre cu án do usar las producciones e, vea la exp licación d e las gram áticas L L (1) en la sección 4.4 .3 . 2 .4 .4 D is e ñ o d e u n a n a liz a d o r s in tá c tic o p r e d ic tiv o P od em os generalizar la téc n ic a in trod u cid a d e m anera inform al en la secció n 2 .4 .2 para apli­ ca rla a cualquier g ra m á tica q ue ten g a un con ju n to PRIMERO separado para los cu erpos d e las producciones q ue p ertenezcan a cualquier no term inal. T am bién verem os q u e a l ten er un es­ q u em a d e traducción (es decir, u n a gram ática con acciones em b eb id as) es p osible ejecu ta r esas accion es com o parte d e los p rocedim ien tos d iseñ ados p a ra e l analizador sin táctico. R ecuerde q ue un an alizador sin tá c tic o p re d ic tiv o e s un program a q u e co n siste e n un proce­ d im ien to para ca d a n o term inal. E l procedim iento para el no term inal A realiza d os cosas: 1. D ecide q ué producción A d eb e utilizar, ex a m in a n d o e l sím b olo d e preanáhsis. L a pro­ ducción co n el cu erpo a (en donde a no es e, la ca d en a vacía) se u tiliz a si e l sím b olo d e preanálisis e s tá en PRIMERO(a). Si hay un co n flicto en tre d o s cu erpos n o vacíos p or cualquier sím b olo d e p reanálisis, en ton ces no p od em os usar e s te m éto d o d e análisis sin tá ctico en e s ta gram ática. A d em ás, la producción e p a ra A , si ex iste , se u tiliza si el sím b olo d e preanáhsis no se en cu en tra en el con ju n to PRIMERO para cualquier o tro cuer­ p o d e producción para A . 2. D esp ués, e l procedim iento im ita e l cu erpo d e la producción elegid a. E s decir, lo s sím ­ bolos d e l cu erpo se “ejecu ta n ” en turno, em p ezan d o d esd e la izquierda. U n n o term inal se “ejecu ta” m ediante u na llam ada al p rocedim ien to para e se n o term inal, y un term i­ nal q u e coin cid e con e l sím b olo d e preanálisis s e “eje cu ta ” leyendo el sig u ien te sím b olo d e entrada. Si en cualquier p u n to e l term in al e n el cu erpo n o coin cid e co n e l sím b olo d e p reanálisis, se rep orta un error d e sin taxis. La figura 2.19 es el resultado d e aplicar esta s reglas a la gra m á tica d e figura 2.16. 2.4 A nálisis sin táctico 67 A s í com o un esq u em a d e traducción se form a ex ten d ien d o u na g ra m á tica , un traductor orien tad o a la sin ta x is p uede form arse m ed ian te la ex ten sió n d e u n analizador sin tá ctico pred ictiv o . E n la sección 5.4 se proporciona un algoritm o p a ra este fin. L a sig u ien te construcción lim ita d a es su ficien te por ahora: 1. Se con stru ye un analizador sin tá ctico predictivo, ignorando las accion es en las produc­ ciones. 2. Se cop ian las accion es d el esq u em a d e traducción al analizador sin tá ctico . Si u na acción aparece desp ués d e l sím b olo d e la g ra m á tica X en la p rod ucción p, en ton ces se cop ia desp ués d e la im plem en tación d e X e n e l có d ig o p a ra p . E n ca so con trario, si aparece al principio d e la producción, en to n ces se co p ia ju sto an tes d e l có d ig o para e l cu erpo d e la producción. E n la sección 2 .5 con stru irem os un traductor d e e s te tipo. 2 .4 .5 R e c u rs iv id a d a la iz q u ie rd a E s p osible que u n analizador sin tá ctico d e d escen so recursivo entre en un ciclo in finito. Se pro­ d u ce un problem a co n las prod uccion es “recursivas p or la izquierda” com o ex p r -> e x p r + te rm e n d ond e el sím b olo m ás a la izquierda del cu erpo es e l m ism o q ue el n o term in al en e l en cab e­ zado d e la producción. S u p on ga que el procedim iento para e x p r d ecid e aplicar e s ta producción. E l cu erpo em p ieza con expr, d e m anera q ue e l p rocedim ien to para e x p r se llam a en form a re­ cursiva. C om o e l sím b olo d e preanálisis cam b ia só lo cu a n d o coin cid e u n term inal en el cuerpo, n o s e realizan cam b ios en la en trad a en tre la s llam adas recursivas d e expr. C om o resu ltad o, la seg u n d a llam ad a a expr hace exa cta m en te lo q ue h izo la prim era llam ada, lo cu a l sig n ifica que s e realiza u n a tercera llam ad a a e x p r y así su cesivam en te, por siem pre. S e p u ed e elim inar u na producción re cursiva por la izquierda, reescribiendo la producción prob lem ática. C onsidere un term inal A co n d o s producciones: A -► Aa | 0 e n d on d e a y 0 so n secu en cias d e term in ales y n o term in ales q ue no em p iezan co n A . Por ejem p lo, en ex p r -*• ex p r + te r m \ term d e l n o term inal A — ex p r, la cad en a a = + te r m , y la c a d en a 0 = term . S e d ice q ue el no term inal A y su p rod ucción so n recu rsivas p o r la izq u ie rd a , y a q u e la producción A A ol tien e a la m ism a A com o e l sím b olo d e m ás a la izquierda e n e l lado d e ­ recho .4 L a aplicación rep etid a d e e s ta producción g en era u n a secu en cia d e a ’s a la d erech a de A , co m o en la figura 2 .2 0 (a). C uando p or fin A s e su stitu y e p o r 0 , ten em os u n a 0 se g u id a por u n a secu en cia de cero o m ás a ’s. 4En una g ram ática recursiva a la izquierda general, en vez d e la producción A-+ A a , el no term inal A puede derivar en A a a través d e producciones interm edias. 68 Capítulo 2. Un traductor sim ple orientado a la sintaxis A A (a) A -4 & R a ... a a F igu ra 2.20: Form as recursivas por la izquierda y p or la d erech a para generar u na cad en a P od em os lograr el m ism o efecto q ue en la figura 2 .2 0 (b ) si reescribim os las producciones para A d e la sigu ien te m anera, usando un nuevo no term inal R: A R —> ¡3R (xR | e El n o term inal R y su producción R -+ a R so n recu rsivos p o r la derecha, y a q ue e s ta pro­ d ucción para R tien e a l m ism o R com o e l ú ltim o sím b olo d e l lado derecho. L as producciones recursivas por la d erech a con d ucen a árboles q ue crecen h acia abajo y a la derecha, co m o en la figura 2.20(b ). L os árboles q ue crecen h acia ab ajo y a la d erech a d ificu lta n m ás la traducción d e exp resion es q ue con tien en operadores asociativos p or la izquierda, com o e l sig n o m enos resta. N o o b sta n te, en la sección 2.5.2 verem os q ue de to d a s form as p u ed e ob ten erse la traducción apropiada d e exp resion es a la notación p ostfijo m ed ian te u n d iseñ o cu id adoso d el esq u em a d e traducción. En la sección 4.3.3 considerarem os form as m ás generales d e recursividad p or la izquierda, y m ostrarem os cóm o p uede elim inarse to d a la recursividad p or la izquierda d e u n a gram ática. 2 .4 .6 E je rc ic io s p a r a la s e c c ió n 2 .4 E j e r c ic io 2 .4 .1 : C onstruya analizadores sin tá ctico s d e d escen so recursivo, em p ezan d o con las sig u ien tes gram áticas: a) 5 -¥ b) 5 c) 5 2.5 +55 | -5 5 5 ( 5 ) 5 -> | a | 6 05 1 | 0 1 U n t r a d u c to r p a r a las e x p re s io n e s sim p le s A hora vam os a construir un traductor orientado a la sin ta x is usando las técn ica s d e la s últim as tres seccio n es, en form a d e un program a funcional en Java, q ue traduce exp resion es aritm éticas a la form a p ostfija. P ara m antener e l program a inicial lo b astan te p eq u eñ o com o p a ra poder 2.5 Un traductor para la s expresiones sim ples 69 ad m inistrarlo, em p ezarem os co n ex p resion es q ue co n siste n en d íg ito s sep a ra d o s por lo s sign os b inarios d e sim ia y resta. E n la sección 2 .6 ex ten d erem o s el p rogram a para trad ucir expre­ sio n es q u e incluyan núm eros y o tro s operadores. E s co n v en ien te estu d iar la trad ucción de ex p resion es con d eta lle , y a q u e aparecen com o un co n stru cto r en m uchos lengu ajes. A m enudo, u n esq u em a d e trad ucción orien ta d o a la sin ta x is sirv e com o la especificación p ara u n traductor. E l esq u em a en la figu ra 2.21 (rep etid o d e la figu ra 2.15) d efin e la trad uc­ ción q ue se v a a realizar aquí. ex p r - ¥ | | ex p r + te r m ex p r - te r m te r m { p rin t('+ ') } { p r in t('-') } te rm -> | 0 1 { print('O') } { p r in t('l') } | 9 { p rin t('9') } F igu ra 2.21: A ccion es para traducir a la n otación postfija A m enudo, la gram ática su byacen te d e u n esq u em a dado tiene q ue m odificarse antes d e p o ­ der analizarlo co n un analizador sin tá ctico predictivo. E n especial, la gra m á tica su b yacen te del esq u em a d e la figu ra 2.21 e s recursiva por la izquierda, y com o v im o s e n la ú ltim a sección, un analizador sin tá ctico predictivo n o p uede m anejar u na g ra m á tica recursiva por la izquierda. Parece q ue ten em os un conflicto: por u n a parte, n ecesitam os u na gra m á tica q ue facilite la traducción, p or o tr a p arte n ecesitam os u n a gra m á tica con sid erablem en te d istin ta q ue facilite e l análisis sin táctico. L a solu ción es em p ezar con la g ra m á tica para facilitar la trad ucción y transform arla con cu id ad o p ara facilitar el an álisis sin tá ctico . A l elim inar la recursividad por la izquierda en la figura 2 . 2 1 , p od em os ob ten er u n a g ra m á tica ad ecu ad a para u sarla en un trad uctor predictivo d e d escen so recursivo. 2 .5 .1 S in ta x is a b s tr a c ta y c o n c r e ta U n p u n to inicial ú til para diseñar un trad u ctor es u na estru ctu ra d e d a to s llam ad a árbol sin ­ tá ctico abstracto. E n u n árbol sin tá ctico ab stracto para u n a exp resión , ca d a n o d o interior re­ p resen ta a un operador; los hijos d e l nodo representan a los op eran d os d e l operador. D e m anera m ás general, cualquier con stru cción d e program ación p uede m anejarse al form ar u n operador para la con stru cción y tratar com o op eran d os a los com p o n en tes con sign ificad o sem á n tico de e s a con stru cción. E n el árbol sin tá ctico ab stracto para 9 -5 + 2 en la figura 2 .2 2 , la raíz represen ta al operador +. Los su bárboles d e la raíz representan a las subexpresiones 9 - 5 y 2. E l agrupam iento d e 9 - 5 com o un operando refleja la evaluación de izquierda a derecha d e los operadores en el m ism o ni­ vel d e precedencia. C om o - y + tienen la m ism a precedencia, 9 -5 + 2 es eq u ivalen te a ( 9 - 5 ) + 2 . Los árboles sin tá ctico s abstractos, con ocidos sim p lem en te com o árboles sin tá c tic o s, s e pa­ recen e n cierto grado a los árboles d e an álisis sin tá ctico . N o o b stan te, e n e l árbol sin tá ctico los n od os interiores representan con stru ccion es d e program ación m ientras q u e, en e l árbol de 70 Capítulo 2. Un traductor sim ple orientado a la sintaxis + 9 5 F igu ra 2.22: Á rb ol sin tá ctico para 9 -5 + 2 análisis sin táctico, los n od os interiores representan no term in ales. M uchos n o term inales d e una gra m ática representan con stru cciones d e program ación, p ero o tro s so n “ayu dan tes” d e un tip o d istin to, com o los q ue representan térm in os, factores o d em á s variaciones d e exp resion es. En e l árbol sin táctico, e sto s ayu dan tes, por lo general, no so n necesarios y por ende se descartan. P ara enfatizar el con traste, a un árbol d e an álisis sin tá ctico se le co n o ce algunas v eces com o árbol sin tá c tic o co n creto , y a la gram ática su byacen te se le llam a sin ta x is co m p leta p a ra el lenguaje. En e l árbol sin tá ctico d e la figura 2.22, ca d a nodo interior s e a so cia co n un op erad or, sin n od os “ayu d an tes” para produ ccion es in d iv id u a le s (u n a p rod ucción cu y o cu erp o co n siste en un no term in al in dividu al, y n ad a m ás) com o e x p r -► te rm o para p roducciones e com o resto €. Es con ven iente q ue u n esq u em a d e traducción s e base e n u n a g ra m á tica cu yos árboles de análisis sin tá ctico esté n lo m ás cerca d e los árboles sin tá ctico s q ue s e a p osible. E l agrupam iento d e su bexpresiones m ed ian te la gram ática en la figura 2.21 es sim ilar a su agrupam iento en los árboles sin tá ctico s. Por ejem plo, las su bexpresiones para e l operador d e srnna se proporcionan m ediante ex p r y te r m e n e l cu erpo d e la producción e x p r + term . 2 .5 .2 A d a p ta c ió n d e l e s q u e m a d e t r a d u c c ió n La técn ica d e elim in ación d e recursividad p or la izquierda tra za d a en la figura 2 .20 tam bién se p uede aplicar a las p roducciones q ue con ten gan acciones sem án ticas. E n prim er lugar, la técn ica se ex tien d e a varias producciones para A . E n n uestro ejem plo, A es e x p r y hay d o s pro­ d uccion es recursivas a la izquierda para ex p r, y u n a q ue no e s recursiva. L a técn ica transform a las producciones A A a \ A ¡5 | 7 e n lo siguiente: .4 R —> —> yR O-R | 0 R | e En segu n d o lugar, d eb em os transform ar producciones q ue hayan in crustad o acciones, no sólo term in ales y no term inales. Las accion es sem án ticas in crustad as en la s p roducciones sim ­ plem ente se tran sp ortan e n la transform ación, com o s i fueran term inales. E j e m p lo 2 .1 3 : C onsidere el esq u em a d e traducción d e la figura 2 .2 1 . S u p on ga que: .4 = expr q 0 = = + term { pi'int('+/ ) } - term { p r in t('- ') } 7 = te rm 2.5 Un traductor para la s expresiones sim ples 71 E n ton ces, la transform ación con elim in ación d e recursividad p or la izquierda produce el esque­ m a d e trad ucción d e la figura 2.23. L as p roducciones ex p r en la figura 2.21 se han transform ado e n las producciones para expr, y u n nuevo no term inal re sto d esem p eñ a e l p ap el d e R . Las producciones para te r m s e repiten d e la figura 2.21. L a figura 2.24 m uestra cóm o se traduce 9 -5 + 2 , m ediante la g ra m á tica d e la figura 2.23. □ exj)r —> te rm r e s to re sto —> + te r m { print('+') } resto - te r m { p r in t('-') } resto I te rm e -¥ 0 { print('0') } | 1 { print('l') } | 9 { print('9 ') } F igu ra 2.23: E squ em a d e trad ucción , d esp u és elim inar la recursividad por la izquierda expr term 9 {prm t('9')} re sto - / / ^ tcn n / 5 {prm t('—') } \ {print^'S')} rest / ! + term / 2 {pririt(/+/)} rest \ {print(' 2')} F igu ra 2.24: T raducción d e 9 -5 + 2 a 9 5 -2 + L a elim in ación d e la recursividad p or la izquierda d eb e realizarse co n cu id ado, para asegu­ rar q ue se preserve el ord en d e las acciones sem án ticas. Por ejem p lo , e l esq u em a transform ado e n la figura 2.23 tien e las accion es { print('+') } y { p rin t('-') } en m edio d el cu erpo d e una producción, en ca d a caso entre los no term in ales te r m y resto . Si las accion es se desplazaran a l final, d esp u és d e r e sto , en to n ces las trad uccion es serían incorrectas. D ejam os co m o ejercicio a l lector dem ostrar q ue 9 -5 + 2 se traduciría en ton ces en form a in correcta a 9 5 2 + -, la notación p o stfija para 9 - ( 5 + 2 ) , en vez d el térm in o 9 5 -2 + d eseado, la n otación p o stfija para ( 9 -5 ) + 2 . 72 2 .5 .3 Capítulo 2. Un traductor sim ple orientado a la sintaxis P r o c e d im ie n to s p a r a lo s n o t e r m in a le s Las funciones expr, r e sto y ¿erra en la figura 2.25 im plem entan e l esq u em a d e traducción orien­ ta d a a la sin ta x is d e la figura 2.23. E stas funciones im itan lo s cu erpos d e la s producciones d e los n o term inales correspondientes. L a función ex p r im p lem en ta la p rod ucción ex p r -► te rm re sto , m ediante la llam ad a a term Q seguid a d e restoQ . v o id exp r () { term Q ] re sto Q ; } v o i d re sto {) { i f ( prea n á h sis —— V ) { coincidili?+0; term Q ] print^+O; re sto Q ; } e l s e i f ( p re a n á lisis —— ) { coin cidir('-'); te rm Q ; p r in t('-/) ; re sto Q ; } e ls e { } /* n o hace n ad a con la e n tra d a * / ; } v o id te rm () { i f ( prea n á lisis es u n d íg ito ) { t = pre a n á lisis; coin cidir(prean álisis)\ print(í); } e l s e reportar^ “error d e sin ta x is”); } F igu ra 2.25: S eu docódigo para los no term in ales expr, re sto y te rm La función re sto im p lem en ta las tres producciones para e l no term inal resto en la figura 2.23. A p lica la prim era p rod ucción si e l sím b olo d e preanálisis es un sign o p o sitiv o , la segu n d a producción si e l sím b olo d e preanálisis es n egativo, y la producción re sto -► e e n to d o s los d em ás casos. Las prim eras d os producciones para re sto s e im plem en tan m ed ian te la s prim eras d os bifurcaciones d e la in stru cción i f e n el procedim iento resto . S i e l sím b olo d e p rean álisis es +, e l sig n o p o sitiv o se relaciona m ed ian te la llam ad a co in cid ir^ +')• D esp u és d e la llam ad a te r m Q , la acción sem á n tica se im p lem en ta escribiendo un carácter d e sig n o p ositivo. L a seg u n d a pro­ d ucción es sim ilar, co n - en vez d e +. C om o la tercera producción para re sto tien e a e d e l lado derecho, la ú ltim a clá u su la else en la función re sto n o hace nada. Las d iez producciones para te rm generan los d iez d íg ito s. C om o ca d a u n a d e es ta s p rod uc­ cion es gen era un d íg ito y lo im prim e, el m ism o cód igo en la figura 2 .25 las im p lem en ta todas. Si la prueba tien e é x ito , la variable t gu ard a el d ígito representado p or p re a n á h sis, para poder 2.5 Un traductor para la s expresiones sim ples 73 escribirlo d esp u és d e la llam ad a a coincidir. O bserve q u e co in c id ir c a m b ia e l sím b olo d e prea­ nálisis, p or lo q ue e l d íg ito n ecesita guardarse para im prim irlo d esp u és .5 2 .5 .4 S im p lific a c ió n d e l t r a d u c t o r A n tes d e m ostrar un program a co m p leto , harem os d os transform aciones d e sim p lificación al cód ig o d e la figura 2.25. Las sim p lificacion es incorporarán e l p rocedim ien to re sto al procedi­ m ien to expr. C uan do s e traducen exp resion es con varios niveles d e p reced en cia, d ich as sim pli­ ficaciones reducen e l núm ero d e procedim ientos necesarios. E n prim er lugar, ciertas llam adas recursivas pueden su stitu irse p or iteraciones. C uando la ú ltim a instrucción q ue se e je c u ta en el cu erpo d e un p rocedim ien to es u na llam ad a recursiva al m ism o procedim ien to, s e d ice q u e la llam ad a es recu rsiva p o r la cola. Por ejem plo, en la función r e sto , las llam adas d e re sto {) con los sím b olos d e preanálisis + y - so n recursivas p or la cola, y a q ue en ca d a u n a d e e s ta s bifurcaciones, la llam ad a recursiva a re sto es la ú ltim a instrucción ejecu ta d a p or e s a llam ad a d e resto. P ara u n procedim iento sin parám etros, u na llam ad a recursiva por la c o la p uede su stitu irse sim p lem en te p or un sa lto al inicio d e l p rocedim iento. E l có d ig o para re sto p u ed e reescribirse com o el seu d ocód igo d e la figu ra 2.26. Siem pre y cu a n d o e l sím b olo d e preanálisis s e a un signo p o sitiv o o n egativo, el procedim iento re sto relaciona el sig n o , llam a a terra para relacionar un d íg ito y con tin ú a e l proceso. E n caso contrario, sa le d e l ciclo w hile y regresa d e resto. v o i d re sto {) { w h ile ( t r u e ) { i f ( prea n á lisis = = V ) { coincidir^ + r) ; ¿erm(); p rin t(V ); c o n t i n u e ; } e l s e i f preanálisis = = ) { c o in c id ili'-^ ; ¿erm(); p rin t('-'); c o n t i n u e ; } b reak ; } } F igu ra 2.26: E lim inación de la recursividad por la c o la en e l procedim iento re sto de la figura 2.25 E n segu n d o lugar, e l program a J ava co m p leto in clu irá un cam b io m ás. U n a v e z q ue las llam adas recursivas por la co la a r e sto en la figura 2.25 se su stitu y a n por iteracion es, la úni­ c a llam ad a restante a re sto es d esd e e l interior d e l p rocedim ien to expr. Por lo ta n to , lo s dos p rocedim ien tos p ueden integrarse e n uno, su stitu y en d o la llam ad a resto Q p o r e l cu erpo d el pro­ ced im ien to resto. 5Como optim ización m enor, podríam os imprimir an te s d e llam ar a coincidir p a ra e v ita r la necesidad d e guardar el dígito. En general, es riesgoso cam biar el orden d e las acciones y los símbolos d e la gram ática, y a que podríam os m odificar lo que hace la traducción. 74 2 .5 .5 Capítulo 2. Un traductor sim ple orientado a la sintaxis E l p r o g r a m a c o m p le to En la figura 2.27 aparece e l program a Java com p leto para nuestro traductor. L a prim era línea d e la figura 2.27, em p ezan d o con im p o r t, proporciona acceso a l p aqu ete j a v a , i o para la entra­ d a y sa lid a d e l sistem a. E l resto d e l cód ig o co n siste en las d os clases A n a liz a d o r y P o s t f i j o . La clase A n a liz a d o r con tien e la variable p r e a n á l i s i s y la s funciones A n a liz a d o r , e x p r , term y c o in c id ir . La ejecu ción em p ieza co n la función m ain, q u e se d efin e e n la cla se P o s t f i j o . L a función m ain crea u na in stan cia a n a l i z a r d e la clase A n a liz a d o r y llam a a s u fun ción e x p r para analizar u n a expresión. La función A n a liz a d o r , q u e tien e el m ism o nom bre q ue s u clase, es un con stru ctor, se llam a d e m anera a u to m á tica cu an do se crea un o b je to d e la clase. D e la definición al princi­ pio d e la clase A n a liz a d o r , p od em os ver q ue el con stru ctor A n a liz a d o r in icializa la variable p r e a n á l i s i s leyendo un token. L os tokens, q ue co n sisten e n caracteres in dividu ales, los su ­ m in istra la ru tina d e e n ta d a d e l siste m a r e a d , la cu a l lee el sig u ien te carácter d e l archivo d e entrada. O bserve q ue p r e a n á l i s i s se d eclara com o en tero, en v e z d e carácter, para anticipar e l hecho d e q u e en seccion es p osteriores introducirem os tokens adicionales ad em ás d e los ca ­ racteres individuales. La fun ción e x p r e s el resultado d e la sim plificación q ue v im o s e n la sección 2.5.4; im plem enta a los no term inales e x p r y r e st d e la figura 2.23. E l cód igo para e x p r en la figura 2.27 llam a a term y d esp u és tien e un ciclo w h ile q ue ev alú a in finitam en te si p r e a n á l i s i s coincide con ’ o co n } - } . E l con trol sa le d e e s te ciclo w h ile al llegar a la in stru cción return. D en tro d el ciclo , se u tilizan las herram ientas d e en tra d a /sa lid a d e la cla se S y ste m para escribir u n carácter. La función term u tiliza la ru tina i s D i g i t d e la cla se C h a r a c te r d e J a v a para probar si el sím b olo d e preanálisis es un d ígito. L a ru tina i s D i g i t esp era ser a p licad a sobre un carácter; no o b sta n te, p r e a n á l i s i s s e d eclara com o entero, an ticip and o las ex ten sio n es a futuro. La con stru cción (c h a r ) p r e a n á l i s i s con vierte u ob lig a a p r e a n á l i s i s a ser un carácter. E n u na pequeña m odificación d e la figura 2.25, la acción sem á n tica d e escribir e l carácter p r e a n á l i s i s ocurre an tes d e la llam ada a c o i n c i d i r . La función c o i n c i d i r com p ru eb a los term inales; lee e l sig u ien te term inal d e la en trad a si hay u na coin cid en cia co n e l sím b olo p r e a n á l i s i s , e in d ica un error e n cualquier otro caso, m ediante la ejecu ción d e la sigu ien te instrucción: th row new E r r o r (" e r r o r d e s i n t a x i s " ) ; E ste cód igo crea u n a n u eva excep ción d e la cla se E r r o r y proporciona la ca d en a e r r o r d e s i n t a x i s com o m en saje d e error. Java n o requiere q ue las ex cep cio n es E r r o r s e declaren en una clá u su la th r o w s, y a q ue su u so e s tá d estin ad o só lo p a ra los ev en to s anorm ales q ue nunca deberían ocu rrir .6 6E1 m an ejo d e e rro re s p u ed e sim plificarse co n las h e rra m ie n ta s p a r a m an ejo d e ex cep cio n es d e J a v a . U n m étodo s e ría d e fin ir u n a n u ev a ex cep ció n , p o r d e c ir E r r o r S i n t a x i s , q u e e x tie n d e a la clase E x c e p tio n del s i s t e m a D espués, se la n z a E r r o r S i n t a x i s e n vez d e E r r o r a l d e te c ta r u n e r ro r , y a s e a e n t e r m o e n c o i n c i d i r . M ás a d e la n te , s e m a n e ja la ex cep ció n e n m a in , e n c e rra n d o la lla m a d a » a l i z a r . e x p r ( ) d e n tr o d e u n a in stru c c ió n t r y q u e a t r a p e a la ex cep ció n E r r o r S i n t a x i s , s e e s c rib e u n m e n sa je y te r m in a e l p ro g ram a. T e n d ría m o s q u e ag reg ar u n a clase E r r o r S i n t a x i s a l p ro g ra m a e n la fig u ra 2.27. P a r a c o m p le ta r la e x te n s ió n , a d e m á s d e I O E x c e p tio n , las funciones c o i n c i d i r y te r m a h o ra d e b e n d e c la ra r q u e p u e d e n la n z a r a E r r o r S i n t a x i s . L a función e x p r , q u e llam a a e s ta s d o s funciones, ta m b ié n d eb e d e c la ra r q u e p u ed e la n z a r a E r r o r S i n t a x i s . Un traductor para la s expresiones sim ples import java.io.*; class Analizador { static int preanálisis; public Analizador() throws IOException { preanálisis = System.in.read(); > void expr() throws IOException { term(); while(true) { if( preanálisis » *+* ) { coincidir('+’); term(); System.out.write(*+*); > else if( preanálisis == ) { coincidir(*- *); term(); System.out.write(*-*); > else return; > > void t e r m O throws IOException { if( Character.isDigit((char) preanálisis) ) { System.out.write((char) preanálisis); coincidir(preanálisis); > else throw n e w Error("error de sintaxis"); > void coincidir(int t) throws IOException { if (preanálisis ==* t ) preanálisis * System, i n .read0 ; else throw n e w Error("error de sintaxis"); > > public class Postfijo { public static void main(String[] args) throws IOException { Analizador analizar = new AnalizadorO ; analizar.expr(); System.out.write(*\n*); > > F igu ra 2.27: P rogram a en Java para traducir exp resion es infijas al form a to p ostfijo 76 Capítulo 2. Un traductor sim ple orientado a la sintaxis U n a s c u a n t a s c a r a c te r ís tic a s i m p o r t a n t e s s o b r e J a v a Las sigu ien tes n o ta s p ueden ser d e u tilidad para aquellos q ue n o esté n fam iliarizados con Java, a la hora d e leer el cód ig o d e la figura 2.27: • U n a c la se en J a v a co n siste en u n a se cu en cia d e d efin icio n es d e variables y fun ­ ciones. • Es necesario utilizar paréntesis para encerrar la s lista s d e p arám etros d e las fun­ ciones, aun cu an d o n o h aya parám etros; por en d e, escribim os e x p r ( ) y t e r m ( ). E stas funciones so n en realidad p rocedim ientos, y a q u e no d evu elv en valores; esto se in d ica m ed ian te la palabra clave v o id an tes d e l nom bre d e la función. • Las funciones s e com u nican en vian do parám etros ‘"por va lo r” o accediendo a los da­ tos com p artidos. Por ejem plo, las funciones e x p r ( ) y t e r m ( ) ex a m in a n el sím bolo de preanálisis usando la variable p r e a n á l i s i s d e la clase, a la q u e to d o s pueden acceder, y a q u e to d o s p ertenecen a la m ism a cla se A n a liz a d o r . • A l igual q ue C , J ava u sa = para la asignación, = desigualdad. para la igualdad y != para la • La c lá u su la “th r o w s IO E x c e p tio n ” en la definición d e t e r m ( ) d ecla ra q u e se p ue­ d e producir u n a excep ción llam ad a IO E x ce p tio n . D ich a ex cep ció n ocurre si n o hay en trad a q u e leer cu an d o la función c o i n c i d i r u sa la ru tina r e a d . C ualquier fun­ ción q ue llam e a c o i n c i d i r d eb e tam b ién declarar q ue p u ed e ocurrir u n a excep ción IO E x ce p tio n d urante su p rop ia ejecución. 2.6 A n á lisis léxico Un analizador léxico lee los caracteres d e la en trad a y los agrupa en “o b je to s token”. Ju n to con u n sím b olo d e term inal q ue se u tiliza para las d ecisio n es d e an álisis sin tá ctico , u n ob jeto token lleva inform ación adicional en form a d e valores d e atrib u tos. H a sta ahora, n o h em os t e ­ nido la necesidad d e diferenciar en tre los térm inos “token” y “term in al” , y a q ue el analizador sin tá ctico ignora los valores d e los atrib u tos q u e llev a un token. E n e s ta sección, u n token es un term inal ju n to co n inform ación adicional. A u n a secu en cia d e caracteres d e en trad a q ue conform an u n so lo token se le con oce com o k x em a . P or en d e, p od em os d ecir q ue e l analizador léxico aísla a un analizador sin tá ctico d e la representación tip o lexem a d e los tokens. El analizador léxico en e s ta sección p erm ite q ue aparezcan núm eros, identificadores y “es­ pacio e n blanco” (espacios, tabu ladores y nuevas líneas) d en tro d e las expresiones. P u ed e usarse p ara ex te n d er e l tra d u cto r d e ex p resion es d e la se cc ió n anterior. C om o la g ra m á tica d e exp resion es d e la figu ra 2.21 d eb e exten d erse para perm itir núm eros e identificadores, apro- 2.6 A nálisis léxico 77 vecharem os e s ta o p ortun idad para p erm itir tam b ién la m u ltip licación y la d ivisión . E l esquem a d e trad u cción ex ten d id o aparece e n la figu ra 2.28. expr ex p r + te r m cx p r - te r m te rm { print('+') } { print('-') } term te r m * fa c to r te r m / fa c to r fa c to r { print('*') } f a c to r { printf7/ ) } ( exj)r ) num id { print ( n u m . valor) } { p rin t(id .k r e m a ) } F igu ra 2.28: A ccion es para traducir a la n otación p ostfijo E n la figura 2.28, se asu m e q ue el term inal n u m tien e un atrib uto n u m . valor, el cu a l nos d a e l valor en tero correspondiente a e s ta ocu rren cia d e n u m . E l term inal i d tien e un atributo co n valor d e cad en a escrito com o i d . lexem a; asu m im os q u e e s ta ca d en a e s e l lex em a actu al que com p rend e e s ta in stan cia d e l i d d e l token. A l final d e e s ta sección, ensam blarem os e n có d ig o J a v a lo s fragm entos d e seud ocód igo que s e u tilizan para ilustrar e l fun cion am ien to d e u n analizador léxico. E l m éto d o en e s ta sección es adecuado para los analizadores léxicos escrito s a m ano. L a sección 3.5 d escrib e u n a herram ienta llam ad a L ex q u e gen era u n analizador léxico a partir d e u na especificación. E n la secció n 2.7 considerarem os las tab las d e sím b olos o las estru ctu ras d e d a to s para guardar inform ación acerca d e los identificadores. 2 .6 .1 E lim in a c ió n d e e s p a c io e n b la n c o y c o m e n ta r io s E l traductor d e exp resion es en la sección 2.5 p u ed e ver ca d a carácter en la en trad a, p o r lo que los caracteres extrañ os, com o los esp acios en blanco, harán q ue falle. L a m ayoría d e los lengua­ je s perm iten q ue aparezcan can tid ad es arbitrarias d e espacio en blanco entre los tokens. Los com en tarios s e ignoran d e igual form a d urante el an álisis sin tá ctico , p o r lo q ue tam b ién pueden tratarse com o esp acio e n blanco. S i e l analizador léxico elim in a e l espacio en blanco, e l analizador sin tá ctico n u n ca tendrá q ue considerarlo. L a altern ativa de m odificar la gra m á tica p a ra incorporar e l esp a cio en blanco e n la sin ta x is no es tan fácil d e im plem entar. E l seu d ocód igo en la figura 2.29 o m ite e l esp a cio e n blanco, leyen do lo s caracteres d e en­ tra d a h a sta llegar a un esp acio en blanco, un tabulador o u n a n ueva línea. L a variable v ista zo co n tien e e l sigu ien te carácter d e entrada. L os núm eros d e lín ea y el co n tex to so n ú tiles dentro d e los m en sajes d e error para ayudar a señalar los errores; e l có d ig o u sa la variable línea para con tar los caracteres d e n u eva lín ea en la entrada. 78 Capítulo 2. Un traductor sim ple orientado a la sintaxis f o r ( ; ; v ista zo = sigu ien te carácter d e en tra d a ) { i f ( v ista zo es un espacio en blanco o un tabulador ) no hacer nada; e l s e i f ( v is ta z o e s u n a n u eva lín ea ) Unea = U n ea + 1; e ls e b re a k ; } F igu ra 2.29: O m isión d el esp a cio e n blanco 2 .6 .2 L e c tu ra a d e la n ta d a Tal vez un analizador léxico ten g a q ue leer algunos caracteres d e p reanálisis, antes d e que pu ed a decidir sobre e l tok en q ue v a a devolver a l analizador sin tá ctico . Por ejem p lo, u n anali­ zador léxico para C o J a v a d eb e leer p or ad elan tad o d esp u és d e ver e l carácter >. S i e l sigu ien te carácter es =, en ton ces > form a parte d e la secu en cia d e caracteres >=, e l lex em a para el token d el operador “m ayor o igual q ue”. E n caso contrario, > p or s í so lo form a e l operador “mayor q ue” , y el analizador léxico h a leído un carácter d e m ás. U n m étod o general p ara leer p or ad elan tad o en la en trad a e s m antener u n búfer d e entrada, a partir d e l cu a l el analizador léxico p uede leer y devolver caracteres. Los búferes d e en trad a pueden ju stificarse ta n só lo p or cu estió n d e eficien cia, y a q ue por lo gen eral e s m ás eficien te ob tener un b loqu e d e caracteres q u e ob tener un carácter a la v ez. U n apuntador lle v a el registro d e la porción d e la en trad a q ue se h a analizado; para regresar u n carácter s e m ueve e l ap un ta­ dor hacia atrás. E n la sección 3.2 verem os las técn ica s para e l uso d e búfer en la entrada. Por lo general, b a sta co n leer u n carácter d e p reanálisis, así q ue u n a solución sim p le es u tili­ zar u n a variable, por decir vista zo , para guardar e l sig u ien te carácter d e entrada. E l analizador léxico en e s ta sección lee un carácter d e preanálisis m ientras recolecta d íg ito s para núm eros, o caracteres para identificadores; p or ejem p lo, lee m ás a llá d e l 1 para diferenciar entre 1 y 1 0 , y lee m ás allá d e t para diferenciar entre t y t r u e . El analizador léxico lee d e preanálisis sólo cu an d o d eb e hacerlo. U n operador com o * puede identificarse sin necesidad de leer por adelantado. E n tales casos, v ista zo se estab lece a un espa­ cio e n blanco, q ue s e o m itirá cu an do s e llam e a l analizador léxico p a ra buscar el sigu ien te token. La aserción invariante en e s ta sección es q ue, cu an do e l analizador léxico d evu elve un token, la variable v ista zo con tien e el carácter q ue e s tá m ás allá d el lex em a para el token actual, o contiene un espacio en blanco. 2 .6 .3 C o n s ta n te s C ad a v e z que aparece u n so lo d íg ito en u n a g ra m á tica para exp resion es, parece razonable p er­ m itir u n a co n stan te en tera arbitraria en su lugar. L as co n sta n tes en teras pueden perm itirse al crear un sím b olo term inal, p or decir n u m , para ésta s, o a l incorporar la sin ta x is d e co n sta n tes en teras en la gram ática. E l trab ajo d e recolectar caracteres en en teros y calcular s u valor nu­ m érico colectiv o se asign a por lo gen eral a u n analizador léxico, p a ra q ue los núm eros puedan tratarse com o u nidades in dividu ales durante e l an álisis sin tá ctico y la traducción. C uando aparece u n a secu en cia d e d ígitos en el flujo d e entrada, e l analizador léxico p asa al analizador sin táctico u n token q ue co n siste en la term inal n u m , ju n to co n u n a trib u to con 2.6 A nálisis léxico 79 valor d e entero, el cu a l se ca lcu la a partir d e los d íg ito s. Si escribim os tokens com o n-uplas encerradas en tre los sign os ( y ) , la en trad a 31 + 2 8 + 5 9 se transform a e n la sigu ien te se­ cuencia: ( n u m , 31) (+) ( n u m , 28) (+) ( n u m , 59) A q u í, el sím b olo term in al + no tien e atrib utos, p or lo q ue s u n -u pla es sim p lem en te {+). El seu d ocód igo e n la figura 2.30 lee los d ígitos en un entero y acum ula el valor d e l entero, usando la variable v. ¡ f ( v ista zo con tien e un d íg ito ) { v = 0 ; do { v = v * 10 + valor en tero d e l d íg ito v is ta z o ; v ista zo = sigu ien te carácter d e entrada; } w h i l e ( v ista zo co n tien e u n d íg ito ); r e t u r n tok en ( n u m , v ); } F igu ra 2.30: A grupam iento d e d íg ito s e n enteros 2 .6 .4 R e c o n o c im ie n to d e p a l a b r a s c la v e e id e n tif ic a d o r e s L a m ayoría d e los lenguajes u tilizan cad en a s d e caracteres fijas ta les co m o f o r , d o e i f , com o sig n o s d e pun tu ación o para identificar las con stru cciones. A d ich as ca d en as d e caracteres se les co n o ce com o palabras clave. Las cad en as d e caracteres tam b ién se u tiliza n com o identificadores para nom brar variables, arreglos, funciones y dem ás. Las gram áticas tratan d e m anera rutinaria a los identificadores com o term inales para sim plificar e l analizador sin tá ctico , el cu al p or con sigu ien te p u ed e esperar e l m ism o term inal, p or decir i d , ca d a v e z q ue aparece algún identificador en la en trad a. Por ejem p lo, en la sigu ien te entrada: cu en ta = c u e n t a + in c r e m e n to ; (2.6) e l analizador trab aja co n e l flujo d e term in ales i d = i d + i d . E l tok en para i d tien e un atributo q ue con tien e el lexem a. Si escribim os los tokens com o n-uplas, p o d em o s ver q u e las n-uplas para e l flujo d e en tra d a (2.6) son: ( i d , " c u e n ta " ) (=) ( i d , " c u e n ta " ) (+) ( i d , " in c r e m e n to " ) ( ; ) P or lo general, las palabras clave cu m p len co n las reglas para form ar identificadores, por lo q ue se requiere un m ecanism o para decidir cu án do u n lex em a form a u n a p a lab ra cla v e y cuándo u n identificador. E l problem a e s m ás fácil d e resolver s i las palabras cla v e so n re serv a d a s; es d ecir, si no p ueden utilizarse com o identificadores. E n tonces, u n a ca d en a d e caracteres form a a un identificador só lo s i no es u na p alabra clave. 80 Capítulo 2. Un traductor sim ple orientado a la sintaxis El analizador léxico en e s ta sección resuelve d o s problem as, utilizan do u n a ta b la p ara guar­ dar cad en as d e caracteres: • R e p resen ta ció n sim ple. U n a ta b la d e cad en a s p uede aislar al resto d el com pilador d e la representación d e las cad en as, y a q ue las fases d el com p ilad or pueden trab ajar con refe­ rencias o apuntadores a la cad en a e n la tab la . Las referencias tam bién pueden m anipular­ s e co n m ás eficien cia q u e las m ism as cadenas. • P alabras reserva d a s. Las palabras reservadas pueden im plem entarse m ediante la inicialización d e la ta b la d e cad en as co n las cad en a s reservadas y su s tokens. C uan do e l analiza­ d or léxico lee u na ca d en a o lexem a q ue p od ría form ar u n identificador, prim ero verifica si e l lexem a se en cu en tra en la ta b la d e cad en as. D e ser así, d ev u elv e el token d e l a tabla; e n caso con trario, d evu elve un to k en co n el term in al i d . En Java, u n a ta b la d e cadenas p uede im plem entarse com o u n a h ash ta b le, usand o u n a clase llam ad a H ashtable. L a sigu ien te declaración: H ashtable palabras = n e w H ashtable()\ estab lece a palabras com o u n a hash table predeterm inada, q ue asign a claves a valores. L a utiliza­ rem os para asignar los lexem as a los tokens. E l seud ocód igo en la figura 2.31 u tiliza la operación g e t para buscar palabras reservadas. i f ( vista zo con tien e una le tr a ) { recolectar letras o d ígitos en un búfer 6; 5 = ca d en a form ada a partir d e lo s caracteres en 6; w = tok en d ev u elto p or palabras. g et(s)\ i f ( w no es n u i l ) r e t u r n w\ e ls e { Introducir el par clave-valor ( 5, ( i d , 5)) en palabras token ( i d , s); re tu rn } } F igu ra 2.31: D istin ción en tre palabras clave e identificadores E ste seu d ocód igo recolecta d e la en tra d a u na ca d en a s , la cu a l co n siste en letras y d ígitos, em p ezan d o con u na letra. Sup onem os q u e s se hace lo m ás larga posible; es d ecir, e l analizador léxico con tinu ará leyen do d e la en trad a m ientras sig a en con tran do letras y d ígitos. C uando en cu en tra algo d istin to a u na letra o d ígito, por ejem p lo, espacio en blanco, e l lex em a se cop ia a un búfer b. S i la tab la tien e u n a en trad a para 5, en ton ces se d ev u elv e el token ob ten id o por palabras.get. A q u í, 5 p odría ser u n a palabra clave, co n la q u e s e sem b ró in icializado la ta b la p a ­ labras, o p od ría ser un identificador q ue se introdujo antes en la tabla. E n ca so contrario, el token i d y e l atrib u to s s e in stalan e n la ta b la y s e devuelven. 2.6 A nálisis léxico 2 .6 .5 81 U n a n a liz a d o r lé x ic o H a sta ah ora en e s ta sección, los fragm entos d e seud ocód igo se ju n ta n para form ar u n a función llam ad a escan ear q u e d evu elve o b je to s token, d e la sigu ien te manera: Token esca n ea r () { om itir esp acio e n b lan co, com o en la secció n 2.6.1; m anejar los núm eros, com o en la secció n 2.6.3; m anejar las palabras reservadas e identificadores, com o en la secció n 2.6.4; / ♦ S i llegam os aquí, tratar e l carácter d e le ctu r a d e p rean álisis v ista zo com o tok en * / Token t = n e w T b k en (ú sta zó )\ v ista zo = espacio en blanco / * inicialización, com o v im o s en la sección 2 .6 .2 * /; r e t u r n £; } E l re sto d e e s ta sección im p lem en ta la función explorar com o p arte d e un p aqu ete d e Java para e l análisis léxico. E l p aqu ete, llam ado a n a liz a d o r l é x i c o tien e clases para tokens y una clase A n a liz a d o r L e x ic o q ue con tien e la función e s c a n e a r . Las cla ses para los tokens y su s cam p o s se ilu stran e n la figu ra 2.32; su s m étod os no se m uestran. L a clase T oken tien e u n cam p o llam ado e t i q u e t a , e l cu a l se u sa para la s decisiones sob re e l an álisis sin táctico. L a su b cla se Num agrega un ca m p o v a lo r p a ra un valor d e entero. L a su b cla se P a la b r a agrega u n cam p o lex em a , el cu a l s e u tiliza p a ra las palabras reservadas y los identificadores. c la s e Tbken in t etiqueta c la s e Num c la s e Palabra in t valor s t r in g lexema F igu ra 2.32: L a clase Token y la s su b cla ses N u m y Palabra C ada clase se en cu en tra en un archivo p o r s í sola. A con tinu ación se m uestra e l archivo para la clase Token: 1) p a ck a g e a n a liz a d o r l é x i c o ; / / A rch ivo T o k en .ja va 2) p u b lic c l a s s T ok en { 3) p u b lic f i n a l i n t e t iq u e t a ; 4 ) p u b l i c T o k e n ( in t t ) { e t i q u e t a = t ; } 5) > L a línea 1 id en tifica el p aqu ete a n a liz a d o r l é x i c o . E l ca m p o e t i q u e t a s e d eclara en la línea 3 com o f i n a l , d e form a que no p uede m odificarse u n a vez estab lecid o. E l con stru ctor Token e n la línea 4 se u tiliza para crear o b je to s token, com o en new T o k en ( *+* ) lo cu a l crea un nuevo o b je to d e la clase T oken y esta b lece s u ca m p o e t i q u e t a a u n a represen­ ta ció n en tera d e }+ y. Por cu estió n d e brevedad, o m itim o s e l h ab itu al m éto d o t o S t r i n g , que d evolvería u na ca d en a ad ecu ad a para s u im presión. 82 Capítulo 2. Un traductor sim ple orientado a la sintaxis En d ond e e l seu d ocód igo ten g a term inales com o n u m e id , e l có d ig o d e J a v a u tiliza co n s­ ta n tes enteras. L a clase E t i q u e t a im p lem en ta a d ich as con stantes: 1) p a ck a g e a n a liz a d o r l é x i c o ; / / A rch ivo E tiq u e ta .ja v a 2) p u b l i c c l a s s E t i q u e t a { 3) p u b lic f i n a l s t a t i c i n t 4) NUM = 2 5 6 , ID = 2 5 7 , TRUE = 2 5 8 , FALSE = 2 5 9 ; 5) > A dem ás d e los cam p os co n valor d e en tero NUM e ID, e s ta cla se d efine d os cam p o s adicionales, TRUE y FALSE, para un uso futuro; se utilizarán para ilustrar el tra ta m ien to d e las palabras clave reservadas.7 Los cam p os en la clase E t iq u e t a so n p u b lic , p or lo q u e p ueden usarse fuera d e l paquete. Son s t a t i c , por lo q ue só lo h ay u n a in stan cia o co p ia d e es to s cam p os. L os c a m p o s so n f i n a l , por lo q u e pueden estab lecerse só lo u n a vez. E n efecto , esto s cam p o s representan co n sta n tes. En C s e logra un efecto sim ilar m ediante e l u so d e instrucciones d e d efinición, p a ra perm itir q ue nom bres com o NUM s e u tilicen com o con sta n tes sim b ólicas, por ejemplo: « d e f in e NUM 256 El cód igo en Java se refiere a E tiq ueta.N U M y E t iq u e t a . ID en lugares en d on d e e l seu d o­ có d ig o s e refiere a los term inales n u m e id . E l único requerim iento es q ue E tiq ueta.N U M y E t i q u e t a . ID d eb en inicializarse co n valores d istin to s, q ue d ifieran u no d e l o tro y d e las co n s­ ta n tes q ue representan tok en s d e un so lo carácter, co m o *+ * o }* } . 1) p a ck a g e a n a l i z a d o r l e x i c o ; / / A rch ivo 2) p u b l i c c l a s s Num e x t e n d s T oken { 3) p u b l i c f i n a l i n t v a lo r ; 4) p u b l i c N u m (in t v ) { su p e r (E tiq u e ta .N U M ); v a lo r = v ; } N u m .ja v a 5) > 1) p a ck a g e a n a l i z a d o r l e x i c o ; / / A rch ivo 2) p u b l i c c l a s s P a la b r a e x t e n d s T ok en { 3) p u b l i c f i n a l S t r i n g lex em a ; 4) p u b lic P a la b r a (in t t , S tr in g s ) 5) s u p e r ( t ) ; le x e m a = new S t r i n g ( s ) ; 6) P a la b ra .ja va { } 7) > F igu ra 2.33: Las su bclases Num y P a la b r a d e Token Las cla ses Num y P a la b r a aparecen en la figura 2.33. L a cla se Num ex tie n d e a T oken m e­ d ia n te la d eclaración d e un cam p o en tero v a lo r en la lín ea 3. E l con stru ctor Num en la lín ea 4 llam a a su p e r ( E t iq u e t a . NUM), q ue estab lece el ca m p o e t i q u e t a en la su perclase T oken a E tiqueta.N U M . 7P o r lo g e n e ra l, los c a ra c te re s A S C II s e co n v ie rte n e n e n te ro s e n tr e 0 y 255. P o r lo ta n to , u tilizarem o s e n te ro s m ayores d e 255 p a r a los term in a le s. 2.6 A nálisis léxico 83 // Archivo AnalizadorLexico.,java 1) package analizadorlexico; 2) import java.io.*; import java.util.*; 3) public class AnalizadorLexico { 4) public int linea = 1; 5) private char vistazo ■ * *; 6) private Hashtable palabras » n e w H a s h t a b l e O ; 7) void reservar(Palabra t) { p alabras.put(t.lexema, t ) ; } 8) public Analizad o r L e x i c o O { 9) reservar( n e w Palabra(Etiqueta.TRUE, "true") ); 10) reservar( n e w Palabra(Etiqueta.FALSE, "false") ); 11) > 12) public Token explorar() throws IOException { 13) for( ; ; vistazo = (char)System.in.read() ) { 14) i f ( vistazo = 15) else if( vistazo 16) else break; 17) * * || vistazo == *\t* ) continue; = *\n* ) linea - linea + 1; > / * con tin ú a en la figura 2.35 * / F igu ra 2.34: C ódigo para un analizador léxico, p arte 1 d e 2 L a clase P a la b r a se u tiliza para palabras reservadas e identificadores, por lo q ue el cons­ tru ctor P a la b r a en la lín ea 4 esp era d o s parám etros: un lex em a y un valor en tero correspon­ d ien te para e t i q u e t a . P od em os crear u n o b je to para la p alabra reservad a t r u e ejecu tan do lo siguiente: new P a la b r a (E tiq u e ta .T R U E , " tr u e " ) lo cu a l crea u n N uevo ob jeto con el cam p o e t i q u e t a esta b lecid o en e t i q u e t a . TRUE y e l cam p o le x e m a estab lecid o a la ca d en a " tru e" . L a clase A n a liz a d o r L é x ic o para e l an álisis léxico aparece e n las figuras 2.34 y 2.35. La variable en tera l i n e a en la línea 4 c u en ta las lín eas d e entrada, y la variable carácter v i s t a z o e n la lín ea 5 con tien e e l sigu ien te carácter d e entrada. Las palabras reservadas se m anejan en la s líneas 6 a 11. La ta b la p a la b r a s se d ecla ra en la línea 6. L a función auxiliar r e s e r v a r en la línea 7 co lo c a u n par cad en a-palab ra en la tabla. Las líneas 9 y 10 en e l con stru ctor A n a liz a d o r L e x ic o inicializan la tabla. U tilizan el construc­ tor P a la b r a para crear o b je to s tip o palabra, los cu a les s e pasan a la función au xiliar r e s e r v a r . P or lo tan to, la ta b la se inicializa co n las palabras reservadas " tru e" y " f a ls e " an tes d e la prim era llam ada d e e x p lo r a r . E l cód ig o para e s c a n e a r en las figuras 2.34-2.35 im p lem en ta los fragm entos d e seud ocód igo e n e s ta sección . L a in stru cción f o r en las líneas 13 a 17 o m ite lo s caracteres d e esp a cio e n blan­ c o , tabu ladores y d e n u eva lín ea. C uando e l con trol sa le d e la in stru cción f o r , v i s t a z o con tien e u n carácter q u e no es espacio en blanco. E l cód igo para leer u n a secu en cia d e d íg ito s e s tá en las líneas 18 a 25. L a fun ción i s D i g i t e s d e la clase C h a r a c te r integrada en Java. Se u tiliza e n la lín ea 18 para com probar si v i s t a z o 84 Capítulo 2. 18) ií( Character.isDigit(vistazo) 19) int v - 0; 20) do { 21) Un traductor sim ple orientado a la sintaxis ) { v - 10*v + Character .digit (vistazo, 10); 22) vistazo * (char)System.in.readO ; 23) } w h i l e ( Character.isDigit(vistazo) ); 24) return new N u m ( v ) ; 25) > 26) i f ( Character.isLetter(vistazo) ) { 27) StringBuffer b = new StringBuffer(); 28) do { 29) b .append(vistazo); 30) peek = (char)System, i n .read(); 31) } w h i l e ( Character.isLetterOrDigit(vistazo) ); 32) String s - b . t o S t r i n g O ; 33) Palabra w = 34) if (w !* null ) return w; 35) w = new Palabra(Etiqueta.ID, s) ; 36) palabras.put(s, w) ; 37) return w ; (Palabra)palabras.get(s); 38) > 39) Token t = n e w Token(vistazo) ; 40) vistazo ■ * *; 41) return t ; 42) 43) } > F igu ra 2.35: C ódigo para u n analizador léxico, parte 2 d e 2 es un d íg ito . D e ser así, el cód ig o en las líneas 19 a 24 acum ula e l valor en tero d e la secu en cia d e d íg ito s e n la en trad a y d evu elve u n nuevo o b je to Num. Las lín eas 26 a 38 analizan palabras reservadas e identificadores. L as palabras clave t r u e y f a l s e y a se han reservado en las líneas 9 y 10. A sí, s i llegam os a la lín ea 35 en ton ces la cad en a s no e s tá reservada, por lo cu a l d eb e ser e l lexem a p a ra un identificador. L a lín ea 3 5 , por lo ta n to, d evu elv e un nuevo o b je to p alabra co n le x e m a esta b lecid o a s y e t i q u e t a estab lecid a a E t i q u e t a . ID. P or ú ltim o, las lín eas 39 a 41 d evu elv en el carácter actu al com o u n token y esta b lecen v i s t a z o a un esp acio en blanco, q ue se elim inará la próxim a v ez q u e se llam e a escan ear. 2.6.6 E je rcicio s p a ra la sección 2.6 E j e r c ic io 2 .6 .1 : E x tie n d a el analizador léxico d e la secció n 2 .6 .5 para elim inar lo s com en ta­ rios, q ue se d efinen d e la sigu ien te manera: a) U n com entario em p ieza co n / / e in clu ye a to d o s los caracteres h a sta e l fin d e e s a línea. 2 .7 Tablas d e símbolos 85 b ) U n com entario em p ieza co n / * e in clu ye a to d o s lo s caracteres h a sta la sig u ien te ocurren­ c ia d e la secu en cia d e caracteres * / . E j e r c ic io 2 .6 .2 : E x tie n d a e l analizador léxico en la secció n 2 .6 .5 para q ue reco n o zca los op e­ radores relaciónales <, <=, ==, !=, >=, >. E j e r c ic io 2 .6 .3 : E x tie n d a el analizador léxico en la sección 2 .6 .5 para q ue recon ozca los v a lo ­ res d e p u n to flotan te com o 2 . , 3 . 1 4 y . 5. 2 .7 T a b la s d e sím b o lo s Las tablas d e sím bolos son estru ctu ras d e d a to s q u e u tiliza n los com piladores p a ra guardar inform ación acerca d e las con stru cciones d e u n program a fuente. L a inform ación se recolecta e n form a in crem en tal m ed ian te las fases d e análisis de un com p ilad or, y las fases d e sín tesis la u tilizan para generar e l cód ig o d estin o. L as en trad as en la ta b la d e sím b olos con tien en informa­ ción acerca d e un identificador, com o s u ca d en a d e caracteres (o lexem a), su tip o, su posición e n e l esp acio d e alm acenam iento, y cualquier o tr a inform ación relevante. P or lo general, las ta b la s d e sím b olos necesitan sop ortar varias d eclaraciones d el m ism o identificador d en tro de u n program a. E n la sección 1.6.1 vim os q ue e l alcance d e u n a d eclaración e s la parte d e u n program a a la cu a l s e ap lica e s a declaración. V am os a im plem entar los alcances m ed ian te el estab lecim ien to d e u n a ta b la d e sím b olos separada para ca d a alcance. U n bloque d e program a con d eclaracio­ nes8 ten drá su p rop ia ta b la d e sím b olos, co n u n a en tra d a para ca d a declaración e n el bloque. E ste m étod o tam b ién funciona para o tras con stru cciones q ue esta b lecen alcances; p or ejem plo, u na clase ten d ría su prop ia tabla, co n u na en trad a p a ra ca d a ca m p o y ca d a m étodo. E sta sección con tien e un m ód u lo d e ta b la d e sím b olos, adecuado p a ra usarlo con los frag­ m en tos d e l trad u ctor en J ava d e e s te ca p ítu lo . E l m ó d u lo s e u tiliza rá com o está , cuando en sam blem os e l trad uctor com p leto en e l apéndice A . M ientras ta n to , p o r cu estió n d e sim pli­ cid ad , el ejem p lo principal d e e s ta sección es u n len gu aje sim p lificad o, q u e sólo co n tien e las con stru ccion es clave q ue to ca n las ta b la s d e sím bolos; en esp ecia l, los b lo q u es, las declaraciones y los factores. O m itirem os to d a s las d em ás con stru ccion es d e instrucciones y exp resion es, para p od er en fo ca m o s en las op eracion es co n la ta b la d e sím b olos. U n program a c o n siste e n bloques c o n declaraciones op cion ales e “in stru cciones” q u e co n siste n en identificadores individuales. C a d a in stru cción d e e s te tip o rep resen ta un uso d e l identificador. H e a q u í un program a de ejem p lo e n e s te lenguaje: { int x; char y; { bool y; x; y; } x; y; > (2.7) Los ejem plos d e la estru ctu ra d e bloqu es en la sección 1.6.3 m anejaron la s definiciones y usos d e nombres; la en trad a (2.7) co n siste ú n icam en te d e d efinicion es y usos d e nom bres. L a tarea q u e vam os a realizar es im prim ir un program a revisado, en e l cual se han elim inado las declaraciones y cad a “in stru cción ” tien e su identificador, seguid o d e un sig n o d e p u n to y co m a y d e su tip o. 8 En C , por ejem plo, los bloques d e program as son funciones o secciones d e funciones q u e s e separan m ediante llaves, y q u e tien en una o m ás declaraciones en su interior. 86 Capítulo 2. Un traductor sim ple orientado a la sintaxis ¿Q u ién c re a las e n tra d a s en la ta b la de sím bolos? E l analizador léxico, el analizador sin táctico y e l analizador sem á n tico so n lo s q u e crean y u tilizan las en trad as en la ta b la d e sím b olos durante la fase d e análisis. E n e s te cap í­ tu lo, harem os q u e e l analizador sin táctico cree las en trad as. C on s u co n o cim ien to d e la estru ctu ra sin tá ctica d e u n program a, por lo general, un analizador sin tá ctico e s tá en una m ejor posición q ue e l analizador léxico para diferenciar en tre las d istin ta s declaraciones d e un identificador. En algunos casos, u n analizador léxico p uede crear u n a en trad a en la ta b la d e sím b o­ los, ta n pronto com o v e los caracteres q u e conform an u n lexem a. M ás a m enudo, e l anali­ zador léxico só lo p u ed e devolver un token al analizador sin tá ctico , p or decir i d , ju n to con un apuntador al lexem a. S in em bargo, sólo el analizador sin tá ctico p uede decidir s i debe utilizar u n a en trad a en la ta b la d e sím b olos q ue se h a y a creado antes, o s i d eb e crear una en trad a n u eva para el identificador. E j e m p lo 2 .1 4 : En la en trad a anterior (2 .7 ), e l o b je tiv o es producir lo siguiente: { { x:int; yrbool; } x:int; y:char; } Las prim eras x y y son d e l b loqu e interno d e la en trad a (2.7). C om o e s te uso d e x s e refiere a la declaración d e x e n e l b loqu e extern o, v a segu id o d e i n t , el tip o d e esa declaración. E l uso d e y en e l b loqu e in tern o s e refiere a la d eclaración d e y en ese m ism o bloque y, p or lo ta n to , tien e e l tip o b oolean o. Tam bién vem os los u sos d e x y y en e l b lo q u e ex tern o , co n su s tip o s, segú n los proporcionan las declaraciones d e l b loqu e externo: en tero y carácter, resp ectivam en te. □ 2 .7 .1 T a b la d e s ím b o lo s p o r a lc a n c e El térm in o “alcance d e l identificador x” en realidad s e refiere al alcance d e u n a declaración esp ecífica d e x. E l térm in o alcance por s í so lo se refiere a u n a p arte d e l program a q ue es el alcance d e u n a o m ás d eclaraciones. Los alcances son im portan tes, y a q ue e l m ism o identificador p u ed e declararse p a ra d istin to s fines en d istin ta s partes d e un program a. A m enudo, los nom bres com unes com o i y x tien en varios usos. C om o o tro ejem p lo, las su b clases pueden volver a declarar e l nom bre d e un m étodo para redefinirlo d e u n a superclase. Si los bloqu es pueden anidarse, varias declaraciones d el m ism o identificador p ueden apa­ recer d en tro d e un so lo bloque. L a sigu ien te sin ta x is produce b loqu es an idados cu an do in strs p uede generar un bloque: bloque '{' decís in s tr s T C olocam os las llaves entre com illas sim p les en la sin ta x is para diferenciarlas d e la s llaves para las accion es sem án ticas. C on la gram ática en la figura 2.38, decís g en era u n a secu en cia op cion al d e d eclaraciones e in strs g en era u n a secu en cia op cion al d e instrucciones. 2 .7 Tablas d e símbolos 87 O p tim iza ció n de las ta b la s de sím bolos p a ra los b loqu es Las im plem en tacion es d e las ta b la s d e sím b olos para los bloqu es p ueden aprovechar la regla d el b loqu e anidado m ás cercano. E l an idam iento asegura q u e la ca d en a d e tablas d e sím b olos aplicables form e u na pila. E n la parte su perior d e la p ila se en cu en tra la ta b la para el bloque actu al. D eb ajo d e ella en la p ila está n la s ta b la s para los bloques circundantes. Por en d e, las ta b la s d e sím b olos pueden asignarse y d esasignarse e n form a parecida a u n a pila. A lgunos com piladores m antienen u na so la hash ta b le d e entradas accesibles; es decir, d e en trad as q ue no se o cu lta n m ed ian te u n a d eclaración en u n bloque anidado. D ich a hash tab le so p o rta b úsq uedas esen ciales en tiem p o s co n sta n tes, a ex p en sa s d e insertar y elim inar en trad as al entrar y salir d e los bloques. A l salir d e un b loqu e B , el com pilador d eb e deshacer cualquier m odificación a la hash ta b le d eb ido a las declaraciones en el bloque B . P ara ello p uede u tilizar u n a p ila auxiliar, para llevar e l rastro d e las m odifica­ ciones a la ta b la hash m ientras se p rocesa e l bloque B. Inclusive, u na in stru cción puede ser un bloque, p or lo q ue nuestro lengu aje p erm ite bloques an idad os, en d ond e p uede volver a declararse u n identificador. L a regla d e l bloque an idado m á s cercano n os in d ica q ue un identificador x se encuentra e n e l alcance d e la declaración an id ad a m ás cerca n a d e x\ es decir, la d eclaración d e x q ue se en cu en tra al exam in ar los bloques d esd e adentro h acia fuera, em p ezan d o con el b lo q u e e n el q u e aparece x. E j e m p lo 2 .1 5 : E l sigu ien te seu d ocód igo u tiliza su bín d ices para diferenciar en tre las d istin tas declaraciones d e l m ism o identificador: 1) { i n t » i; 2) 3) { 4) 5) } 6) ¡n t y x\ ¡ n t w 2] b o o l y 2; i n t z 2\ ••• W2 •••; ••• x i •••; ••• y<¿ ••• w 0 •••; ••• z 2 •••; x i •••; ••• y i •••; } E l su bín d ice no form a parte d e un identificador; es, d e hecho, el núm ero d e lín ea d e la declara­ ción q ue se ap lica a l identificador. Por en d e, to d a s las ocu rren cias d e x está n d en tro d el alcance d e la d eclaración en la lín ea 1. L a ocu rren cia d e y en la lín ea 3 e s tá en el alcance d e la declara­ ción d e y en la lín ea 2, y a q ue y s e volvió a declarar d en tro d e l bloque interno. Sin em bargo, la ocu rren cia d e y en la línea 5 e s tá den tro d el alcance d e la d eclaración d e y e n la lín ea 1. L a ocu rren cia d e w en la lín ea 5 s e en cu en tra su p u esta m en te d en tro d e l alcance d e una d eclaración d e w fuera d e e s te fragm ento d e l program a; su su bín d ice 0 d en o ta u na declaración q ue es glob al o ex tern a p ara e s te bloque. P or ú ltim o , 2 se d eclara y se u tiliza d en tro d e l bloque anidado, pero n o p uede usarse e n la línea 5, y a q ue la d eclaración an idad a se ap lica só lo al b loqu e anidado. □ 88 Capítulo 2. Un traductor sim ple orientado a la sintaxis La regla d el bloque anidado m ás cercano p u ed e im plem entarse m ed ian te e l en cad en am ien to d e las tab las d e sím b olos. E s decir, la ta b la para un bloque anidado a p u n ta a la ta b la para el bloque circundante. E j e m p lo 2 .1 6 : La figura 2.36 m uestra tab las de sím b olos para el seu d o có d ig o d el ejem p lo 2.15. B i es para el bloque q ue em p ieza en la línea 1 y B¿ es para el bloque q u e em p ieza en la lín ea 2. E n la p arte su perior d e la figura hay u n a ta b la d e sím b olos adicional B q para cualquier declaración glo b a l o predeterm inada que proporcione e l lenguaje. D urante e l tiem p o q ue anali­ zam os las lín eas 2 a 4 , el en torn o s e represen ta m ediante u na referencia a la ta b la d e sím bolos inferior (la d e B¿). C uando avanzam os a la lín ea 5, la ta b la d e sím b olos para B¿ se v u elv e in­ accesible, y e l en torn o se refiere en su lugar a la ta b la d e sím b olos para B \ , a p artir d e la cual p od em os llegar a la ta b la d e sím b olos global, pero no a la ta b la para B 2. □ w X y w in t ... in t in t x y ïooJ z in t F igu ra 2.36: Tablas d e sím b olos en cad en ad as para el ejem p lo 2.15 La im plem en tación en J ava d e las tab las d e sím b olos en cad en ad as en la figura 2.37 d efin e a u n a clase E n t, abreviación d e en torn o .9 L a clase E n t so p o rta tres operaciones: • O rear u na n u eva tabla d e sím bolos. E l con stru ctor E nt (p ) en las líneas 6 a 8 d e la figura 2.37 crea un o b je to E n t co n u n a hash ta b le llam ad a t a b l a . E l o b je to se en ca d en a al parám etro co n valor d e en torn o p, estab lecien d o e l cam p o s i g u i e n t e a p. A un qu e los o b je to s E n t son los q ue form an u n a cadena, es con ven iente hablar d e las ta b la s q u e s e van a encadenar. • p u t u n a n ueva en trad a en la ta b la actual. L a hash ta b le co n tien e pares clave-valor, en donde: - La clave e s u na cadena, o m ás bien u n a referencia a u n a cad en a. P odríam os usar d e m anera altern ativa referencias a o b je to s tok en para identificadores com o las claves. - E l va lo r e s u n a en trad a d e la c la se S im b o lo . E l có d ig o en las líneas 9 a 11 n o nece­ sita con ocer la estru ctu ra d e u n a entrada; es decir, e l có d ig o es in depend iente d e los cam p os y los m éto d o s en la clase S im b o lo . 9“Entorno” e s otro térm ino para la colección d e tablas d e sím b olos q u e son relevantes en un punto dado en el programa. 2 .7 Tablas d e símbolos 89 / / Archivo Ent.java 1) package símbolos; 2) import java.util.*; 3) public class Ent { 4) private Hashtable tabla; 5) protected Ent ant; 6) public Ent(Ent p) { 7) tabla * n e w Hashtable(); ant = p; 8) > 12) public Simbolo get(String s) { for( Ent e - this; e 13) !■ nuil; e = e.ant ) { 14) Simbolo encontro = (Simbolo)(e.tabla.g e t (s)); 15) ií( encontro !- null ) return encontro; 16) > 17) return null; > 18) 19) > F igu ra 2.37: L a clase E n t im p lem en ta a las ta b la s d e sím b olos encadenadas • g e t u na en trad a para un identificador buscando en la ca d en a d e tablas, em p ezan d o con la tab la para el bloque actu al. E l cód igo para e s ta operación en la s líneas 12 a 18 devuelve una en trad a en la ta b la d e sím b olos o n u i l . E l encad en am ien to d e las tab las d e sím bolos produce u na estru ctu ra tip o árbol, y a q ue p u e­ d e anidarse m ás d e u n bloque dentro d e un bloque circundante. Las líneas p un teadas en la figura 2.36 so n un recordatorio d e q ue las tab las d e sím bolos encadenadas pueden form ar un árbol. 2.7.2 E l uso de las ta b la s de sím bolos E n efecto, la fun ción d e una tab la de sím b olos es pasar inform ación d e las declaraciones a los usos. U n a acción sem á n tica “co lo ca ” (p u t) inform ación acerca d e u n identificador s e n la ta b la d e sím b olos, cu an d o s e a n aliza la d eclaración de x. P osteriorm ente, una acción sem á n tica aso­ cia d a con u na producción com o f a c to r -► id “o b tie n e” (g et) inform ación acerca d e l identifica­ dor, d e la tab la d e sím b olos. C om o la trad ucción d e u na exp resión Ey o p E¿, para u n operador o p ordinario, d ep en d e só lo d e las trad uccion es d e E i y y no d irectam ente d e la ta b la de sím b olos, p od em os agregar cualquier núm ero d e operadores sin necesidad d e cam b iar e l flujo b ásico d e inform ación d e las d eclaraciones a los usos, a través d e la ta b la d e sím bolos. E j e m p lo 2 .1 7 : E l esq u em a d e trad ucción e n la figura 2 .38 ilu stra cóm o p uede usarse la clase E n t. E l esq u em a d e traducción se con cen tra en los alcances, las declaraciones y lo s usos. Im plem en ta la trad ucción d escrita en e l ejem p lo 2.14. C om o d ijim os an tes, en la en trad a 90 Capítulo 2. program a -* Un traductor sim ple orientado a la sintaxis { sup = n u il; } bloque bloque -*■ '{ ' { gu ardado = sup; su p = n e w E n t(su p )\ print("{ "); } decís in s tr s { su p = gu ardado , print("} ■); } decís -► i decís deci « deci -► t ip o id ; in s tr s -*• I in s tr s in s tr c in s tr -*■ | bloque f a c to r ; -► id f a c to r { s = n e w Sím b o lo ; s.ty p e — t i p o , k x em a su p .p u t(iá . k x em a , s); } { p r in t(" ; "); } { 5 = 5up.pe¿(id.fea:ema); p rin t(id .k re m a ); p rin t(" :"); } print (s.tipo)] F igu ra 2.38: E l u so d e las tab las de sím b olos para trad ucir un lengu aje con bloques { in t x; char y ; { b ool y; x; y; > x; y; } e l esq u em a d e traducción elim in a las declaraciones y produce { { x:int; y:bool; } x:int; y:char; } O bserve q ue los cu erp os d e las producciones se alinearon en la figura 2.38, para q ue todos los sím b olos d e g ra m á tica aparezcan en u n a colu m n a y to d a s las accion es en u n a segu n d a colum na. C om o resu ltad o, por lo general, los com p o n en tes d el cu erpo se esparcen a través d e varias líneas. A hora, considerem os las accion es sem án ticas. E l esq u em a de trad ucción crea y d esca rta las tab las d e sím b olos al m om ento d e entrar y salir d e los bloques, resp ectivam en te. L a variable sup d en o ta la ta b la superior, e n e l en cab ezad o d e u n a ca d en a d e tab las. L a prim era producción d e la gram ática su b yacen te es program a -► bloque. L a acción sem á n tica an tes d e bloque inicializa sup a n u il , sin entradas. 2.8 Generación d e código interm edio 91 L a seg u n d a producción, bloque decís i n s t r s tien e accion es a l m om ento en q u e se en tra y se sa le d e l bloque. A l entrar al bloque, an tes d e decís, u n a acción sem á n tica g u a rd a una referencia a la ta b la actual, usando u na variable local llam ad a guardado. C ada u so d e e s ta pro­ d u cción tien e su propia variable local gu ardado, d istin ta d e la variable local para cualquier otro u so d e e s ta producción. E n un analizador sin tá ctico d e d escen so recursivo, gu ardado sería local para e l bloque for d el procedim iento. E n la secció n 7 .2 verem os el tratam ien to d e las variables locales d e u na fun ción recursiva. E l sigu ien te código: sup = n e w E n t(sup); estab lece la variable sup a u n a ta b la recién crea d a q ue e s tá en cad en ad a al valor anterior d e su p, ju sto antes d e entrar a l bloque. L a variable su p es un o b jeto d e la cla se Ent; e l có d ig o p a ra e l con stru ctor E n t aparece en la figura 2.37. A l salir del bloque, d esp u és d e T , u n a acción sem á n tica restaura su p al valor q ue ten ía guardado a l m om ento d e entrar al bloque. E n realidad, las tab las form an u na pila; al restaurar su p a su valor guardado, s e sa c a el efecto d e las declaraciones en e l b loq u e.10 Por en d e, las d eclaraciones en el b loq u e n o so n visib les fuera d e l m ism o. U n a declaración, decís -> t i p o id produce u n a n ueva en trad a para e l identificador de­ clarado. A su m im os q ue los tokens t i p o e id tien en ca d a u no u n a trib u to asociado, q ue es el tip o y el lexem a, resp ectivam en te, d el identificador declarado. E n vez d e pasar p or tod os los c a m p o s d e un o b je to d e sím b olo s, asum irem os q ue h ay un cam p o tipo q ue prop orciona e l tip o d e l sím b olo. C ream os u n nuevo o b je to d e sím b olo 5 y asignam os s u tip o d e m anera apropiada, m ed ian te s .tip o = t i p o .lexem a. L a en trad a co m p leta se co lo ca e n la ta b la d e sím b olos superior m ed ian te su p .p u t(iá . lexem a, s). L a acción sem á n tica en la producción f a c to r ->■ id u tiliz a la ta b la d e sím b olos p a ra obtener la en tra d a p ara el id en tificad or. L a o p era ció n g e t b u sca la p rim era en trad a en la ca d en a d e tab las, em p ezan d o co n sup. L a en trad a q u e se o b tie n e co n tien e to d a la inform ación necesaria acerca d e l identificador, com o s u tip o. □ 2.8 G e n e ra c ió n d e código in te rm e d io E l front-end d e un com pilador con stru ye u n a representación in term ed ia d el program a fuente, a partir d e la cu a l e l back-end g en era e l program a d estin o. E n e s ta secció n considerarem os representaciones interm edias para exp resion es e in stru cciones, y verem os ejem p los d e cóm o producir d ich as representaciones. 2.8.1 D o s tip o s de rep re sen ta cio n es in term ed ia s C om o sugerim os en la sección 2.1 y esp ecia lm en te en la figura 2.4, las d os representaciones in term ed ias m ás im p ortan tes son: i0En vez d e guardar y restaurar tablas en form a exp lícita, u n a alternativa p odría ser agregar las operaciones está tica s p u sh y pop a la clase Ent. 92 Capítulo 2. Un traductor sim ple orientado a la sintaxis • Los árboles, in clu yen d o los d e an álisis sin tá ctico y los sin tá ctico s (abstractos). • Las representaciones lineales, en esp ecial el “cód igo d e tres d irecciones”. Los árboles sin tá ctico s ab stractos, o sim p lem en te sin tá ctico s, se presentaron en la sección 2.5.1, y en la sección 5.3.1 volverem os a exam in arlos d e u n a m anera m ás form al. D urante el análisis sin táctico, se crean los n od os d el árbol sin tá ctico para representar con stru cciones d e program ación im portan tes. A m ed ida q ue avan za e l análisis, se agrega inform ación a lo s nodos en form a d e atrib u tos asociados co n ésto s. L a elecció n d e a trib u to s d ep en d e d e la trad ucción a realizar. Por o tro lado, el cód igo d e tres d irecciones es u na secu en cia d e pasos d e program a elem en ­ tales, com o la su m a d e d o s valores. A diferencia d e l árb ol, n o h ay u n a estru ctu ra jerárquica. C om o verem os en e l ca p ítu lo 9, n ecesitam os e s ta representación si v a m o s a realizar algún tip o d e op tim ización im p ortan te d e cód igo. E n ese caso, d iv id im o s la e x te n sa secu en cia d e instruc­ cion es d e tres direcciones q ue form an un program a e n “bloqu es b á sico s” , q ue so n secu en cias d e instrucciones q u e siem p re s e ejecu tan u na d esp u és d e la otra, sin bifurcaciones. A dem ás d e crear u n a rep resen tación interm edia, el front-end d e u n com p ilad or com p ru eb a q ue el program a fuente sig a las reglas sin tá ctica s y sem á n tica s d e l len gu aje fu en te. A e s ta com p rob ación s e le c o n o ce com o com probación e s tá tic a ; e n general, “e s tá tic o ” sig n ifica “rea­ lizado p or e l com p ilad or” .11 L a com p rob ación e s tá tic a asegura q ue s e d e te c te n cierto s tip o s d e errores d e program ación, in clu yen d o los co n flicto s d e tip o s , y q u e s e reporten d u ra n te la com p ilación. Es p osib le q ue u n com p ilad or con stru ya un árbol sin tá ctico al m ism o tiem p o q ue em ite los p asos d e l cód ig o d e tres direcciones. N o o b sta n te , es com ú n q ue lo s com piladores em ita n el cód igo d e tres direcciones m ientras e l analizador sin tá ctico “avan za en e l proceso” d e construir un árbol sin táctico, sin construir en realidad la estru ctu ra d e d a to s tip o árbol com p leta. En v ez d e ello, el com p ilad or a lm acen a los n od os y su s atrib utos necesarios para la com probación sem á n tica o para otros fines, ju n to con la estru ctu ra d e d a to s u tiliza d a para e l an álisis sin tác­ tico . A l hacer e s to , las p artes d e l árbol sin táctico q u e so n necesarias p a ra construir e l cód igo d e tres direcciones está n d isp on ib les cu an do se n ecesitan , pero d esaparecen cu an do y a no son necesarias. E n el cap ítu lo 5 verem os los d etalles relacionados co n e s te proceso. 2.8.2 C o n stru cc ió n de á rb o les sin tá ctico s Prim ero vam os a proporcionar un esq u em a d e trad ucción para construir árboles sin tá ctico s, y desp ués, en la sección 2.8.4, m ostrarem os cóm o p u ed e m odificarse e s te esq u em a para em itir có d ig o d e tres direcciones, ju n to con , o en v e z d e , e l árbol sin táctico. En la sección 2.5.1 v im o s q ue el árbol sin táctico u Su contraparte, “dinám ico”, sign ifica “m ientras e l programa s e ejecu ta”. Muchos lenguajes tam bién realizan ciertas com probaciones dinám icas. Por ejem plo, un lenguaje orientado a ob jeto s com o Java algunas veces d eb e com ­ probar los tip o s durante la ejecución d e un program a, y a q u e e l m étodo q u e s e aplique a un ob jeto puede depender de la su b clase específica d e e s e objeto. 2.8 Generación d e código interm edio 93 op Ei representa u n a expresión q ue se form a al aplicar el operador o p a las su bexpresiones repre­ sen ta d a s por E i y E¿. P u ed en crearse árboles sin tá ctico s p a ra cualquier con stru cción , no solo exp resion es. C ad a con stru cción s e represen ta m ed ian te u n nodo, co n hijos para lo s com p onen ­ te s co n sign ificad o sem án tico d e la con stru cción. Por ejem p lo, lo s co m p o n en tes co n significado sem án tico d e u n a instrucción w hile e n C: w h i l e ( e x p r ) in s tr so n la exp resión ex p r y la instrucción in str.12 E l nodo del árbol sin tá ctico para u n a instrucción w h ile d e e s te tip o tien e u n op erad or, al cual llam am os w h i l e , y d o s hijos: los árboles sin tá cti­ co s para e x p r y para in str. E l esq u em a d e traducción e n la figura 2.39 con stru ye árboles sin tá ctico s para un lenguaje representativo, pero b astan te lim itado, d e exp resion es e instrucciones. T od os los n o term inales e n e l esq u em a d e trad ucción tien en un atrib u to n, q ue es un n o d o d el árbol sin tá ctico . Los n od os se im plem en tan com o o b je to s d e la cla se N odo. L a clase N odo tien e d os su b clases interm edias: E x p r para to d o tip o d e exp resion es, e I n s tr para tod o tip o de instrucciones. C ad a tip o d e in stru cción tien e u na su b clase corresp ond ien te de I n s tr ; por ejem p lo, el operador w h i l e corresponde a la su b cla se W hile. U n n o d o d e l árbol sin­ tá ctico para el operador w h i l e , con los hijos x y y se crea m ed ian te e l sigu ien te seudocódigo: n ew W hile(x,y) e l cu a l crea u n o b je to d e la clase W hile m ed ian te u na llam ad a al con stru ctor con stru ctora W hile, co n el m ism o nom bre q ue la clase. A l igual q ue los con stru ctores corresponden a los operadores, los parám etros d e los con stru ctores corresponden a lo s op eran d os e n la sin ta x is ab stracta. C uan do estu d iem os e l cód igo d etallad o en e l ap én d ice A , verem os cóm o se co lo ca n los m éto d o s en d o n d e p erten ecen en e s ta jerarquía d e clases. E n e s ta secció n hablarem os só lo de algu nos m éto d os, d e m anera informal. V am os a considerar ca d a u n a d e las producciones y reglas d e la figura 2.39, u n a a la vez. Prim ero exp licarem os las p roducciones q ue definen d istin to s tip o s d e instrucciones, y desp ués las producciones q u e d efinen n uestros tip os lim itad os d e expresiones. Á rboles sin tácticos para las instrucciones P ara ca d a construcción d e u na instrucción, definim os un operador en la sin ta x is abstracta. Para las construcciones q u e em piezan co n u n a palabra clave, vam os a usar la palabra clave para el operador. Por en d e, h ay u n operador w h i l e para las instrucciones w hile y un operador d o para 12El paréntesis derecho sólo sirve para separar la expresión d e la instrucción. E l paréntesis izquierdo en realidad no tien e significado; e s tá a h í sólo para facilitar la legibilidad, y a qu e sin é l, C perm itiría paréntesis desbalanceados. 94 Capítulo 2. p ro gram a -> bloque -* in s tr s -► i i n s tr -► bloque ¿ns£r$ O*' m sír si € Un traductor sim ple orientado a la sintaxis { return bloque.n\ } { bloque.n = in strs.n \ } { in str s .n = n e w S e c (in s tr s \.n , in str.n ); } { in str s .n = n u il; } expr ; { in s tr .n — n e w E u al(expr.n)\ } i f ( e x p r ) in s tn { i n s t r . n = n e w Ij( expr.n, in s tn . n); } w h i l e ( e x p r ) in s tn { in s tr .n = n e w W h ile(ex p r.n , tn sfri.n ); } d o in s tn w h i l e ( e x p r ) ; { i n s t r . n = n e w D o (in s tn .n , ex p r.n ); } bloque { in s tr .n = bloque.n] } expr -► rel = e x p n rel { expr.n = n e w A s i g n a ( ' = re/.n, eæ pn.n); } { expr.n = rel.n\ } i i rel\ < ad ic re/i <= adic a d ic { r e i n = n e w R e l ( ' < re^ .n , ad ic.n); } { r e i n = n e w R e l ( ' < r e t .n , adic.n ); } { r e i n = adic.n; } a dici + te rm te r m { a d ic .n = n e w O p ( ' + a d i & .n , term .n ); { a d ic .n = te r m .n ; } } i ¿ermi * f a c to r /acior { te rm .n = n e w 0p(V, te r m \.n , fa c to r .n); { te rm .n = fa c to r .n] } } ( expr ) num { fa c to r .n = ex p r.n ; } { f a c to r.n = n e w i reí te r m -► -► i ja c fo r -► i n u m . valor); } Figura 2.39: Construcción de árboles sintácticos para expresiones e instrucciones 2.8 Generación d e código interm edio 95 las instrucciones do-w hile. Las instrucciones condicionales pueden m anejarse m ediante la defini­ ción d e d os operadores i f e l s e e i f para las instrucciones i f con y sin u n a p arte e l s e , respectiva­ m ente. E n nuestro lenguaje d e ejem p lo sim ple, no utilizam os e l s e , por lo cual só lo ten em os una instrucción if. A gregar e l s e im plicaría ciertos problem as d e análisis sin táctico, lo cu a l verem os e n la sección 4.8.2. C ada operador d e instrucción tiene u na clase correspondiente con el m ism o nom bre, con la prim era letra en m ayúscula; por ejem plo, la clase //c o r r e sp o n d e a if. A dem ás, definim os la su b clase 5ee, q ue representa a u na secu en cia d e instrucciones. E sta su b clase corresponde a la no term inal in strs d e la gram ática. C ad a una d e esta s clases es su bclase d e In str, q ue a su vez es u n a su bclase d e Nodo. E l esq u em a d e traducción en la figura 2 .39 ilu stra la con stru cción d e los n od os d e árboles sin tá ctico s. U n a regla típ ica es la d e las instrucciones if: in s tr -* i f ( ex p r ) in s tn { in str.n = n e w If(e x p r.n , in a tri.n ); } Los com p on en tes im p ortan tes d e la in stru cción i f son ex p r e in s tn . L a acción sem á n tica define e l nodo m s¿r.n com o u n nuevo o b je to d e la su b clase I f . E l có d ig o para el con stru ctor d e I f n o se m uestra. C rea un nuevo nodo etiq u eta d o com o if, co n los n od os ex p r.n e in s tr i.n com o hijos. Las instrucciones d e exp resion es no em p iezan co n u n a palabra clave, p or lo q ue definim os u n nuevo operador e v a l y la clase Eval, q u e es u na su b clase d e I n s tr , para representar las exp resion es que son instrucciones. L a regla relevante es: in s tr -► ex p r ; { in s tr .n — n e w E v a l (expr.n)] } R e p r e s e n t a c ió n d e lo s b lo q u e s e n lo s á r b o le s s in t á c t ic o s L a con stru cción d e la in stru cción restante en la figura 2 .39 es e l b loq u e, el cu a l co n siste e n una secu en cia d e instrucciones. C onsidere las sig u ien tes reglas: in s tr -► bloque ->■ bloque in s tr s ' } ' { in s tr .n = bloque.n; } { bloque.n = in s tr s .n; } L a prim era d ice q ue cu an d o u n a in stru cción e s un bloque, tien e e l m ism o árbol sin tá ctico q u e el bloque. L a seg u n d a regla d ice q ue e l árbol sin tá ctico para e l no term inal bloque es sim p lem en te e l árbol sin tá ctico para la secu en cia d e instrucciones e n e l bloque. P or cu estió n d e sim p licidad , e l lengu aje en la figura 2 .39 no incluye d eclaraciones. Aun cu an d o las declaraciones s e incluyen en e l apéndice A , verem os q ue el árbol sin tá ctico para u n b loqu e sigu e sien d o e l árbol sin tá ctico p a ra las in stru cciones en e l bloque. C om o la infor­ m ación de las declaraciones e s tá in corporada en la ta b la d e sím b olos, n o se n ecesita e n e l árbol sin táctico. Por lo tan to, los b loqu es (con o sin d eclaraciones) parecen ser só lo o tra construcción d e in stru cción e n e l cód igo interm edio. U n a secu en cia d e instrucciones se represen ta m ed ian te el u so d e u n a h o ja n u i l para una in stru cción vacía, y un operador s e c para u n a secu en cia d e instrucciones, com o s e m uestra a continuación: in strs -► in strsi in s tr { in str s .n — n e w S e c ( in s tr s \.n , in str.n ); } 96 Capítulo 2. Un traductor sim ple orientado a la sintaxis E j e m p l o 2 .1 8 : E n la figura 2.40, vem os p arte d e un árbol sin tá ctico q ue representa a un b lo­ q u e, o lista d e in stru cciones. H ay d os instrucciones en la lista, siend o la prim era u n a instrucción i f y la segu n d a u n a instrucción w h i l e . N o m ostram os la parte d e l árbol q ue e s tá p or en cim a d e e s ta lista d e instrucciones, y só lo m ostram os co m o triángulo a c a d a u no d e lo s subárboles necesarios: d os árboles d e exp resion es para las con d icion es d e las instrucciones i f y w h i l e , y d os árboles d e instrucciones para su s su bin stru cciones. □ se e sec w h ile sec n u il F igu ra 2.40: P arte d e un árbol sin tá ctico para u na lista d e in stru cciones q u e co n siste en u na instrucción i f y u n a in stru cción w h i l e Á r b o le s s in tá c tic o s p a r a la s e x p r e s io n e s A nteriorm ente m anejam os la precedencia m ás a lta d e * so b re + m ed ian te e l uso d e los tres n o term inales ex p r, te r m y fa cto r. E l núm ero d e no term inales e s precisam ente u no m ás el núm ero d e niveles d e p reced en cia en las exp resion es, com o sugerim os e n la sección 2.2.6. E n la figura 2.39, ten em os d o s operadores d e com p aración , < y <= en un nivel d e precedencia, a sí com o los operadores + y * com u nes, p or lo q ue hem os agregado un no term inal adicional, llam ado adic. La sin ta x is a b stra cta n os p erm ite agrupar operadores “sim ilares” para reducir e l núm ero d e ca so s y su b clases d e nodos en u n a im plem en tación d e expresiones. E n e s te ca p ítu lo , “sim ilar” sign ifica q u e las reglas d e com probación d e tip o s y gen eración d e có d ig o para los operadores son sim ilares. P or ejem plo, com ú nm en te los operadores + y * p ueden agruparse, y a q ue pueden m anejarse d e la m ism a forma; su s requerim ientos e n relación con los tip o s d e op eran d os son los m ism os, y cad a u no produce u n a instrucción in dividu al d e tres d irecciones q u e ap lica u n o p e­ rador a d os valores. E n general, el agrupam iento de operadores en la sin ta x is a b stra cta s e b asa en la s n ecesid ades d e las fases p osteriores d el com pilador. L a ta b la en la figura 2.41 esp ecifica la corresp ond en cia entre la sin ta x is con creta y a b stra cta para varios d e los operadores d e Java. En la sin taxis con creta, tod os los operadores so n a sociativos p or la izquierda, ex c ep to el operador d e asign ación =, e l cu a l es asociativo por la derecha. L os operadores en u n a línea 2.8 Generación d e código interm edio Si n t a x i s 97 concreta = Sintaxis abstracta a s ig n a I | && == != <<=>=> + - con d con d reí reí op * / / ! op not - unario [] m en os acceso F igu ra 2.41: S in taxis con creta y a b stra cta para varios operadores d e Java tien en la m ism a precedencia; e s decir, = y ! = tien en la m ism a precedencia. Las líneas está n en ord en de m enor a m ayor precedencia; p or ejem p lo, == tien e m ayor p reced en cia q u e los operado­ res && y =. E l su bín d ice u n a rio en - unario e s só lo para d istingu ir u n sign o d e m enos unario a la izquierda, com o en - 2 , d e un sign o d e m enos binario, com o en 2 - a . E l operador [ ] representa e l acceso a los arreglos, com o e n a [ i ] . L a co lu m n a d e sin ta x is a b stracta esp ecifica e l agrupam iento d e los operadores. E l operador d e asignación = e s tá en u n grupo p or s í solo. E l gru p o c o n d co n tien e los operadores booleanos con d icion ales && y I I. E l gru p o r e í con tien e los operadores d e com paración relaciónales e n las lín eas para == y <. E l gru p o o p con tien e los operadores aritm éticos co m o + y *. E l sign o m enos unario, la negación b o olean a y e l acceso a los arreglos s e en cu en tran en gru p os por s í solos. L a asignación entre la sin ta x is con creta y a b str a cta e n la figura 2.41 p uede im plem entarse escribien do u n esq u em a d e traducción. Las p roducciones para lo s no term in ales ex p r, reí, a d ic, te r m y ¡a c to r en la figura 2.39 especifican la sin ta x is co n creta para un su b co n ju n to represen­ ta tiv o d e los operadores en la figura 2.41. Las accion es sem án ticas e n esta s prod uccion es crean n od os d e árboles sin tácticos. Por ejem plo, la regla te rm -* te rm i * ¡a c to r { te rm .n — n e w O p (V ,te rm \.n , fa c to r.n ) ; } crea un nodo d e la clase Op, q ue im p lem en ta a los operadores agrupados bajo o p en la figura 2.41. E l con stru ctor Op tien e un parám etro V para identificar al operador actual, ad em ás de lo s n od os te r m i.n y fa c to r.n para las subexpresiones. 2 .8 .3 C o m p r o b a c ió n e s t á t i c a Las com p rob acion es está tic a s so n com p rob acion es d e co n sisten cia q ue se realizan d urante la com p ilación. N o so lo aseguran q ue u n program a p u ed a com p ilarse con éx ito , sin o q u e tam bién tien en e l p oten cial para atrapar los errores d e program ación e n form a anticipada, antes de ejecu tar un program a. L a com probación e s tá tic a in clu ye lo siguiente: • C om probación sin tá c tic a . H ay m ás en la sin ta x is q ue las gram áticas. Por ejem p lo, las res­ tricciones com o la d e q ue un identificador se declare cu an do m en os u na vez en u n alcance 98 Capítulo 2. Un traductor sim ple orientado a la sintaxis o q u e u na instrucción break d eb e ir d en tro d e un ciclo o d e u n a in stru cción sw itch , son sin tácticas, aunque n o está n cod ificadas en, o im plem en tad as por, u na g ra m á tica q ue se u tiliz a p ara e l an álisis sin táctico. • C om probación d e tip o s. L as reglas sob re los tip o s d e u n lengu aje aseguran q u e un o p e­ rador o función s e aplique al núm ero y tip o d e op eran d os correctos. Si es necesaria la conversión en tre tip os, p or ejem plo, cu an do s e su m a un en tero a un núm ero d e punto flo ­ ta n te, en ton ces el com probador d e tip o s p uede insertar un operador en el árbol sin tá ctico para representar e s a conversión. A con tinu ación hablarem os sobre la conversión d e tipos, usand o e l térm in o com ú n “coerción ”. L - v a l u e y R - v a l u e A hora considerarem os algu nas com p rob acion es está tic a s sim p les q ue p ueden realizarse d urante la con stru cción d e u n árbol sin tá ctico para un program a fuente. E n general, ta l vez haya q ue realizar com p rob acion es está tic a s com plejas, para lo cu a l prim ero hay q u e construir u na repre­ sentación in term ed ia y d esp u és analizarla. H ay u na diferencia entre el sign ificad o d e los identificadores a la izquierda y el lado derecho d e u n a asignación. E n ca d a u na d e las sigu ien tes asignaciones: i = 5; i = i + 1; e l lado d erech o esp ecifica u n valor entero, m ientras q ue e l lado izquierdo esp ecifica en d ónd e se v a a alm acenar el valor. Los térm inos Vvalue y r-va lu e se refieren a lo s valores q ue son apropiados en los lados izquierdo y derecho d e u na asign ación, resp ectivam en te. E s decir, los r-va lu e so n lo q u e g en eralm en te con sid eram os co m o “valores” , m ien tras q u e lo s U value so n las ubicaciones. La com p rob ación e s tá tic a d eb e asegurar q u e el lado izquierdo d e u n a asign ación d en o te a un l-value. U n identificador com o i tien e un U value, al igual q ue u n acceso a u n arreglo com o a [ 2 ] . Pero una co n sta n te com o 2 no e s apropiada e n e l lado izquierdo d e la asignación, y a q ue tien e un r-va lu e, pero no un l-value. C o m p r o b a c ió n d e t ip o s La com probación d e tip os asegura q u e el tip o d e u n a construcción co in cid a con lo q u e espera su co n tex to . P or ejem plo, en la sigu ien te in stru cción if: ¡ f ( e x p r ) in s tr se esp era q ue la exp resión e x p r te n g a e l tip o b o o l e a n . Las reglas d e com p rob ación d e tip os sigu en la estru ctu ra op era d o r/o p era n d o d e la sin ta x is ab stracta. S u p on ga q ue e l operador r e í representa a los operadores relaciónales com o <=. La regla d e tip os para e l grupo d e op erad ores r e í e s q ue su s d os op eran d os d eb en tener el m ism o tip o, y el resu ltad o tien e e l tip o b oolean o. U tiliza n d o el a trib u to Upo para e l tip o d e u na ex ­ presión, dejem os q ue E c o n sista d e r e í aplicado a E i y E¿. E l tip o d e E p uede com probarse al m om ento d e con stru ir s u nodo, m ed ian te la ejecución d e cód igo com o e l siguiente: 2.8 Generación d e código interm edio 99 i f ( E i.tip o = = E ¿.tipo ) E .tip o = boolean; e ls e error; L a id ea d e relacionar los tip o s actu ales con los esperad os se sig u e aplicando, aún en las sigu ien tes situaciones: • C oerciones. U n a coerción ocurre cu a n d o el tip o d e un operando s e con vierte en form a a u to m á tica al tip o esperado p or e l operador. E n u n a exp resión com o 2 * 3 .1 4 , l a trans­ form ación usual es convertir el en tero 2 en un núm ero d e p u n to flo ta n te equivalente, 2 . 0 , y d esp u és realizar una operación d e p u n to flo ta n te con e l p ar resu ltan te d e operandos d e p u n to flotan te. L a definición d el lengu aje esp ecifica las coercion es dispon ib les. Por ejem plo, la regla actu al para r e í q ue vim os antes p o d ría ser q ue E i.tip o y E ¿.tipo puedan convertirse al m ism o tip o. E n ta l ca so , sería legal com parar, p o r d ecir, un en tero con un valor d e p u n to flotante. • Sobrecarga. E l operador + en J a v a representa la su m a cu an do se ap lica a enteros; sign ifica con caten ación cu an d o se ap lica a cad en as. Se d ice q ue u n sím b olo e s tá sobrecargado si tien e d istin to s significados, d ep en diend o de su co n tex to . Por en d e, + e s tá sobrecargado en Java. P ara d eterm in ar e l sign ificad o de u n operador sobrecargado, h ay q ue considerar los tip o s con ocidos d e su s operandos y resultados. P or ejem plo, sa b em o s q ue e l + en z = x + y es con caten ación si sab em os q ue cu alq uiera d e las variables x, y o z es d e tip o cad en a. N o o b sta n te, si tam b ién sab em os que a lg u n a d e é s ta s es d e tip o entero, en to n ces ten em o s un error en los tip o s y n o h ay sign ificad o para e s te u so d e +. 2 .8 .4 C ó d ig o d e t r e s d ir e c c io n e s U n a vez q ue se con stru yen los árb oles d e sin ta x is, s e p u ed e realizar un p roceso m ás d etallad o d e análisis y sín tesis m ed ian te la evalu ación d e los atrib u tos, y la ejecu ción d e fragm entos de cód ig o en los nodos d e l árbol. P ara ilustrar las p osibilid ades, vam os a recorrer árboles sin ­ tá c tic o s p ara generar cód ig o d e tres direcciones. E n específico, le m ostrarem os cóm o escribir funciones para procesar e l árbol sin tá ctico y, com o efecto colateral, em itir e l có d ig o d e tres d irecciones necesario. I n s t r u c c i o n e s d e t r e s d ir e c c io n e s E l cód igo d e tres direcciones es u na secu en cia d e instrucciones d e la form a x= y op z e n d ond e x, y y z son nom bres, con sta n tes o valores tem porales generados por el com pilador; y o p representa a un operador. M anejarem os los arreglos u sand o las sig u ien tes dos varian tes d e instrucciones: x [ y ] = 2 x= y [ z] 100 Capítulo 2. Un traductor sim ple orientado a la sintaxis La prim era co lo ca e l valor d e 2 en la ubicación x[y] , y la seg u n d a co lo c a e l valor d e y[z] en la ubicación x. Las instrucciones d e tres direcciones se ejecu ta n en secu en cia num érica, a m enos q ue s e les ob ligu e a hacer lo contrario m ediante un sa lto con d icion al o incondicional. E legim os las sigu ien ­ te s instrucciones para el flujo d e control: if F a ls e x g o to L ifT r u e x g o to L g o to L s i a; es falsa, ejecu tar a con tinu ación la in stru cción etiq u e ta d a com o L s i a; es verdadera, ejecu tar a con tinu ación la in stru cción etiq u eta d a com o L ejecu tar a con tinu ación la instrucción etiq u e ta d a com o L Para unir u na etiq u e ta L a cualquier instrucción, se le an tepon e el prefijo L :. U n a instrucción p uede tener m ás d e u n a etiq u eta. Por ú ltim o, n ecesitam os instrucciones para copiar u n valor. L a sig u ien te in stru cción d e tres direcciones co p ia e l valor d e y a x: x= y T r a d u c c ió n d e in s t r u c c io n e s Las instrucciones se trad u cen en cód ig o d e tres d irecciones m ediante e l uso d e instrucciones d e sa lto , para im plem entar el flujo d e con trol a través d e la instrucción. L a d istrib ución d e la figura 2.42 ilu stra la traducción d e i f ex p r t h e n in s tr 1. L a in stru cción d e sa lto en la sigu ien te distribución: i f F a l s e x g o t o después sa lta sobre la trad ucción d e i n s tn si ex p r se ev a lú a com o f a l s e . Las d em á s con stru cciones d e instrucciones se traducen d e m anera sim ilar, usand o sa lto s apropiados alrededor d el cód igo para su s com p on en tes. c ó d ig o p a r a c a lc u la r expr en x i f F a l s e x g o t o d esp u é s c ó d ig o p a r a i n s t ^ d e s p u é s —► F igu ra 2.42: D istribución d e cód ig o para la s in stru cciones if P ara fines con cretos, m ostram os el seu d ocód ig o para la cla se / / e n la figura 2.43. L a cla se I f es u n a su b clase d e I n str, a l igual q u e las clases para las dem ás con stru ccion es d e instrucciones. C ad a su b cla se d e I n s tr tien e un con stru ctor (en e s te ca so , If) y u na función gen, a la cu a l lla ­ m am os para generar e l cód igo d e tres d irecciones para e s te tip o d e instrucción. 2.8 Generación d e código interm edio 101 c l a s s I f e x t e n d s I n s tr { E xpr E\ I n s tr 5; p u b l i c If(E x p r x , I n s tr y) { E = x, S = y; desp u es = n u e va etiq u eta Q ; } p u b l i c v o i d gen () { E xpr n — E .r - v a lu e Q ; e m itir{ “i f F a l s e ” + n .to S trin g Q + “ g o t o ” + despues); S .gen ()\ e m itir (d esp u es + } } F igu ra 2.43: L a función gen en la cla se I f gen era cód igo d e tres direcciones E l con stru ctor d e / / e n la figura 2.43 crea n od os d e árbol sin tá ctico para las instrucciones if. S e llam a co n d o s parám etros, u n n od o d e exp resión x y un nodo d e in stru cción y , los cuales gu ard a com o atrib utos E y S. E l con stru ctor tam bién asign a a l a trib u to despues u na nueva e tiq u e ta ú nica, llam ando a la función n u eva etiq u eta Q . L a e tiq u e ta se utilizará d e acuerdo con la d istrib ución e n la figu ra 2.42. U n a vez q ue se construye e l árbol sin táctico com p leto para un program a fuente, se h a ce una llam ad a a la función gen en la raíz d el árbol sin táctico. C om o un program a es un b loqu e en nuestro lenguaje sim ple, la raíz d el árbol sin táctico representa la secuencia d e instrucciones en el bloque. T od as las clases d e instrucciones con tien en u na función gen. E l seu d ocód igo para la fun ción gen d e la cla se / / e n la figura 2 .43 e s represen tativo. L lam a a E . r _ valueQ para traducir la exp resión E (la exp resión co n valor b oolean o q ue form a p arte de las instrucciones if) y gu ard a e l nodo d e resu ltad o d ev u elto por E . E n b rev e hablarem os sobre la trad ucción d e las expresiones. D esp ués, la función gen em ite un sa lto con d icion al y llam a a S .gen Q para traducir la su b in stru cción S. T r a d u c c ió n d e e x p r e s io n e s A hora ilustrarem os la traducción d e las exp resion es, para lo cu a l considerarem os expresiones q ue con ten gan operadores binarios o p , accesos a arreglos y asignaciones, adem ás d e co n sta n tes e identificadores. Por cu estió n d e sim p licidad , en un acceso a un arreglo y[¿\, requerim os q ue y se a un identificador .13 P ara u n a exp licación d eta lla d a sobre la generación d e có d ig o interm edio para las exp resion es, vea la sección 6.4. V am os a usar e l en foqu e sen cillo d e generar u n a in stru cción d e tres direcciones para ca d a n od o d e operador en e l árbol sin táctico para u na expresión. N o se gen era có d ig o para los iden­ tificadores y las con stan tes, y a q ue ésto s p ueden aparecer com o d irecciones en las instrucciones. S i u n n od o x d e la clase E xpr tien e u n operador o p , en ton ces se em ite u na in stru cción para calcu lar e l valor e n e l nodo x y convertirlo e n un nom bre “tem poral” generado p or e l com p ila­ dor, p o r d ecir, t. P or en d e, i - j + k se traduce en dos instrucciones: 13Efite lenguaje sim ple s o p o r ta a[a[n]], p e ro no a[m] [n]. O bserve q u e a [ a [ n ] ] tien e la fo rm a a[£], e n donde E es a [n ]. 102 Capítulo 2. Un traductor sim ple orientado a la sintaxis ti = i - j t2 = ti + k Con los accesos a arreglos y las asignaciones surge la necesidad d e diferenciar entre los I-valúes y los r-valu es. Por ejem plo, 2 * a [ i ] p u ed e traducirse con virtien do e l r-va lu e d e a [ i ] en u n nom bre tem poral, com o en: ti = a [ i ] t2 = 2 * ti Pero no p od em os sim p lem en te usar un nom bre tem poral e n lugar d e a [ i ] , si a [ i ] aparece en e l lado izquierdo d e u na asignación. El m étod o sim p le u tiliza las d os funciones Uvalue y r-va lu e, q ue aparecen en las figuras 2.44 y 2.45, resp ectivam en te. C uan do la función r-va lu e s e ap lica a un nodo x q ue no es hoja, gen era instrucciones para convertir a i en un nom bre tem poral, y d evu elve un nuevo nodo q ue represen ta a este tem poral. C uan do se ap lica la función Irvalue a un n o d o q u e n o es hoja, tam bién gen era in stru cciones para calcular los su bárboles d eb a jo d e x, y d ev u elv e un nodo q ue represen ta la “dirección” para x. D escribirem os prim ero la función Irvalué, y a q ue tien e m en os casos. A l aplicarse a u n nodo x, la función l-value sim p lem en te d evu elv e x s i e s el n odo para u n identificador (es d ecir, si x e s d e la clase Id). E n n uestro lengu aje sim p le, e l único otro caso en d ond e u n a exp resión tien e un I-valué ocurre cu an d o x representa u n acceso a u n arreglo, com o a [ i ] . E n e s te caso, x ten d r á la form a A cce so {y , z ) , en d ond e la clase A cceso es u n a su b cla se d e E x p r, y represen ta e l nom bre d el arreglo al q u e se v a a acceder y 2 represen ta e l d esp lazam iento (índ ice) d el elem en to elegid o en ese arreglo. D el seu d ocód igo en la figura 2.44, la fun ción IrvalueWama. a r-va lu e(z) p a ra generar instrucciones, si es necesario, para calcu lar el r-va lu e d e 2 . D esp u és con stru ye y d evu elve un nuevo nodo A cceso, con hijos p ara e l nom bre del arreglo y y el r-va lu e d e 2. E xpr lrva lu e(x : E xpr) { i f ( x es u n n od o I d ) r e t u r n x; e l s e i f ( x es un n od o A c ce so (y, 2) y y es un nodo I d ) { r e t u r n n e w A c ce so (y, r-valu e(z))\ } e ls e error; } F igu ra 2.44: S eu docódigo para la función Uvalue E j e m p lo 2 .1 9 : Cuando e l n od o x representa el acceso al arreglo a [ 2 * k ] , la llam ada a lrvalue(x) gen era u na instrucción t = 2 * k y d evu elve u n nuevo n od o x ' q ue representa e l l-value a [ t ] , en d o n d e t es un nuevo nom bre tem poral. En detalle, se llega al fragm ento d e cód igo 2.8 Generación d e código interm edio 103 r e t u r n n e w A c ce so (y, r-va lu e(z))\ e n d on d e y e s el nodo para a y 2 es el n o d o para la expresión 2*k . La llam ad a a r-valu e(z) gen era cód ig o p ara la expresión 2 *k (es decir, la in stru cción d e tres direcciones t = 2 * k ) y d evu elv e el nuevo n od o / , q ue representa a l nom bre tem p oral t . E se nodo z ' se co n v ierte en el valor d e l segu n d o cam p o en e l nuevo n od o A cceso llam ad o x ' q u e se crea. □ E xpr r-v a lu e (x : E xpr) { i f ( x es u n n od o I d o C o n sta n te ) r e t u r n x, e ls e i f ( x es u n n o d o Op ( o p , y , z) o R e í ( o p , y , z) ) { t = nuevo tem poral; em itir ca d en a para t = r-va lu e(y) o p r-valu e(z); r e t u r n u n nuevo n o d o para í; } e l s e i f ( x es u n n o d o A cceso (y , z) ) { t = nuevo tem poral; llam ar a lrvalue(x), q ue d ev u elv e A cceso (y ,zf)\ em itir cad en a para t = A cceso (y , z*); r e t u r n un nuevo nodo para } e l s e i f ( x es u n n o d o A sig n a (y , z) ) { z ' = r-va lu e(z); em itir ca d en a para lrvalue(y) = zf\ r e t u r n z'\ } } F igu ra 2.45: S eu docódigo para la fun ción r-valu e L a función r-valu e en la figura 2.45 gen era instrucciones y d ev u elv e un n odo q u e p o sib le­ m en te e s nuevo. C uan do x representa a un identificador o a u n a co n sta n te, r-va lu e d ev u elv e la m ism a x. E n tod os los d em ás casos, d evu elve un nodo I d para un nuevo nom bre tem poral t. Los casos son los siguientes: • C uan do £ representa a t / o p 2 , e l cód ig o prim ero ca lcu la y ' = r-va lu e(y) y z! = r-va lu e(z). C rea u n nuevo nom bre tem poral t y g en era u n a in stru cción t = y ' o p z ' (dicho en form a m ás precisa, u na instrucción q ue se form a a partir d e las represen taciones d e ca d en a de í / , o p y zf). D evu elve un n odo para e l identificador t. • C uan do x representa un acceso a un arreglo y[¿\, p od em os reutilizar la función Uvalue. La llam ad a a Irvalue(x) d evu elve un acceso i/[¿/], en d ond e z ' represen ta a u n identificador que con tien e e l d esp lazam iento para e l acceso al arreglo. E l có d ig o crea un nuevo nombre tem p oral t, gen era u n a instrucción b asada en t — y[zf] y d ev u elv e un nodo para t. 104 Capítulo 2. Un traductor sim ple orientado a la sintaxis • C uan do x represen ta a y = z , en to n ces e l có d ig o prim ero ca lcu la z' = r-va lu e(z). G enera u n a in stru cción con b ase en lrvalue(y) — zf y d ev u elv e el nodo z ’. Ejemplo 2.20: C uando se ap lica a l árbol sin tá ctico para a[i] = 2*a[j-k] la función r-valu e genera t3 = J t2 = a ti = 2 a [ i ] - k [ t3 ] * t2 = ti Es decir, la raíz es un n odo A sig n a co n el prim er argum ento a [ i ] y e l segu n d o argum ento 2 * a [ j - k ] . P or en d e, se ap lica el tercer caso y la fun ción r-va lu e e v a lú a e n form a recursiva a 2 * a [ j - k ] . L a raíz d e e s te subárbol es e l nodo O p para *, q ue produce la creación d e un nuevo nom bre tem poral t i , an tes d e q ue se evalúe el op eran d o izquierdo 2 , y d esp u és el operando derecho. L a co n sta n te 2 no g en era un cód ig o d e tres direcciones, y su r-va lu e se d evu elve co ­ m o nodo C o n sta n te co n el valor 2. El operando derecho a [ j - k ] e s u n n od o A cceso, el cu a l provoca la creación d e un nuevo nom bre tem p oral t 2 , antes d e q ue se h aga u n a llam ad a a la fun ción l-value en e s te nodo. D espués se hace u n a llam ad a recursiva a r-valu e sobre la exp resión j - k . C om o efecto colateral d e e s ta llam ad a se gen era la instrucción d e tres d irecciones t3 = j - k, u n a vez q ue s e crea e l nuevo nom bre tem poral t 3 . D esp ués, al regresar a la llam ad a d e ¡rvalue sobre a [ j - k ] , al nom bre tem p oral 1 2 s e le asigna e l r-valu e d e la expresión d e acceso com p leta, es decir, t 2 = a [ t 3 ]. A hora regresam os a la llam ada d e r-va lu e sobre el nodo O p 2* a [ j - k ] , q ue anteriorm ente creó el nom bre tem poral t i . U n a instrucción d e tres d irecciones t i = 2 * t 2 se g en era com o un efecto colateral, para evaluar e s ta expresión d e m ultiplicación. Por ú ltim o, la llam ada a r-valu e en to d a la exp resión se co m p leta llam ando a Uvalue sobre e l lado izquierdo a [ i ] y después generando u n a in stru cción d e tres d irecciones a [ i ] = t i , en d on d e e l lado derecho d e la asignación se asig n a a l lado izquierdo. □ Mejor código para las expresiones P od em os m ejorar n uestra función r-valu e en la figura 2.45 y generar m enos instrucciones d e tres direcciones, d e varias formas: • R educir el núm ero d e instrucciones d e co p ia en u n a fase d e op tim iza ció n subsiguiente. P or ejem p lo, e l par d e in stru cciones t = i +1 y i = t p ueden com b inarse en i = i + 1 , si n o h ay u sos su bsiguientes de t . • G enerar m enos instrucciones en prim er lu gar, tom an d o en c u en ta e l co n tex to . Por ejem ­ plo, s i el lado izquierdo d e una asignación d e tres d irecciones es u n acceso a u n arreglo a [ t ] , en ton ces el lado derecho d eb e ser un nom bre, u na c o n sta n te o un nom bre tem poral, ca d a u no d e los cu a les só lo u tiliza u n a dirección. P ero si e l lado izquierdo es un nom bre x, en to n ces e l lado derecho p uede ser u na operación y op z que u tilice d o s direcciones. 2 .9 Resumen d el capítulo 2 105 P od em os evitar ciertas instrucciones d e co p ia m odificando las funciones d e traducción para generar u n a in stru cción parcial q ue calcu le, p or ejem p lo j+ k , pero q ue n o se com p ro m eta a indicar en d ón d e se v a a colocar el resu ltad o, lo cu al s e in d ica m ediante u n a dirección n u i l para e l resultado: n u il = j + k ( 2 . 8) L a dirección d e resu ltad o n u la s e su stitu y e d esp u és p or u n identificador o un nom bre tem poral, seg ú n s e a apropiado. Se su stitu y e p or un identificador si j+ k e s tá en e l lado derecho d e una asignación, co m o en i = j + k ; , en cu yo caso la exp resión ( 2 . 8) se con vierte en i = j + k P ero, si j+ k e s u na su bexpresión, com o en j+ k + 1 , en ton ces la dirección d e resultado nula en ( 2 . 8) se su stitu ye por un nuevo nom bre tem poral t , y se gen era u na n u eva instrucción parcial: t = j + k n u il = t + 1 M uchos com p ilad ores realizan to d o el esfu erzo p osible p or generar có d ig o q u e s e a ta n bueno o m ejor q u e e l cód ig o ensam blador escrito a m ano q ue producen lo s exp erto s. Si se u tiliza n las técn icas d e op tim ización d e cód ig o com o las d el ca p ítu lo 9, en to n ces u na estra teg ia efectiv a p od ría ser u tilizar un m étod o sim p le p ara la generación d e có d ig o interm edio, y d ep en der del op tim izad or d e cód igo para elim inar las in stru cciones innecesarias. 2 .8 .5 E je r c ic io s p a r a la s e c c ió n 2 .8 Ejercicio 2.8.1: Las instrucciones for en C y J a v a tien en la forma: for ( e x p n ; expr¿ ; expr$ ) in s tr L a prim era expresión se eje cu ta an tes d e l ciclo; p or lo gen eral se u tiliza para inicializar e l índice d e l ciclo . L a seg u n d a expresión es u n a p ru eb a q u e se realiza an tes d e c a d a iteración d e l ciclo; se sa le d el ciclo si la expresión s e convierte en 0. E l ciclo en s í p u ed e considerarse com o la instruc­ ción { in s tr ex p rs; } . L a tercera exp resión se eje cu ta al final d e c a d a iteración; p or lo general se u tiliz a para increm entar e l índice d el ciclo. E l sign ificad o de la in stru cción for es sim ilar a: e x p n ; while ( expr¿ ) { in s tr expr 3 ; } D efin a u n a clase F or para las instrucciones for, d e m anera sim ilar a la cla se / / e n la figura 2.43. Ejercicio 2.8.2: E l lengu aje d e program ación C no tien e un tip o b oolean o. M u estre có m o un com p ilad or d e C p od ría traducir u n a in stru cción if e n có d ig o d e tres direcciones. 2.9 R e su m e n d e l c a p ítu lo 2 Las técnicas orien tad as a la sin ta x is q u e vim os en e s te ca p ítu lo p ueden usarse para construir interfaces d e usuario (front-end) d e com piladores, com o las q ue se m uestran en la figura 2.46. 106 C a p ítu lo 2 . if ( v is ta z o = U n tr a d u c to r s i m p l e o r ie n ta d o a la s i n t a x i s *\ n ’ ) l i n e a = l i n e a + 1 ; Analizador léxico (if) ((> (id , " v is ta z o " ) (eq ) ( c o n s t , > \n ’ ) ()) ( i d , " lin e a " ) ( a s ig n a ) (id , " lin e a " ) (+) ( n u m , 1 ) (; ______________________________* ______________________________ Traductor orientado a la sintaxis I 1 : t i = ( in t ) -e\ vistazo 2: i f F a l s e v i s t a z o == t i g o to 4 asigna (in t) i 3\ n 3 / linea / 3: l i n e a = l i n e a + 1 \ 4: + \ linea 1 F igura 2.46: D os p osibles traducciones d e u n a instrucción ♦ E l pun to inicial para un traductor orientado a la sin ta x is es u n a gram ática para el lengu aje fuente. U n a g ra m á tica d escrib e la estru ctu ra jerárquica d e los program as. Se d efine e n térm inos d e sím b olos elem entales, conocidos com o te rm in a le s, y d e sím bolos variables llam ados no term in a les. E sto s sím b olos representan con stru cciones d el lenguaje. Las reglas o produ cciones d e una gram ática con sisten en un n o term inal con ocido com o e l encabezado o lado izqu ierdo d e una producción, y d e u n a secu en cia d e term inales y no term inales, co n ocid a com o e l cuerpo o lado derecho d e la producción. U n no term inal se d esig n a co m o el sím bolo inicial. ♦ A l especificar u n traductor, es conveniente adjuntar atrib utos a la construcción d e pro­ gram ación, en dond e un a tribu to es cualquier can tid ad asociada con una construcción. C om o las construcciones se representan m ed iante sím b olos d e la gram ática, el con cepto d e los atrib u tos s e ex tien d e a los sím b olos d e la gram ática. A lgunos ejem p los d e atrib utos incluyen un valor en tero asociado con u n term in al n u m q u e representa números, y una ca d en a aso cia d a co n u n term inal i d que representa identificadores. ♦ U n an a liza d o r léxico lee la en trad a un carácter a la vez, y produce com o sa lid a u n flujo d e to k en s, en dond e u n token con siste e n un sím bolo term inal, ju n to co n inform ación adi­ cio n a l en la form a d e valores d e atributos. E n la figura 2.46, los tokens se escriben com o n-uplas encerradas en tre ( ). E l token (id , " v is t a z o " ) co n siste en la term inal id y en un apuntador a la en trad a en la ta b la de sím b olos que con tien e la cad en a " v i s t a z o " . El 2 .9 Resumen d el capítulo 2 107 traductor u tiliza la ta b la para llevar la c u en ta d e las palabras reservadas e identificadores que y a s e han analizado. ♦ E l a n álisis sin tá c tic o es e l problem a d e averiguar cóm o p uede derivarse u n a ca d en a de term inales d e l sím b olo d e in icio d e la gram ática, su stitu y en d o en form a rep etid a un no term inal por el cu erpo d e u n a d e su s producciones. E n general, un analizador sin táctico con stru ye un árbol d e an álisis sin táctico , en el cu a l la raíz s e etiq u e ta con e l sím b olo ini­ cial, ca d a nodo q u e no es h oja corresponde a u na p rod ucción y ca d a h o ja se etiq u e ta con un term inal o co n la ca d en a vacía, e. E l árbol d e an álisis sin tá ctico d eriv a la ca d en a de term inales en las hojas, y se lee d e izquierda a derecha. ♦ Los analizadores sin tá ctico s eficien tes p ueden crearse a m ano, m ediante u n m éto d o tipo d escen d en te (d e la raíz h a sta las hojas d e u n árbol d e an álisis sin tá ctico ) llam ado análisis sin tá ctico p redictivo. U n a n a liza d o r sin tá c tic o p re d ictivo tien e un p rocedim ien to para c a d a no term inal; los cu erpos d e los procedim ientos im ita n las p rod uccion es p a ra los no term inales; y, e l flujo d e con trol a través d e lo s cu erpos d e los p rocedim ien tos p uede de­ term inarse sin am bigüedades, analizando un sím b olo d e preanálisis en e l flujo d e entrada. E n e l ca p ítu lo 4 p o d rá ver otros m étod os para e l an álisis sin táctico. ♦ L a trad ucción orien tad a a la sin ta x is s e realiza adju ntand o reglas o fragm entos d e pro­ gram a a las p roducciones en u na gram ática. E n e s te ca p ítu lo hem os considerado sólo los atrib utos sin te tiza d o s, e l valor d e un a trib u to sin tetiza d o e n cualquier nodo x puede d ep en der só lo d e los atrib utos en los hijos d e x, si los hay. U na d efin ició n o rie n ta d a a la sin ta x is ad ju n ta reglas a las producciones; las reglas calcu lan los valores d e los atributos. U n esquem a d e tra d u cció n in crusta fragm entos de program a llam ados acciones se m á n ti­ cas en los cu erpos d e las producciones. Las accion es se ejecu tan en el orden en el q ue se u tilizan las p roducciones d urante el análisis sin táctico. ♦ E l resultado d el análisis sin tá ctico es u na representación d e l program a fuente, conocido com o código in term ed io . E n la figura 2.46 se ilu stran d o s form as principales d e có d ig o in­ term edio. U n árbol sin tá c tic o a b stra cto tien e n od os para las con stru ccion es d e program a­ ción; los hijos d e u n nodo proporcionan las su b con stru ccion es sign ificativas. D e m anera alternativa, e l código d e tre s direccion es es u na secu en cia d e instrucciones, en la cu a l ca d a in stru cción lleva a cab o u n a so la operación. ♦ Las tablas de sím bolos so n estru ctu ras d e d a to s q u e con tien en inform ación acerca d e los identificadores. L a inform ación se co lo c a en la ta b la d e sím b olos cu an do se a n a liza la d eclaración d e u n identificador. U n a acción sem á n tica o b tie n e inform ación d e la ta b la de sím b olos cu an do e l identificador s e vu elve a utilizar, por ejem p lo , com o factor en una expresión. C a p ít u lo 3 Análisis léxico E n e s te cap ítu lo le m ostrarem os cóm o con stru ir un analizador léxico. P a ra im plem entar un analizador léxico a m ano, es ú til em pezar con un d iagram a o cualquier o tr a d escrip ción d e los lexem as d e c a d a token. D e e s ta m anera, p o d em o s escribir có d ig o para identificar c a d a ocurren­ c ia d e ca d a lexem a en la en trad a, y devolver inform ación acerca d e l token identificado. P od em os producir tam b ién un analizador léxico en form a au to m á tica , esp ecifican d o los patrones d e los lexem as a un gen erador de a n a liza d o res léxicos, y com p ilan d o eso s patrones en cód ig o q ue funcione com o un analizador léxico. E ste m éto d o fa cilita la m odificación d e u n ana­ lizador léxico, y a q u e só lo ten em os q u e reescribir los patrones afectad os, y no to d o e l program a. A giliza tam bién el p roceso d e im plem entar el analizador, y a q u e el program ador esp ecifica el softw are e n e l nivel m ás a lto d e los patrones y se b a sa en e l generador para p roducir e l código d eta lla d o . E n la sección 3.5 p resen tarem os u n gen erador d e analizadores léx ico s llam ad o L ex (o F lex, en u na p resen tación m ás reciente). E m pezarem os el estu d io d e los generadores d e analizadores léxicos m ed ian te la presentación d e las exp resion es regulares, u n a n otación con ven iente para especificar lo s p atron es d e lexem as. M ostrarem os cóm o e s ta n otación p uede transform arse, prim ero en a u tó m a ta s no determ in istas y d esp u és en au tóm atas d eterm in ista. E sta s ú ltim a s d os n ota cio n es pueden usarse com o en­ tra d a para un “con trolad or” , es decir, cód ig o q ue sim u la a esto s a u tó m a ta s y los u tiliz a com o g u ía para d eterm in ar e l sigu ien te token. E ste control y la esp ecificación d el a u tó m a ta form an e l núcleo d e l analizador léxico. 3.1 L a fu n c ió n d e l a n a liz a d o r léxico C om o la prim era fase de un com p ilad or, la principal tarea d e l analizador léxico es leer lo s ca­ racteres d e la en trad a d el program a fuente, agruparlos en lexem as y producir com o sa lid a una secu en cia d e tokens para ca d a lexem a e n e l program a fuente. E l flujo d e to k en s se en v ía a l ana­ lizador sin tá ctico para su análisis. C on frecuencia e l analizador léxico in tera ctú a ta m b ién con la ta b la d e sím b olos. C uando e l analizador léxico d escubre un lex em a que c o n stitu y e a u n iden- 109 110 Capítulo 3. Análisis léxico tificador, d eb e introducir ese lexem a en la ta b la d e sím b olos. E n algu nos ca so s, el analizador léxico p uede leer la inform ación relacionad a con el tip o d e inform ación d e la ta b la d e sím b olos, com o ayu da para d eterm in ar e l token apropiado q u e d eb e pasar al analizador sin táctico. En la figura 3.1 se sugieren esta s interacciones. Por lo regular, la interacción se im p lem en ta haciendo q u e el analizador sin tá ctico llam e al analizador léxico. L a llam ad a, sugerida p or el com an d o obten erS igu ien teT oken , hace q ue el analizador léxico le a lo s caracteres d e su en trad a h a sta q ue p ueda identificar el sigu ien te lexem a y producirlo para e l sig u ien te token, e l cual d evu elve al analizador sin táctico. token pro g ram a fu en te A n a liz a d o r A n a liz a d o r léx ico sin tác tico a l an álisis sem án tico o b ten erS ig u ie n te T o k en T a b la d e sím b o lo s F igu ra 3.1: Interacciones entre el analizador léxico y e l analizador sin táctico C om o e l analizador léxico es la p arte d e l com p ilad or q ue lee e l te x to d e origen, d eb e realizar o tra s tareas aparte d e identificar lexem as. U n a d e esa s tareas es elim inar los com entarios y el espacio en blanco (caracteres de espacio, nueva lín ea, tabulador y ta l vez otro s caracteres q ue se u tilicen para separar tok en s en la en trad a). O tra d e las tareas es correlacionar los m ensajes d e error gen erados por e l com pilador con e l program a fuente. Por ejem p lo , el analizador léxico p uede llevar el registro d el núm ero d e caracteres d e nueva lín ea v isto s, para poder asociar un núm ero d e lín ea con ca d a m en saje d e error. E n algunos com p ilad ores, el analizador léxico crea u na co p ia d e l program a fuente con los m ensajes d e error in sertad os en las p osiciones apro­ piadas. S i e l program a fuente u tiliza un preprocesador d e m acros, la exp a n sió n d e las m acros tam bién p ueden form ar parte d e las tareas d e l analizador léxico. A lgunas veces, los analizadores léxicos se d ivid en e n u n a c a sca d a d e d o s procesos: a) E l escaneo co n siste en los procesos sim p les q ue no requieren la d eterm in ación d e tokens d e la en trad a, com o la elim inación de com entarios y la co m p actación d e los caracteres d e espacio en blanco con secu tivos en uno solo. b) E l propio an álisis léxico es la porción m ás com p leja, en d o n d e el escanear produce la secu en cia d e tokens com o salida. 3 .1 .1 C o m p a r a c ió n e n t r e a n á lis is lé x ic o y a n á lis is s in tá c tic o E x isten varias razones p or las cu a les la p arte corresp ond ien te a l análisis d e un com p ilad or se separa en fases d e an álisis léxico y análisis sin tá ctico (p a rsin g ). 3.1 La función d el analizador léxico 111 1. L a sen cillez e n e l d iseñ o es la consideración m ás im portan te. L a separación d el análisis léxico y e l an álisis sin táctico a m enudo nos p erm ite sim plificar por lo m enos u na d e esta s tareas. Por ejem p lo, u n analizador sin tá ctico q ue tu v iera q u e m anejar los com entarios y el esp acio en blanco com o u nidades sin tá ctica s sería m ucho m ás com plejo q u e u no que asum iera que el analizador léxico y a h a elim inad o lo s com entarios y el esp a cio en blanco. Si vam os a d iseñ ar u n nuevo lengu aje, la separación d e las cu estio n es léxicas y sin tá ctica s p uede llevar a u n d iseñ o m ás lim p io d e l lengu aje en general. 2. Se m ejora la eficien cia d el com pilador. U n analizador léxico separado nos p erm ite aplicar técnicas esp ecializad as q ue sirven sólo para la ta rea léxica, no para e l trab ajo d e l análisis sin táctico. A dem ás, las técnicas d e búfer esp ecializad as para leer caracteres d e en trad a pueden agilizar la velocid ad d e l com p ilad or e n form a considerable. 3. Se m ejora la p ortabilidad d el com pilador. Las peculiaridades esp ecíficas d e los d isp ositi­ vos d e en tra d a p ueden restringirse al analizador léxico. 3 .1 .2 T o k e n s , p a tr o n e s y le x e m a s A l hablar sobre el an álisis léxico, u tilizam o s tres térm inos d istin to s, p ero relacionados: • U n token es un par q ue co n siste en un nom bre d e token y un valor d e a trib u to opcional. E l nom bre d e l token es u n sím b olo ab stracto q ue representa u n tip o d e unid ad léxica; por ejem plo, u na palabra clave esp ecífica o u n a secu en cia d e caracteres d e en trad a q ue d en o ­ ta n u n identificador. Los nom bres d e lo s to k en s son los sím b olos d e en trad a q ue procesa el analizador sin táctico. A partir d e e s te m om ento, en general escribirem os el nom bre de un tok en e n negrita. C on frecuencia n os referirem os a u n token por s u nom bre. • U n p atró n e s u n a d escrip ción d e la form a q u e pueden tom ar los lexem as d e u n token. E n e l caso d e u na p alab ra clave com o token, e l p atrón es só lo la secu en cia d e caracteres que form an la palabra clave. P ara los identificadores y algu nos o tro s tokens, e l p a tró n es una estru ctu ra m ás com p leja q ue se relacio n a m ed ian te m uchas cadenas. • U n lexem a e s u na secu en cia d e caracteres en el program a fuente, q ue coinciden co n e l p atrón para u n token y q ue e l analizador léxico id en tifica com o u na in sta n cia d e ese token. E j e m p lo 3 .1 : La figura 3 .2 proporciona algu nos tokens com u nes, su s patrones d escritos de m anera inform al y algu nos lexem as d e ejem plo. L a sigu ien te in stru cción en C nos servirá para ver cóm o se u tilizan esto s co n cep to s en la práctica: p r i n t f ( " T o t a l = 70d \n " , p u n tu a c ió n ) ; ta n to p r i n t f com o p u n tu a c ió n so n lexem as q u e coinciden co n e l patrón para el token id , y " T o ta l = °/od\n" es un lexem a q ue coin cid e co n l i t e r a l . □ E n m uchos lengu ajes d e program ación, las sig u ien tes clases cubren la m ayoría, si n o es que tod os, los tokens: 112 Capítulo 3. Análisis léxico TOKEN if else comparación id numero literal D escripción informal Le x e m a s caracteres i, f if e, 1, s, e <o>o<=o>=o = Else caracteres o != de ejemplo <=, != letra seguida por letras y dígitos pi, puntuación, D2 cualquier constante numérica 3.14159, 0,6.02e23 cualquier cosa excepto ", rodeada por "’ s "core dumped" Figura 3.2: Ejemplos de tokens 1. U n token para cada palabra clave. El patrón para una palabra clave es el m i s m o que para la palabra clave en sí. 2. Los tokens para los operadores, ya sea en forma individual o en clases c o m o el token comparación, mencionado en la figura 3.2. 3. U n token que representa a todos los identificadores. 4. U n o o m á s tokens que representan a las constantes, c o m o los números y las cadenas de literales. 5. Tokens para cada signo de puntuación, c o m o los paréntesis izquierdo y derecho, la c o m a y el signo de punto y coma. 3 .1 .3 A t r i b u t o s p a r a lo s to k e n s Cuando má s de un lexema puede coincidir con un patrón, el analizador léxico debe proporcio­ nar a las subsiguientes fases del compilador información adicional sobre el lexema específico que coincidió. Por ejemplo, el patrón para el token numero coincide con 0 y con 1, pero es en extremo importante para el generador de código saber qué lexema se encontró en el programa fuente. Por ende, en muchos casos el analizador léxico devuelve al analizador sintáctico no sólo el nombre de un token, sino un valor de atributo que describe al lexema que representa ese token; el nombre del token influye en las decisiones del análisis sintáctico, mientras que el valor del atributo influye en la traducción de los tokens después del análisis sintáctico. Va m os a suponer que los tokens tienen cuando menos un atributo asociado, aunque este atributo tal vez tenga una estructura que combine varias piezas de información. El ejemplo más importante es el token id, en donde debemos asociar con el token una gran cantidad de información. Por lo general, la información sobre un identificador (por ejemplo, su lexema, su tipo y la ubicación en la que se encontró por primera vez, en caso de que haya que emitir un mensaje de error sobre ese identificador) se mantiene en la tabla de símbolos. Por lo tanto, el valor de atributo apropiado para un identificador es un apuntador a la entrada en la tabla de símbolos para ese identificador. 3.1 La función d el analizador léxico 113 P r o b le m a s d ifíc ile s d u r a n t e e l r e c o n o c im ie n to d e to k e n s Por lo general, d ad o el patrón q ue d escrib e a los lexem as d e u n token, es m uy sencillo re­ con ocer los lexem as q ue coinciden cu an do ocurren en la entrada. N o o b sta n te, en algunos lenguajes no e s ta n ev id en te cu an d o h em os v isto u n a in sta n cia d e un lex em a q ue corres­ ponde a un token. E l sigu ien te ejem p lo se tom ó de Fortran, en el form ato fijo to d a v ía perm itido en Fortran 90. E n la sigu ien te instrucción: DO 5 I = 1 .2 5 no es evid en te q ue el prim er lexem a e s D 05I, u n a in sta n cia d e l token identificador, h asta q ue vem os e l p u n to q ue v a d esp u és d el 1. O bserve q ue los esp acios e n blanco en e l len­ gu aje Fortran d e form ato fijo se ignoran (una con ven ción arcaica). Si hubiéram os v isto una co m a en v e z d e l punto, ten dríam os u n a instrucción do: DO 5 I = 1 ,2 5 en d on d e el prim er lexem a es la palabra clave DO. E j e m p lo 3 .2 : L os nom bres d e los tokens y los valores d e a trib u to asociados para la siguiente in stru cción en Fortran: E = M * C ** 2 s e escrib en a continuación com o u n a secu en cia d e pares. C id , apuntador a la en trad a e n la ta b la d e sím b olos para E > < a s ig n a _ o p > < i d , apuntador a la en trad a en la ta b la d e sím b olos p a ra M> < m u lt_ o p > C i d , apuntador a la en trad a en la ta b la d e sím b olos p a ra C> C exp_op> e n u m e r o , valor en tero 2 > O bserve q ue en ciertos pares en esp ecial en lo s operadores, sig n o s d e pun tu ación y palabras clave, n o hay necesidad d e un valor d e atrib u to . E n e s te ejem p lo, el tok en n u m e r o h a reci­ bido un atrib u to co n valor d e entero. E n la p ráctica, u n com pilador ordinario alm acenaría en su lugar u na cad en a d e caracteres q ue represente a la co n sta n te, y q ue u tilice com o va lo r de atrib u to para n u m e r o un apuntador a e s a cadena. □ 3 .1 .4 E r r o r e s lé x ic o s S in la ay u d a d e los d em ás com p on en tes es d ifícil para u n analizador léxico saber q u e h ay un error en e l cód ig o fuente. Por ejem plo, s i la ca d en a f i se en cu en tra por prim era v e z en un pro­ gra m a en C en e l sigu ien te contexto: 114 Capítulo 3. Análisis léxico fi ( a = f(x )) ... un analizador léxico no puede sab er si f i es una p alabra cla v e i f m al escrita, o un identificador d e u na función no declarada. C om o f i es u n lex em a válid o para e l token id , e l analizador léxico d eb e regresar el token i d al analizador sin tá ctico y dejar q ue a lg u n a o tra fase d e l com ­ pilador (qu izá el analizador sin táctico e n este caso) m and e un error d eb id o a la transposición d e las letras. Sin em bargo, su p o n g a q u e surge u n a situ ación en la cu al e l analizador léxico no p u ed e pro­ ceder, y a q ue ninguno d e los patrones para los tokens coin cid e co n algú n prefijo d el resto d e la en trad a. L a e str a te g ia d e recuperación m ás sim p le e s la recuperación en “m odo d e pánico” . E lim inam os caracteres su cesivos d e l resto d e la entrada, h a sta q u e e l analizador léxico p ueda encontrar un tok en b ien form ado al principio d e lo q u e haya quedado d e entrada. E s ta técn ica d e recuperación p u ed e confundir al analizador sin táctico, pero en un en torn o d e com p utación interactivo, p u ed e ser b a sta n te adecuado. O tras d e las p osibles accion es d e recuperación d e errores son: 1. Elim inar un carácter d el resto d e la entrada. 2. Insertar un carácter faltan te en e l resto d e la entrada. 3. S u stitu ir u n carácter p or otro. 4. T ransponer d o s caracteres adyacentes. Las transform aciones com o é sta s pueden probarse en un in tento por reparar la entrada. La estra tegia m ás sen cilla es ver si un prefijo d el resto d e la en trad a p uede transform arse en un lexem a válid o m ediante u na transform ación sim ple. E sta estra teg ia tien e sentido, y a q ue e n la práctica la m ayoría d e los errores léxicos involucran a u n so lo carácter. U n a estra teg ia d e correc­ ción m ás general es encontrar el m enor núm ero d e transform aciones necesarias para convertir e l program a fuente en uno q ue co n sista sólo d e lexem as válidos, pero este m étodo se considera dem asiado costoso en la práctica com o para q ue valga la p en a realizarlo. 3 .1 .5 E je rc ic io s p a r a la s e c c ió n 3.1 E j e r c ic io 3 .1 .1 : D ivid a el sigu ien te program a e n C + + : f l o a t c u a d r a d o L im ita d o (x ) f l o a t x { / * d e v u e lv e x a l c u a d r a d o , p e r o n u n ca más d e 100 * / re tu r n ( x < = - 1 0 . 0 ||x > = 1 0 . 0 ) ? 1 0 0 :x * x ; } en lexem as apropiados, usando la exp licación d e la secció n 3 .1 .2 co m o gu ía. ¿Q ué lexem as d e­ berían ob ten er valores léxicos asociados? ¿C uáles deberían ser esos valores? Ejercicio 3.1.2: Los lenguajes In decid ib les com o H TM L o X M L son d istin to s d e lo s d e pro­ gram ación con ven cionales, en q ue la pun tu ación (etiq u eta s) e s m uy num erosa (com o en H TM L) o es un con ju n to d efin ib le p or e l usuario (com o en X M L ). A dem ás, a m enudo la s etiq u eta s pueden tener parám etros. Sugiera cóm o divid ir el sig u ien te d o cu m en to d e HTML: 3 .2 Uso d e búfer en la entrada 115 He a q u í u na f o t o d e <B>mi c a s a < /B > : <PXIMG SRC = " c a s a . g i f "><BR> Vea <A HREF = "m aslm gs .htm l">M ás Im ágenes< /A > s i l e g u s t ó ó sa .< P > e n los lexem as apropiados. ¿Q ué lexem as deberían ob ten er valores léxicos asociad os, y cuáles deb erían ser eso s valores? 3.2 U so d e b ú fe r en la e n tr a d a A n tes d e hablar sobre el problem a d e reconocer lex em a s en la en trad a, vam os a exam in ar al­ gu n as form as en las q u e p uede agilizarse la sim p le pero im p ortan te ta rea d e leer el program a fu en te. E s ta tarea se d ificu lta d eb ido a q ue a m enudo ten em os q u e b uscar u no o m ás caracteres m ás a llá d el sigu ien te lexem a para p od er esta r seguros d e q ue ten em os e l lex em a correcto. El recuadro titu la d o “P rob lem as d ifíciles d urante el recon ocim iento d e tokens” en la secció n 3.1 n os d io un ejem p lo extrem o, pero h ay m uchas situ a cio n es en las q ue d eb em os analizar por lo m enos u n carácter m ás p or ad elantado. P or ejem plo, no p o d em o s esta r seguros d e haber v isto el fin al d e u n identificador sin o h a sta ver un carácter q ue n o es letra n i d íg ito , y q ue, por lo ta n to , n o form a parte d el lexem a para id. E n C, los operadores d e u n so lo carácter com o - , = o < p od rían ser tam b ién e l principio d e un operador d e d os caracteres, com o - > , == o <=. P or en d e, vam os a presentar un esq u em a d e d os búferes q ue se en ca rg a d e la s lee tin a s por ad elan tad o exten sa s sin problem as. D espués considerarem os u n a m ejora e n la q u e se utilizan “cen tin elas” para ahorrar tiem p o a l verificar el final d e los búferes. 3 .2 .1 P a re s d e b ú fe re s D eb id o al tiem p o requerido para procesar caracteres y al ex te n so núm ero d e caracteres que s e d eb en procesar d urante la com p ilación d e un program a fu en te ex ten so , se han desarrollado técn icas esp ecializad as d e u so d e búferes para reducir la can tid ad d e sob recarga requerida en e l p rocesam ien to d e un so lo carácter d e entrada. U n esq u em a im p ortan te im plica e l uso d e dos búferes que se recargan en form a alterna, com o se su giere e n la figura 3.3. M * C * * ~ 2 eof r av an ce in icio L ex e m a F igu ra 3.3: U so d e un par d e búferes d e en trad a C ada búfer e s del m ism o ta m a ñ o N , y p or lo gen eral N es d el tam a ñ o d e un bloque d e disco (es d ecir, 4 096 b y tes). M ediante el uso d e un com an d o d e lectu ra d el siste m a p o d em o s leer N caracteres y colocarlos en un búfer, en v e z d e utilizar u n a llam ad a al siste m a por ca d a carác­ ter. Si quedan m en os d e N caracteres en e l archivo d e entrada, en to n ces un carácter especial, 116 Capítulo 3. Análisis léxico representado por eof, m arca el final d el archivo fuente y es d istin to a cu alq uiera d e los posibles caracteres d el program a fuente. Se m antien en d os apuntadores a la entrada: 1. E l apuntador in ic io L e x e m a m arca e l inicio d el lex em a actual, cu y a ex ten sió n estam os tratan d o d e determ inar. 2. E l apuntador avance ex p lo r a por ad elan tad o h a sta encontrar u n a co in cid en cia en el patrón; d urante el resto d el cap ítu lo cubrirem os la e str a te g ia e x a c ta m ediante la cu a l se realiza e s ta d eterm inación. U n a vez q ue se d eterm in a e l sigu ien te lexem a, a v a n c e se co lo c a en e l carácter q ue se en cu en tra en su extrem o derecho. D espués, u n a vez q ue el lex em a s e registra com o u n valor d e atributo d e un token d ev u elto al analizador sin tá ctico , in ic io L e x e m a s e co lo c a en el carácter q u e v a ju sto d esp u és d el lexem a q ue acabam os de encontrar. E n la figura 3 .3 vem os q u e a v a n c e ha pasado d el final d e l sigu ien te lexem a, ** (el operador d e exp on en ciación en Fortran), y d eb e retractarse u n a p osición a s u izquierda. P ara d esplazar a a v a n c e h acia d elan te prim ero ten em o s q u e probar si hem os llegado al final d e uno d e los búferes, y d e ser así, d eb em os recargar e l otro búfer d e la en tra d a , y m over av a n ­ c e al principio d e l búfer recién cargado. Siem pre y cu an do no ten g a m o s q ue alejarnos ta n to d el lex em a com o para q ue la su m a d e s u lon gitu d m ás la d ista n c ia q u e n os alejam os s e a m ayor q u e N, nunca habrá p eligro d e sobrescribir e l lexem a e n su búfer an tes d e poder determ inarlo. 3 .2 .2 C e n t in e la s Si u tilizam os el esq u em a d e la sección 3.2.1 en la form a descrita, d eb em os verificar, ca d a vez q ue m ovem os e l apuntador avance, que no n os hayam os sa lid o de uno d e lo s búferes; si esto pasa, en to n ces tam b ién d eb em os recargar el o tro búfer. A sí, por c a d a lectu ra d e caracteres hacem os d o s pruebas: u n a para el final d el búfer y la o tr a para d eterm in ar q ué carácter s e lee (esta ú ltim a p uede ser u n a bifurcación de varias v ía s). P od em os com binar la p ru eb a d el final d el búfer co n la p ru eb a d el carecer actu al si exten d em o s ca d a búfer para q u e co n ten g a u n valor cen tin ela a l final. E l ce n tin ela e s un carácter esp ecia l q ue no p uede form ar p arte d e l program a fuente, para lo cual u na o p ción n atu ral e s el carácter eof. La figura 3 .4 m u estra e l m ism o arreglo q ue la figu ra 3.3, pero co n lo s cen tin ela s agregados. O bserve q ue eof retien e su u so com o m arcador d e l final d e to d a la en trad a. C ualquier eof q ue aparezca en o tr a ubicación d istin ta al final d e un búfer sign ifica q ue llegam os al final d e la entrada. L a figura 3.5 sin tetiza e l algoritm o para m over a v a n c e h a cia d elan te. O bserve cóm o la prim era prueba, q ue p uede form ar parte d e u n a bifurcación d e varias v ía s con base en el carácter al q ue a p u n ta a v a n ce, es la ú n ica p ru eb a q ue h acem os, ex c ep to en e l ca so en el q ue en realidad nos encontram os al final d e un búfer o d e la entrada. 3.3 E sp e c ifica c ió n d e los to k e n s Las exp resion es regulares son u na n otación im p ortan te p a ra especificar p atron es d e lexem as. A unque no p ueden exp resar tod os los patrones posibles, so n m uy efectiv a s para especificar los tip os d e patrones q ue en realidad n ecesitam os para los tokens. E n e s ta secció n estu diarem os 3.3 Especificación d e los tokens 117 ¿S e n o s p u e d e a c a b a r e l e s p a c io d e lo s b ú f e r e s ? En la m ayoría d e los lengu ajes m odernos, los lex em a s son co rto s y b a sta con u no o d os caracteres d e lectu ra adelantada. Por en d e, un tam a ñ o d e búfer N alrededor d e lo s m iles es m ás q ue su ficiente, y e l esq u em a d e d o b le búfer d e la secció n 3.2.1 fu n cion a sin p ro­ blem as. N o ob sta n te, ex iste n ciertos riesgos. P or ejem p lo , si las cad en as d e caracteres pueden ser m uy ex ten sa s, q ue p ueden exten d erse en varias líneas, en ton ces p odríam os en fren tam os a la p osibilid ad d e q u e u n lex em a se a m ás grande q u e N . P ara e v ita r proble­ m as co n las cad en as d e caracteres exten sa s, p o d em o s tratarlas co m o u n a con catenación d e com p on en tes, u no d e c a d a línea sob re la cu al s e escribe la cadena. Por ejem p lo, en Java es convencional representar las cad en as ex ten sa s escribien do u n a parte en ca d a línea y con caten an d o las p artes co n u n operador + al final d e ca d a parte. U n problem a m ás d ifícil ocurre cu an do p u ed a ser necesario un p roceso d e lectura ad elan tad a arbitrariam ente exten so. Por ejem plo, algunos lenguajes com o P L /I no tratan a las palabras clave com o re serv a d a s; e s decir, p od em os usar id en tificadores co n el m is­ m o nom bre q ue u na p alabra clave com o DECLARE. Si presentam os al analizador léxico el tex to d e un program a en P L /I q ue em p iece com o DECLARE ( ARG1, ARG2,. . . n o p uede estar seguro si EECLARE e s u n a palabra cla v e y ARG1 , etc é te r a son variables q ue se están declarando, o si DECLARE es e l nom bre d e un procedim iento co n su s argum entos. Por e s ta razón, los lengu ajes m odernos tien den a reservar su s palabras clave. P ero si n o lo hacen, p od em os tratar a u n a p alabra clave com o DECLARE com o un identificador am biguo, y de­ jar que el analizador sin tá ctico resu elva e s ta c u estió n , tal v ez e n con ju n to c o n la b úsqueda en la tab la d e sím b olos. la n otación form al para las exp resion es regulares, y en la sección 3.5 verem os cóm o se utilizan e sta s exp resion es en u n generador d e analizadores léxicos. D esp ués, en la secció n 3.7 verem os cóm o construir el analizador léxico, convirtiendo las ex p resion es regulares en u n a u tó m a ta que realice e l recon ocim iento d e los tokens especificados. 3 .3 .1 C a d e n a s y le n g u a je s U n alfabeto es u n con ju n to fin ito d e sím b olos. A lgu nos ejem plos típ ico s d e sím b olos so n las letras, los d ígitos y los sign os d e p untuación. E l con ju n to {0 , 1 } es e l alfabeto bin ario. A SC II e s un ejem p lo im portan te d e u n alfabeto; s e u tiliza en m uchos sistem a s d e softw are. U nicode, E * M * eof C * t * 2 eof ♦ av an ce in icio L ex e m a F igu ra 3.4: C en tinelas a l final d e ca d a búfer eof 118 Capítulo 3. Análisis léxico s w it c h ( *au ance+ + ) { c a s e eo f: i f ( avan ce e s tá al final d e l prim er búfer ) { recargar e l segu n d o búfer; avan ce = inicio d el segu n d o búfer; } e l s e i f ( avance e s tá al final d e l segu n d o búfer ) { recargar e l prim er búfer; avance = inicio del prim er búfer; } e l s e / * e o f d en tro d e un búfer m arca el final d e la e n tra d a * / term inar e l an álisis léxico; b reak ; C asos para los d em ás caracteres } F igu ra 3.5: C ódigo d e lectu ra por ad elan tad o con centin elas I m p le m e n ta c ió n d e b ifu r c a c io n e s d e v a r ia s v ía s P odríam os im aginar q ue la in stru cción sw itch en la figura 3 .5 requiere m uchos p asos para ejecutarse, y q u e colocar el caso e o f prim ero no es u na elección in teligente. E n realidad, no im p o rta en q u é orden presen tem os los caso s para ca d a carácter. E n la p rá ctica , una bifurcación d e varias vías, d ep en d ien d o d el carácter d e en tra d a , se realiza e n un paso, sa lta n d o a u na dirección en con trad a en u n arreglo d e direcciones, in d ex a d o m ediante caracteres. q ue incluye aproxim adam ente 10 000 caracteres d e los alfab etos alrededor d el m undo, e s otro ejem p lo im p ortan te d e un alfabeto. U n a cadena sob re un alfabeto es u na secu en cia fin ita d e sím b olos q ue se extra en d e ese alfabeto. E n la teoría d el lenguaje, los térm in os “oración” y “p alabra” a m enudo se u tilizan com o sin ónim os d e “cad en a”. L a lon gitu d d e u n a c a d en a s , q ue por lo gen eral s e escribe com o |$ |, es e l núm ero d e ocurrencias d e sím b olos en s. Por ejem p lo, b a n a n a es u na ca d en a con u na longitud d e seis. L a cadena v a c ía , representada p or e, e s la ca d en a d e longitud cero. U n lenguaje e s cualquier conjunto con tab le d e ca d en as sobre algú n alfabeto fijo. E sta definición es d em asiad o am plia. Los lenguajes ab stractos com o 0, el conjunto v a c ío , o { e } , el con ju n to q ue con tien e só lo la ca d en a vacía, so n lengu ajes b a jo e s ta definición. Tam bién lo son e l conjunto d e to d o s los program as en C q ue está n bien form ados en sen tid o sin tá c tic o , y el con ju n to d e tod as las oraciones e n inglés gram áticalm ente correctas, aunque e sto s ú ltim os d os lenguajes son difíciles d e especificar co n ex a c titu d . O bserve q ue la d efinición d e “len g u a je” n o requiere q u e se atrib u ya algún sign ificad o a las cad en as en el lengu aje. E n e l ca p ítu lo 5 verem os los m étod os para definir e l “sign ificad o” d e las cadenas. 3.3 Especificación d e los tokens 119 T érm in o s p a ra p a rte s de caden as Los sigu ien tes térm inos relacionados co n ca d en a s son d e uso com ún: 1. U n p re fijo d e la ca d en a s es cualquier ca d en a q u e se o b tien e al elim inar cero o m ás sím b olos del final d e s. P or ejem p lo, ban, banan a y e so n prefijos d e banana. 2. U n su fijo d e la cad en a s e s cualquier ca d en a q ue se o b tie n e al elim inar cero o m ás sím b olos d el principio d e s. Por ejem plo, nana, b an a n a y e son sufijos d e banana. 3. U na subcadena d e 5 se o b tie n e al elim inar cualquier prefijo y cualquier sufijo d e s. P or ejem p lo, banana, nan y e so n su b cad en as d e banana. 4. Los prefijos, sufijos y su b cad en as p ro p io s d e u n a c a d en a 5 son eso s prefijos, sufijos y su b cad en as, resp ectivam en te, d e s q ue no son e ni so n igu ales a la m ism a s. 5. U na subsecuencia de s es cualquier ca d en a q u e se form a m ed ian te la elim inación de cero o m ás p osiciones no necesariam ente co n secu tiv a s d e s. P or ejem plo, b a a n es u n a su b secu en cia de banana. S i £ y y so n cad en as, en ton ces la con caten ación de x y y, d en o ta d a p or x y, e s la cad en a q u e se form a al unir y co n x P or ejem plo, s i x = s u p e r y = m ercado, en to n ces x y = s u p e r ­ m ercad o. L a cad en a v a cía e s la id en tidad e n la con catenación; es decir, p a ra cualquier cad en a 5, es — se — s. Si p en sam os en la con caten ación com o un prod ucto, p od em os definir la “ex p o n en cia ció n ” d e cad en as d e la sigu ien te form a. D efin a a 3o p a ra q ue s e a e, y para tod as la s i > 0 , d efin a a 5* para q ue se a $*- 1 s. C om o es — s, resu lta q ue s1 = s. E n to n ces s2 = ss, s 3 = s s s , y a sí sucesi­ vam ente. 3.3.2 O p eracio n es en los len gu ajes E n e l a n álisis léxico, las op eracion es m ás im p o rta n tes e n los len g u a jes so n la u nión, la conca­ ten a ció n y la cerradura, las cu ales se d efin en d e m a n era form al en la figu ra 3.6. L a u n ión es la op eración fam iliar que se hace co n los con ju n tos. L a co n ca ten a ció n d e len g u a jes e s cu an do s e co n caten an to d a s las cad en as q u e se form an al tom ar u n a ca d en a d el prim er len gu aje y u na cad en a d el segu n d o lengu aje, en to d a s las form as posibles. La cerradura (K lee n e) d e un len gu aje L , q u e se d en ota com o £ * , e s el con ju n to d e ca d en a s q u e se o b tien en a l con catenar L cero o m ás veces. O b serve q ue L°, la “co n ca ten a ció n d e L cero v eces” , se d efin e co m o {e }, y por in ducción, U es L l~l L. P or ú ltim o, la cerradura p o sitiv a , d en o ta d a co m o L + , es igual q ue la cerradura d e K leen e, pero sin el térm in o L°. E s decir, e n o esta r á en L + a m en o s que e s té en el m ism o L. 120 Capítulo 3. Análisis léxico O p e r a c ió n D e f in ic ió n y n o t a c ió n Unión d e L y M L U M = { s | s e s tá en L o s e s tá en M } C on caten ación d e L y M L M = { st \ s e s tá en L y t e s tá e n M } Cerradura d e K lee n e d e L Cerradura p o sitiv o d e L L * = U £ o L% L+ = U S i V Figura 3.6: D efin iciones d e las op eracion es en los lenguajes E j e m p l o 3 .3 : S ea L el con ju n to d e letras {A, B, . . Z, a , b , . . . , z } y se a D el con ju n to d e d íg itos {0 , 1 , . . .9 } . P od em os pensar en L y D d e d os form as, e n esen cia eq u ivalen tes. U n a form a es q ue L y D son , resp ectivam en te, los alfab etos d e la s letras m ayúsculas y m inúsculas, y d e los d íg ito s. L a seg u n d a form a es q ue L y D so n lengu ajes cu yas ca d en as tien en longitud d e uno. H e aq u í algunos otros lengu ajes q ue p ueden con stru irse a partir d e los lenguajes L y Z>, m ed ian te los operadores d e la figura 3.6: 1. L U D es e l con ju n to d e letras y d ígitos; h ablando e n sen tid o estricto , e l lengu aje co n 62 cad en as d e lon gitu d uno, y cad a u n a d e las cad en as es u na letra o un d ígito. 2. L D es e l con ju n to d e 520 cad en as de lon gitu d dos, ca d a u na d e las cu ales co n siste en una letra, se g u id a d e u n d ígito. 3. L4 es el con ju n to d e tod as las cad en as d e 4 letras. 4 . L * es e l con ju n to d e tod as las cad en as d e letras, incluyendo e, la ca d en a vacía. 5. L (L U D )* es el con ju n to de tod as las cad en a s d e letras y d íg ito s q ue em p iezan con u na letra. 6. D * es e l con ju n to d e tod as las cad en as d e u no o m ás d ígitos. 3.3.3 E x p re sio n e s re g u la re s Su p on ga q ue d eseam os describir el con ju n to d e identificadores válid os d e C. E s ca si el m ism o lengu aje d escrito en el p u n to (5) anterior; la única diferencia e s q ue se incluye el gu ión bajo entre las letras. En el ejem p lo 3.3, p udim os describir los identificadores proporcionando nom bres a los con jun tos d e letras y d íg ito s, y u sand o los operadores d e u nión, con caten ación y cerradura d el lenguaje. E ste proceso e s tan ú til q ue se h a em p eza d o a u tilizar com ú nm en te u n a n otación co ­ n o cid a com o expresion es regu lares, p ara describir a to d o s lo s lengu ajes q ue puedan construirse a partir d e e s to s operadores, aplicados a los sím b olos d e cierto alfabeto. E n e s ta n o tación , si ¿e¿ra_ s e estab lece de m anera q u e represente a cualquier letra o al gu ión bajo, y d íg ito _ se 121 3.3 Especificación d e los tokens estab lece d e m anera q ue represente a cualquier d íg ito , en to n ces p odríam os d escribir e l lenguaje d e los identificadores de C m ediante lo siguiente: letra- ( le tr a - \ d íg ito ) * L a barra vertical d e la exp resión anterior sig n ifica la unión, los paréntesis s e u tilizan para agrupar las su b exp resion es, e l asterisco in d ica “cero o m ás ocu rren cias d e ” , y la y u x ta p o sició n d e letra_ co n el resto d e la exp resión in d ica la concatenación. Las exp resion es regulares se con stru yen en form a recursiva a partir d e las exp resion es re­ gu lares m ás pequeñas, u sand o las reglas q ue describirem os a con tinu ación. C ad a expresión regular r d e n o ta un lengu aje L (r), e l cu a l tam bién s e d efin e en form a recursiva, a partir d e los lengu ajes d en otad os p or las su bexpresiones d e r. H e aq uí las reglas q ue d efinen la s expresiones regulares sobre cierto alfab eto E , y los lengu ajes q u e d en o ta n d ich as expresiones. B A SE : H ay d o s reglas que form an la base: 1. e es u na exp resión regular, y L (e) es { e } ; e s d ecir, e l len gu aje cu y o único m iem bro es la cad en a vacía. 2. Si a e s u n sím b olo en S , en ton ces a es u na exp resión regular, y L (a ) = { a } , es d ecir, el lengu aje con u n a cadena, d e lon gitu d uno, co n a en su ú n ica p osición. T enga en cu en ta que por con ven ción u sam os cu rsiva para los sím b olos, y n eg rita p a ra su correspondiente expresión regular.1 IN D U C C IÓ N : H ay cu atro partes q ue co n stitu y en la inducción, m ediante la cu a l la s exp resio­ n es regulares m ás gran d es se con stru yen a partir d e las m ás pequeñas. S u p on ga q ue r y s son exp resion es regulares q ue d en o ta n a los lengu ajes L (r ) y L (s), respectivam ente. 1. (r )|(s) e s u na exp resión regular q ue d e n o ta e l lengu aje L (r ) U L (s). 2. (r)(s) es u n a exp resión regular q ue d en o ta el len gu aje L (r )L (s). 3. (r)* e s u n a exp resión regular q u e d e n o ta a (L (r))* . 4. (r) e s u n a expresión regular q ue d e n o ta a L (r ). E s ta ú ltim a regla d ice q ue p od em os agre­ gar pares adicionales d e paréntesis alrededor d e las exp resion es, sin cam biar e l lenguaje que d en otan . Según s u d efinición, las exp resion es regulares a m enudo con tien en pares innecesarios d e pa­ réntesis. T al v e z s e a necesario elim inar ciertos pares d e p aréntesis, s i a d op tam os las sigu ientes convenciones: a) E l operador unario * tien e la p reced en cia m ás a lta y es a so cia tiv o a la izquierda. b) L a con caten ación tien e la seg u n d a precedencia m ás a lta y e s a so cia tiv a a la izquierda. 1 Sin embargo, al hablar sobre los caracteres específicos del conjunto de caracteres ASCII, por lo general, usaremos la fuente de teletipo para el carácter y su expresión regular. 122 Capítulo 3. Análisis léxico c) | tien e la p reced en cia m ás b aja y e s asociativ o a la izquierda. Por ejem plo, bajo esta s con ven ciones p od em os su stitu ir la expresión regular ( a ) |( ( b ) * ( c ) ) por a | b * c . A m b as exp resion es d en otan e l con ju n to d e ca d en as q ue so n u n a so la a o cero o m ás bs segu id as por u na c. E j e m p l o 3 . 4 : S ea E = { a , b}. 1. L a exp resión regular a | b d e n o ta e l lengu aje {a , 6}. 2. ( a | b ) ( a | b ) d e n o ta a {aa, a6,6a, 66}, el lengu aje d e to d a s la s ca d en as d e lo n g itu d dos sobre e l alfab eto E . O tra expresión regular para e l m ism o lengu aje sería a a | a b | b a | b b . 3. a * d e n o ta e l len gu aje q ue co n siste e n tod as las ca d en a s d e cero o m ás as, e s d ecir, { e , a, aa, aaa, ...} . 4. ( a |b ) * d en o ta e l con ju n to d e to d a s las cad en as q ue co n sisten en cero o m ás in stancias d e a o 6, es decir, to d a s las cad en as d e as y 6s: {e, a, 6, aa, a6,6a, 66, aaa, . .. } . O tra expresión regular para e l m ism o lengu aje es ( a * b * ) * . 5. a | a * b d en o ta el lengu aje {a, 6, a6, aa6, a a a 6 ,. . . } , es decir, la ca d en a a y tod as las cad en as q ue co n siste n en cero o m ás as y q ue term inan en 6. A un lengu aje q ue p uede d efinirse m ediante u na exp resión regular se le lla m a conjunto regular. Si d os exp resion es regulares r y a d en o ta n el m ism o con ju n to regular, d ecim os q ue son equ ivalen tes y escribim os r = s. P or ejem plo, ( a | b ) = ( b |a ) . H ay u na variedad d e leyes algebraicas para las exp resion es regulares; ca d a ley afirm a q ue las exp resion es d e d o s form as d istin ta s so n eq u ivalen tes. L a figura 3 .7 m u estra p a rte d e las leyes algebraicas para la s expre­ sion es regulares arbitrarias r, s y t. Le y fj s — s |r r\(s\t) = (r|s)|£ r (s t) = (r s ) t D e s c r ip c ió n | e s con m utativo | e s asociativo L a con caten ación es asociativa r(s|¿) = rs\rt\ ( $ |¿ ) r = s r \tr L a con caten ación se d istrib uye so b re | v. II £ II vu e es la id en tidad para la con catenación r * = (r|e)* r ** = r * e se g a ra n tiza en u n cerradura * e s id em p oten te F igu ra 3.7: L eyes algebraicas para las exp resion es regulares 3.3 Especificación d e los tokens 3.3.4 123 D efin icio n es reg u la res P or con ven iencia d e n otación, ta l v e z se a con ven ien te p on er nom bres a cierta s expresiones regulares, y utilizarlos en las exp resion es su bsiguientes, com o s i los nom bres fueran sím bolos por s í m ism os. S i E es u n alfab eto d e sím b olos básicos, en to n ces u n a d efin ició n reg u la r es una secu en cia d e d efinicion es d e la forma: di di -+ n —► r2 dn rn e n donde: 1. C ad a di es un nuevo sím b olo, q ue no e s tá en E y no es el m ism o q ue cualquier o tro d. 2. C ad a es u n a exp resión regular sob re e l alfabeto E U { á i, d¿, . . . , d i- J . A l restringir a E y a las á s d efinidas co n anterioridad, ev ita m o s las d efinicion es recursivas y p od em os construir u n a exp resión regular so b re E so la m en te, para ca d a r¿. P ara ello, prim ero su stitu im o s los u sos d e d i en r2 (que no p uede usar n in gu n a d e las d s, ex cep to d i), d esp u és su s­ titu im o s los u sos d e di y d¿ en r3 por ri y (la su stitu ció n d e) r2, y a sí en lo su cesivo. Por últim o, e n r n su stitu im o s c a d a para ¿ = 1 , 2 , ... , n — 1 , por la versión su stitu id a d e r¿, ca d a u n a de las cu a les só lo tien e sím b olos d e E . E j e m p l o 3 . 5 : Los identificadores d e C so n ca d en a s d e letras, d íg ito s y gu io n es bajos. H e aquí u na definición regular para e l lengu aje d e los identificadores d e C . Por con ven ción, usarem os c iu s iv a para los sím b olos d efinidos en las d efinicion es regulares. letra_ - » d íg ito - » id -► A | B |- • -| Z | a | b |- • -| z 0 | 1 |* • *¡ 9 | _ letra_ ( letra _ | d íg ito )* □ E j e m p l o 3 . 6 : Los núm eros sin sign o (enteros o d e punto flo ta n te) so n ca d en a s com o 5280, 0 .0 1 2 3 4 , 6 .3 3 6 E 4 o 1 .8 9 E -4 . L a definición regular d ig ito dígitos fra cc io n O p c io n a l expon en te O pcion al n u m ero -+ -* -► -► 0 | 1 I* • *| 9 digito d ig ito * . á g ito s \ e ( E ( + | - | c ) díg ito s ) | e dig ito s fra ccio n O p cio n a l ex p on en teO pcion al e s u n a especificación precisa para e s te con ju n to d e cad en as. E s decir, u n a fra ccio n O p cio n a l es u n punto d ecim al (pu nto) segu id o d e u no o m ás d íg ito s, o se o m ite (la ca d en a v a cía ). U n ex­ po n en teO p cio n a l, si no se om ite, es la letra E seg u id a d e u n signo o p cio n a l + o —, seguid o de u no o m ás d íg ito s. O bserve q ue p or lo m enos u n d ígito d eb e ir d esp u és d e l p unto, d e m anera q u e n u m ero no coincide con 1 . , pero s í co n 1 . 0 . □ 124 Capítulo 3. Análisis léxico 3.3.5 E x te n sio n e s de las ex p re sio n es reg u la res D esd e q ue K leen e introdujo las exp resion es regulares co n los operadores b ásicos para la unión, la con caten ación y la cerradura d e K leen e en la d éca d a d e 1950, s e han agregado m uchas ex ­ ten sion es a las exp resion es regulares para m ejorar su habilidad a l especificar los p atron es d e cad en as. A q u í m en cion am os algu nas ex ten sion es rotacionales q ue se incorporaron por prim era v ez en las herram ientas d e U n ix com o Lex, q u e so n m u y ú tiles en la especificación d e los ana­ lizadores léxicos. L as referencias a e ste ca p ítu lo co n tien en u na exp licación d e algu nas variantes d e exp resion es regulares en uso h oy en día. 1. Una o m á s in sta n cia s. E l operador unario p o stfijo + represen ta la cerradura p o sitiv o d e u n a exp resión regular y s u lengu aje. E s decir, si r e s u n a exp resión regular, en to n ces (r )+ d en ota el len gu aje ( L ( r ) ) +. E l operador + tien e la m ism a p reced en cia y a so ciativid ad q ue el operador *. D os leyes algebraicas ú tiles, r * = r+ |e y r+ = r r * = r * r relacionan la cerradura d e K leen e y la cerradura positiva. 2. C ero o u na in sta n c ia . E l operador unario postfijo ? sign ifica “cero o u na ocu rren cia”. Es decir, r? es eq u ivalen te a r|e, o d ich o d e o tr a form a, L (r? ) = L (r ) U {e}. E l operador ? tien e la m ism a preced en cia y asociativid ad q ue * y + . 3. C lases d e caracteres. U n a expresión regular ai|o2h ' 'Ia»» e n d on d e las a¿s so n ca d a u na sím b olos d el alfab eto, p uede su stitu irse m ed ian te la abreviación [a i 02 - • - 0^]. Lo q ue es m ás im p ortan te, cu an d o ai, oq, . . . , On form an u n a secu en cia lógica, p or ejem p lo , letras m ayúsculas, m inúsculas o d ígitos con secu tivos, p od em os su stitu irlo s p or ai~an; es decir, só lo la prim era y ú ltim a separadas por u n gu ión corto. A sí, [a b e] es la abreviación para a |b |c , y [a-z] lo e s para a |b |- • -|z. E j e m p lo 3 .7 : M ediante e s ta s abreviaciones, p od em os rescribir la d efinición regular d e l ejem ­ plo 3.5 como; letra_ —► [A-Za-z_] dígito [0-9] id -► letra_ ( letra \ d ig ito )* La definición regular d e l ejem p lo 3.6 tam b ién p u ed e sim plificarse: dig ito -► [0-9] dig íto s -► d ig ito + n u m ero -► d ig íto s ( . dig ito s)? (E [+-]? d íg ito s )? 3.3 Especificación d e los tokens 3.3.6 125 E je rc ic io s p a ra la sección 3.3 E j e r c i c i o 3 . 3 . 1 : C onsulte los m anuales d e referencia d el lengu aje p a ra d eterm inar (i) los con ­ ju n to s d e caracteres q u e form an el alfabeto d e en tra d a (excluyend o aquellos q ue sólo puedan aparecer en cad en as d e caracteres o com en tarios), (ii) la form a léxica d e las co n sta n tes n u m é­ ricas, y ( iii) la form a lé x ic a d e los id en tificad ores, p a ra ca d a u n o d e los sig u ie n tes lenguajes: (a) C (b) C + + (c) C # (d ) Fortran (e) J a v a (f) L isp (g) SQL. ! E j e r c i c i o 3 .3 .2 : D escrib a los lenguajes d en o ta d o s p or las sig u ien tes exp resion es regulares: a) a ( a |b ) * a . b ) ((e |a )b * )* c) ( a |b ) * a ( a |b ) ( a |b ) . d) a* b a * b a * b a * . !! e ) ( a a | b b ) * ( ( a b | b a ) ( a a | b b ) * ( a b | b a ) ( a a | b b ) * ) * . E j e r c i c i o 3 .3 .3 : E n u na cad en a d e lon gitu d n, ¿cu án tos d e lo s sig u ien tes hay? a) Prefijos. b ) Sufijos. c) P refijos propios. ! d ) Subcadenas. ! e) Subsecuencias. E j e r c i c i o 3 . 3 . 4 : L a m ayoría d e los lenguajes so n sensibles a m a yú scu la s y m in ú scu la s, por lo q ue las palabras clave sólo p ueden escribirse d e u n a form a, y las exp resion es regulares que describ en su lexem a so n m uy sim ples. N o o b sta n te, algu nos lenguajes com o SQL so n in se n si­ bles a m a yú scu las y m in ú scu la s, por lo q u e u n a p alabra cla v e p u ed e escribirse e n m inúsculas o e n m ayúsculas, o en cualquier m ezcla d e am bas. Por en d e, la p alabra clave SELECT d e SQL tam b ién p u ed e escribirse com o s e l e c t , S e l e c t o sE lE cT . M uestre cóm o escribir u n a expresión regular para u na p alabra clave e n un lengu aje in sen sib le a m ayúsculas y m inúsculas. Ilustre la id ea escribiendo la exp resión para “se le c t” e n SQL. ! E j e r c i c i o 3 .3 .5 : E scriba d efinicion es regulares para los sigu ientes lenguajes: a) T od as las cad en as d e letras en m inúsculas q u e co n ten gan la s cin co v o ca les e n orden. b) T od as las cad en as d e letras e n m inúsculas, en las q ue las letras s e en cu en tren en orden lexicográfico ascendente. c) C om entarios, q u e co n sistan d e u n a ca d en a rodeada p or / * y * / , s i n u n * / entre ello s, a m en os q ue se encierre en tre d obles com illas ("). 126 Capítulo 3. Análisis léxico !! d ) T odas las cad en as d e d ígitos sin d ígitos rep etid os. S ugeren cia: P ru eb e este problem a prim ero co n unos cu an tos d íg ito s, com o { 0 , 1, 2}. !! e) T odas las cad en as de d ígitos q ue ten g a n por lo m en os u n d íg ito repetido. !! f ) T od as las cad en as de os y fe con un núm ero par d e as y u n núm ero im par d e bs. g) E l con ju n to d e m ovim ientos d e A jedrez, en la notación inform al, com o p -k 4 o k b p x q n . !! h) T odas i) T od as las cad en as de las cad en as os y de as y fe q ue n o co n ten gan la su b ca d en a abb. fe q ue n o co n ten gan la su b secu en cia abb. E j e r c ic io 3 .3 .6 : E scriba cla ses d e caracteres p ara los sig u ien tes co n ju n to s d e caracteres: a) L as prim eras d iez letras (h a sta “j ”) , y a s e a e n m ayúsculas o en m inúsculas. b) L as con son an tes en m inúsculas. c) Los “d ígitos” en un núm ero hexad ecim al (elija m ayúsculas o m inúsculas para los “d ígi­ to s” m ayores a 9). d) L os caracteres q u e p ueden aparecer al final d e u na oración leg ítim a e n in glés (por ejem ­ plo, el sign o d e adm iración). Los sigu ien tes ejercicios, h a sta e incluyendo el ejercicio 3.3.10, tra ta n acerca d e la n otación d e exp resion es regulares exten d id a s d e Lex (el generador d e analizadores léxicos q u e verem os con d etalle en la sección 3 .5). L a notación ex te n d id a se p resen ta en la figura 3.8. E j e r c ic io 3 .3 .7 : O bserve q ue esta s exp resion es regulares proporcionan a tod os lo s sigu ientes sím b olos ( caracteres de operadores) u n sign ificad o especial: \ " . - $ [ ] ♦ + ? { > ! / Su sign ificad o esp ecial d eb e d esactivarse si s e n ecesitan p a ra representarse a s í m ism os en u na ca d en a d e caracteres. P ara ello, d eb em os colocar el carácter entre com illas, d en tro d e u na ca ­ d en a d e lon gitu d u no o más; p or ejem plo, la exp resión regular "**" coincide co n la ca d en a **. Tam bién p od em os ob ten er el sign ificad o literal d e un carácter d e operador si le anteponem os una barra d iagon al inversa. P or en d e, la expresión regular \ * \ * tam bién coincide co n la ca d en a **. E scrib a u n a exp resión regular q u e co in cid a con la ca d en a "V E j e r c ic io 3 .3 .8 : E n Lex, u na clase d e ca rá cte r co m p lem en ta d o represen ta a cualquier carác­ ter, ex cep to los q ue se lista n en la c la se d e carácter. D en otam os a u n carácter com p lem en tado m ediante el uso d e ~ com o el prim er carácter; este sím b olo no form a e n s í parte d e la clase q ue se e s tá com p lem en tand o, a m en os que se liste d en tro d e la m ism a cla se. A sí, [~A -Z a-z] coincide co n cualquier carácter q ue no s e a u n a letra m a yú scu la o m inúscula, y [ ~ V ] representa a cualquier carácter ex cep to ~ (o n u eva lín ea, y a q ue e l carácter n u eva lín ea n o p u ed e estar en n in gu n a clase d e caracteres). M u estre q ue para cualquier expresión regular co n clases d e caracteres com p lem en tados, hay una exp resión regular eq u ivalen te sin clases d e caracteres com p lem en tados. 3.3 Especificación d e los tokens Ex p r e s ió n 127 C o in c i d e con E je m pl o c u n carácter c q ue no se a operador a V e l carácter c, literalm en te la cad en a 3, literalm ente \* »**» . cualquier carácter ex cep to n u eva línea a . *b * e l inicio d e u na línea "abe $ e l final de u n a lín ea a b c$ [«] cualquiera d e los caracteres e n la ca d en a 5 [ab e] r*] cualquier carácter q ue n o e s té en la ca d en a s [~ a b c] r* cero 0 m ás cad en as q ue coincidan con r a* r+ u n a 0 m ás cad en as q u e coincidan con r a+ r? cero 0 u n a r a? r{m , n} en tre m y n ocu rren cias d e r a [ l ,5 ] n r2 una n se g u id a d e u n a r2 ab n | r2 u n a r\ 0 u na r2 a |b M igual q ue r (a Ib) n /r 2 ri cu an do va segu id a d e r2 á b c /1 2 3 F igu ra 3.8: E xp resion es regulares d e Lex E j e r c i c i o 3 .3 .9 : La exp resión regular r{m , n } coincide co n las ocurrencias en tre m y n del p atrón r. P or ejem plo, a [ l , 5 ] coin cid e co n u n a ca d en a d e u n a a cin co as. M u estre q ue para ca d a exp resión regular q ue con tien e operadores d e repetición d e e s ta form a, h ay u na expresión regular eq u ivalen te sin operadores d e repetición. E j e r c i c i o 3 .3 .1 0 : E l operador ~ coincide co n e l extrem o izquierdo d e u n a línea, y S coincide co n e l extrem o derecho d e u n a línea. E l operador ~ tam b ién se u tiliza para introducir las clases d e caracteres com p lem en tados, pero e l co n tex to siem p re d eja e n claro cu á l es e l sign ificad o de­ sead o. P or ejem p lo, ~ [ ~ a e io u ] * $ coin cid e co n cualquier lín ea co m p leta q ue no co n tien e una v o ca l e n m inúscula. a) ¿C óm o p od em os saber cu á l es el sign ificad o d esea d o de b) ¿P od em os su stitu ir siem p re u n a expresión regular, usando los operadores ~ y $, p or una expresión eq u ivalen te q ue n o u tilice n inguno d e esto s operadores? E j e r c i c i o 3 .3 .1 1 : E l com an d o d el intérprete (sh ell) d e U N IX s h u tiliza los operadores d e la figura 3 .9 en exp resion es d e nom bres d e archivo para describir con jun tos d e nom bres d e ar­ ch ivos. Por ejem plo, la exp resión d e nom bre d e archivo * . o coincide con to d o s los nom bres de archivo q ue term inen en . o; o r d e n l . ? coin cid e con to d o s lo s nom bres d e archivo d e la form a 128 Capítulo 3. Análisis léxico Ex p r e s ió n COINCIDE CON E je m pl o V la cad en a s, literalm ente 'V V * e l carácter c, literalm ente V cualquier cad en a * .0 ? cualquier carácter ord en 1 . ? [^] cualquier carácter en 5 o r d e n l.[e s o ] F igu ra 3.9: E xp resion es d e nom bres d e archivo utilizad as p or e l com an do s h d e l intérprete d e U N IX o r d e n . c, en d on d e c es cualquier carácter. M u estre cóm o pueden su stitu irse la s exp resion es d e nom bres d e archivo d e s h por exp resion es regulares eq u ivalen tes, usand o só lo los operadores básicos d e unión, con caten ación y cerradura. ! E j e r c ic io 3 .3 .1 2 : SQL p erm ite u n a form a rudim entaria d e patrones, en lo s cu a les d o s carac­ teres tien en u n sign ificad o especial: e l gu ión b ajo (_) represen ta a cualquier carácter y el sign o d e p or cien to (%) represen ta a cualquier ca d en a d e 0 o m ás caracteres. A d em á s, el program ador p uede definir cualquier carácter, p or decir e, para q u e se a e l carácter d e escap e, d e m anera q ue si colocam os a e an tes d e e antes d e _, % o cualquier e, o b ten em os el carácter q ue v a desp ués d e su sign ificad o literal. M uestre cóm o exp resar cualquier patrón d e SQL com o u na expresión regular, d ad o q u e sab em os cu á l es e l carácter d e escape. 3.4 R e c o n o c im ie n to d e to k e n s En la sección anterior, aprendim os a expresar los patrones usando exp resion es regulares. Ahora d eb em os estu d iar cóm o tom ar to d o s los patrones para to d o s los tokens necesarios y construir u na p ieza d e cód ig o para exam in ar la cad en a d e en trad a y buscar u n prefijo q ue s e a un lexem a q ue co in cid a con uno d e eso s patrones. E n n uestra exp licación harem os u so d e l sigu ien te bosquejo: i n s tr -► i f e r p r t h e n in s tr | i f expr t h e n in s tr e l s e in s tr expr -*• te m í o p r e l te m í | term -► id n um ero I te m í e Figura 3.10: U n a g ra m á tica para la s in stru cciones d e bifurcación E j e m p lo 3 .8 : E l fragm ento d e gram ática d e la figura 3.10 d escrib e im a form a sim p le d e ins­ trucciones d e bifurcación y d e exp resion es con d icion ales. E s ta sin ta x is es sim ilar a la d e l len­ gu a je P ascal porque t h e n aparece e n form a e x p líc ita d esp u és d e las condiciones. 3.4 Reconocimiento d e tokens 129 P ara o p r e l , u sam os los op erad ores d e com p aración d e len g u a jes co m o P a sca l o S Q L , en d ond e = e s “e s igu al a” y o e s “no e s igu a l a” , y a q ue p resen ta u n a estr u c tu ra in teresan te de lexem as. Las term inales d e la gram ática, q u e so n if, t h e n , e l s e , o p r e l , id y n u m e r o , so n los nom bres d e tok en s en lo q u e al analizador léxico resp ecta. L os p atron es para e s to s tokens se describ en m ediante el u so d e d efinicion es regulares, com o en la figu ra 3.11. Los patrones para i d y n ú m ero son sim ilares a lo q u e vim os e n el ejem p lo 3.7. digito á g ito s num ero letra id if then else oprel —* [0-9] —► —► —► —► —► —► —► —► d ig ito + d ig ito s ( . dígitos)? ( E [+-]? díg ito s )? [A-Za-z] letra ( letra | d ig ito )* if th e n e ls e < 1 > 1 <= 1 >= 1 = 1 o F igu ra 3.11: P atron es para los tokens d el ejem p lo 3.8 P ara e s te lengu aje, el analizador léxico reconocerá la s palabras cla v e i f , t h e n y e l s e , así com o los lexem as q ue coinciden con los patrones para oprel, id y num ero. P a ra sim plificar las cosas, vam os a hacer la su posición com ú n d e q ue las palabras cla v e tam b ién son palabras r e s e r ­ vadas', es d ecir, n o so n identificadores, aun cu a n d o su s lexem as coinciden co n e l p atrón para identificadores. A dem ás, asignarem os a l analizador léxico e l trab ajo d e elim inar e l esp a cio e n blanco, reconociendo e l “to k en ” w s d efin id o por: ws —► ( b l a n c o | t a b | n u e v a l i n e a ) + A qu í, b l a n c o , t a b y n u e v a l i n e a so n sím b olos ab stractos q ue u tiliza m o s para expresar los caracteres A SC II d e los m ism os nom bres. E l token w s es d istin to d e los d em ás tokens porque cu an d o lo recon ocem os, n o lo regresam os a l analizador sin tá ctico , sin o q ue rem id a m o s el ana­ lizador léxico a partir d el carácter q u e v a d esp u és d e l esp a cio e n blanco. E l sig u ien te tok en es e l q ue se d evu elv e a l analizador sin táctico. N u estro o b jetiv o para e l analizador léxico se resum e e n la figura 3.12. E sa ta b la m uestra, para ca d a lexem a o fam ilia d e lexem as, q ué nom bre d e token se d evu elve a l analizador sin tác­ tico y q u é valor d e atrib u to se d evu elve, com o v im o s en la sección 3.1.3. O bserve q ue para los se is operadores relaciónales, se u tilizan las co n sta n tes sim b ó lica s LT, LE, y d em ás com o e l valor d e l atrib uto, para poder indicar qué in sta n cia d e l token o p r e l hem os encontrado. E l op e­ rador específico q ue se en cu en tre influirá en e l có d ig o q u e genere e l com pilador d e salida. □ 130 Capítulo 3. Análisis léxico LEXEMAS C ualquier ws if Then e ls e C ualquier id C ualquier num ero < <= = o > >= NOMBRE DEL TOKEN VALOR DEL ATRIBUTO — — if th e n e ls e id num ero op rel oprel op rel oprel op rel oprel — A puntador a u n a e n tra d a en la ta b la A puntador a u n a e n tra d a en la ta b la LT LE EQ NE GT GE F igu ra 3.12: Tokens, su s patrones y los valores d e lo s atributos 3.4.1 D ia g ra m a s de tra n sició n de estad os Com o paso interm edio en la construcción d e un analizador léxico, prim ero convertim os los pa­ trones en diagram as d e flujo estilizados, a los cu ales se les llam a “diagram as d e transición d e es­ tados” . E n e s ta sección, realizarem os la conversión d e los patrones d e expresiones regulares a los diagram as d e transición de estad os en form a m anual, p ero en la sección 3.6 verem os q ue h ay una form a m ecánica d e construir estos diagram as, a partir d e colecciones d e expresiones regulares. Los diagram as d e tra n sició n d e e sta d o s tien en u na colección d e n od os o círculos, llam a­ d os estados. C ad a e sta d o representa u n a condición q ue p o d r ía ocurrir d urante el proceso d e explorar la entrada, buscando un lexem a q ue coin cid a con u no d e varios patrones. P od em os considerar un esta d o com o un resum en d e tod o lo q u e d eb em o s sab er acerca d e los caracteres q ue h em os v isto en tre el apuntador in id o L e x e m a y e l apuntador avan ce (com o en la situ ación d e la figura 3.3). Las Uneas se d irigen d e un esta d o a otro d el diagram a d e transición d e esta d o s. C ad a línea se etiq u eta m ediante un sím b olo o conjunto d e sím b olos. Si nos en con tram os en cierto esta d o s, y el sigu ien te sím b olo d e en trad a es a, b uscam os u n a lín ea q ue sa lg a d e l esta d o 5 y e s té e ti­ q u etad o p or a (y tal v e z por otros sím b olos tam b ién ). Si en con tram os d ich a línea, avanza­ m os el apuntador avance y en tram os al esta d o d el d iagram a d e transición d e esta d o s a l que nos llev a e sa lín ea. A sum irem os q ue to d o s n uestros diagram as d e transición d e esta d o s so n d eter­ m in ista s, lo q ue sign ifica q ue nunca hay m ás d e u na lín ea q u e sa le d e un esta d o dado, con un sím b olo d ad o d e entre su s etiq u etas. A partir d e la sección 3 .5 , relajarem os la con d ición d el d eterm inism o, facilitan d o en form a considerable la v id a d e l d iseñ ador d e un analizador léxico, aunque e s to se hará m ás difícil para e l im plem entador. A lgunas con ven ciones im p ortan tes d e los diagram as d e tran sición d e esta d o s son: 1. Se d ice q ue ciertos estad os so n de a c e p ta c ió n , o fin a les. E sto s esta d o s indican q u e se h a en con trad o un lexem a, au nq ue e l lexem a a ctu a l tal v e z no co n sista d e to d a s las p o ­ sicion es en tre los apuntadores in id o L e x e m a y a v a n c e Siem pre indicam os un esta d o d e 3.4 Reconocimiento d e tokens 131 aceptación m ed ian te u n círculo d oble, y s i h ay q ue realizar u n a acción (por lo general, devolver u n token y u n valor d e atrib u to al analizador sin tá ctico ), la adjuntarem os al esta d o d e aceptación. 2. A dem ás, si e s necesario retroceder el apuntador avance u n a p osición (es d ecir, s i el lexem a no in clu ye el sím b olo que n os llevó a l esta d o d e a ce p ta ció n ), en ton ces deberem os colocar d e m anera adicional u n * cerca d el esta d o d e aceptación. E n nuestro ejem plo, nunca es necesario retroceder a avan ce m ás d e u n a p o sició n , p ero s i lo fuera, podríam os adjuntar cualquier núm ero d e *s a l esta d o d e aceptación. 3. U n esta d o s e d esign a com o el estado in ic ia l; e s to s e in d ica m ed ian te u na línea etiq u eta ­ d a com o “inicio” , q ue no proviene d e n ingu na parte. E l d ia g ra m a d e tran sición siem pre em p ieza en el e sta d o inicial, an tes d e leer cualquier sím b olo d e entrada. E j e m p lo 3 .9 : L a figura 3.13 es u n diagram a d e transición d e esta d o s q ue reconoce los lexem as q ue coinciden con el tok en o p r e l . E m p ezam os e n e l esta d o 0, e l esta d o inicial. Si vem os < com o el prim er sím b olo d e en trad a, en to n ces d e en tre los lexem as q u e coinciden con el patrón para o p r e l sólo p od em os ver a <, o o <=. Por lo ta n to , p asam os al esta d o 1 y analizam os el sigu ien te carácter. Si es = , en to n ces recon ocem os e l lex em a <=, p asam os al esta d o 2 y devolve­ m os e l token o p r e l co n el atrib u to LE, la co n sta n te sim b ó lica q ue represen ta a e s te operador de com paración esp ecífico. Si e n el esta d o 1 e l sigu ien te carácter e s >, en ton ces ten em o s e l lexem a o y p asam os a l esta d o 3 para devolver una indicación d e q ue se h a en con trad o el operador “no es igual a”. E n cualquier otro carácter, el lex em a es <, y p asam os al esta d o 4 para devolver e s a inform ación. Sin em bargo, observe q u e e l esta d o 4 tien e un * para indicar q u e debem os retroceder la en tra d a u n a posición. F igu ra 3.13: D iagram a d e tran sición d e esta d o s para o p r e l P or otro lado, si en el esta d o 0 el prim er carácter q ue vem os es =, en ton ces e s te carácter d eb e ser e l lexem a. D e in m ediato d evolvem os e se hecho d esd e el esta d o 5. L a p osibilid ad res­ ta n te es q u e el prim er carácter s e a >. E n ton ces, d eb em os pasar al esta d o 6 y d ecid ir, en base 132 Capítulo 3. Análisis léxico al sigu ien te carácter, s i el lexem a es >= (si vem os a con tinu ación el sig n o =), o só lo > (con cu al­ quier o tro carácter). O bserve que, s i e n el estad o 0 vem os cualquier carácter ad em ás d e <, = o >, no es p osib le q ue estem o s viend o un lexem a o p r e l , p or lo q ue no u tilizarem os e s te diagram a d e tran sición d e estad os. □ 3.4.2 R e co n o cim ie n to de las p a la b ra s re s e rv a d a s y los id en tificad o res El recon ocim iento d e las palabras reservadas y los identificadores p resen ta un problem a. P or lo general, las palabras clave com o i f o t h e n son reservadas (com o en nuestro b osq u ejo), p or lo q ue no so n identificadores, aun cu an do lo parecen. A sí, aunque por lo general usam os un d iagram a d e transición d e estad os com o el d e la figura 3.14 p a ra buscar lexem as d e identificadores, e s te d iagram a tam bién reconocerá las palabras clave i f , t h e n y e l s e d e nuestro bosquejo. letra o dígito * return (obtenerToken{ ), instalarID{ )) F igu ra 3.14: U n d iagram a d e tran sición d e esta d o s para identificadores ( id ) y palabras clave H ay d os form as en las q ue p od em os m anejar las palabras reservadas q ue parecen id en tifi­ cadores: 1. Instalar las palabras reservadas en la ta b la d e sím b olos d esd e el principio. U n ca m p o d e la en trad a en la ta b la d e sím b olos in dica q u e esta s ca d en a s n u n ca serán identificadores ordinarios, y nos d ice q ué token representan. H em os su p u esto q ue e s te m éto d o es el q ue se u tiliza en la figura 3.14. A l encontrar un identificador, u n a llam ada a in s ta la r lD lo co lo ca e n la ta b la de sím b olos, si no se en cu en tra a h í to d a v ía , y d evu elve un apuntador a la en trad a e n la ta b la d e sím b olos para e l lex em a q ue se en con tró. D esd e luego q u e cu al­ quier identificador q ue no se encuentre en la ta b la d e sím b olos d urante el análisis léxico no p uede ser u n a p alabra reservada, p or lo q ue su token es id . L a función obtenerT oken exa m in a la en trad a en la ta b la d e sím b olos para el lex em a encontrado, y d evu elve el nom bre d e token q ue la ta b la d e sím b olos indique q ue represen ta e s te lexem a; y a sea id o u no d e los tokens d e p alab ra clave q ue se in sta ló e n u n principio en la tabla. 2. Crear diagram as de tran sición d e estad os separados para c a d a palabra clave; en la figura 3.15 s e m uestra un ejem p lo para la palabra cla v e t h e n . O bserve q ue dicho d iagram a d e transición d e esta d o co n siste en estad os q u e representan la situ a ció n desp ués d e ver cada letra su cesiv a d e la p alabra clave, se g u id a d e u n a p ru eb a p a ra un “no le tr a ni d íg ito ” , es decir, cualquier carácter q ue no p u ed a ser la con tinu ación d e u n identificador. Es necesario verificar q ue e l identificador h aya term inado, o d e lo contrario devolveríam os el token t h e n e n situ a cio n es e n las q u e e l token correcto er a id , con un lex em a com o t h e n e x tV a lu e que te n g a a t h e n com o un prefijo propio. Si ad optam os e s te m éto d o , en ­ ton ces d eb em os dar prioridad a los tokens, para q ue los to k en s d e palabra reservada se 3.4 Reconocimiento d e tokens 133 reconozcan d e preferencia en vez d e id , cu a n d o el lex em a coin cid a con am bos patrones. N o u tilizarem os este m étod o e n nuestro ejem plo, q ue ex p lic a por q u é lo s esta d o s e n la figura 3.15 no está n enum erados. inicio F igu ra 3.15: D iagram a d e transición h ip o tético p a ra la p alabra cla v e t h e n 3.4.3 F in a liza ció n d el bosqu ejo E l diagram a d e transición para los tokens id q ue vim os en la figura 3.14 tien e u n a estructu ra sim p le. E m p ezan d o en e l esta d o 9, com p ru eb a q u e el lex em a em p iece co n u n a letra y q ue pase a l esta d o 10 en caso d e ser así. Perm anecem os en e l e sta d o 10 siem pre y cu a n d o la en trad a co n ten g a letras y d ígitos. A l m om ento d e encontrar e l prim er carácter q ue no s e a le tr a ni d íg ito , p asam os al esta d o 11 y aceptam os el lex em a en con trad o. C om o el ú ltim o carácter no form a p arte d el identificador, d eb em os retroceder la en trad a u na p osición, y com o v im o s en la sección 3.4.2, in trodu cim os lo q ue h em os en con trad o e n la ta b la d e sím b olos y determ inam os s i ten em os u n a palabra clave o u n verdadero identificador. E l diagram a d e transición d e esta d o s para el token n u m e r o se m uestra en la figura 3.16, y es h a sta ahora e l d iagram a m ás com plejo q ue hem os v isto . E m p ezan d o en e l esta d o 12, si vem o s un d íg ito p asam os al esta d o 13. E n ese esta d o p o d e m o s leer cualquier núm ero d e d ígitos adicionales. N o ob sta n te, si v em o s algo q ue no s e a u n d íg ito o un punto, hem os v isto u n núm ero e n form a d e entero; 123 es un ejem p lo. P ara m anejar e s e ca so p asam os al esta d o 20, e n donde d evolvem os e l token n u m e r o y un apuntador a una ta b la d e co n sta n tes en d on d e se introduce e l lexem a encontrado. E sta m ecánica n o se m u estra en el diagram a, pero es a n á loga a la form a e n la que m anejam os los identificadores. inicio F igu ra 3.16: U n d iagram a d e tra n sició n para lo s núm eros sin sig n o S i en v e z d e ello v em o s u n p u n to en e l e sta d o 13, en to n ces ten em os u n a “fracción o p cio n a l”. P asam os al esta d o 14, y b u scam os u no o m ás d íg ito s adicionales; e l esta d o 15 s e u tiliza para e s te fin. Si vem os u na E, en ton ces ten em os un “ex p o n en te o p cio n a l” , cuyo reconocim iento es trab ajo d e los estad os 16 a 19. Si en el esta d o 15 vem os algo q ue no s e a u n a E o u n d ígito, en to n ces hem os llegado al final de la fracción, no h ay ex p o n en te y d evolvem os e l lex em a encon­ trado, m ed ian te el estad o 2 1 . 134 Capítulo 3. Análisis léxico El diagram a d e transición d e estad os final, q ue se m uestra en la figu ra 3 .1 7 , es para el espacio en blanco. E n ese diagram a b uscam os u no o m ás caracteres d e “esp a cio en blanco” , representados p or d e l i m e n e se diagram a; por lo gen eral e sto s caracteres son los espacios, tabuladores, caracteres d e n ueva lín ea y tal vez o tro s caracteres q u e e l d iseñ o d el lengu aje no considere com o parte d e algún token. delim F igu ra 3.17: U n d iagram a d e transición para el espacio en blanco O bserve q u e , en el esta d o 24, hem os en con trad o un b loqu e d e caracteres d e espacio en blanco con secu tivos, segu id os d e un carácter q u e n o e s esp a cio e n blanco. R egresem os la en ­ trad a p ara q u e em p iece en el carácter q u e no es esp a cio e n blanco, pero no regresam os nada al analizador sin táctico, sin o q ue d eb em os reiniciar e l proceso d el an álisis léxico d esp u és d el espacio en blanco. 3.4.4 A r q u ite c tu r a de u n an alizad o r léx ico basado en d ia g ra m a s de tran sició n de esta d o s Hay varias form as e n las q ue p ueden u tilizarse los diagram as d e tran sición d e esta d o s para construir un analizador léxico. S in im portar la estra teg ia general, ca d a e sta d o se representa m ediante u n a p ieza d e cód igo. P od em os im aginar u n a variable e s t a d o q ue co n tien e el núm ero d el estad o actu al para u n d iagram a d e tran sición d e esta d o s. U n a instrucción sw itch co n base en el valor d e e s t a d o nos lleva al cód igo para ca d a u no d e los p o sib les esta d o s, en d ond e en ­ con tram os la acción d e ese estad o. A m enudo, e l có d ig o para un esta d o es en s í u n a instrucción sw itch o u n a bifurcación d e varias v ía s q u e d eterm in a el sigu ien te esta d o m ediante el proceso d e leer y exam inar e l sigu ien te carácter d e entrada. E j e m p lo 3 .1 0 : E n la figura 3.18 vem os un b osquejo d e ó b te n e r O p R e lO , u n a función en C + + cu yo trab ajo es sim u lar e l diagram a d e transición d e la figura 3.13 y devolver un o b jeto d e tip o TOKEN; es decir, un par q u e co n siste en el nom bre d el token (que d eb e ser o p r e l en este ca so ) y un valor d e atrib u to (el cód ig o para u no d e los seis operadores d e com paración en e s te caso). Lo prim ero q ue hace ó b te n e r O p R e lO es crear un nuevo o b je to to k e n R e t e inicializar su prim er com p on en te con OPREL, el cód igo sim b ólico para e l token o p r e l . P od em os ver el com p ortam ien to típ ic o d e un esta d o e n e l ca so 0, e l ca so en d on d e e l esta d o actu al e s 0. U n a fun ción llam ad a s ig C a r O o b tie n e e l sig u ien te carácter d e la en trad a y lo asign a a la variable local c. D espués verificam os si c es u no d e los tres caracteres q ue esperam os encontrar, y realizam os la transición d e esta d o q ue in d ica e l d iagram a d e tran sición d e la figura 3.13 en ca d a caso. Por ejem p lo, s i e l sigu ien te carácter d e en trad a e s =, p asam os al esta d o 5. Si e l sigu ien te carácter d e en tra d a n o e s u no q ue pueda em pezar un operador d e com p a­ ración, en ton ces se hace u na llam ad a a la función f a l l o ( ) . Lo q ue h a g a é s ta d ep en d erá d e la 3.4 Reconocimiento d e tokens 135 TOKEN o b te n e r O p R e lO { TOKEN to k e n R e t = new (OPREL); w h i l e ( l ) { / * r e p i t e e l p r o c e s a m ie n t o d e c a r a c t e r e s h a s t a que o cu rre un re to r n o o un f a l l o * / s w itc h (e s ta d o ) { c a s e 0 : c = s ig C a r O ; i f ( c = >< > ) e s t a d o = 1 ; e l s e i f ( c == , = * ) e s t a d o = 5 ; e l s e i f ( c == *>y ) e s t a d o = 6 ; e l s e f a l l o ( ) ; / * e l le x e m a no e s u n o p r e l * / b reak ; case 1 : . . . case 8 : re tr a c ta r O ; t o k e n R e t . a t r i b u t o = GT; re tu r n (to k e n R e t); > > } F igu ra 3.18: Bosquejo d e la im plem en tación d e l diagram a d e tran sición o p r e l e str a te g ia glob al d e recuperación d e errores d el analizador léxico. D eb e reiniciar e l apuntador a v a n c e para colocarlo en la m ism a p osición q ue in ic io L e x e m a , d e m anera q u e p u ed a aplicarse o tro d iagram a d e tran sición d e esta d o s al verdadero inicio d e la en trad a sin procesar. E ntonces p od ría cam biar el valor d e e s t a d o para q ue se a e l esta d o in icial para otro d iagram a d e transi­ ción, e l cu a l buscará o tro token. D e m anera alternativa, si no h ay o tro d iagram a d e transición de esta d o s q ue e s té sin uso, f a l l o ( ) podría iniciar u na fase d e corrección d e errores q ue tratará d e reparar la en trad a y encontrar un lexem a, com o v im o s en la sección 3.1.4. Tam bién m ostram os la acción para el esta d o 8 en la figura 3.18. C om o e l e sta d o 8 llev a u n *, d eb em os regresar e l apuntador d e en trad a u n a p osición (es decir, colocar a c d e v u elta en el flu­ jo d e en trad a ). E sta ta re a se lleva a ca b o m ed ian te la función r e t r a c t a r O . C om o el esta d o 8 represen ta el reconocim iento d e l lexem a >=, esta b lecem o s e l segu n d o co m p o n en te d el o b jeto d ev u elto (el cu a l su p on em os se llam a a t r i b u t o ) con GT, el có d ig o para e s te operador. □ P ara poner en p ersp ectiv a la sim u lación d e un d iagram a d e tran sición d e esta d o s, vam os a considerar las form as e n q ue e l cód ig o com o e l d e la figu ra 3.18 p o d ría ajustarse a to d o el analizador léxico. 1. P odríam os arreglar q ue los d iagram as d e transición para ca d a token se probaran en form a secu en cial. D espués, la función f a l l o ( ) d el ejem p lo 3.10 restablece e l apuntador a v a n ce e in icia e l sigu ien te diagram a de transición d e esta d o s, ca d a vez q ue se le llam a. E ste m étod o n os p erm ite usar diagram as d e tran sición d e esta d o s p a ra las palabras clave individuales, com o el q ue se sugiere en la figura 3.15. Sólo ten em os q ue usarlos antes que e l d iagram a para id , d e m anera q u e las palabras clave sea n palabras reservadas. 136 Capítulo 3. Análisis léxico 2. P odríam os ejecu tar los d iversos diagram as d e transición d e esta d o s “en paralelo” , ali­ m en tan do el sigu ien te carácter d e en trad a a tod os ellos y p erm itien d o q ue ca d a u no rea­ lice las tran siciones requeridas. S i utilizam os e s ta estra teg ia , d eb em os tener cu id ado d e resolver e l caso en e l q ue un diagram a en cu en tra a u n lex em a q ue coin cid e con su patrón, m ientras u no o varios d e los otros diagram as p ueden segu ir p rocesan do la entrada. La estra teg ia norm al es tom ar el prefijo m ás largo d e la e n tra d a q ue coin cid a con cualquier patrón. E sa regla nos p erm ite p or ejem plo, dar preferencia al identificador s i g u i e n t e sobre la p alabra clave t h e n , o a l operador - > sobre 3. E l m étod o preferido, y e l q ue vam os a usar e n la s sig u ien tes seccion es, e s com binar tod os los d iagram as d e transición d e esta d o s en uno solo. P erm itim os q ue e l d iagram a d e tran­ sición d e esta d o s le a la en trad a h a sta q u e no haya u n sigu ien te e sta d o posible, y después tom am os el lexem a m ás largo q ue haya coincidido con algú n patrón, com o d ijim os en el punto (2) anterior. E n nuestro b osqu ejo, e s ta com b inación es fácil, y a q ue n o p uede haber d o s tok en s q ue em p iecen co n el m ism o carácter; es decir, e l prim er carácter nos in d ica d e in m ed iato el tok en q ue esta m o s b uscando. Por en d e, p odríam os sim p lem en te com binar los esta d o s 0 , 9, 12 y 22 e n un esta d o inicial, d ejan d o las d em ás transiciones in tactas. N o o b sta n te , en general, el prob lem a d e com binar d iagram as d e tran sición de esta d o s para varios tok en s e s m ás com p lejo, co m o verem os e n breve. 3.4.5 E je rcicio s p a ra la sección 3.4 E j e r c ic io 3 .4 .1 : P roporcione los diagram as d e transición d e esta d o s p a ra reconocer los m is­ m os lengu ajes q ue en ca d a una d e las exp resion es regulares en e l ejercicio 3.3.2. E j e r c ic io 3 .4 .2 : P roporcione los diagram as d e transición p a ra reconocer los m ism os lengu ajes q ue e n ca d a u n a de las exp resion es regulares en e l ejercicio 3.3.5. Los sigu ien tes ejercicios, h a sta el 3.4.12, p resen tan el algoritm o d e A ho-C orasick para re­ con ocer una colección d e palabras clave en u n a ca d en a d e te x to , en un tiem p o proporcional a la lon gitu d d e l te x to y la su m a d e la longitud d e las palabras clave. E ste algoritm o u tiliza u na form a esp ecial d e diagram a de transición, co n o cid o co m o trie. U n trie es un d iagram a d e transición d e estad os co n estru ctu ra d e árbol y d istin ta s etiq u e ta s e n las lín eas q ue n os llevan d e u n n od o a su s hijos. Las h ojas d el trie representan la s palabras clave reconocidas. K nuth, M orris y P ra tt presentaron un algoritm o para reconocer u n a p alabra cla v e indivi­ d u a l 6162 • • • bn en u n a cad en a d e tex to . A qu í, el trie es un d iagram a d e tra n sició n d e esta d o s con n estad os, d e 0 a n. E l esta d o 0 es e l esta d o in icial, y e l esta d o n representa la aceptación, es decir, e l d escub rim iento d e la p alabra clave. D e c a d a esta d o s, d esd e 0 h a sta n — 1, hay u na transición al esta d o 5 + 1, q ue se e tiq u e ta m ediante el sím b olo bs+i. P or ejem plo, e l trie para la p alabra clave ab ab aa es: P ara p od er p rocesar las cad en as d e te x t o con rapidez y buscar u na p alabra cla v e en esas cad en as, es ú til definir, para la palabra clave 6162 • • • bn y la p osición 5 en e s a p alabra clave (correspondiente al esta d o s d e su trie), u n a Junción de fa llo , / ( s ) , q ue se ca lcu la com o en la 3.4 Reconocimiento d e tokens 137 figu ra 3.19. E l o b jetiv o es q ue &1&2 * • • &/(*) s e a el prefijo propio m ás largo d e bib¿ • • • bs, que ta m b ién s e a sufijo d e fofe • • • bs. L a razón d e la im p o rta n cia d e f ( s ) es que, si tratam os de encontrar u n a coin cid en cia en u na ca d en a d e te x to p a ra 6162 • • * bn, y h em os relacionado las prim eras s p osiciones, pero d esp u és fallam os (es decir, q ue la sigu ien te p osición d e la ca d en a de te x to n o co n ten g a a bs+1 ), en to n ces f ( s ) es e l prefijo m ás largo d e 6162 • • • bn q ue p o d ría quizá coincidir con la cad en a d e te x to h a sta e l punto en e l q ue nos en con tram os. D esd e luego q u e el sigu ien te carácter d e la cad en a d e te x to d eb e ser 6/(,)+i, o d e lo contrario seguiríam os teniendo problem as y ten dríam os q u e considerar un prefijo aún m ás co rto , el cual será 6/(/(s)). 1) ¿=0; 2) / ( 1) = 0; 3) for (s = 1; s < n; s + +) { 4) w h i l e ( t > 0 && fctH-i ! = bt+i) t = /( í ) ; 5) i f (& *, = = 6(+i) { 6) t = t + 1; 7) f ( s + 1) = f; } e ls e f (s + 1 ) = 0; 8) } F igu ra 3.19: A lgoritm o para calcu lar la función d e fallo para la p alabra cla v e 6162 * * * bn C om o ejem plo, la función d e fallo para e l trie q u e con stru im os antes para ababaa es: s m 1 0 2 u 3 1 4 2 0 3 G 1 P or ejem p lo, los esta d o s 3 y 1 representan a lo s prefijos aba y a, resp ectivam en te. / ( 3 ) = 1 y a q u e a es el prefijo propio m ás largo d e aba, q ue tam bién es un sufijo d e ab a. A dem ás, /( 2 ) = 0, d eb ido a q ue e l prefijo propio m ás largo d e ab, que tam bién es u n sufijo, es la ca d en a vacía. E j e r c ic io 3 .4 .3 : C on stru ya la función d e fallo para las sigu ientes cadenas: a ) abababaab. b ) a a aaaa. c ) abbaabb. ! E j e r c ic io 3 .4 .4 : D em uestre, por inducción en 5, q ue el algoritm o d e la figura 3 .19 ca lcu la en form a correcta la fun ción d e fallo. !! E j e r c ic io 3 .4 .5 : M u estre q ue la asign ación t = f ( t ) en la lín ea (4) d e l a figura 3.19 se ejecu ta cu an d o m ucho n veces. M uestre que, p or lo ta n to , to d o e l algoritm o requiere só lo un tiem po 0 ( n ) para u n a p alabra clave d e lon gitu d n. 138 Capítulo 3. Análisis léxico H abiendo calcu lado la función d e fallo para u n a palabra cla v e 6162 ■• • K , p od em os explorar una cad en a ai 02 • • • a™ en un tiem po 0 ( m ) p ara sa b er s i h ay u n a ocu rren cia d e la p a lab ra clave en la cad en a. E l algoritm o, q ue s e m uestra en la figura 3.20, d esliza la p alabra cla v e a lo lar­ g o d e la cad en a, tratan d o d e progresar en b u sca d e la co in cid en cia d e l sig u ien te carácter d e la palabra clave con el sigu ien te carácter d e la cadena. Si no p uede hacerlo d esp u és d e relacionar 5 caracteres, en to n ces “d esliza” la p alabra clave a la d erech a s — f(s ) p osiciones, d e m anera q ue sólo los prim eros f ( s ) caracteres d e la palabra cla v e se consideren com o coincidencias con la cadena. 1) 5 = 0 ; 2) 3) 4) 5) f o r (« = 1 ; i < m \ « + + ) { w h i l e ( 5 > 0 a¿ ! = 6^-1 ) 5 = f(s ) \ i f (ai = = bs+ 1) 5 = 5 + 1 ; i f ( 5 = = n ) r e t u r n “si” ; 6) } r e t u r n “n o ” ; F igu ra 3.20: E l algoritm o K M P eva lú a si la ca d en a a ^ • • • am co n tien e u n a palabra clave in dividu al 6162 • • • bn com o u n a su bcadena, en u n tiem p o 0 ( m + n) E j e r c ic io 3 .4 .6 : A pliqu e el algoritm o K M P para evaluar si la palabra cla v e ab a b a a es u na su b ca d en a de: a) abababaab. b) abababbaa. !! E j e r c ic io 3 .4 .7 : M uestre q u e el algoritm o d e la figura 3.20 n os in d ica en form a correcta si la p alabra clave es u na su b ca d en a d e la cad en a dada. S u geren cia: p roceda p o r in du cción en i. M uestre q ue para to d a s las i, e l valor d e 5 d esp u és d e la lín ea (4) e s la lon gitu d del prefijo m ás largo d e la palabra clave q ue e s un sufijo d e 0102 • • • a¿. !! E j e r c ic io 3 .4 .8 : M uestre q u e el algoritm o d e la figu ra 3.20 s e eje cu ta e n u n tiem p o 0 ( m + n ) , su p on ien d o q ue la función / y a s e h a calcu lado y q ue su s valores se alm acenaron en u n arreglo indexado p or 5. E j e r c ic io 3 .4 .9 : Las cadenas d e F ibonacci s e d efinen d e la sig u ien te manera: 1 . 51 = b. 2 . 32 = a. 3. Sk = Sk-iSk-2 para k > 2. Por ejem plo, 53 = ab , 54 = a b a y 55 = abaab. a) ¿C uál es la lon gitu d d e sn? 3.4 Reconocimiento d e tokens 139 b ) C on stru ya la fu n ción d e fallo para % c ) C on stru ya la fun ción d e fallo para $7. !! d ) M uestre q ue la función d e fallo para cualquier p u ed e expresarse m ed ian te / ( 1 ) = / ( 2 ) = 0 , y q ue para 2 < j < \sn\, f ( j ) e s j — |s * -i|, en d on d e fc es el en tero m ás largo, de form a q ue |$*| < j + 1 . !! e ) E n el algoritm o K M P , ¿cuál e s el núm ero m ás gran d e d e ap licacion es co n secu tiv a s de la función d e fallo, cu an d o tratam os d e d eterm in ar si la p a lab ra cla v e sk aparece en la cad en a d e tex to s^+i? A h o y C orasick generalizaron e l algoritm o K M P para reconocer cu alq uiera d e u n conjunto d e palabras clave e n u na cad en a d e tex to . E n e s te ca so e l trie es un verdadero árb ol, con rami­ ficaciones d esd e la raíz. H ay un e sta d o para ca d a ca d en a q u e se a un prefijo (no necesariam ente propio) d e cualquier p alabra clave. E l padre d e un esta d o corresp ond ien te a la ca d en a 6162 • • • bk es e l esta d o q ue corresponde a fe fe - • • 6*_i. U n esta d o d e a cep tación si corresponde a una p alabra clave com p leta. Por ejem p lo, la figura 3.21 m u estra e l trie para la s palabras cla v e he, sh e, h is y h ers. L a función d e fallo para e l trie gen eral s e d efin e d e la sig u ien te form a. S u p on ga q ue s e s el e sta d o q ue corresponde a la ca d en a &ife • • • bn. E n tonces, f ( s ) es e l esta d o q u e corresp ond e al su fijo propio m ás largo d e &ife • ■ ■ bn q ue tam bién e s un prefijo d e alguna p alabra clave. Por ejem p lo, la función d e fallo para e l trie d e la figura 3.21 es: s m 1 2 0 0 3 0 4 1 5 2 G 7 8 0 3 0 9 3 E j e r c ic io 3 .4 .1 0 : M odifique el algoritm o d e la figura 3 .19 para calcular la fun ción d e fallo para tries gen erales. S ugeren cia: L a principal diferencia es q ue no p o d em o s sim plificar la prue­ b a d e igualdad o d esigu ald ad d e 6^+1 y bt+i e n las lín eas (4) y (5) d e la figura 3.19. E n vez de 140 Capítulo 3. Análisis léxico ello, d esd e cualquier estad o p u ed e haber varias tran siciones so b re diversos caracteres, a sí com o hay tran sicion es ta n to en e com o en i d esd e el esta d o 1 en la figura 3.21. C ualquiera d e esas transiciones p od ría c o n d u cim o s a un estad o q u e represente el sufijo m ás largo q ue se a tam bién un prefijo. E j e r c ic io 3 .4 .1 1 : C on stru ya los tries y calcu le la función d e fallo para los sig u ien tes con jun tos d e palabras clave: a) aaa, ab a a a y ababaaa. b) a l l , f a l l , f a t a l , lla m a y lam e. c) p ip e , p e t , ite m , tem p er y p e r p e t u a l. E j e r c ic io 3 .4 .1 2 : M uestre q u e su algoritm o d el ejercicio 3.4.10 se sig u e ejecu tan d o en un tiem p o q ue es lineal, en la su m a d e las lon gitud es d e las palabras clave. 3.5 E l g e n e ra d o r d e a n a liz a d o re s léxicos Lex En e s ta sección presentarem os u n a herram ien ta co n o cid a co m o L ex, o F le x en u n a im plem entación m ás recien te, q ue n os p erm ite especificar un analizador léxico m ed ian te la especificación d e exp resion es regulares para describir p atron es d e lo s tokens. L a n otación d e en trad a para la herram ienta L ex s e co n o ce com o el lenguaje L ex , y la herram ienta en s í es e l co m p ila d o r Lex. El com pilador L ex transform a los patrones d e en trad a en un d iagram a d e transición y gen era có d ig o , en u n archivo llam ad o l e x . y y . c , q ue sim u la e s te diagram a d e transición. L a m ecánica d e cóm o ocurre e s ta trad u cción d e exp resion es regulares a diagram as d e transición e s e l tem a d e las sigu ientes secciones; aquí sólo aprenderem os acerca d el lengu aje Lex. 3 .5 .1 U s o d e Lex La figura 3.22 su giere cóm o se u tiliz a Lex. U n archivo d e entrada, a l q ue llam arem os l e x . l , e s tá escrito en e l lengu aje L ex y d escrib e e l analizador léxico q u e se v a a generar. E l com pilador Lex transform a a l e x . 1 en un program a en C, en un archivo q u e siem p re se llam a l e x . y y . c. El com p ilad or d e C com p ila este archivo e n un archivo llam ado a .o u t , com o d e costum bre. La sa lid a d e l com p ilad or d e C es un analizador léxico funcional, q u e p u ed e recibir un flujo d e caracteres d e en tra d a y producir u n a ca d en a d e tokens. El u so norm al d e l program a com p ilad o e n C , den om in ado a . o u t en la figura 3.22, es com o una su b ru tin a d el analizador sin táctico. E s u na fun ción en C q ue d evu elve u n entero, e l cual representa u n cód igo para uno d e los p osib les nom bres d e ca d a token. E l valor d e l atrib uto, y a se a o tro cód igo num érico, un apuntador a la ta b la d e sím b olos, o nada, s e co lo c a en una variable glob al llam ad a y y l v a l ,2 la cu a l se com p arte en tre e l analizador léxico y e l analizador sin tá ctico, co n lo cu a l se sim p lifica el p roceso d e devolver tan to e l nom bre com o un valor de a trib u to d e un token. 2A p ropósito, la y y q u e aparece en y y l v a l y l e x . y y . c s e refiere al generador d e analizadores sin tá ctico s Y acc, que describirem os en la sección 4.9, e l cual s e u tiliza , por lo regular, en con jun to con Lex. 141 3.5 E l generador d e analizadores léxicos Lex F igu ra 3.22: C reación d e un analizador léxico co n L ex 3 .5 .2 E s t r u c t u r a d e lo s p r o g r a m a s e n Lex U n program a en L ex tien e la sigu ien te forma: declaraciones Ti reglas de traducción Ti funciones auxiliares L a sección d e declaraciones in clu ye las declaraciones d e variables, con sta n tes de m a n ifiesto (identificadores q u e se declaran para representar a u n a con stante; p or ejem p lo , e l nom bre de u n token) y d efinicion es regulares, en e l estilo d e la secció n 3.3.4. C ada u na d e las reglas d e trad ucción tien e la sig u ien te forma: P atrón { A c ció n } C ad a patrón es u na expresión regular, la cu a l p uede usar las d efinicion es regulares d e la sección d e d eclaraciones. Las acciones so n fragm entos d e có d ig o , p or lo general, escrito s en C , aunque s e han cread o m uchas variantes d e L ex q ue u tiliza n o tro s lenguajes. L a tercera sección con tien e las funciones ad icion ales q ue se u tiliza n en las acciones. D e ma­ nera alternativa, estas funciones pueden com pilarse p o r separado y cargarse con e l analizador léxico. E l analizador léxico q ue crea L ex tra b a ja en con ju n to co n e l analizador sin tá ctico d e la si­ g u ien te m anera. C uan do e l analizador sin tá ctico llam a al analizador léxico, é s te em p ieza a leer e l resto d e s u entrada, un carácter a la vez, h a sta q u e en cu en tra e l prefijo m ás largo d e la en trad a q ue coin cid e con u no d e los patrones P¿. D esp u és eje cu ta la acción asociad a A v P or lo general, A i regresará al analizador sin táctico , pero s i no lo hace (tal v e z d eb ido a q ue P i d es­ crib e esp acio en b lanco o com en tarios), en to n ces el analizador léxico procede a buscar lexem as ad icion ales, h a sta q u e u na d e las accion es corresp ond ien tes p rovoque un re to m o al analizador sin táctico. E l analizador léxico d evu elve un so lo valor, el nom bre d e l token, al analizador sin­ tá ctico , pero u tiliza la variable en tera com p artid a y y l v a l p a ra pasarle inform ación adicional sob re el lexem a en con trad o, si es necesario. 142 Capítulo 3. Análisis léxico E j e m p lo 3 .1 1 : L a figura 3.23 es un program a en Lex q u e recon oce lo s to k en s d e la figu ra 3.12 y d evu elve e l token encontrado. U nas cu an tas ob servaciones acerca d e e s te có d ig o n os darán una id ea d e varias d e las características im portan tes d e Lex. En la sección d e declaraciones vem o s u n par d e llaves esp eciales, %{ y / } . C ualquier co sa d en tro d e ellas se co p ia d irectam en te a l archivo l e x . y y . c , y no se tr a ta com o definición regu­ lar. E s com ú n colocar ah í las d efinicion es d e las co n sta n tes d e m anifiesto, usando instrucciones # d e f i n e d e C para asociar cód igos en teros ú nicos c o n ca d a u na d e la s co n sta n tes d e m anifiesto. En nuestro ejem plo, hem os listad o en un com entario los nom bres d e la s co n sta n tes d e m anifies­ to LT, IF , etc étera , pero n o las h em os m ostrado definidas para ser en teros esp ecífico s .3 A dem ás, e n la sección d e declaraciones h ay u n a secu en cia d e d efinicion es regulares. É stas u tilizan la n otación ex te n d id a para exp resion es regulares q ue describ im os e n la secció n 3.3.5. Las d efin icion es regulares q u e se u tilizan en d efinicion es posteriores o e n los patrones d e las reglas d e traducción, van rodeadas de llaves. A sí, p or ejem plo, delim s e d efin e com o abreviación para la clase d e caracteres q ue co n siste en e l espacio en blanco, el ta b u la d o r y el carácter d e nueva línea; esto s ú ltim os d o s se representan, com o en to d o s lo s com an dos d e U N IX , por una barra d iagon al inversa se g u id a d e t o d e n, resp ectivam en te. E n ton ces, w s se d efine para q ue se a uno o m ás delim itadores, m ediante la exp resión regular { d e lim } + . O bserve q u e en la definición de id y d e n u m ero se u tiliza n paréntesis co m o m eta sím bolos d e agrupam iento, por lo q ue no s e representan a s í m ism os. E n con traste, la E en la definición d e n u m ero s e rep resen ta a s í m ism a. S i d eseam os usar u n o d e los m e ta sím b olos d e Lex, com o cu alq uiera d e los p arén tesis, +, * o ? para q ue se representen a s í m ism os, p od em os colocar u na barra d iagon al inversa antes d e ellos. Por ejem p lo, vem os \ . en la definición d e n um ero para representar el punto, y a q ue e se carácter es un m eta sím b olo q ue represen ta a “cualquier carácter” , co m o es costu m b re e n las exp resion es regulares d e U N IX . En la sección de funciones auxiliares v em o s d os d e esas funciones, i n s t a l a r ID O e i n s ­ t a l a r Num O . A l igual q ue la porción d e la sección d e declaración q u e aparece entre % {...% }, to d o lo q ue hay e n la sección auxiliar se co p ia d irectam ente a l archivo l e x . y y . c , pero p uede usarse en las acciones. Por ú ltim o, vam os a exam in ar algu nos d e los p atron es y reglas en la sección m ed ia d e la figura 3.23. E n prim er lugar ten em os a w s, u n identificador declarado en la prim era sección, e l cu a l tiene u na acción vacía asociada. Si en con tram os espacio e n blanco, no regresam os al analizador sin táctico, sin o q ue buscam os otro lexem a. E l segu n d o tok en tien e e l patrón d e ex ­ presión regular sim p le i f . Si vem o s las d o s letras i f en la en trad a, y ésta s no van segu id as d e o tra letra o d íg ito (que haría q ue e l analizador léxico b uscara u n prefijo m ás largo d e la en trad a q ue coin cid a co n e l p atrón para i d ) , en ton ces el analizador léxico con su m e esta s d o s letras d e la en trad a y d evu elv e el nom bre d e token IF, es decir, el en tero q ue la c o n sta n te d e m anifiesto IF representa. Las palabras clave t h e n y e l s e se tra ta n d e m anera sim ilar. El q u in to tok en tien e e l patrón d efinido por id . O bserve que, aunque las palabras clave com o i f coinciden co n e s te patrón así com o co n un patrón anterior, Lex elije e l p atrón q ue aparezca 3Si s e u tiliza Lex ju n to con Yacc, en ton ces serla normal definir las con stan tes d e m anifiesto en e l program a Yacc y usarlas sin definición en e l program a Lex. C om o lex.yy.c s e com p ila co n la salid a d e Y acc, por consiguiente las constantes estarían d isponibles para las acciones en e l programa en Lex. 3.5 E l generador d e analizadores léxicos Lex %{ / * d e f i n i c i o n e s d e l a s c o n s t a n t e s de m a n i f i e s t o LT, LE, EQ, NE, GT, GE, I F , THEN, ELSE, ID , NUMERO, OPREL * / 7.} /* d e f in ic io n e s r e g u la r e s * / d e lim [ \t\n ] ws { d e lim } + le tr a { A -Z a -z ] d ig ito [0 -9 ] id { l e t r a } ( { l e t r a } |{ d i g it o } ) * numero { d ig it o } + ( \.{ d ig ito } + ) ? (E [+ - ] ? (d ig it o )+ ) ? {w s> if th en e ls e { id } {n um ero} "<" "<=" { / * n o h a y a c c ió n y n o h a y r e t o r n o * / } {r e tu r n (IF );} {re tu r n (T H E N ); } { r e tu r n (E L S E ); } { y y lv a l = ( in t ) in s t a la r I D ( ) ; r e tu r n (ID );} { y y l v a l = ( i n t ) in s ta la r N u m O ; retura(NUM ERO); } { y y l v a l = LT; r e t u r a ( OPREL); } { y y l v a l = LE; retu ra (O P R E L ); } { y y l v a l = EQ; retu ra(O P R E L ); } { y y l v a l = NE; r e t u r a ( OPREL); } { y y l v a l = GT; r e t u r a ( OPREL); } { y y l v a l = GE; r e t u r a ( OPREL); } "<>" ">" ">=" i n t i n s t a l a r I D ( ) { / * f u n c ió n p a r a i n s t a l a r e l le x e m a en l a t a b l a d e s ím b o lo s y d e v o lv e r un ap u n ta d o r a e s t o ; y y t e x t a p u n ta a l p rim er c a r a c t e r y y y l e n t e s l a lo n g itu d * / i n t in s ta la r N u m O { / * s i m i l a r a i n s t a l a r I D , p e r o c o l o c a l a s c o n s t a n t e s n u m é r ic a s e n u na t a b l a s e p a r a d a * / } F igu ra 3.23: P rogram a en Lex para los tokens d e la figura 3.12 143 144 Capítulo 3. Análisis léxico prim ero en la lista , en situ acion es en las q ue e l prefijo m ás largo co in cid e con d o s o m ás patro­ nes. L a acción q ue s e realiza cu an d o hay u n a coin cid en cia con id c o n siste e n tres pasos: 1. Se hace u n a llam ad a a la función i n s t a l a r ID ( ) para colocar el lex em a en con trad o en la tab la d e sím b olos. 2. E s ta fun ción d evu elv e u n apuntador a la ta b la d e sím b olos, el cu a l se co lo c a e n la va­ riable glob al y y l v a l , en d on d e el analizador sin tá ctico o u n com p on en te p osterior d el com pilador puedan usarla. O bserve q ue i n s t a l a r I D O tien e d os variables dispon ib les, q ue e l analizador léxico generado p or L ex esta b lece d e m anera autom ática: (a) y y t e x t es un apuntador al inicio d el lexem a, análogo a in ic io L e x e m a en la figura 3.3. (b) y y le n g es la lon gitu d del lexem a encontrado. 3. E l nom bre d e tok en ID se d evu elv e a l analizador sin táctico. La acción q ue se lleva a cab o cu an do un lexem a q ue coincide con e l p atrón n u m ero es sim ilar, sólo q ue se u sa la función auxiliar in s t a la r N u m ( ) . □ 3 .5 .3 R e s o lu c ió n d e c o n flic to s e n Lex N os h em os referido a las d os reglas q u e u tiliza Lex para decidir acerca d el lex em a apropiado a seleccionar, cu an do varios prefijos d e la en tra d a coinciden con uno o m ás patrones: 1. Preferir siem p re u n prefijo m ás largo a u no m ás corto. 2. Si e l prefijo m ás largo p osib le coin cid e co n d os o m ás patrones, preferir e l p atrón q ue se lista prim ero en e l program a en Lex. E j e m p lo 3 .1 2 : L a prim era regla nos d ice q u e d eb em o s continuar leyendo letras y d íg ito s para buscar e l prefijo m ás largo d e esto s caracteres y agruparlos co m o un identificador. T am bién nos d ice q ue d eb em os tratar a <= com o un solo lexem a, en v ez d e seleccion ar < com o u n lex em a y = com o el sigu ien te lexem a. L a seg u n d a regla hace a las palabras clave reservadas, si listam os las palabras clave an tes q ue ¡d en el program a. Por ejem p lo , si se d eterm in a q ue t h e n es e l prefijo m ás largo d e la en trad a q ue coincide con algún patrón, y e l patrón t h e n v a antes q ue { i d } , com o en la figura 3.23, en to n ces s e d evu elve el tok en THEN, e n v e z d e ID. □ 3 .5 .4 E l o p e r a d o r a d e la n ta d o Lex lee d e m anera a u tom ática un carácter ad elan te d el ú ltim o carácter q u e form a el lexem a seleccionado, y d esp u és regresa la en trad a para q ue sólo se co n su m a e l propio lex em a de la en trad a. N o ob sta n te, algunas veces p uede ser con ven ien te q ue cierto patrón coin cid a con la entrada, só lo cu an do vaya segu id o d e cierto s caracteres m ás. D e ser así, ta l vez p odam os u ti­ lizar la barra d iagon al en un p atrón para indicar el final d e la p arte d e l p atrón q ue coincide 3.5 E l generador d e analizadores léxicos Lex 145 c o n e l lexem a. Lo q u e v a desp ués d e / es u n patrón adicional q ue se d eb e relacionar antes de poder decidir q ue vim os e l token en cu estió n , pero q ue lo q ue co in cid e con e s te segu n d o patrón n o form a p arte d e l lexem a. E j e m p lo 3 .1 3 : E n Fortran y en algu nos o tro s lengu ajes, las palabras cla v e no son reservadas. E sa situ ación crea problem as, com o por ejem p lo la sig u ien te instrucción: IF ( I , J ) = 3 e n d o n d e IF es el nom bre d e u n arreglo, no u n a p alabra clave. E s ta in stru cción co n tra sta con las in stru cciones d e la form a IF ( c o n d ic ió n ) THEN . . . e n d ond e IF es u na p alabra clave. P or fortuna, p od em os a segu ram os d e q ue la palabra cla v e IF siem p re vaya se g u id a d e un p arén tesis izquierdo, cierto te x to (la co n d ició n ) q ue p uede contener p aréntesis, un paréntesis derecho y u n a letra. A sí, p o d ríam os escribir u n a regla d e L ex p a ra la p alabra clave IF, com o: IF / \ ( .* \ ) { le tr a } E s ta regla d ice que el p atrón con e l q ue coincide e l lexem a e s só lo las d o s letras IF . L a barra d iagon al d ice q ue le sigu e un p atrón adicional, pero q ue no coin cid e con e l lexem a. E n este patrón, el prim er carácter es e l paréntesis izquierdo. C om o ese carácter es un m eta sím bolo d e Lex, d eb e ir precedido por u na barra diagonal in versa para indicar q ue tien e s u significado literal. E l punto y e l asterisco coinciden con “cualquier ca d en a sin un carácter d e n ueva línea” . O bserve q ue e l p u n to es u n m eta sím b olo d e Lex que sign ifica “cualquier carácter ex cep to n ue­ v a lín ea” . V a segu id o d e u n paréntesis derecho, d e nuevo con u na barra d iagon al in v ersa para dar a ese carácter su sign ificad o literal. E l p atrón adicional v a seguid o por el sím b olo letra, que e s u n a definición regular q ue represen ta a la cla se d e caracteres d e tod as las letras. O bserve q ue, para q u e e s te patrón p u ed a ser a p ru eb a d e errores, d eb em o s preprocesar la en tra d a para elim inar el esp acio en blanco. N o h ay provisión en e l patrón para e l esp a cio en blanco, ni p od em os tratar con la p osibilid ad d e q ue la con d ición se e x tie n d a en varias líneas, y a q ue el p u n to no coin cid irá co n un carácter d e n u eva línea. P or ejem p lo, su p o n g a q ue a e s te p atrón se le pide q ue co in cid a con un prefijo d e entrada: IF(A<(B+C)*D)THEN. . . los prim eros d os caracteres coinciden co n IF , el sigu ien te carácter co in cid e con \ ( , los siguien­ t e nueve caracteres coinciden con y los sig u ien tes d o s coinciden co n \ ) y letra. Observar e l hecho d e q u e e l prim er paréntesis derecho (después d e C) n o vaya seguid o d e u n a letra es irrelevante; só lo n ecesitam os encontrar a lgu n a m anera d e hacer q ue la en trad a coin cid a con el patrón. C onclu im os q u e las letras IF co n stitu y en e l lexem a, y q ue son u na in sta n cia d e l token ¡f. □ 146 Capítulo 3. Análisis léxico 3 .5 .5 E je rc ic io s p a r a la s e c c ió n 3 .5 E j e r c ic io 3 .5 .1 : D escrib a cóm o hacer las sigu ien tes m odificaciones al program a en Lex d e la figura 3.23: a) A gregar la p alabra clave w h ile . b) C am biar los operadores d e com paración para q ue sea n los operadores en C d e ese tip o. c ) P erm itir el gu ión bajo (_) com o u n a letra adicional. ! d ) A gregar un nuevo p atrón co n el token STRING. E l p a tró n co n siste en u na d ob le co m illa (" ), cualquier ca d en a d e caracteres y u na d o b le co m illa final. N o o b sta n te, si aparece u n a d o b le c o m illa en la cad en a d eb e se r carácter d e e sca p e, p a ra lo cu a l le a n tep o n e­ m os u n a barra d iagon al in versa ( \ ) y, por lo tanto, una barra d iagon al inversa en la c a d e n a d eb e represen tarse m ed ian te d o s barras d ia g o n a les in versas. E l valor léxico es la cad en a sin las d obles com illas circun dan tes, y sin las barras d iagonales inversas q ue se usan com o carácter d e esca p e. Las cad en a s d eb en instalarse en u n a ta b la d e cadenas. E j e r c ic io 3 .5 .2 : E scriba u n program a e n L ex que co p ie un archivo, su stitu y en d o c a d a secu en ­ c ia no vacía d e esp acios en blanco p or u n so lo espacio. E j e r c ic io 3 .5 .3 : E scriba un program a en L ex q ue co p ie un program a e n C, su stitu y en d o ca d a in sta n cia d e la palabra clave f l o a t por d o u b le . E j e r c ic io 3 .5 .4 : E scriba un program a en Lex q ue co n v ierta un archivo a “P ig la tín ”. E n es­ pecífico, su p on ga q u e el archivo es una secu en cia d e palabras (gru pos d e letras) separadas por espacio en blanco. C ad a v e z q ue se en cu en tre con u na palabra: 1 . Si la prim era letra es u n a con son an te, desplácela h a sta el final d e la p a lab ra y desp ués agregue ay. 2. Si la prim era letra es u na vocal, só lo agregue a y a l final d e la palabra. Todos los caracteres q u e no sean letras d eb en cop iarse in ta cto s a la salida. E j e r c ic io 3 .5 .5 : En SQ L, las palabras clave y los identificadores so n sen sib les a m ayúsculas y m inúsculas. Escriba un program a en L ex que reconozca las palabras clave SELECT, FROM y WHERE (en cualquier com binación d e letras m ayúsculas y m in ú scu las), y e l token ID, q ue para los fines d e este ejercicio p uede considerar co m o cualquier secu en cia d e letras y d ígitos, em p e­ zando co n u na letra. N o tien e q ue in stalar los identificadores en u n a ta b la d e sím b olos, pero d eb e indicar cu ál sería la diferencia en la fun ción “in sta ll” d e la q ue describ im os p a ra los iden­ tificadores sen sib les a m ayúsculas y m inúsculas, com o en la figura 3.23. 3 .6 A utom atas Gnitos 3.6 147 A u tó m a ta s fin ito s A hora vam os a descubrir cóm o Lex con vierte su program a d e en trad a en un analizador léxico. E n el corazón d e la tran sición se en cu en tra e l form alism o co n o cid o com o a u tó m a ta s fin ito s . En esen cia, esto s co n sisten en gráfos com o lo s d iagram as d e transición d e esta d o s, con algunas diferencias: 1. Los au tóm atas finitos so n reconocedores; só lo d icen “s í” o “n o ” en relación co n ca d a p o ­ sib le cad en a d e entrada. 2. Los au tóm atas finitos p ueden ser d e d o s tipos: (a) Los au tó m a ta s fin ito s n o d e te rm in ista s (A F N ) no tien en restricciones en cu a n to a las etiq u e ta s d e su s líneas. U n sím b olo p uede etiq u etar a varias líneas q ue surgen d el m ism o esta d o , y €, la cad en a vacía , es u n a p osible etiq ueta. (b ) Los au tóm atas fin ito s d e te rm in ista s (A F D ) tien en , para ca d a esta d o , y para ca d a sím b olo d e su alfabeto d e entrada, ex a cta m en te u n a lín ea co n ese sím b olo q ue sale d e ese estado. Tanto los au tóm atas fin ito s d eterm in istas com o los no d eterm in istas son cap aces d e reco­ nocer los m ism os lengu ajes. D e hecho, esto s lengu ajes son ex a cta m en te lo s m ism os lenguajes, con ocid os com o lenguajes regulares, q u e p ueden describir las exp resion es regulares .4 3 .6 .1 A u t ó m a t a s f in ito s n o d e t e r m i n i s t a s U n au tóm ata fin ito n o d e te rm in ista (A F N ) co n siste en: 1 . U n con ju n to fin ito d e esta d o s S. 2. U n con ju n to d e sím b olos d e en trad a E , e l alfabeto d e en trada. Sup onem os q ue e, que representa a la ca d en a vacía, n un ca será m iem bro d e E . 3. U n a fu n ció n d e tra n sic ió n q u e proporciona, para ca d a esta d o y para c a d a sím b olo e n E U { e } , un con ju n to d e estados sigu ien tes. 4 . U n esta d o so d e 5, q ue s e d istin gu e com o e l estado in ic ia l 5. U n con ju n to d e esta d o s F , u n su b con ju n to d e 5, q ue s e d istin g u en com o los esta d o s a cep ­ ta n tes (o estados fin ales). P od em os representar u n A F N o A F D m ed ian te u n gráfico d e tra n sic ió n , en d on d e los nodos so n esta d o s y los flancos Indecidibles representan a la fun ción d e tran sición . H ay un flanco Indecidible a, q ue va del e sta d o s al esta d o t si, y só lo si t e s uno d e los esta d o s sig u ien tes para el e sta d o s y la en tra d a a. E ste gráfico es m uy parecido a u n diagram a d e transición, excep to que: 4 H ay una p equeña laguna: según la definición q u e les d im os, las expresiones regulares no pueden describir el lenguaje vacío, y a qu e no e s conveniente utilizar e s te patrón en la práctica. No ob stan te, los au tóm atas finitos pueden definir e l lenguaje vacío. E n teoría, 0 s e trata com o una expresión regular adicional, para e l único fin d e definir el lenguaje vacío. 148 Capítulo 3. Análisis léxico a) E l m ism o sím b olo puede etiq u etar flancos d e un esta d o h acia varios esta d o s d istin to s. b) U n flanco puede etiq u etarse p or e, la cad en a vacía, en vez d e, o ad em ás de, los sím bolos d el alfabeto d e entrada. E j e m p lo 3 .1 4 : E l gráfo d e tran sición para u n A F N q ue recon oce e l len gu aje d e la exp resión regular ( a |b ) * a b b s e m u estra e n la figura 3.24 . U tiliza rem o s e s te ejem p lo ab stracto, q ue d escrib e a to d a s las ca d en a s d e as y 6s q ue term inan e n la ca d en a esp ecífica abb, a lo largo d e e s ta sección . N o o b sta n te , es sim ilar a las ex p resio n es regulares q u e d escrib en len g u a jes d e verdadero interés. P or ejem p lo, u n a exp resión q ue d escrib e a to d o s lo s archivos cu y o nom ­ bre term in a en .o es c u a l q u i e r a * . o , en d on d e c u a l q u i e r a represen ta a cualquier carácter im prim ible. a F igu ra 3.24: U n a u tó m a ta fin ito n o d eterm in ista Siguiendo n u estra con ven ción para los d iagram as d e transición, e l d o b le círculo alrededor d el esta d o 3 in d ica q ue e s te esta d o e s d e esta d o s. O bserve q ue la ú n ica form a d e llegar d el esta d o inicial 0 al esta d o d e aceptación es seguir cierto ca m in o q u e p erm an ezca en e l e sta d o 0 d urante cierto tiem p o, y d esp u és v aya a los esta d o s 1, 2 y 3 leyendo abb d e la en trad a. Por en d e, las únicas cad en as q ue llegan al esta d o d e acep tación so n las q u e term inan en abb. □ 3 .6 .2 T a b la s d e t r a n s ic i ó n Tam bién p od em os representar a un A F N m ediante u n a tabla de tra n sic ió n , cuyas fila s corres­ pond en a los estad os, y cu yas colum nas corresponden a los sím b olos d e en trad a y a e. L a entra­ d a para u n esta d o d ad o y la en trad a es e l valor d e la función d e transición q ue s e ap lica a esos argum entos. Si la fun ción d e tran sición n o tien e inform ación acerca d e e se par estad o-entrad a, colo cam os 0 en la ta b la para ese estad o. E j e m p lo 3 .1 5 : L a tab la d e transición p ara el A F N d e la figura 3 .24 se m u estra en la figura 3.25. □ La ta b la d e transición tien e la v e n ta ja d e q ue p o d em o s encontrar co n facilidad la s tran sicio­ nes en cierto estad o y la en trad a. Su d esv en ta ja e s q ue o c u p a m ucho espacio, cu an do e l alfabeto d e en tra d a es exten so, aunque m uchos d e lo s esta d o s n o ten gan m ovim ientos en la m ayoría d e los sím b olos d e entrada. 3 .6 A utom atas Gnitos 149 ESTA D O a 0 b e W 0 1 0 m 0 2 0 0 {3} i 0 3 0 F igu ra 3.25: T ab la d e transición para e l A F N d e la figura 3.24 3 .6 .3 A c e p ta c ió n d e la s c a d e n a s d e e n t r a d a m e d ia n te lo s a u t ó m a t a s U n A F N acep ta la ca d en a d e en trad a a; s i, y sólo si h ay algún ca m in o en el grafo d e transición, d esd e el esta d o in icial h a sta uno d e los esta d o s d e aceptación, d e form a q ue lo s sím b olos a lo largo d el cam in o d eletreen a x. O bserve q u e las etiq u e ta s e a lo largo d el ca m in o se ignoran, y a q ue la cad en a v a cía no con trib uye a la ca d en a q u e se con stru ye a lo largo d e l cam ino. E j e m p lo 3 .1 6 : E l A F N d e la figura 3.24 a ce p ta la ca d en a aabb. E l cam in o etiq u eta d o por aabb d el esta d o 0 al estad o 3 q ue dem uestra e s te hecho es: a a b b 0 --------- ► 0 --------- ► 1 --------- ► 2 --------- ► 3 O bserve q ue varios cam in os etiq u etad as por la m ism a ca d en a p ueden conducir h acia esta d o s d istin to s. Por ejem p lo, e l cam ino a a b b o— —► o— — ► O -------------- ► O --------------►O e s o tro cam ino que parte d el esta d o 0, etiq u eta d a por la cad en a aabb. E ste cam ino con d uce al esta d o 0, que n o d e aceptación. Sin em bargo, recuerde q u e un A F N acep ta a una ca d en a siem ­ pre y cuando h aya c ierto cam ino etiq u eta d o por esa cad en a, que con d u zca d el esta d o inicial a un estad o d e aceptación. E s ir relevante la ex isten cia d e otros cam in os que conduzcan a un esta d o d e no aceptación. □ E l lenguaje d efin id o (o aceptado) por un A F N es e l con jun to de cadenas que etiq u eta n cierto cam ino, d el estad o inicial a un esta d o d e aceptación. C om o m encionam os antes, el A F N d e la figura 3.24 define el m ism o lenguaje que la exp resión regular ( a |b )* a b b ; es decir, to d a s las car d en a s d el alfabeto { a , 6} que term inen en abb. P odem os usar L (A ) para representar el lenguaje aceptad o por e l a u tó m a ta A . E j e m p lo 3 .1 7 : L a figura 3.26 es un A F N q u e acep ta a L ( a a * |b b * ). L a ca d en a aaa s e acepta d eb id o a el cam ino. e a a a 0 ------------------------------ ► 1 ------------------------------ ► 2 ------------------------------ ► 2 ------------------------------ ► 2 O bserve q u e las es “desap arecen ” en u n a co n caten ación , p or lo q u e la etiq u e ta d el ca m in o es aaa. □ 3 .6 .4 A u t ó m a t a s f in ito s d e t e r m i n i s t a s U n au tóm ata fin ito d e te rm in ista (A F D ) es un ca so esp ecia l d e un A F N , en donde: 150 Capítulo 3. Análisis léxico a F igu ra 3.26: A F N q u e a cep ta a a a * |b b * 1. N o h ay m ovim ien tos e n la en trad a e. 2. P ara ca d a esta d o s y cad a sím b olo d e en trad a a, hay ex a cta m en te u n a línea q ue surge d e 5, Indecidible com o a. Si u tilizam os u n a tab la d e transición p ara representar a un A F D , en ton ces ca d a en trad a es un solo esta d o . Por en d e, p od em os representar a e s te esta d o sin las llaves q ue u sam os para form ar los conjuntos. M ientras q ue e l A F N es u n a representación a b stra cta d e un algoritm o p a ra reconocer las cad en as d e cierto len gu aje, e l A F D es un algoritm o sim p le y con creto p a ra reconocer cadenas. Sin d u d a es afortunado q ue cad a exp resión regular y ca d a A F N puedan convertirse en un A F D q ue acep te e l m ism o lenguaje, y a q u e es e l A F D el q u e en realidad im plem en tam os o sim ulam os al construir analizadores léxicos. E l sigu ien te algoritm o m uestra có m o aplicar un A F D a u na cadena. A lg o r it m o 3 .1 8 : Sim ulación de u n A F D . ENTRADA: U n a cad en a d e en trad a x , q u e se term in a con u n carácter d e fin d e archivo eof. U n A F D D con el esta d o in icial 5o, q ue acep ta esta d o s F , y la función d e tran sición m o ver. SALIDA: R esp ond e “s í ” e n caso d e q ue D acepte a x\ “no” en ca so contrario. M ÉTO D O : A plicar e l algoritm o d e la figura 3 .27 a la ca d en a d e en trad a x La función m o v e r(s,c ) proporciona e l esta d o para el cu a l h ay un flanco d esd e e l esta d o $ sobre la en trad a c. L a función sig C a r d evu elv e e l sigu ien te carácter d e la cad en a de en tra d a x. □ E j e m p lo 3 .1 9 : E n la figura 3 .28 vem os el grafo d e transición d e u n A F D q ue a cep ta e l lengu a­ je ( a |b ) * a b b , el m ism o que a cep ta e l A F N d e la figura 3.24. D ad a la ca d en a d e en trad a ababb, este A F D in trodu ce la secu en cia d e esta d o s 0, 1, 2, 1 , 2 , 3 y d ev u elv e “s i”. □ 3 .6 A u tóma ta s Gnitos 151 s = s 0; c = sig C a rQ ; w h ile ( c != e o f ) { s = m o v er(s , c ) ; c = sigC arQ ; } ¡ f ( s e s tá e n F ) r e t u r n " si" ; e l s e r e t u r n "no"; F igu ra 3.27: Sim ulación d e un A F D F igu ra 3.28: A F D que a cep ta a ( a |b ) * a b b 3 .6 .5 E je r c ic io s p a r a la s e c c ió n 3 .6 ! E j e r c ic io 3 .6 .1 : L a figura 3.19 e n los ejercicios d e la secció n 3.4 ca lcu la la función d e fallo para e l algoritm o KM P. M uestre cóm o, d ad a e s a fun ción d e fallo, p o d e m o s con stru ir, a partir d e u na p alab ra clave &1&2 • • • bn, un A F D d e n + 1 esta d o s q u e recon ozca a .*6162 • • • bn, en d o n d e e l p u n to represen ta a “cualquier carácter”. A dem ás, e s te A F D p u ed e con stru irse en un tiem p o 0 (n ). E j e r c ic io 3 .6 .2 : D iseñ e au tó m a ta s finitos (d eterm in istas o n o) para ca d a u no d e los lenguajes d e l ejercicio 3.3.5. E j e r c ic io 3 .6 .3 : P ara el A F N d e la figura 3.29, in diqu e tod os lo s cam in os etiq u eta d a s com o aabb. ¿E l A F N a cep ta a aabbl e F igu ra 3.29: A F N para e l ejercicio 3.6.3 152 Capítulo 3. Análisis léxico e F igu ra 3.30: A F N para el ejercicio 3.6.4 E j e r c ic io 3 .6 .4 : R ep ita el ejercicio 3.6.3 para e l A F N d e la figura 3.30. E j e r c ic io 3 .6 .5 : P roporcione las tab las d e tran sición para el A F N de: a) E l ejercicio 3.6.3. b) E l ejercicio 3.6.4. c) L a figura 3.26. 3.7 D e las e x p re sio n e s re g u la re s a los a u tó m a ta s La exp resión regular es la n otación d e elección para describir analizadores léxicos y d em ás softw are d e p rocesam ien to d e patrones, com o se v io en la secció n 3.5. N o ob sta n te, la im plem entación d e ese softw are requiere la sim u lación d e un A F D , com o en el algoritm o 3.18, o ta l vez la sim u lación d e un A F N . C om o, p o r lo general, u n A F N tien e la o p ció n d e m overse sobre un sím b olo d e en trad a (com o lo hace la figura 3.24, sobre la en trad a a d esd e el esta d o 0) o sobre e (com o lo hace la figura 3.26 d esd e e l esta d o 0 ), o incluso la o p ció n d e realizar una transición sob re e o sobre u n sím b olo de en trad a real, s u sim u lación e s m enos sim p le q u e la d e un A F D . P or en d e, con frecuencia e s im p ortan te convertir un A F N a u n A F D q ue a cep te el m ism o lenguaje. En e s ta sección verem os prim ero cóm o convertir A F N s a A F D s. D esp u és u tilizarem os e s ta técnica, co n ocid a com o “la con stru cción d e su b con ju n tos” , para producir un algoritm o ú til para sim ular a los A F N s d e form a d irecta, en situ a cio n es (aparte d e l análisis léxico) e n d ond e la conversión d e A F N a A F D requiere m ás tiem p o q ue la sim u lación d irecta. D esp ués, m ostra­ rem os cóm o convertir las exp resion es regulares en A F N s, a p artir d e lo cual p uede construir un A F D , s i lo d esea. C oncluirem os con u n a d iscu sión d e la s con cesion es en tre tiem p o y espacio, inherentes en los diversos m éto d o s para im plem entar ex p resion es regulares, y verem os cóm o p uede elegir e l m étod o apropiado para s u aplicación. 3 .7 .1 C o n v e r s ió n d e u n A F N a A F D La idea general d e la con stru cción d e su b con ju n tos e s q ue ca d a esta d o d e l A F D con stru id o corresponde a un con ju n to d e esta d o s d el A F N . D esp u és d e leer la en trad a a\Qa • • • an, e l A F D 3 .7 D e la s expresiones regulares a los autóm atas 153 s e en cu en tra en e l esta d o q ue corresponde al con ju n to d e esta d o s q ue el A F N p uede alcanzar, d esd e su esta d o inicial, sigu iend o los cam in os etiq u eta d o s com o ai 02 • • • anE s p o sib le q u e e l núm ero d e esta d o s d e l A F D s e a ex p o n en cia l en el núm ero d e esta d o s del A F N , lo cu a l podría provocar d ificu ltad es al tratar d e im plem entar e s te A F D . N o ob stan te, p arte d el poder d e l m étod o b asado en au tó m a ta s para e l an álisis léxico es q ue para los lengua­ je s reales, e l A F N y e l A F D tien en aproxim adam ente e l m ism o núm ero d e esta d o s, y no se ve e l com p ortam ien to exp on en cial. A lg o r i t m o 3 .2 0 : L a con strucción d e su bcon jun tos d e u n A F D , a p artir d e un A F N . E N T R A D A : U n A F N N. SA L ID A : U n A F D D q ue a cep ta el m ism o lengu aje q ue N. M ÉTO D O : N uestro algoritm o con stru ye u na ta b la d e tran sición D tra n p a ra D . C ad a estad o d e D es un con ju n to d e esta d o s d e l A F N , y con stru im os D tra n p a ra q u e D p u ed a sim ular “en paralelo” tod os los p osibles m ovim ien tos q ue N p uede realizar sobre u n a ca d en a d e en trad a d ad a. N uestro prim er problem a e s m anejar las tran siciones e d e N en form a apropiada. En la figura 3.31 vem os las d efinicion es d e varias funciones q ue d escrib en cá lcu lo s b ásicos en los esta d o s d e N que so n necesarios en e l algoritm o. O bserve q ue s e s un esta d o in d iv id u a l d e N, m ientras q u e T es u n con ju n to d e esta d o s d e N. O p e r a c ió n DESCRIPCIÓN e-cerra d u ra (s) C onjunto d e estad os d el A F N a los q u e se p uede llegar d esd e e l esta d o s d el A F N , sólo en las transiciones e. e -c erra d u ra (T ) C onjunto de estad os d el A F N a los q u e se p u ed e llegar d esd e cierto e sta d o 5 del A F N en el con ju n to T, sólo en las transiciones e; = U5en T e-cerradu ra(s). m o v e r (T , a ) C onjunto d e estad os d el A F N p a ra lo s cu a les h ay u n a tran sición sobre el sím b olo d e en trad a a, a partir d e cierto esta d o s en T. F igu ra 3.31: O peraciones sobre lo s esta d o s d el A F N D eb em os explorar eso s con ju n tos d e esta d o s e n lo s q u e puede esta r N d esp u és d e v er cierta ca d en a d e entrada. C om o b ase, an tes d e leer el prim er sím b olo d e entrada, N p u ed e esta r en cu alq uiera de los esta d o s d e e-cerradu ra(so), en d o n d e 5o es s u esta d o inicial. P a ra l a inducción, su p o n g a que N p u ed e estar e n el con ju n to d e esta d o s T d esp u és d e leer la c a d en a d e en trad a x. S i a con tinu ación lee la en trad a a, en ton ces N p uede pasar d e in m ediato a cu alq uiera d e lo s es­ ta d o s en m over( T, a). N o ob sta n te, d esp u és d e leer a tam bién podría realizar varias transicio­ n es e; por lo ta n to , TVp o d r ía estar e n cualquier esta d o d e e-cerradu ra(m over( T, a)) d esp u és de leer la en tra d a xa. Siguiendo esta s id eas, la con stru cción d el con ju n to d e esta d o s d e D , D esta d o s, y s u función d e tran sición D tra n , se m uestran en la figura 3.32. E l e sta d o inicial d e D es e-cerradura(so), y lo s esta d o s d e aceptación d e D so n to d o s aque­ llos con jun tos d e esta d o s d e N q u e incluyen cu a n d o m enos u n esta d o d e aceptación d e N. P ara 154 Capítulo 3. Análisis léxico com p letar n u estra d escrip ción d e la con stru cción d e su bconjun tos, sólo n ecesitam os m os­ trar cóm o a l principio, e-cerradura(so) es e l único esta d o en D e sta d o s , y e s tá sin marcar: w h i l e ( hay un esta d o sin m arcar T en D esta d o s ) { m arcar T; f o r ( c a d a sím b olo d e en trad a a ) { U — e-cerra d u ra (m o ver(T , a)); i f ( U n o e s tá en D e sta d o s ) agregar U com o esta d o sin m arcar a D e sta d o s; D tra n [T , a] = U\ } } F igu ra 3.32: L a con stru cción d e su bconjun tos e-cerra d u ra (T ) s e calcu la para cualquier con ju n to d e esta d o s T d el A F N . E ste proceso, q u e se m uestra e n la figura 3.33, es una b úsq ueda sim p le y d irecta en u n gráfo, a p artir d e un conjunto d e estad os. E n e s te caso, im agin e q ue só lo está n d isp on ib les las líneas In decid ib les com o e en e l gráfico. □ m eter to d o s los esta d o s d e T en pila; inicializar e-c erra d u ra (T ) co n T\ w h i l e ( p ila n o e s tá v a cía ) { sacar t , el elem en to superior, d e la p ila ; f o r ( cad a esta d o u co n un flanco d e t a u, Indecidible com o e ) i f ( u no e s tá en e-cerradura( T ) ) { agregar u a e-cerradura( T); m eter u en la pila; } } F igu ra 3.33: C álcu lo d e e-cerradura( T ) E j e m p lo 3 .2 1 : L a figura 3.34 m uestra a o tro A F N q ue a cep ta a ( a |b ) * a b b ; resu lta q u e es el q ue vam os a con stru ir d irectam ente a partir d e e s ta expresión regular en la sección 3.7. V am os a aplicar el A lgoritm o 3.20 a la figura 3.29. El esta d o in icial A d e l A F D eq u ivalen te es e-cerradu ra(0 ), o A = {0 , 1, 2, 4 , 7 } , y a q ue é sto s son los m ism os esta d o s a los q ue se p uede llegar d esd e e l esta d o 0 , a través d e un cam in o cu yas lín eas tien en tod os la etiq u e ta e. O bserve q ue un ca m in o p u ed a tener cero líneas, por lo q ue se puede llegar al esta d o 0 d esd e s í m ism o, m ediante un ca m in o etiq u e ta d a co m o e. El a lfa b eto d e e n tra d a es {a , b }. P or en d e, n uestro prim er p a so es m arcar A y ca lcu lar D tra n [A , a] = e -c e rra d u ra (m o v e r(A , a)) y D tra n [A , 6] = e-cerradu ra (m o v e r ( A , &)). D e los esta d o s 0 , 1, 2, 4 y 7, só lo 2 y 7 tien en tran sicio n es so b re a, h a cia 3 y 8 , re sp ectiv a m en te. Por en d e, m o v e r(A , a) = {3 , 8 }. A d em á s, e-cerradu ra ({3 , 8 } ) = {1 , 2, 3, 4 , 6 , 7, 8} , p or lo cu a l con clu im os que: 3 .7 D e la s expresiones regulares a los autóm atas 155 e F igu ra 3.34: E l A F N Ampara ( a |b ) * a b b D tran [A , a] — e-c erra d u ra (m o ve r(A , a)) = e-cerra d u ra ({3, 8 }) — {1 , 2, 3, 4, 6 , 7, 8 } V am os a llam ar a este con ju n to B , d e m anera q u e D tra n [A , a] — B. Ahora, d eb em os calcular D tran [A , b\. D e los esta d o s en A sólo e l 4 tien e u na transición sobre 6, y v a a l esta d o 5. Por ende, D tra n [A , 6] = e-cerra d u ra ({5 }) = { 1 , 2, 4, 6 , 7 } V am os a llam ar al con ju n to anterior C, d e m anera q ue D tra n [A , b] = C. ESTADO DEL A F N ESTADO DEL A F D a b {0 , 1, 2, 4 , 7} A B C { 1 , 2 , 3 , 4 , 6 , 7 , 8} B B D {1, 2, 4 , 5, 6 , 7} C B C { 1 , 2 , 4 , 5 , 6 , 7 , 9} D B E {1, 2, 3, 5, 6 , 7, 10} E B C F igu ra 3.35: T abla d e tra n sició n D tra n para el A F D D S i con tinu am os e s te p roceso co n los con jun tos desm arcados B y C, en un m om ento dado llegarem os a u n p u n to en el q ue tod os los esta d o s d e l A F D esté n m arcados. E s ta co n clu sión se garan tiza, y a q ue “sólo” h ay 211 su b con ju n tos d istin to s d e un con ju n to d e o n ce esta d o s d e un A F N . L os cin co esta d o s d istin to s d e l A F D q ue realm ente con stru im os, su s correspondientes con ju n tos d e estad os d el A F N , y la ta b la d e transición para e l A F D D s e m uestran en la figura 3.35, y el gráfico d e tran sición para D e s tá en la figu ra 3.36. E l e sta d o A es e l esta d o inicial, y e l esta d o E , q ue con tien e e l esta d o 10 d el A F N , es el único esta d o d e aceptación. O bserve q ue D tien e un e sta d o m ás q ue e l A F D de la figura 3.28 para el m ism o lenguaje. Los estad os A y C tien en la m ism a fun ción d e m ovim ien to, por lo cu a l p ueden com binarse. En la sección 3.9.6 hablarem os sob re la cu estió n d e reducir al m ínim o e l núm ero d e esta d o s d e un AFD. □ 156 Capítulo 3. Análisis léxico b F igu ra 3.36: R esu ltad o d e aplicar la con stru cción d e su b con ju n tos a la figura 3.34 3 .7 .2 S im u la c ió n d e u n A F N U n a estra teg ia q u e se h a u tilizad o en varios program as d e ed ició n d e t e x to es l a d e construir un A F N a partir d e u na exp resión regular, y d esp u és sim ular e l A F N u tilizan do algo com o una con stru cción d e su b con ju n tos “sob re la m archa” . L a sim u lación s e d escrib e a continuación. A lg o r it m o 3 .2 2 : Sim ulación d e u n A F N . ENTRADA: U n a cad en a d e en trad a x q ue term in a con u n carácter d e fin d e línea eof. U n A F N N con el esta d o in icial 5o, q ue acep ta estad o s F , y la función d e tran sición m o ver. SALIDA: R esp ond e “s í ” en caso d e q u e M acepte a x; “n o ” en ca so contrario. M ÉTO D O : E l algoritm o m antiene un con ju n to d e esta d o s actu ales 5 , aquellos a lo s q u e se lleg a d esd e 5o sigu iend o u n cam in o etiq u eta d o p or las en trad as leíd as h a sta e s e m om ento. Si c es el sigu ien te carácter d e en trad a leído por la fun ción sig C a rQ , en ton ces prim ero calculam os m o v e r(S , c) y d esp u és cerram os ese con ju n to usando e-cerra d u ra (). E n la figura 3.37 s e m uestra un b osquejo d e l algoritm o. □ 1) 2) 3) S = e-cerradura(so); c = á g C a r{)\ while ( c ! = eof ) { 4) 5) 6) 7) 8) S = e-cerra d u ra (m o ver(S ,c))] c = sig C a rQ ; } if ( S C\ F \ = else return 0 ) return "no"; "sí"; F igu ra 3.37: Sim ulación d e un A F N 3 .7 D e la s expresiones regulares a los autóm atas 3 .7 .3 157 E fic ie n c ia d e la s im u la c ió n d e u n A F N S i se im p lem en ta co n cu id ad o, el algoritm o 3 .22 p u ed e ser b astan te eficien te. C om o la s ideas im plicad as so n ú tiles e n u n a variedad d e algoritm os sim ilares q ue involucran la búsqueda de gráficos, verem os e s ta im plem en tación con m ás d eta lle. Las estru ctu ras d e d a to s q u e n ecesita­ m os son: 1 . D os pilas, ca d a u na de las cu ales con tien e un con ju n to d e esta d o s d el A F N . U n a d e esta s pilas, esta d o sA n t, con tien e e l con ju n to “a ctu a l” d e estados; e s decir, el valor d e S d el lado derecho d e la lín ea (4) e n la figura 3.37. L a segun da, esta d o sN u ev, co n tien e e l “sig u ien te” conjunto de estad os: S d el lado izquierdo d e la línea (4). H ay un p a so q ue no s e v e en el q u e , a m ed ida q ue avanzam os por e l ciclo d e las líneas (3) a la ( 6 ) , esta d o sN u e v se transfiere a e s ta d o s A n t 2. U n arreglo b oolean o ya E sta E n , in dexado por los esta d o s d el A F N , p a ra indicar cuáles estad os y a está n e n estadosN u ev. A un qu e el arreglo y la p ila co n tien en la m ism a infor­ m ación, es m ucho m ás rápido interrogar a yaE staE n[s] q ue buscar e l e sta d o s en la pila estadosN u ev. E s p or eficien cia q ue m antenem os am bas representaciones. 3. U n arreglo b idim ensional m o ver[s, a] q u e co n tien e la ta b la d e transición d e l A F N . Las entradas en e s ta tab la, q ue son con jun tos d e esta d o s, se representan m ediante lista s en­ lazadas. P ara im plem entar la lín ea (1) d e la figura 3.37, d eb em o s estab lecer ca d a en trad a en el arreglo ya E sta E n a FALSE, d esp u és para ca d a esta d o s en e-cerradu ra(so), h ay q ue m eter 5 en e s ta d o sA n t y yaE staE n[s] a TRUE. E s ta operación sobre e l esta d o $, y la im plem en tación de la lín ea (4) tam b ién , se facilitan m ed ian te u na fun ción a la q ue llam arem os agregarE stado(s). E s ta función m ete el estad o s en esta d o sN u ev, esta b lece yaE staE n[s] a TRUE, y s e lla m a a sí m ism a en form a recu rsiva sobre los esta d o s en m o v e r[s, c] para p od er am pliar e l cá lcu lo de e-cerradu ra(s). Sin em bargo, para ev ita r d uplicar el trabajo, d eb em os tener cu id ado d e nunca llam ar a agregarE stado en un estad o q ue y a se encuentre e n la p ila esta d o sN u ev. L a figura 3.38 m u estra u n b osquejo d e e s ta función. 9) 10) 11) 12 ) 13) 14) 15) agregarE stado(s) { m eter s en esta d o sN u e v; yaE staE n[s] = TRUE; f o r ( t en m o ver[s, c] ) ¡ f ( !y a E sta E n (t) ) agreg a rE sta d o (t); } F igu ra 3.38: A gregar u n nuevo esta d o s, que sab em os no se en cu en tra en esta d o sN u ev P ara im plem entar la lín ea (4) d e la figura 3.37, analizam os ca d a e sta d o 5 e n esta d o sA n t. Prim ero buscam os el con ju n to d e esta d o s m o ver[s, c], e n d on d e c es la sig u ien te entrada, y para 158 Capítulo 3. Análisis léxico ca d a u no d e eso s esta d o s q ue no s e en cu en tren y a e n esta d o sN u ev, le aplicam os agregarE stado. O bserve q ue agregarE stado tien e el efecto d e calcu lar e-cerradu ra y d e agregar tod os esos esta d os a esta d o sN u e v tam b ién , s i no se en con trab an y a agregados. E sta secu en cia d e pasos se resum e en la figura 3.39. 16) 17) 18) 19) 20) 21 ) 22) 23) 24) 25) 26) f o r ( s e n esta d o sN u e v ) { sacar s d e esta d o sN u e v; m eter s a estadosA n t] yaE staE n[s] = FALSE; } F igu ra 3.39: Im plem entación d e l p aso (4) d e la figura 3.37 Ahora, su p o n g a q u e el A F N N tien e n esta d o s y m transiciones; es d ecir, m es la su m a d e d e salida. Sin contar la llam ad a a agregarE stado e n la lín ea (19) d e la figura 3.3 9 , el tiem po invertido en e l ciclo d e las líneas (16) a (21) es O (n). E s d ecir, p od em os recorrer e l ciclo cu a n ­ d o m ucho n veces, y ca d a p aso d el ciclo requiere u n trab ajo con stan te, ex cep to p o r el tiem p o invertido en agregarE stado. Lo m ism o s e ap lica al ciclo d e la s lín eas (22) a la (26). D urante u n a ejecu ción d e la figura 3.39, e s decir, d el p a so (4) d e la figura 3.37, só lo es p osible llam ar u na vez a agregarE stado sob re un esta d o dado. L a razón e s q u e, ca d a vez q ue llam am os a agreg a rE sta d o (s), estab lecem os yaE staE n[s\ a TRUE en la lín ea 11 d e la figu ra 3.39. U n a vez q u e yaE staE n[s] es TRUE, las pruebas e n la lín ea (13) d e la figura 3.38, y la lín ea (18) d e la figura 3.39 ev ita n o tr a llam ada. El tiem p o invertido en u n a llam ad a a agregarE stado, exclu sivo d e l tiem p o invertido en las llam adas recursivas en la lín ea (14), e s 0 ( 1 ) para las líneas (10) y (11). P ara las lín eas (12) y (13), el tiem p o dep en de d e cu á n ta s tran siciones e haya al salir d e l esta d o s. N o con ocem os este núm ero para un esta d o dado, pero sab em o s q ue hay cu an do m enos m transiciones en to ta l, sa ­ liendo d e tod os los estad os. C om o resu ltad o, e l tiem p o adicional invertido en las líneas (11) d e tod as las llam adas a agregarE stado d urante u na ejecu ción d el có d ig o d e la figura 3.39 es 0 ( m ). El agregado para e l resto d e los p asos d e agregarE stado es O (n), y a q ue es u n a co n sta n te por llam ada, y h ay cu an d o m en os n llam adas. C oncluim os que, si se im p lem en ta en form a apropiada, e l tiem p o p a ra ejecu tar la lín ea (4) d e la figura 3.37 e s 0 ( n + m ). E l resto d el ciclo w h ile d e las lín eas (3) a la ( 6 ) requiere d e un tiem p o 0 (1 ) p or iteración. Si la en trad a £ es d e lon gitu d k , en ton ces el tra b a jo to ta l en ese ciclo es 0 ( ( k ( n + m )). L a lín ea (1) d e la figura 3.37 p uede ejecu tarse en un tiem p o 0 ( n + m ), 3 .7 D e la s expresiones regulares a los autóm atas 159 N o ta c ió n O g r a n d e (B ig -O h ) U n a exp resión com o 0 ( n ) es u n a abreviación para “cu a n d o m enos ciertos tiem p o s n cons­ ta n tes”. T écn icam ente, d ecim os q ue u n a función / ( n ) , ta l v ez el tiem p o d e ejecu ción de algún p aso d e u n algoritm o, es 0 (g(ri)) si h ay co n sta n tes c y r^, d e tal form a q ue c a d a vez q ue n > no, e s cierto q u e f (n ) < cg(n). U n m od ism o ú til es “0 ( 1 ) ” , q u e sign ifica “alguna co n sta n te”. E l uso d e e s ta n o ta c ió n B ig-O h n os p erm ite e v ita r profundizar d em asiad o en los d eta lle s acerca d e lo q ue con tam os com o unidad d e tiem p o d e ejecu ción , y aún a sí nos p erm ite expresar la velocid ad a la cual crece e l tiem p o d e ejecución d e un algoritm o. y a q ue e n esen cia co n sta d e lo s pasos d e la figura 3.39, en d on d e esta d o sA n t só lo con tien en el e sta d o 5o- Las líneas (2 ), (7) y ( 8 ) requieren d e un tiem po 0 ( 1 ) ca d a una. Por en d e, e l tiem po de ejecu ción d el A lgoritm o 3.22, si se im p lem en ta en form a apropiada, es 0 ( ( k ( n + m )). E s d e ­ cir, el tiem p o requerido es proporcional a la longitud d e la en trad a m ultip licada por e l tam año (nod os m ás lín eas) d e l gráfo d e transición. 3 .7 .4 C o n s tr u c c ió n d e u n A F N a p a r t i r d e u n a e x p r e s ió n r e g u la r A hora le proporcionarem os u n algoritm o para convertir cualquier exp resión regular en un A F N q ue d efin a e l m ism o lengu aje. E l algoritm o e s tá orien tad o a la sin ta x is, y a q u e recorre e n form a recursiva h acia arriba el árbol sin tá ctico p a ra la exp resión regular. P a ra ca d a su bexpresión, el algoritm o con stru ye un A F N con un so lo esta d o aceptante. A l g o r i t m o 3 . 2 3 : El algoritm o d e M cN augh ton -Y am ada-T h om pson para convertir u n a expre­ sió n regular en un A F N . E N T R A D A : U n a exp resión regular r sobre e l alfa b eto E . SA L ID A : U n A F N iV q u e a ce p ta a L (r). M ÉTO D O : E m pezar por un an álisis sin tá ctico d e r para ob ten er la s su bexpresiones q ue la con stitu yen . L as reglas para construir un A F N co n sisten en reglas básicas p a ra el m anejo de su bexpresiones sin operadores, y reglas in du ctivas para construir A F N s m ás largos, a partir d e los A F N s para las su bexpresiones in m ed iatas d e u n a exp resión dada. B A SE : P ara la exp resión €, s e con stru ye el sigu ien te A F N : A qu í, i e s un nuevo esta d o , e l esta d o in icial d e e s te A F N , y f e s otro nuevo estad o, e l estad o a cep tan te para el A F N . P ara cualquier su bexpresión a en E , s e co n stru y e el sigu ien te A FN: 160 Capítulo 3. Análisis léxico en d on d e o tr a vez i y f so n n uevos esta d o s, los esta d o s inicial y d e aceptación, respectivam ente. O bserve q ue en am bas con stru cciones básicas, con stru im os un A F N d istin to , con nuevos esta ­ d os, para ca d a ocu rren cia d e e o algu na a com o su bexpresión d e r. I N D U C C I Ó N : Suponga que N (s) y N (t) son A F N s para las expresiones regulares s y t, respec­ tivamente. a) S u p on ga q ue r = s\t. E n ton ces N (r ), e l A F N para r, se con stru ye com o e n la figura 3.40. A qu í, i y f son nuevos estad os, los esta d o s inicial y d e aceptación d e N (r ), resp ectiva­ m ente. H ay tran siciones e d esd e i h a sta los esta d o s in iciales d e N (s) y N ( t) , y ca d a uno d e los esta d o s d e aceptación tien e tran siciones e h acia e l esta d o d e aceptación /. O bserve que los esta d o s acep tan tes d e N (s) y N (t) n o son d e aceptación en N (r ). C om o cualquier cam in o d e i a / d eb e pasar p or N (s) o N (t) exclu sivam en te, y co m o la e tiq u e ta d e ese ca ­ m ino no se m od ifica p or e l hecho d e q ue la s es salen d e i o en tran a f con cluim os q ue N (r) a ce p ta a L (s) U L(¿), q ue es lo m ism o q ue L (r ). E s decir, la figura 3.40 es u n a cons­ trucción correcta para el operador d e unión. in icio F igu ra 3.40: A F N para la unión de d os exp resion es regulares b) S u p on ga q ue r = st. E n ton ces, con stru ya N (r) com o en la figura 3.41. E l esta d o in icial d e N (s) se con vierte en el esta d o inicial d e N (r ), y e l e sta d o d e aceptación d e N (t) es el único esta d o d e aceptación d e N (r ). E l esta d o d e aceptación d e N (s) y el esta d o inicial d e N ( t) s e com b inan e n u n so lo estad o, con to d a s la s tran sicion es q ue en tran o salen de cualquiera d e eso s estad os. U n cam in o d e i a / e n la figura 3.41 d eb e pasar prim ero a través d e N (s) y , por lo tan to, su etiq u e ta em p eza rá co n a lg u n a ca d en a en L (s ). D esp ués, el cam in o con tin ú a a través d e iV(¿), p or lo q ue la etiq u e ta d el cam in o term in a con u na cad en a en L (t). C om o pronto argum entarem os, los esta d o s de a cep tación n un ca tien en lín ea s d e sa lid a y los esta d o s in iciales n u n ca tien en líneas d e en tra d a , por lo q ue n o es p osible q ue un cam in o v u elv a a entrar a N (s) d esp u és d e salir d e e s te esta d o . P or en d e, N (r) acep ta ex a cta m en te a L (s )L ( t), y es un A F N correcto para r — st. F igu ra 3.41: A F N para la con caten ación d e d os exp resion es regulares 3 .7 D e la s expresiones regulares a los autóm atas 161 c) S u p on ga q u e r = 5*. E n ton ces, para r con stru im os e l A F N N (r) q ue se m uestra en la figura 3.42. A q u í, i y / s o n nuevos esta d o s, el esta d o in icial y e l único e sta d o a cep ta n te de N (r ). P ara ir d e i a f p od em os segu ir e l ca m in o introducido, etiq u eta d o com o e, e l cual se o c u p a d e la única ca d en a en L (s )° , p od em os pasar al esta d o in icial d e N (s), a través d e ese A F N , y d esp u és d e su e sta d o d e aceptación regresar a su esta d o in icial, cero o m ás veces. E sta s op cion es perm iten q u e N (r) a cep te a to d a s la s ca d en a s en ¿ ( s ) 1, L (s )2, y a sí en lo su cesiv o , d e form a que el con ju n to en tero d e cad en as acep ta d a s por N (r) es L (s*). e e F igu ra 3.42: A F N para e l cierre d e u n a exp resión regular d ) P or ú ltim o, su p on ga q u e r = (s ). E n ton ces, L (r ) = L (s), y p o d em o s usar e l A F N N (s) com o N (r). □ L a descripción d el m étod o en el A lgoritm o 3.23 co n tien e sugerencias d e p or q ué la cons­ trucción in d u ctiva fu n cion a en la form a esperada. N o proporcionarem os u na p ru eb a form al de su correcto fu n cion am ien to, p ero s í presentarem os varias propiedades d e los A F N s construidos, ad em ás d e l im portan tísim o hecho d e q ue N (r) a ce p ta e l lengu aje L (r ). E s ta s propiedades son in teresantes y ú tiles para realizar u n a p ru eb a formal. 1. N (r) tien e cu an do m en os el d ob le d e esta d o s, q ue eq u ivalen a los operadores y operandos en r. E ste en la ce re su lta d e l hecho d e que ca d a p aso d e l algoritm o crea cu an do m enos dos nuevos estad os. 2. N (r) tien e u n esta d o in icial y un esta d o d e aceptación. E l esta d o d e aceptación n o tien e tran siciones salien tes, y e l esta d o inicial no tien e tran siciones en tran tes. 3. C ad a e sta d o d e N (r) q ue n o s e a el e sta d o d e a cep tación tien e u n a tra n sició n sa lien te en un sím b olo en S , o d os tran siciones sa lien tes, am bas en e. E j e m p l o 3 . 2 4 : V am os a usar el A lgoritm o 3 .23 para construir un A F N para r = ( a | b ) * a b b . L a figura 3.43 m u estra un árbol d e an álisis sin tá ctico para r, q u e es análogo a los árboles de an álisis sin táctico con stru id os para las exp resion es aritm éticas en l a secció n 2.2.3. P a ra la su b exp resión n , la prim era a , con stru im os e l sig u ien te A FN: 162 Capítulo 3. Análisis léxico rll r9 r, a I r10 r2 b F igu ra 3.43: Á rbol d e an álisis sin tá ctico para (a | b )* a b b H em os elegid o los núm eros d e los esta d o s para q ue sea n co n sisten tes con lo q u e sig u e. P a ra r 2 con stru im os lo siguiente: A hora p od em os com binar N (r{) y N( r2) , m ediante la con stru cción d e la figura 3 .40 para o b te ­ ner e l A F N para r3 = ri|r 2; e s te A F N se m uestra en la figura 3.44. F igu ra 3.44: A F N para r% El A F N para r4 = (r3) es e l m ism o q ue para r3. E n tonces, e l A F N para = (r3)* es com o se m uestra en la figura 3.45. H em os usado la con stru cción en la figu ra 3.42 para crear e s te A F N , a partir d e l A F N d e la figura 3.44. 3 .7 D e la s expresiones regulares a los autóm atas 163 F igu ra 3.45: A F N para rs A hora con sid erem os la su b exp resión r6, q u e es o tr a a . U tilizam os la con stru cción básica para a o tr a vez, pero d eb em os usar nuevos esta d o s. N o se p erm ite reutilizar el A F N q u e cons­ tru im os para n , aun cu an do n y r6 so n la m ism a expresión. E l A F N para r6 es: P ara ob tener e l A F N d e r 7 = r5 r6, aplicam os la con stru cción d e la figu ra 3.41. C om binam os los estad os 7 y 7', co n lo cual s e produce el A F N d e la figura 3.46. S i continuam os d e e s ta form a co n n uevos A F N s para las d o s su bexpresiones b llam adas rg y n o , en un m om ento d a d o cons­ truirem os el A F N para ( a | b ) * a b b q u e v im o s prim ero en la figura 3.34. □ inicio F igu ra 3.46: A F N para iy 3 .7 .5 E f ic ie n c ia d e lo s a lg o r itm o s d e p r o c e s a m ie n to d e c a d e n a s O bservam os q ue el A lgoritm o 3.18 p rocesa u n a ca d en a x en u n tiem p o 0 ( \x \) , m ientras que e n la sección 3.7.3 con cluim os q ue p odríam os sim ular u n A F N en un tiem p o proporcional al 164 Capítulo 3. Análisis léxico producto d e |z| y el tam añ o d el gráfo d e tran sición d el A F N . O b viam en te, es m ás rápido hacer un A F D q u e sim ular un A F N , p or lo q ue p odríam os p reg u n ta m o s por q u é ten d ría sentid o sim ular u n A F N . U n a cu estió n q ue p uede favorecer a un A F N es que la con stru cción d e lo s su bconjun tos puede, en el peor caso, exp on en ciar e l núm ero d e esta d o s. A un qu e en principio, e l núm ero d e esta d os d el A F D n o influye en el tiem p o d e ejecución d el A lgoritm o 3 .1 8 , s i el núm ero d e esta ­ d os se vu elv e ta n grande q ue la ta b la d e transición no q u ep a en la m em oria principal, en ton ces e l verdadero tiem p o d e ejecución ten dría q u e incluir la E / S en d isco y, p or en d e, se elev a ría d e m anera considerable. E j e m p l o 3 . 2 5 : C onsidere la fam ilia d e lenguajes d escritos por la s ex p resion es regulares d e la form a Ln = ( a | b ) * a ( a | b ) n_1, e s decir, ca d a lengu aje L n c o n siste en ca d en a s d e as y 6s d e ta l form a q u e e l n-ésim o carácter a la izquierda d el ex trem o derecho co n tien e a a. U n A F N d e n + 1 estad os es fácil d e construir. P erm anece e n su esta d o inicial b a jo cualquier entrada, pero tam bién tien e la o p ció n , e n la en trad a a, d e pasar a l esta d o 1. D el esta d o 1 p a sa a l esta d o 2 en cualquier entrada, y a sí en lo su cesivo, h a sta q u e en e l esta d o n acepta. L a figura 3.47 sugiere este A F N . inicio a, b s ~ \ a, b a, b a, b F igu ra 3.47: U n A F N q u e tien e m ucho m enos esta d o s q u e el A F D eq u ivalen te m ás pequeño N o o b sta n te, cualquier A F D para el len gu aje Ln d eb e tener cu an do m en os 2" esta d o s. N o dem ostrarem os e s te hecho, pero la id ea es q ue si d os ca d en as d e lon gitu d n p ueden llevar al A F D a l m ism o esta d o , en to n ces p od em os exp lotar la ú ltim a posición en la q u e difieren las cad en as (y, por lo tan to, u na d eb e tener a a y la o tr a a 6) p a ra continuarlas en form a idéntica, h a sta q u e sean la m ism a en las ú ltim as n — 1 p osiciones. E n ton ces, e l A F D esta rá en un esta d o en e l q ue d eb e ta n to aceptar com o no aceptar. Por fortuna, com o dijim os antes, e s raro q ue en e l análisis léxico se involucren p atron es d e este tip o , y no esperam os encontrar A F D s con nú­ m eros extravagantes d e estad os en la práctica. □ Sin em bargo, los generadores d e analizadores léxicos y o tro s sistem a s d e p rocesam ien to d e cad en as em p iezan a m enudo co n u n a expresión regular. N o s en frentam os a la o p ció n d e conver­ tir e s ta exp resión en un A F N o A F D . E l co sto adicional d e elegir un A F D es, por en d e, e l co sto d e ejecu tar el A lgoritm o 3.23 en el A F N (podríam os pasar d irecto d e u na exp resión regular a un A F D , pero e n esen cia e l trab ajo es el m ism o). Si e l procesador d e ca d en a s se v a a ejecutar 3 .7 D e la s expresiones regulares a los autóm atas 165 m uchas veces, com o es el caso para e l an álisis léxico, en ton ces cualquier c o sto d e convertir a u n A F D es aceptab le. N o ob sta n te, e n otra s ap licacion es d e procesam iento d e cad en as, com o G rez, en d ond e el usuario esp ecifica u n a exp resión regular y u no d e varios archivos en lo s que s e v a a buscar e l patrón d e esa exp resión , p uede ser m ás eficien te om itir el paso d e construir u n A F D , y sim ular e l A F N d irectam ente. V am os a considerar e l c o sto d e convertir u na exp resión regular r e n u n A F N m ed ian te el A lgoritm o 3.23. U n p aso clave es construir e l árbol d e an álisis sin tá ctico para r. E n e l cap ítu ­ lo 4 verem os varios m éto d o s que son cap aces d e con stru ir e s te árbol d e an álisis sin tá ctico en tiem p o lin eal, es decir, en u n tiem p o 0 ( |r |) , en d on d e |r | represen ta e l ta m a ñ o d e r: la su m a d e l núm ero d e op erad ores y op eran d os en r. Tam bién es fácil verificar q ue ca d a u n a d e las con stru ccion es b á sica e in d u ctiva d e l A lgoritm o 3 .23 requiera un tiem p o co n sta n te, d e m anera q u e e l tiem p o com p leto invertido p or la conversión a un A F N es 0 ( |r |) . A dem ás, com o ob servam os e n la sección 3 .7 .4 , e l A F N q ue con stru im os tien e cu an do mucho \r \ esta d o s y 2 |r | transiciones. E s decir, e n térm inos d el an álisis en la sección 3.7.3, tenem os q u e n < | r | y r a < 2 | r | . A sí, la sim u lación de e s te A F N en u na ca d en a d e en trad a x requiere un tiem p o 0 ( |r | x \x \). E ste tiem p o d om in a el tiem po requerido p o r la con stru cción d el A F N , que e s 0 ( |r |) y, p or lo tan to, con clu im os q ue e s p o sib le tom ar u na exp resión regular r y la cad en a x , e indicar si rrestá en L (r ) en u n tiem p o 0 ( |r | x \x\). E l tiem p o q ue requiere la con stru cción d e su b con ju n tos d ep en d e e n gran p arte d e l núm ero d e estad os q ue te n g a el A F D resu ltan te. P ara em p ezar, observe q u e en la con stru cción d e la fi­ g u ra 3.32, e l p aso clave, la con stru cción d e un con ju n to d e e sta d o s U a p artir d e un conjunto de esta d o s T y un sím b olo d e en trad a a, es m uy parecida a la con stru cción d e u n n u evo conjunto d e esta d o s a partir d el an tigu o con ju n to d e esta d o s e n la sim u lación d e un A F N d el A lgoritm o 3.22. Y a hem os con cluid o que, si s e im p lem en ta en form a apropiada, e s te p aso requiere cuan­ d o m ucho un tiem p o proporcional a l núm ero d e esta d o s y tran siciones d e l A F N . S u p on ga q ue em p ezam os con u n a expresión regular r y la con vertim os en un A F N . E ste A F N tien e cu an do m ucho |r | esta d o s y 2 |r | transiciones. A dem ás, h ay cu a n d o m ucho \r \ sím b o­ los d e entrada. A sí, para ca d a esta d o con stru id o d e l A F D , d eb em os construir cu a n d o m ucho |r| nuevos estad os, y cada u no requiere a lo m ás un tiem p o 0 ( |r | + 2 |r |) . E l tiem p o para construir u n A F D d e s esta d o s e s , p o r con sigu ien te, 0 ( |r | 2s). E n el caso com ú n en el q ue 5 es ap roxim adam ente |r |, la con stru cción d e subconjuntos requiere u n tiem p o 0 ( |r |3). N o ob sta n te, en el peor ca so com o en el ejem p lo 3 .2 5 , e s te tiem po e s 0 ( |r | 22 ^ ). La figura 3.48 resu m e las op cion es cu an do recibim os u na exp resión regular r y d eseam os producir un reconocedor q ue indique si u na o m ás ca d en a s x e stá n en L (r). AUTÓMATA AFN Caso típico del A F D Peor caso del A F D In i c i a l 0(M) 0(|r|3) Oflr|22l-1) POR CADENA 0(|r| x |*|) 0(1*1) 0(|*|) F igu ra 3.48: C osto in icial y c o sto por ca d en a d e varios m étod os para reconocer e l len gu aje de u n a exp resión regular 166 Capítulo 3. Análisis léxico Si d om in a e l c o sto por cad en a, com o es e l caso cu a n d o con stru im os un analizador léxico, es evid en te q ue preferim os el A F D . N o ob stan te, en los com an dos com o g r e p , en donde ejecu ta ­ m os e l a u tó m a ta só lo sob re u n a cad en a, p or lo general, preferim os e l A F N . N o e s sin o h a sta q ue \x\ se acerca a |r |3 q ue em p ezam os a considerar la conversión a u n A F D . Sin em bargo, h ay una estra teg ia m ix ta q ue es casi ta n b uena com o la mejor estra teg ia d el A F N y A F D para ca d a exp resión r y cad en a x. E m p ezam os sim u land o e l A F N , pero recor­ d am os los con jun tos d e estad os d e l A F N (es d ecir, los esta d o s d e l A F D ) y su s transiciones, a m ed ida q ue los calcu lam os. A n tes d e procesar e l con ju n to actu al d e esta d o s d el A F N y el sím b olo d e en trad a actu al, com probam os si ten em os y a calcu lada e s ta tra n sició n , y utilizam os la inform ación en caso d e q ue así sea. 3 .7 .6 E je rc ic io s p a r a la s e c c ió n 3 .7 E je r c ic io 3 .7 .1 : C onvierta a A F D s los A F N s de: a) L a figura 3.26. b) L a figura 3.29. c) L a figura 3.30. E je r c ic io 3 .7 .2 : U se e l A lgoritm o 3.22 p ara sim ular los A F N s. a) F igu ra 3.29. b) F igu ra 3.30. con la en tra d a aabb. 3 . 7 . 3 : C onvierta las sigu ien tes exp resion es regulares en au tó m a ta s finitos d eterm i­ nistas, m ediante los algoritm os 3.23 y 3.20: E je r c ic io a) (a | b )* . b) (a * | b * )* . c) ((e | a )b * )* . d) (a | b )* a b b (a | b )* . 3.8 D iseñ o d e u n g e n e ra d o r d e a n a liz a d o re s léxicos En e s ta sección aplicarem os las técn icas p resen tad as en la sección 3.7 p a ra ver la arquitectura d e u n generador d e analizadores léxicos com o Lex. H ablarem os sobre d o s m éto d o s, basados en A F N s y A F D s; el ú ltim o es e n esen cia la im plem en tación d e Lex. 3.8 D iseño de un generador d e analizadores léxicos 3 .8 .1 167 L a e s t r u c t u r a d e l a n a liz a d o r g e n e r a d o L a figura 3.49 p resen ta las gen eralid ades acerca d e la arq u itectura d e un analizador léxico generado por Lex. E l program a q ue sirve com o analizador léxico in clu ye u n program a fijo que sim u la a un au tóm ata; e n e s te punto dejam os ab ierta la d ecisión d e si el a u tó m a ta es deter­ m in ista o no. E l resto d el analizador léxico co n siste en com p o n en tes q ue s e crean a partir d el program a Lex, por e l m ism o Lex. Búfer d e entrada Programa en Lex F igu ra 3.49: U n program a en Lex s e con vierte en u na ta b la d e transición y en acciones, para q ue las u tilice un sim ulador d e au tóm atas finitos E sto s com p on en tes son: 1. U n a ta b la d e transición para e l au tóm ata. 2. Las funciones q u e se pasan d irectam en te a través d e Lex a la sa lid a (v ea la sección 3.5.2). 3. Las accion es d e l program a d e entrada, q u e aparece com o fragm entos d e có d ig o q ue el sim ulador d e l a u tó m a ta d eb e invocar e n e l m om ento apropiado. P ara construir el au tóm ata, em p ezam os tom an d o ca d a patrón d e expresión regular en el program a en Lex y lo con vertim os, m ediante el A lgoritm o 3.23, en un A F N . N ecesitam os un so lo a u tó m a ta q ue reconozca los lexem as q ue coinciden co n algu no d e los patrones en el progra­ m a, p or lo q u e com binam os to d o s los A F N s en u no solo, introduciendo u n nuevo esta d o inicial c o n tran siciones e h acia cad a u no d e los esta d o s in iciales del N { d e los A F N s p a ra el p atrón p v E s ta con stru cción se m u estra en la figura 3.50. E je m p lo sim ple: 3 .2 6 : V am os a ilustrar las ideas de e s ta secció n co n el sigu ien te ejem p lo abstracto 168 Capítulo 3. Análisis léxico F igu ra 3.50: U n A F N con stru id o a partir d e u n program a en Lex a a b b a* b + { acción A i { acción A 2 { acción A 3 p a ra el p a tró n p i } para el p a tró n p 2} para el p a tró n p 3} O bserve q ue e sto s tres patrones presentan ciertos co n flicto s d e l tip o q u e describ im os en l a sec­ ción 3.5.3. E n esp ecial, la ca d en a abb coin cid e con e l segu n d o y tercer patrones, pero vam os a considerarla com o u n lexem a para el p atrón p¿, y a q ue el p atrón se lista prim ero en el p rogram a anterior en Lex. E n ton ces, las cad en as d e en trad a com o aabbb • • • tien en m uchos prefijos q ue coinciden co n e l tercer p atrón. L a regla d e L ex es to m a r e l m ás largo, por lo q ue continuam os leyendo bs h a sta encontrarnos con o tra a, en d o n d e reportam os q ue e l lex em a c o n sta d e las as iniciales, segu id as d e to d a s las bs q u e haya. La figura 3.51 m u estra tres A F N s q ue reconocen los tres patrones. E l tercero es u n a sim p li­ ficación d e lo q ue sald ría d el A lgoritm o 3.23. A sí, la figura 3 .52 m uestra e sto s tres A F N s com ­ binados en un so lo A F N , m ed ian te la adición d el esta d o inicial 0 y d e tres tran sicion es e. □ 3 .8 .2 C o in c id e n c ia d e p a t r o n e s c o n b a s e e n lo s A F N s Si e l analizador léxico sim u la un A F N com o el d e la figura 3.5 2 , en to n ces d e b e leer l a en trad a q ue em p ieza en el p u n to d e su entrada, al cu a l nos hem os referido com o in icio L exem a. A m e­ dida q ue el apuntador llam ado avan ce avan za h acia d ela n te e n la en trad a, ca lcu la e l conjunto d e esta d o s en los q u e se en cu en tra en ca d a punto, sig u ien d o e l A lgoritm o 3.22. En algú n m om ento, la sim u lación d e l A F N lleg a a un p u n to en la en trad a e n d on d e n o hay sig u ien tes estad os. E n e se punto, no h ay esp eran za d e q ue cualquier prefijo m ás largo d e la en ­ trad a haga q ue e l A F N llegue a un esta d o d e aceptación; e n vez d e ello, el con ju n to d e estad os siem p re esta rá vacío. P or en d e, esta m o s listos para decidir so b re el prefijo m ás largo q u e se a un lexem a q ue coincide con cierto patrón. 3.8 D iseño de un generador d e analizadores léxicos 169 F igu ra 3.52: A F N com binado .*b + ninguno F igu ra 3.53: Secu en cia d e los con jun tos d e esta d o s q ue s e in trodu cen al procesar la en trad a aaba 170 Capítulo 3. Análisis léxico B u scam os h acia atrás en la secu en cia d e con jun tos d e esta d o s, h a sta encontrar u n conjunto q ue in clu ya u no o m ás esta d o s d e aceptación. Si h ay varios esta d o s d e aceptación en e s e con ­ ju n to, elegim os e l q u e e s té asociad o co n el prim er p a tró n en la lis ta d el program a en L e x . R etroced em os el apuntador avan ce h acia e l final d el lexem a, y realizam os la acción A { asociad a con el p atrón p¿. E j e m p l o 3 . 2 7 : Su p on ga q ue ten em os los patrones d el ejem p lo 3.36 y q ue la en trad a em p ieza con aaba. L a figura 3 .5 3 m uestra los con ju n tos d e esta d o s d el A F N d e la figura 3 .52 q u e intro­ d ucim os, em p ezan d o con e-cerradu ra del esta d o inicial 0, e l cu a l es {0, 1, 3, 7 } , y p rocedien do a partir d e ahí. D esp u és d e leer e l cu arto sím b olo d e en tra d a , nos encontram os e n un conjunto vacío d e estad os, y a q u e en la fig u ra 3.52 no h ay tran siciones salien tes d e l e sta d o 8 en la en ­ trad a a. Por en d e, n ecesitam os retroceder para buscar un con ju n to d e esta d o s q ue in clu ya un esta d o aceptante. O bserve q u e , com o se in d ica en la figura 3.53, d esp u és d e leer a n os encontram os en un con ju n to q ue in clu ye el e sta d o 2 y, p or lo ta n to , in d ica q u e el patrón a tien e u n a coinciden ­ cia. N o ob sta n te, d esp u és d e leer aab n os encontram os en el esta d o 8 , el cu a l in d ica q u e s e h a en con trad o u n a coin cid en cia co n a * b + ; e l prefijo aab es el prefijo m ás largo q ue nos llev a a un esta d o d e aceptación. P or lo tan to, seleccion am os aab com o e l lex em a y ejecu tam os la acción ^ 3 , la cual d eb e incluir un regreso al analizador sin tá ctico , indicando q ue se h a en con trad o el token cu yo patrón es p3 = a * b + . □ 3 .8 .3 A F D s p a r a a n a liz a d o r e s lé x ic o s O tra arquitectura, q ue se asem eja a la salid a d e L e x , es convertir e l A F N para to d o s los p a ­ trones en u n A F D eq u ivalen te, m ediante la con stru cción d e su bconjun tos d e l A lgoritm o 3.20. D entro d e ca d a esta d o d e l A F D , si h ay u no o m ás esta d o s acep tan tes d el A F N , se d eterm in a e l prim er p atrón cu yo esta d o a cep tan te s e representa, y e s e p atrón se con vierte en la sa lid a d el esta d o A F D . E j e m p l o 3 . 2 8 : L a figura 3.54 m u estra un diagram a d e transición d e esta d o basado en e l A F D q ue s e con stru ye m ed ian te la con stru cción d e subconj u n tos d el A F N e n la figura 3.52. Los es­ tad os d e aceptación se etiq u e ta n m ediante el p atrón identificado por ese esta d o . Por ejem p lo, e l esta d o { 6 , 8 } tien e d o s esta d o s d e aceptación, los cu ales corresponden a lo s patrones a b b y a * b + . C om o e l prim er patrón se lista prim ero, ése es e l p atrón q u e se asocia con el esta d o {6, 8 }. □ U tilizam os el A F D en un analizador léxico e n form a m uy parecida a l A F N . Sim ulam os el A F D h a sta q ue en cierto p u n to n o h aya un esta d o sigu ien te (o h ablando e n sen tid o estricto , h a sta q u e e l sigu ien te esta d o se a 0 , el esta d o m u e rto q ue corresponde al con ju n to vacío d e esta ­ d os d e l A F N ). E n e se punto, retrocedem os a través d e la secu en cia d e esta d o s q ue introdujim os y, ta n pronto com o nos encontram os con un e sta d o d e aceptación d e l A F D , realizam os la acción a sociad a con el p atrón para ese estado. E j e m p l o 3 . 2 9 : S u p on ga q ue e l A F D d e la figura 3 .54 recibe la en trad a abba. L a secu en cia d e esta d o s in troducidos es 0137, 247, 58, 68 , y en la a final no h ay u na tran sición q ue sa lg a d el esta d o 68 . Por en d e, consideram os la secu en cia a partir d el final, y en e s te caso, 68 en s í es un e sta d o d e acep tación que rep orta e l patrón = abb. □ 171 3.8 D iseño de un generador d e analizadores léxicos a F igu ra 3.54: Grafo d e tran sición para un A F D q ue m aneja lo s patrones 3 .8 .4 a, a b b y a * b + I m p le m e n ta c ió n d e l o p e r a d o r d e p r e a n á lis is E n la sección 3.5.4 v im o s q ue algunas veces es necesario el operador d e preanálisis / d e L e x en u n p atrón n /r ¿ , y a q u e ta l vez e l patrón n para un tok en específico d eb a describir cierto con ­ te x to r2 a la izquierda, para poder identificar e n form a correcta e l lex em a a ctu al. A l convertir el p atrón r i /r 2 e n un A F N , tratam os a l / com o si fuera e, p o r lo q u e en realidad no buscam os u n / e n la en trad a. N o ob sta n te, si el A F N reconoce u n prefijo x y d e l búfer d e entrada, d e form a que co in cid a con e s ta exp resión regular, e l final d el lex em a no es en donde e l A F N en tró a su estad o d e aceptación. E n v e z d e ello , e l final ocurre cu a n d o el A F N en tra a un esta d o s t a l que: 1 . 5 ten g a u n a tran sición e en e l / im aginario. 2. H ay u n cam in o d e l e sta d o inicial d el A F N h a sta e l esta d o 5 , q ue d eletrea a x. 3. H ay u n cam in o d e l e sta d o s al esta d o d e a cep tación que d eletrea a y. 4 . ares lo m ás largo p osib le para cualquier x y q u e cu m p la c o n las con d icion es 1-3. S i só lo h ay u n e sta d o d e transición e en el / im aginario en e l A F N , en ton ces e l final del lexem a ocurre cu an do s e en tra a este esta d o p or ú ltim a vez, com o se ilu stra en e l siguiente ejem p lo. Si el A F N tien e m ás d e un e sta d o d e transición e e n e l / im aginario, en to n ces e l pro­ b lem a gen eral de encontrar e l esta d o 5 actu a l s e d ificu lta m ucho m ás. 3 . 3 0 : E n la figura 3.55 se m u estra un A F N para e l patrón d e la instrucción IF de Fortran co n lectu ra ad elan tad a d e l ejem p lo 3.13. O bserve q u e la tran sición e d e l esta d o 2 a l 3 representa al operador d e aceptación. E l esta d o 6 in dica la presencia d e la palabra cla v e IF . N o o b sta n te, para encontrar e l lexem a IF exp loram os en retroceso h a sta la ú ltim a ocu rren cia del e sta d o 2 , ca d a v e z q ue se en tra al esta d o 6 . □ E je m p lo 172 Capítulo 3. Análisis léxico E s ta d o s m u e r to s e n lo s A F D s T écnicam ente, e l a u tó m a ta e n la figura 3.54 n o es e n s í un A F D . L a razón es q u e un A F D tien e una transición proveniente d e ca d a esta d o , e n ca d a sím b olo e n su a lfab eto de entrada. A q u í hem os o m itid o las tran sicion es q ue van al esta d o m uerto 0 y, p or lo tanto, hem os om itid o las tran siciones q ue v a n d e l esta d o m uerto h acia s í m ism o, en tod as las en trad as. Los ejem plos anteriores d e conversión d e A F N a A F D no ten ían u n a form a de pasar del esta d o in icial a 0, pero el A F N d e la figura 3.52 sí. N o ob sta n te, a l construir un A F D para usarlo en un analizador léxico, es im portante q ue tratem os al estad o m uerto d e m anera d istin ta , y a q u e d eb em os sab er cu a n d o no hay m ás p osibilid ad d e reconocer un lexem a m ás largo. Por en d e, sugerim os siem p re om itir las tran siciones h acia el estad o m uerto y elim inar el esta d o m uerto en sí. D e hecho, el problem a es m ucho m ás difícil d e lo q ue parece, y a q ue u n a con stru cción d e A F N a A F D puede producir varios esta d o s q u e n o puedan llegar a u n e sta d o d e aceptación, y d ebem os saber cu án d o se h a llegado a cu alq uiera d e e sto s esta d o s. L a sección 3 .9 .6 h ab la sobre cóm o com binar to d o s esto s esta d o s en un e sta d o m uerto, d e m anera q u e se a m ás fácil identificarlos. T am bién es interesante observar q u e si con stru im os un A F D a p artir de una exp resión regular q ue u tilice los A lgoritm os 3 .20 y 3.23, en to n ces e l A F D no tendrá ningún estad o, aparte d e 0 , q ue no p ueda d irig im o s h acia un esta d o d e aceptación. inicio Figura 3.55: A F N q u e recon oce la p alabra clave IF 3 .8 .5 E je rc ic io s p a r a la s e c c ió n 3 .8 E j e r c i c i o 3 .8 .1 : S u p on ga q u e ten em os d os tokens: (1) la p a lab ra clave i f y (2) los identificadores, q u e so n cad en as d e letras d istin ta s d e i f . Muestre: a) E l A F N para e sto s tokens. b) E l A F D p ara esto s tokens. E j e r c i c i o 3 .8 .2 : R ep ita el ejercicio 3.8.1 para los tokens q ue co n sista n en ( 1 ) la p alabra clave w h ile , (2) la p alabra clave when, y (3) los identificadores co m p u esto s de ca d en a s d e letras y d ígitos, em p ezan d o co n u n a letra. 3 .8 .3 : S u p on ga q u e vam os a revisar la definición d e un A F D para p erm itir cero o una transición salien te d e ca d a esta d o , en cad a sím b olo d e en tra d a (en v e z d e q u e s e a ex a cta ­ m ente u na transición, com o en la definición están d ar d el A F D ). D e e s ta form a, algunas expre­ E je r c ic io 3.9 Optimización d e los buscadores p o r concordancia d e patrones basados en AFD 173 sio n es regulares tendrían “A F D s” m ás pequeños en com paración con la d efinición está n d a r de u n A F D . P rop orcion e un ejem p lo d e u na exp resión regular así. E j e r c i c i o 3 . 8 . 4 : D iseñ e un algoritm o para reconocer lo s patrones d e lectu ra p or adelantado d e Lex d e la form a n / r2, en d on d e n y r 2 so n exp resion es regulares. M u estre cóm o funciona su algoritm o en las sigu ien tes entradas: a) ( abcd\abc)/d b) ( a |a 6) / 6a c ) aa * /a * 3.9 O p tim iz a c ió n d e los b u s c a d o re s p o r c o n c o rd a n c ia d e p a tr o n e s b a sa d o s e n A F D E n e sa sección presentarem os tres algoritm os q ue se u tiliza n para im plem entar y optim izar b uscadores p o r con cordan cia d e p atron es, con stru id os a partir d e exp resion es regulares. 1. El primer algoritm o es ú til en un com pilador d e Lex, y a q ue construye un A F D directam en­ te a partir d e u na expresión regular, sin construir un A F N interm edio. A dem ás, e l A F D resultante puede tener m enos estad os q ue e l A F D que se construye m ediante un A F N . 2. E l segu n d o algoritm o dism inu ye al m ínim o e l núm ero d e esta d o s d e cualquier A F D , me­ diante la com binación d e los esta d o s q ue tien en e l m ism o co m p ortam ien to a futuro. El algoritm o e n s í es b astan te eficien te, pues se eje cu ta en un tiem p o 0 (n log n ), e n donde n es e l núm ero d e esta d o s d e l A F D . 3. E l tercer algoritm o produce representaciones m ás com p a cta s d e las tab las d e transición que la ta b la están d ar bidim ensional. 3 .9 .1 E s ta d o s s ig n ific a tiv o s d e u n A F N P ara em p ezar n uestra d iscu sión acerca d e cóm o pasar d irecta m en te d e u na expresión regular a un A F D , prim ero d eb em os analizar co n cu id ad o la con stru cción d el A F N d el algoritm o 3.23 y considerar los p apeles q ue d esem p eñ an varios esta d o s. A un esta d o d e l A F N le llam am os sig n ifica tivo si tien e u n a transición d e sa lid a q ue no s e a e. O bserve q ue la con stru cción de su b con ju n tos (A lgoritm o 3.20) só lo u tiliz a los esta d o s sig n ifica tiv o s en u n con ju n to T cuando calcu la e-c erra d u ra (m o ve r(T , a)), el con ju n to d e esta d o s a lo s q ue se p u ed e llegar d esd e T con u na en trad a a. E s decir, el con ju n to d e esta d o s m overos, a) no e s tá v a cío só lo s i e l esta d o s es im p ortan te. D u ran te la con stru cción d e su b co n ju n to s, pueden identificarse d os con jun tos de esta d o s del A F N (que se tra ta n com o si fueran el m ism o co n ju n to ) si: 1 . T ien en los m ism os esta d o s sign ificativos. 2. Y a s e a q u e am bos ten gan esta d o s d e acep ta ció n , o ninguno. 174 Capítulo 3. Análisis léxico C uando e l A F N se con stru ye a partir d e u n a exp resión regular m ediante e l A lgoritm o 3.23, p od em os decir m ás acerca d e los esta d o s sign ificativos. L os únicos esta d o s sig n ifica tiv o s son los que se in trodu cen com o esta d o s in iciales en la p a rte b á sica p a ra la p o sició n d e un sím b olo específico en la exp resión regular. E s decir, ca d a e sta d o sign ificativo corresponde a un op eran ­ d o esp ecífico en la expresión regular. El A F N con stru id o só lo tien e un esta d o d e aceptación, p ero é s te , q ue n o tien e transiciones d e salida, no es un esta d o sign ificativo. A l con catenar u n único m arcador final # derecho con una exp resión regular r, p roporcionam os a l esta d o d e aceptación p a ra r u n a transición sobre # , con lo cu al lo m arcam os com o u n estad o sign ificativo d el A F N para ( r ) # . E n o tra s palabras, al usar la exp resión regular au m en ta d a ( r ) # , p od em os olvid arn os d e los esta d o s d e aceptación a m ed ida q ue procede la con stru cción d e subconjuntos; cu an do se co m p leta la con stru cción , cualquier esta d o con una transición sobre # d eb e ser un esta d o d e aceptación. Los esta d o s sign ificativos del A F N corresponden d irectam ente a la s p osiciones en la ex ­ presión regular q ue con tien en sím b olos d el alfabeto. C om o pronto verem os, es con ven ien te pre­ sen tar la expresión regular m ed ian te su árbol sin tá c tic o , en d ond e la s h ojas corresponden a los operandos y los n od os interiores corresponden a los operadores. A un n odo interior s e le llam a n odo-con cat, n odo-o o n o d o -a sterisco s i se e tiq u e ta m ediante el operador d e co n ca ten a ­ ción (p u n to ), el operador d e unión |, o e l operador *, resp ectiv a m en te. P od em os construir un árbol sin tá ctico para u na exp resión regular al igual q ue com o lo h icim os para las expresiones aritm éticas en la sección 2.5.1. 3 . 3 1 : L a figura 3.56 m uestra e l árbol sin tá ctico p a ra la exp resión regular d e nuestro bosquejo. L os n od os-con cat s e representan m ed ian te círculos. □ E je m p lo F igu ra 3.56: Á rbol sin tá ctico para (a | b )* a b b # 3.9 Optimización d e los buscadores p o r concordancia d e patrones basados en AFD 175 Las h ojas e n un árbol sin tá ctico s e etiq u e ta n m ed ian te e o m ediante u n sím b olo d e l alfabe­ to . P ara c a d a h oja q ue no se e tiq u e ta com o e, le adjuntam os un en tero ú nico. N os referim os a e s te en tero com o la po sició n d e la h oja y ta m b ién com o u n a p osición d e su sím b olo. O bserve q u e un sím b olo p uede tener varias posiciones; p or ejem p lo, a tien e la s p osiciones 1 y 3 e n la figura 3.56. Las p osiciones en el árbol sin tá ctico corresponden a lo s esta d o s sign ificativos del A F N construido. E j e m p l o 3 . 3 2 : L a figura 3.57 m u estra e l A F N para la m ism a expresión regular q ue la figura 3.56, co n los esta d o s sign ificativos en um erados y los dem ás esta d o s representados por letras. Los estad os enum erados e n el A F N y las p osiciones en el árbol sin tá ctico corresponden d e una form a q u e pronto verem os. □ e F igu ra 3.57: A F N con stru id o por el A lgoritm o 3.23 para ( a |b ) * a b b # 3 .9 .2 F u n c io n e s c a lc u la d a s a p a r t i r d e l á r b o l s in tá c tic o P ara construir u n A F D d irectam en te a partir d e u na exp resión regular, con stru im os su árbol sin táctico y d esp u és calcu lam os cu atro funciones: anulable, p rim era p o s, v ltim a p o s y á g u ie n te p o s, las cu ales se d efinen a con tin u ación . C ad a definición se refiere al árbol sin tá ctico para una exp resión regular au m en tad a ( r ) # específica. 1 . anulable(n) es verdadera para un nodo n d el árbol sin táctico si, y sólo si, la subexpresión representada por n tien e a e e n su lenguaje. E s decir, la subexpresión p u ed e “hacerse nula” o puede ser la cad en a vacía, aun cu an do p ueda representar tam b ién a o tra s cadenas. 2 . prim erapos(n) es el conjunto d e posiciones en e l subárbol con raíz en n, que corresponde al primer sím bolo d e por lo menos una cadena en e l lenguaje de la subexpresión con raíz en n. 3. idtim apos(ri) es e l conjunto d e posiciones en e l subárbol con raíz en n, que corresponde al últim o sím bolo d e por lo m enos u na cadena en e l leguaje d e la subexpresión con raíz en n. 176 Capítulo 3. Análisis léxico 4. sig u ien tepos(p), para u na p osición p, e s el con ju n to d e p osiciones q en to d o el árbol sin táctico, d e ta l form a q ue h aya cier ta cad en a x = aia>¿ • • • an en u na L ( ( r ) # ) ta l q ue p ara cierta ¿, h aya u n a form a d e exp licar la m em bresía d e a: en L ( ( r ) # ) , h aciendo q ue a¿ coin cid a co n la p osición p d e l árbol sin tá ctico y Oj+i con la p osición q. 3 .3 3 : C onsidere e l n odo-con cat n en la figura 3.56, q ue corresp ond e a la expresión A legam os q ue anulable(n) es falsa, y a q u e e s te nodo gen era to d a s las ca d en a s d e as y fe q u e term in an en u na a; no gen era a e. Por o tro lado, el n odo-asterisco d eb a jo d e é l p uede hacerse nulo; gen era a e ju n to co n tod as las d em ás cad en as d e as y fe. p rim era p o s(n ) = { 1 , 2, 3 } . E n una cad en a gen erad a en form a com ú n , com o aa, la prim era p osición d e la cad en a corresp ond e a la p osición 1 d e l árbol, y en u n a ca d en a com o ba, la pri­ m era p osición d e la cad en a proviene d e la p osición 2 d e l árbol. N o ob sta n te, cu an do la ca d en a gen erad a por la exp resión d el nodo n es só lo a, en to n ces e s ta a proviene d e la posición 3. ídtim apo$(ri) = { 3 } . E s decir, sin im portar q u é ca d en a se genere a partir d e la expresión d el n odo n, la ú ltim a posición es la a q ue proviene d e la p osición 3 d e la cadena. sigu ien tepos es m ás d ifícil d e calcular, pero en b reve verem os la s reglas para hacerlo. He aquí u n ejem p lo d e l razonam iento: sigu ien tepos (1) = {1, 2, 3 }. C onsidere u na ca d en a • --ac-- •, en d ond e la c p u ed e ser a o 6, y la a proviene d e la p o sició n 1. E s decir, e s ta a e s u n a d e las q ue se generan m ediante la a en la exp resión ( a |b ) * . E s ta a p o d ría ir seg u id a d e o tr a a o b q ue p rovenga d e la m ism a su bexpresión, en cu yo caso c proviene d e la p osición 1 o 2. Tam bién es p osible q ue e s ta a s e a la ú ltim a en la cad en a gen erad a por ( a |b ) * , en cuyo ca so e l sím b olo c d eb e ser la a q ue proviene d e la p osición 3. Por ende, 1, 2 y 3 son ex a cta m en te las p osiciones q ue p ueden segu ir d e la p osición 1 . □ E je m p lo (a | b )* a . 3 .9 .3 C á lc u lo d e anulable , p rim era p os y u ltim apos P od em os calcu lar a anulable, p rim era p o s y u ltim a p o s m ediante recursividad d ire cta sobre la altu ra d el árbol. L as reglas básicas e in du ctivas para anulable y p rim era p o s se resum en en la figura 3.58. L as reglas para u ltim apos son e n esen cia las m ism as q ue p a ra p rim era p o s, pero las funciones d e los hijos C\ y d eb en intercam biarse e n la regla para un n odo-con cat. E j e m p l o 3 . 3 4 : D e to d o s los nodos en la figura 3.56, só lo e l n odo-asterisco p uede hacerse nulo. D e la ta b la d e la figura 3.58 p od em os observar q u e n in gu n a de las h ojas p u ed e hacerse nula, y a q ue tod as ellas corresponden a op eran d os q ue no so n e. E l n odo-o no p uede hacerse nulo, y a q ue n ingu no d e su s hijos lo son . E l n odo-asterisco p uede hacerse nulo, y a q ue tod os los nodosasterisco p ueden hacerse nulos. P or ú ltim o, ca d a u no d e los n o d o s-co n ca tt, q ue tien en por lo m enos un h ijo q ue no p u ed e hacerse nulo, n o pueden hacerse nulos. El cálcu lo d e p rim era p o s y u ltim apos para ca d a u no d e los n od os s e m u estra en la figura 3.59, co n p rim era p o s(n ) a la izquierda d el nodo n, y u ltim a p o s(n ) a su derecha. C ad a u n a d e las h ojas só lo s e tien e a s í m ism a para p rim era p o s y u ltim a p o s, segú n lo requerido en la regla para las hojas q ue no son e en la figura 3.58. P ara e l nodo-o, tom am os la unión d e p rim erapos en los hijos y hacem os lo m ism o para ultim apos. L a regla para e l nodo-asterisco d ice q ue d ebem os tom ar e l valor d e p rim erapos o u ltim apos en el único hijo d e ese nodo. 3.9 Optimización d e los buscadores p o r concordancia d e patrones basados en AFD 177 NODO n anulable(n) p rim era p o s(n ) U n a h oja etiq u e ta d a com o e tru e 0 U n a h oja co n la posición i f a ls e w U n n odo-o n = ci|c 2 an u lable(ci) o r anulable (C2) p rim era p o s(ci) U prim erapos(o¿) U n n odo-con cat n = C1 C2 an ulable(ci) a n d anuláble(c 2) i f (a n u la b le(ci) ) p rim era p o s(c\) U p rim erapos{o¿) e l s e p rim era p o s(ci) U n n odo-asterisco n — Ci* tru e p rim era p o s(ci) F igu ra 3.58: R eglas para calcu lar a anulable y p rim era p o s A hora, considere el n odo-con cat m ás inferior, al q ue llam arem os n. P ara calcu lar p rim era p o s( n) , prim ero consideram os s i e l operando izquierdo p uede hacerse n ulo, lo cu a l e s cierto en este ca so . P or lo tan to, p rim era p o s para n es la unión d e p rim era p o s p a ra ca d a u no d e su s hijos; e s decir, {1 , 2} U { 3 } = { 1 , 2, 3 } . L a regla p a ra id tim a p o s no aparece en form a ex p líc ita e n la figura 3.58, pero com o d ijim os antes, las reglas so n las m ism as q ue para p rim era p o s, con los h ijos intercam biados. E s d ecir, para calcular u ltim a p o s(n ) d eb em o s verificar s i s u hijo derecho (la h oja con la p osición 3) p uede hacerse nulo, lo cu a l no es cierto. P or lo ta n to , u ltim a p o s(n ) e s e l m ism o q ue e l n odo u ltim apos d e l hijo derecho, o { 3 } . □ 3 .9 .4 C á lc u lo d e siguientepos P or últim o, n ecesitam os ver cóm o calcular sigu ientepos. Sólo h ay d o s form as en q ue p od em os hacer q ue la p osición d e u na exp resión regular sig a a otra. 1. Si n es un n odo-con cat con e l hijo izquierdo C\ y co n e l hijo derecho c¿, en to n ces para cad a p osición i en u ltim a p o s{c i) , to d a s las p o sicio n es en prim era p o s(c 2) se en cu en tran en sigu ien tepos(i). 2. Si n e s un n odo-asterisco e i es una p osición en u ltim a p o s(n ), en ton ces to d a s la s p o sicio ­ nes en prim era p o s(n ) s e en cu en tran en sig u ien tep o s(Í). E j e m p lo 3 .3 5 : V am os a continuar co n nuestro bosquejo; recuerde q ue en la figura 3.59 calcu­ lam os p rim era p o s y xdtim apos. L a regla 1 para sigu ien tepos requiere q ue analicem os c a d a nodocon cat, y q u e coloqu em os ca d a p osición e n p rim era p o s d e su hijo derecho e n sig u ien tep o s, para cad a posición e n u ltim apos d e s u hijo izquierdo. P ara el n odo-con cat m ás inferior en la figura 3.59, esa regla in d ica q ue la posición 3 e s tá e n sig u ien tep o s( 1) y sig u ien tep o s(2). E l siguiente n od o-con cat in dica q ue la p osición 4 e s tá en siguientepos^3 ), y lo s d o s n o d os-con cat restan­ te s n os dan la p osición 5 en siguientepos^4 ) y la 6 e n siguientepos^5). 178 Capítulo 3. Análisis léxico {1,2,3} o {6} {1,2,3} o {5} {5} b { 5} {1*2,3} o {4} {1,2,3} o {3} {1,2} *{1,2} {6} #{6} {4} b {4} {3} a {3} { U } I {1,2} {\} a { \ } {2}b{2} F igu ra 3.59: p rim era p o s y xdtim apos para los n od os en el árbol sin tá ctico p a ra ( a |b ) * a b b # Tam bién d eb em os aplicar la regla 2 al nodo-asterisco. E sa regla nos in d ica q ue las p osi­ cion es 1 y 2 e s tá n tan to en sigu ien tepos( 1 ) com o en siguientepos{ 2 ), y a q ue ta n to p rim era p o s com o vitim a p o s para e s te n od o so n {1 ,2 }. L os con jun tos co m p leto s sig u ien tep o s s e resum en en la figura 3.60. □ NODO n sigu ien tep o s(n ) 1 2 { 1 ,2 ,3 } { 1 ,2 ,3 } 3 4 5 {4 } {5 } {6 } 6 0 F igu ra 3.60: L a fun ción sigu ien tepos P od em os representar la función sigu ien tepos m ed ian te la creación d e un gráfico dirigido, con un nodo para cada p osición y u n arco d e la p o sició n i a la p o sició n j s i y só lo si j se en cu en ­ tra en sigu ien tepos(i) . L a figura 3.61 m u estra e s te gráfico para la función d e la figura 3.60. N o d eb e sorprendernos el hecho d e q ue e l grafo para sig u ien tep o s s e a casi un A F N sin tran­ saccion es e para la exp resión regular su byacen te, y se con vertiría en uno si: 1. H acem os q ue tod as las p osicion es en p rim era p o s d e la raíz sean esta d o s iniciales, 2. E tiq u etam os ca d a arco d e i a j m ediante e l sím b olo en la p osición i. 3.9 Optimización d e los buscadores p o r concordancia d e patrones basados en AFD 179 F igu ra 3.61: G ráfico d irigido para la función sigu ientepos 3. H acem os q ue la p osición asociad a co n e l m arcador final # s e a e l único esta d o d e acepta­ ción. 3.9.5 C o n v e rsió n d ire c ta de u n a exp re sió n re g u la r a u n A F D A lg o r i t m o 3 .3 6 : C onstrucción d e u n A F D a p artir d e u na expresión regular r. E N T R A D A : U n a exp resión regular r. SA L ID A : U n A F D D q ue reconoce a L (r). M ÉTODO: 1. C onstruir u n árbol sin tá ctico T a partir d e la expresión regular au m en tad a ( r ) # . 2. C alcular anulable, p rim era p o s, v ltim a p o s y sig u ien tep o s para T, m ed ian te los m étod os de las secciones 3.9.3 y 3.9.4. 3. C onstruir D e sta d o s, el con ju n to de esta d o s d el A F D D , y D tra n , la fun ción d e transi­ ción para D , m ediante e l p rocedim ien to d e la figura 3.62. Los esta d o s d e D so n estad os d e posiciones e n T. A l principio, ca d a esta d o e s tá “sin m arca” , y un esta d o se “m arca” ju sto an tes d e q ue considerem os su s tran siciones d e salida. E l e sta d o inicial d e D es p rim era p o s(n 0), en d ond e e l nodo n 0 es la raíz d e T. L os esta d o s d e a cep tación so n los que con tien en la posición para e l sím b olo d e m arcador final # . E j e m p lo 3 .3 7 : A hora p od em os unir los pasos d e nuestro bosquejo y construir un A F D para la expresión regular r = ( a |b ) * a b b . E l árbol sin tá ctico para ( r ) # apareció e n la figura 3.56. A h í ob servam os q u e para e s te árbol, anulable es verdadera sólo para e l n odo-asterisco, y ex ­ h ibim os a p rim era p o s y u ltim a p o s en la figura 3.59. Los valores d e sigu ien tepos aparecen e n la figu ra 3.60. E l valor d e p rim era p o s para la raíz d e l árbol e s {1, 2, 3 } , p or lo q ue e s te con ju n to es el esta d o in icial d e D . L lam em os a e s te con ju n to d e esta d o s A . D eb em os calcu lar D tra n [A , a] y D tra n [A , b]. D e entre las p osiciones d e A , la 1 y la 3 corresponden a a, m ientras q u e la 2 corresp ond e a b. P or en d e, D tra n [A , a] = sigu ien tepos{ 1) U sig u ien tep o s(3) = { 1 , 2, 3, 4 } y 180 Capítulo 3. Análisis léxico inic¡alizar D e sta d o s para q u e co n ten ga sólo el esta d o sin m arcar p rim era p o s(n o ) , en d ond e no e s la raíz d el árbol sin tá ctico T p a ra ( r ) # ; w h i l e ( h ay un esta d o sin m arcar S en D e sta d o s ) { m arcar 5; f o r ( ca d a sím b olo d e en trad a a ) { dejar q ue U s e a la unión d e sig u ien tep o s(p ) para to d a s la s p en 5 q ue correspondan a a; i f ( U n o e s tá en D e sta d o s ) agregar U com o e sta d o sin m arcar a D esta d o s; D tran [S , a] — U\ } } F igu ra 3.62: C onstrucción de un A F D d irecta m en te a partir d e u n a exp resión regular D tra n [A , 6] = sig u ie n te p o s(2) = {1 , 2, 3 }. E ste ú ltim o es el esta d o A y , por lo ta n to , no tien e q ue agregarse a D esta d o s, pero el anterior, B = {1 , 2, 3 , 4 } es nuevo, p or lo q u e lo agregam os a D e sta d o s y procedem os a calcular su s transiciones. E l A F D co m p leto se m uestra en la figura 3.63. □ b F igu ra 3.63: A F D con stru id o a partir d e la figura 3.57 3.9.6 M in im izació n d el n ú m ero de esta d o s de u n A F D P u ed e haber m uchos A F D s q ue reconozcan e l m ism o lenguaje. Por ejem p lo , observe q ue los A F D s d e las figuras 3.36 y 3.63 reconocen e l lengu aje L ( ( a |b ) * a b b ) . E sto s a u tó m a ta s no solo tien en estad os con d istin to s nom bres, sin o que ni siq u iera tien en el m ism o núm ero d e estad os. Si im plem en tam os un analizador léxico com o u n A F D , p or lo general, e s preferible un A F D q ue ten g a el m enor núm ero d e estad os p osib le, y a q ue ca d a esta d o requiere en trad as en la ta b la para describir al analizador léxico. El asu nto d e los nom bres d e los estad os e s m enor. D ecim os q ue d o s a u tó m a ta s tien en n o m ­ bres de esta d o s equ ivalen tes s i u no p u ed e transform arse en e l o tro c o n só lo cam biar lo s nom bres d e los estad os. Las figuras 3.36 y 3.63 no tien en nom bres d e esta d o s eq u ivalen tes. N o ob sta n te, hay u na estrech a relación en tre los esta d o s d e ca d a uno. Los esta d o s A y C d e la figura 3.36 son en realidad eq u ivalen tes, y a q ue n ingu no es u n e sta d o d e aceptación, y en cualquier en trad a 3.9 Optimización d e los buscadores p o r concordancia d e patrones basados en AFD 181 transfieren h acia e l m ism o estado: h acia B en la e n tra d a a y h a cia C e n la e n tra d a 6. A dem ás, am bos esta d o s A y C se com p ortan com o el esta d o 123 d e la figura 3.6 3 . D e igual form a, el esta d o B d e la figura 3.36 s e co m p o rta com o e l esta d o 1234 d e la figura 3.63, e l esta d o D se co m p o rta com o el esta d o 1235, y e l esta d o E s e co m p o rta co m o e l esta d o 1236. C om o resultado siem p re h ay un A F D único c o n e l núm ero m ínim o d e esta d o s (equivalentes) para cualquier len gu aje regular. A dem ás, e s te A F D con e l m ínim o núm ero d e e sta d o s pude cons­ truirse a p artir d e cualquier A F D para e l m ism o lengu aje, m ed ian te e l agrupam iento d e con­ ju n to s con estad os eq u ivalen tes. E n e l caso d e L ( ( a |b ) * a b b ) , la figura 3.63 es e l A F D co n el m ínim o núm ero d e esta d o s, y p uede construirse particionando los esta d o s d e la figura 3.36 de la sigu ien te m anera: { A , C } { B } { D } { E } . P ara p od er com prender e l algoritm o para crear la partición d e esta d o s q u e co n v ierta a cu al­ quier A F D e n s u A F D eq u ivalen te co n e l m ínim o núm ero d e esta d o s, ten em os q ue ver cóm o las cad en as d e en trad a d iferencian un esta d o d e otro. D ecim os q ue la ca d en a x d iferen cia e l estad o s d e l estad o t s i só lo u no d e los estad os a los q ue se lleg a d esd e s y sigu iend o e l ca m in o con la etiq u e ta x, es un e sta d o d e aceptación. E l esta d o s p uede diferen cia rse d el esta d o t si hay a lgu n a ca d en a q ue los diferencie. E j e m p lo 3 .3 8 : L a cad en a v acía diferencia a cualquier esta d o d e aceptación d e cualquier estad o d e no aceptación. E n la figura 3.36, la cad en a bb diferencia e l esta d o A d e l B , y a q ue bb llev a al esta d o A h acia un esta d o C d e no aceptación, pero lleva a B a l esta d o d e aceptación E . □ E l algoritm o d e m inim ización d e estad o s fu n cion a m ed ian te el p articion am ien to d e los es­ ta d o s d e un A F D en gru p os de estad os q ue n o puedan diferenciarse. D esp ués, ca d a gru p o se co m b in a en un so lo esta d o del A F D co n el núm ero m ínim o d e esta d o s. E l algoritm o funciona m anten ien d o u n a p artición, cu yos gru p os son con jun tos d e esta d o s q u e n o se han diferenciado tod avía, m ientras q u e se sab e q ue d os esta d o s cualesquiera d e d istin to s gru p os pueden diferen­ ciarse. C uan do la p artición no p u ed e depurarse m ás m ed ian te la descom p osición d e cualquier gru p o en gru p os m ás p eq ueños, ten em o s e l A F D co n e l m ínim o núm ero d e estad os. A l principio, la partición c o siste e n d o s grupos: los esta d o s d e aceptación y los d e n o acep­ tación . E l p aso fun dam en tal es tom ar cierto gru p o d e la partición actual, p or decir A = {¿ i, 52, • ■ - , s*}, y cierto sím b olo d e en trad a a, y ver cóm o p uede usarse a para diferenciar algunos esta d o s e n e l gru p o A . E xam in am os las tran sicion es q ue sa len d e ca d a e sta d o s i, . . . , s* en la en trad a a, y si los esta d o s a los q ue s e llega p ertenecen a d o s o m ás gru p os d e la partición actu al, d ividim os a A en u na colección d e grupos, p a ra q ue y Sj esté n e n e l m ism o g ru p o, si y só lo si p asan al m ism o grupo en la en trad a a. R ep etim o s e s te p roceso d e divid ir grupos, h asta q u e ninguno d e los gru p os p u ed a d ivid irse m ás co n ningún sím b olo d e entrada. E n e l siguiente algoritm o se form aliza e s ta idea. A lg o r i t m o 3 .3 9 : M inim ización d el núm ero d e esta d o s d e u n A F D . E N T R A D A : U n A F D D co n un con ju n to d e esta d o s 5, e l alfa b eto d e en trad a E , e l estad o in icial s 0 y e l con ju n to d e esta d o s d e aceptación F. SA L ID A : U n A F D D ', q ue a ce p ta el m ism o len gu aje q ue D y tien e e l m enor núm ero d e estad os posible. 182 Capítulo 3. Análisis léxico P o r qu é fu n cio n a el alg o ritm o de m in im ización de esta d o s D eb em os dem ostrar d o s cosas: q ue los esta d o s q ue perm anecen en el m ism o gru p o en Hfinai no p ueden diferenciarse por n in gu n a cad en a, y q ue los esta d o s q ue term in an en gru­ p os d istin to s s í p ueden hacerlo. L a prim era es u na inducción sobre i , la cu a l nos d ice que si d esp u és d e la ¿-ésim a iteración d e l p aso (2) d el A lgoritm o 3 .3 9 , s y t se en cu en tran en e l m ism o grupo, en ton ces no h ay u n a ca d en a d e lon gitu d i o m enor q ue p ueda diferenciar­ los. D ejarem os los d eta lles d e e s ta in du cción para q u e u sted los deduzca. La seg u n d a es u na inducción sobre ¿, la cu a l n os d ice q ue si los esta d o s s y t s e co lo ­ can en d istin to s gru p os en la 2-ésim a iteración d el p aso (2 ), en ton ces hay u n a ca d en a que p uede diferenciarlos. L a base, cu an d o s y t s e colo ca n en grupos d istin to s d e la partición inicial, es sim ple: u no d eb e ser d e aceptación y e l o tro no, para q ue e los diferencíe. Para la inducción, d eb e haber u n a en trad a a y esta d o s p y q, d e ta l form a q ue s y t vayan a los esta d o s p y g, resp ectivam en te, con la en trad a a. A dem ás, p y q y a d eb en haberse colocad o e n gru p os d istin tos. E n ton ces, p or la h ip ótesis in d u ctiva, hay algu na ca d en a x que diferencia a p d e q. Por lo ta n to , ax diferencia a s d e t. M ÉTODO: 1. E m pezar co n u n a partición in icial II con d os grupos, F y S - F , los esta d o s d e aceptación y d e no acep tación d e D. 2. A plicar el procedim iento d e la figura 3.64 p a ra construir u n a n u eva partición U mev¡i. al principio, d ejar q ue n nueva = ü ; f o r (cad a gru p o G d e I I ) { p articionar G en su bgrup os, d e form a q u e d o s esta d o s s y t se en cu en tren en el m ism o su b gru p o, s i y só lo s i para todos los sím b olos d e en trad a a, lo s esta d o s s y t tien en transiciones sobre a h acia esta d o s en e l m ism o gru p o d e II; / * en el p eo r caso, un esta d o esta rá e n u n su bgrup o p or s í solo * / su stitu ir G e n n nueVa p or e l con ju n to d e tod os los su bgrup os form ados; } F igu ra 3.64: C onstrucción d e llueva 3. Si Ilnueva = II, dejar q ue n finai = II y continuar con el p a so (4 ). D e no ser así, repetir el p aso (2) co n n nueva e n v e z d e II. 4. Elegir un esta d o en ca d a grupo d e üfinai com o e l re p rese n ta n te para e se grupo. L os re­ p resentantes serán los esta d o s d e l A F D D ' con e l m ínim o núm ero d e esta d o s. Los d em ás com p on en tes d e D ' s e con stru yen d e la sigu ien te manera: 3.9 Optimización d e los buscadores p o r concordancia d e patrones basados en AFD 183 E lim in ación d el estad o m u erto A lgunas veces, e l algoritm o d e m m im ización produce un A F D con un esta d o muerto; uno q ue no e s aceptante y q u e se transfiere h acia s í m ism o en ca d a sím b olo d e entrada. T écnicam ente, este esta d o es necesario, y a q ue un A F D d eb e ten er u n a tran sición p ro­ ven iente d e cualquier estad o con ca d a sím bolo. N o o b sta n te y com o vim os en la sección 3.8.3, co n frecuencia es con ven iente saber cu an do no hay p osib ilid ad d e aceptación, para poder d eterm in ar q u e se h a v isto e l lexem a apropiado. Por en d e, ta l vez s e a con ven iente elim inar e l esta d o m uerto y u tilizar un a u tó m a ta q ue o m ita algu nas transiciones. E ste a u tó m a ta tien e un esta d o m en os q ue e l A F D co n el m ínim o núm ero d e esta d o s, pero h ablando e n sen tid o estr icto n o es un A F D , d eb ido a las tran siciones q ue faltan h a cia el esta d o m uerto. (a) El esta d o inicial d e D ' es e l representante d e l grupo que co n tien e el esta d o inicial d e D. (b ) Los esta d o s d e aceptación d e D ' son los representantes d e los gru p os q ue contienen un esta d o d e aceptación d e D . O bserve q ue ca d a grupo co n tien e sólo esta d o s de aceptación o só lo estad os d e no aceptación, y a q ue em p ezam os separand o esa s dos clases d e esta d o s, y e l procedim iento d e la figura 3.64 siem p re form a nuevos gru­ p os q u e so n su bgrup os d e los gru p os q ue se construyeron p reviam ente. (c) D ejar q u e s s e a el representante d e algún gru p o G d e IIfinai, y dejar q u e la transición d e D , d esd e s co n la en trad a a, s e a h acia e l esta d o t. D ejar q ue r s e a e l representan­ te d el gru p o H d e t. D espués en D \ h ay u na transición d esd e s h acia r c o n l a en trad a a. O bserve q ue en D , ca d a esta d o en e l gru p o G d eb e ir h acia algún esta d o d el gru p o H co n la en tra d a a, o d e lo con trario, e l grupo G s e hubiera d iv id id o d e acuerdo a la figura 3.64. E j e m p lo 3 .4 0 : V am os a reconsiderar e l A F D d e la figura 3.36. La p artición inicial co n siste e n los d o s gru p os { A , B , C, D } { E } q ue son , resp ectivam en te, los esta d o s d e no aceptación y los esta d o s d e aceptación. P ara construir IInueva, el procedim iento d e la figura 3.64 co n sid era am­ b os gru p os y recib e com o en trad a a y 6. E l gru p o { E } no p uede d ivid irse, y a q u e só lo tien e un e sta d o , p or lo cu a l { E } perm anecerá in tacto en n raieVaE l o tro grupo { A , ¿?, C, D } p u ed e dividirse, p or lo q ue d eb em o s considerar e l e fecto d e ca d a sím b olo d e en trad a. C on la en trad a a, ca d a u no d e esto s esta d o s p a sa a l esta d o B , por lo q u e no hay form a d e diferenciarlos m ediante cad en as q ue em p iecen con a. C on la en trad a 6, los estad os A , B y C pasan a los m iem bros d el gru p o { A , B , C, D } , m ientras q u e e l esta d o D p a sa a 2?, un m iem bro d e otro grupo. Por en d e, en IInueva, e l grupo { A , B , C, D } se d iv id e e n { A , B , C } { D } , y n nUeva para e s ta ronda es { A , B , C } { D } { E } . 184 Capítulo 3. Análisis léxico En la sigu ien te ronda, p od em os divid ir a { A , B , C } en { A , C } { B } , y a q ue ca d a u no d e los esta d os A y C p asan a un m iem bro d e { A , B , C } con la en trad a 6, m ientras q ue B p asa a un m iem bro d e o tro gru p o, { D }. A sí, desp ués d e la seg u n d a iteración, llueva = { A , C } { B } { D } { E } . P ara la tercera iteración , n o p od em os divid ir el único gru p o restan te co n m ás d e un estad o, y a q u e A y C van a l m ism o esta d o (y, p or lo tan to , al m ism o gru p o) co n c a d a entrada. C onclui­ m os q ue nfinaj = { A , C } { B } { D } { E } . A hora vam os a construir e l A F D con e l m ínim o núm ero d e esta d o s. T ien e cu a tro estad os, los cu ales corresponden a los cu atro gru p os d e Ilfinai, y vam os a elegir a A , B , D y E com o los representantes d e esto s grupos. E l esta d o inicial e s A y e l único esta d o a cep ta n te e s E . L a figura 3.65 m u estra la función de transición para el A F D . P or ejem p lo, la tran sición d esd e e l e sta d o E con la en tra d a b es h acia A , y a q ue e n el A F D original, E p a sa a C con la en trad a 6, y A es el representante del gru p o d e C. P or la m ism a razón, la tran sición co n b d esd e e l e sta d o A p a sa al m ism o esta d o A , m ientras q ue to d a s las d em ás tran sicion es son com o e n la figura 3.36. □ ESTADO a b A B A B B D D B E E B A F igu ra 3.65: T ab la d e tran sición d e un A F D co n e l m ínim o núm ero d e esta d o s 3.9.7 M in im izació n de esta d o s en los a n a lizad o res léxico s P ara aplicar el p rocedim ien to d e m inim ización d e esta d o s a los A F D s generados en la sección 3.8.3, d eb em os em pezar el A lgoritm o 3.39 co n la partición q ue agrupa en con ju n to a to d o s los esta d os q ue reconocen a un token esp ecífico, y q ue tam b ién c o lo c a e n un gru p o a to d o s los esta ­ d os q ue n o in dican n ingú n token. P ara hacer m ás claro esto , vam os a ver u n ejem plo. E j e m p lo 3 .4 1 : Para e l A F D d e la figura 3.54, la partición in icial es: {0137, 7 } { 2 4 7 } { 8 , 5 8 } { 7 } { 6 8 } { 0 } Es decir, los esta d o s 0137 y 7 d eb en estar ju n tos, y a q u e ninguno d e ello s an un cia un token. Los esta d o s 8 y 58 d eb en estar ju n to s, y a q ue am bos anuncian el tok en a * b + . O bserve q ue hem os agregado un esta d o m uerto 0, el cu a l su p on em os tien e tran siciones h a cia s í m ism o con las en trad as a y 6. E l e sta d o m uerto tam b ién es e l d estin o d e las tran sicion es faltan tes co n a d esd e los esta d o s 8, 58 y 68. D eb em os separar a 0137 d e 7, y a q ue p asan a d istin to s gru p os con la en trad a a. Tam bién separam os a 8 d e 58, y a q ue pasan a d istin to s gru p os co n b. P or en d e, to d o s los esta d o s se en cu en tran en gru p os por s í solos, y la figura 3.54 es e l A F D con e l m ínim o núm ero d e estad os q ue recon oce a su s tres tok en s. R ecuerde q ue un A F D q ue sirv e com o analizador léxico, p or lo general, elim in a e l esta d o m uerto, m ientras q ue tra ta m o s a las tran siciones fa lta n tes com o una señ a l para finalizar e l recon ocim iento d e tokens. □ 3.9 Optimización d e los buscadores p o r concordancia d e patrones basados en AFD 3.9.8 185 In terca m b io de tiem p o p o r espacio en la sim u lación de u n A F D L a m anera m ás sim p le y ráp id a d e representar la función d e transición d e un A F D es u n a ta b la b idim ensional in d exad a p or esta d o s y caracteres. D a d o u n esta d o y el sig u ien te carácter de en trad a, acced em os a l arreglo para encontrar el sig u ien te e sta d o y cualquier acción e sp ecia l que d eb em os tomar; p o r ejem plo, devolver un token al analizador sin tá ctico . C om o un analizador léxico ordinario tien e varios cien tos d e estad o s en su A F D e involucra al alfabeto A SC II d e 128 caracteres d e en trad a, e l arreglo con su m e m enos d e un m egabyte. N o ob sta n te, los com piladores tam b ién aparecen en d isp o sitiv o s m uy p eq ueños, en donde h a sta un m egab yte d e m em oria p od ría ser d em asiad o. P a ra ta les situ a cio n es, ex iste n m uchos m éto d o s q ue p o d e m o s usar para com p actar la ta b la d e transición. Por ejem plo, p o d em o s re­ presentar ca d a esta d o m ed ian te una lis ta d e tran siciones (es decir, pares carácter-estado) que s e term in en m ediante un esta d o predeterm inado, el cu a l d eb e elegirse para cualquier carácter d e en trad a q ue no se en cu en tre en la lista . Si elegim os com o predeterm inado e l sig u ien te esta ­ d o q u e ocu rra con m ás frecuencia, a m enudo p od em os reducir la cantidad d e alm acenam iento necesario por un factor extenso. Hay u na estructu ra d e d atos m ás su til q ue n os perm ite com binar la velocidad d el acceso a los arreglos con la com presión d e listas con valores predeterm inados. P odem os considerar e s ta es­ tructura com o cuatro arreglos, según lo sugerido en la figura 3.66.5 El arreglo base se u tiliza para determ inar la ubicación base d e las entradas para e l estad o s, q ue se encuentran en los arreglos si­ g u ien te y com probacion El arreglo predeterm in a d o se u tiliza para determ inar u na ubicación base alternativa, si el arreglo com probacion n os indica q ue e l q ue proporciona base[s] es inválido. p re d e te r ­ m in a d o sig u ie n te b a se / c o m p ro b a c ió n y F igu ra 3.66: E stru ctu ra d e d a to s para representar tab las d e transición P ara calcu lar sig u ie n te E sta d o (s, a ), la transición p a ra e l e sta d o s con la en tra d a a, exam ina­ m os las en trad as sig u ien te y com probacion en la ubicación l = b a se[s]+ a , en d on d e e l carácter a s e tra ta com o entero, su p u estam en te en e l rango d e 0 a 127. Si com probacion[l) = 5, entonces 5 En la práctica^ habría otro arreglo indexado p o r estados, p ara proporcionar la acción asociada con ese estado, si lo hay. 186 Capítulo 3. Análisis léxico e s ta en trad a es válid a y el sigu ien te esta d o para e l esta d o 5 con la en trad a a e s sig u ien te[l\. Si com probacion[l\ * s , en ton ces d eterm in am os o tro esta d o t — predeterm in ado[s] y rep etim o s el proceso, com o si t fuera e l esta d o actu al. D e m anera m ás form al, la fun ción sig u ien teE sta d o se d efine así: in t sig u ie n te E sta d o (s, a) { i f ( com probacion[base[s]+a] = s ) r e t u r n s¿guiente[base[s] + a]; e l s e r e t u r n sigu ien teE stado(p red eterm in a d o [s], a); } El u so q ue s e p retende d e la estru ctu ra d e la figura 3.66 e s acortar los arreglos sigu ien ­ te-com probacion, aprovechando las sim ilitu d es en tre los esta d o s. Por ejem p lo, e l esta d o ¿, el predeterm inado para el esta d o s, p od ría ser el esta d o q u e d ice “esta m o s trab ajan do con un identificador” , al igual q ue e l esta d o 10 en la figura 3.14. T al vez se en tre al e sta d o 5 desp ués d e v er las letras th , q ue son un prefijo d e la p alabra cla v e t h e n , a sí com o tam b ién p odrían ser e l prefijo d e algún lexem a para un identificador. C on e l carácter d e en trad a e , d eb em o s pasar d el estad o s a u n e sta d o esp ecial q u e recuerde q ue hem os v is to t h e , pero en caso con trario, el esta d o 5 se co m p o rta d e igual form a q ue t. Por en d e, a comprobacion[base[s] + e ] le asignam os s (para confirm ar q ue e s ta en trad a es válid a para s ) y a siguiente[base[s]+Q \ le asign am os el esta d o q u e recuerda a t h e . A dem ás, a p re d e te rm in a d o [5] se le a sig n a t. A unque tal vez no p od am os elegir los valores d e base d e form a q ue no h a y a entradas en sigu ien te-com probacion sin utilizar, la exp erien cia h a dem ostrado q ue la e str a te g ia sim p le d e asignar valores base a los esta d o s en tu m o , y asignar a c a d a valor d e base[s] e l en tero m ás bajo, d e m anera q ue las entradas esp eciales p ara el e sta d o 5 n o esté n y a o cu p a d a s, u tiliza un p o co m ás d e espacio q ue e l m ínim o posible. 3.9.9 E je rcicio s p a ra la sección 3.9 E j e r c ic io 3 .9 .1 : E x tie n d a la ta b la d e la figura 3.58 para q ue in clu ya los operadores (a) ? y (b) +. E j e r c ic io 3 .9 .2 : U se e l A lgoritm o 3.36 para convertir las exp resion es regulares d e l ejercicio 3.7 .3 d irectam en te en au tóm atas fin itos d eterm in istas. ! E j e r c ic io 3 .9 .3 : P od em os dem ostrar q ue d os exp resion es regulares so n eq u ivalen tes s i m ostra­ m os que su s A F D s co n e l m ínim o núm ero d e esta d o s so n los m ism os si se ca m b ia e l nom bre a los estad os. D em uestre d e e s ta form a q ue las sigu ien tes exp resion es regulares: ( a |b ) * , (a * |b * )* y ( (e |a ) b * ) * so n tod as eq u ivalen tes. N o ta : T al vez h a y a con stru id o los A F D s para e s ta s expre­ siones, al responder al ejercicio 3.7.3. ! E j e r c ic io 3 .9 .4 : C onstruya los A F D s co n el m ínim o núm ero d e esta d o s para las sigu ientes exp resion es regulares: a) ( a |b ) * a ( a |b ) . b) ( a |b ) * a ( a |b ) ( a |b ) . c) ( a |b ) * a ( a |b ) ( a |b ) ( a |b ) . 3.10 Resumen d el capítulo 3 187 ¿P u ed e ver u n patrón? E j e r c ic io 3 .9 .5 : P ara hacer u so form al d e la afirm ación inform al d e l ejem p lo 3.25, m uestre q u e cualquier a u tó m a ta fin ito d eterm in ista para la sig u ien te exp resión regular: ( a |b ) * a ( a |b ) ( a |b ) - ( a |b ) e n d on d e ( a |b ) aparece n — 1 veces al final, d eb e tener por lo m enos 2n esta d o s. Sugerencia: O bserve e l p atrón en e l ejercicio 3.9.4. ¿Q ué co n d ició n co n relación al h istorial d e entradas representa ca d a estad o? 3 .10 R e su m e n d e l c a p ítu lo 3 ♦ Tbkens. E l analizador léxico ex p lo ra e l program a fuente y produce com o sa lid a u n a se­ cu en cia d e tokens, los cuales, p or lo general, se pasan a l analizador sin tá ctico , u no a la vez. A lgu n os tokens pueden con sistir sólo d e un nom bre d e token, m ientras q ue otros tam bién pueden tener u n valor léxico asociado, e l cu a l p rop orcion a inform ación acera de la in stan cia esp ecífica d e l token q ue se h a en con trad o en la entrada. ♦ L exem as. C ad a vez q ue e l analizador léxico d ev u elv e un token al analizador sin tá cti­ co, tiene un lexem a asociado: la secu en cia d e caracteres d e en tra d a q ue representa el token. ♦ Uso de búferes. C om o a m enudo es necesario explorar por ad elan tad o sobre la entrada, para p od er ver en dónde term in a e l sigu ien te lexem a, es necesario q ue e l analizador léxico u tilice búferes en la entrada. E l u so d e un par d e búferes en form a cíclica y la term ina­ ción d e l con ten ido d e cad a búfer con u n cen tin ela q ue avise al llegar a su fin a l, so n dos técnicas q ue aceleran e l p roceso d e esca n eo d e la entrada. ♦ P a tro n es. C ad a token tien e un p atrón q u e d escrib e cu áles son las secu en cias d e ca r a cte­ res q u e p ueden form ar los lexem as correspondientes a e se token. A l con ju n to d e palabras, o cad en as d e caracteres, q ue coinciden co n u n p atrón d a d o se le co n o ce com o lenguaje. ♦ E xpresion es regulares. E sta s exp resion es se u tiliza n con frecuencia para describir los patrones. Las exp resion es regulares s e crean a partir d e caracteres individuales, m ediante el operador d e unión, d e con caten ación y el cierre d e K leene, o el operador “cualquier núm ero d e ”. ♦ D efin icio n es regulares. L as coleccion es com p lejas d e lenguajes, com o los patrones q ue d es­ criben a los tokens d e un lengu aje d e program ación, s e d efinen a m enudo m ed ian te una definición regular, l a cu a l es u n a secu en cia d e in stru cciones, en la s q ue ca d a u n a d e ellas d e ­ fine a u na variable q ue representa a cierta exp resión regular. L a exp resión regular para u na variab le p u ed e u tiliza r las variables d efin id a s co n anterioridad en s u exp resión regular. ♦ N o ta ció n d e ex presión regu lar exten d id a . P u ed e aparecer u n a variedad d e operadores adicionales com o abreviaciones en las exp resion es regulares, para facilitar la acción de expresar los patrones. A lgu nos ejem plos incluyen e l operador + (uno o m ás d e ), ? (cero 188 Capítulo 3. Análisis léxico o uno d e ), y las cla ses d e caracteres (la unión d e las cadenas, en d o n d e ca d a u n a co n siste en uno d e los caracteres). ♦ D iagram as d e tra n sició n de esta d o s. A m enudo, e l co m p ortam ien to d e un analizador léxico p uede describirse m ed ian te u n d iagram a d e transición d e esta d o s. E sto s diagram as tien en esta d o s, ca d a uno d e los cu ales represen ta algo acerca d el h istorial d e lo s caracte­ res v isto s d urante e l escan eo actu al, en b u sca d e un lex em a q ue co in cid a con u no d e los p osibles patrones. H ay flechas, o transiciones, d e u n e sta d o a o tro , c a d a u n a d e la s cu ales indica los p osib les sigu ien tes caracteres d e entrada, q ue p ueden hacer q ue el analizador léxico realice ese cam b io d e estad o. ♦ A u tó m a ta s fin ito s. Son u n a form alización d e los d iagram as d e tra n sició n d e esta d o s, los cu ales incluyen u n a d esign ación d e un estad o inicial y u no o m ás esta d o s d e aceptación, así com o el con ju n to d e estad os, caracteres d e en trad a y tran siciones en tre los estad os. Los estad os acep tan tes in dican q ue se h a en con trad o el lex em a para cierto token. A d i­ ferencia d e los diagram as d e tran sición d e esta d o s, los au tó m a ta s fin ito s pueden realizar tran siciones sob re u n a en trad a vacía, a sí co m o sobre los caracteres d e entrada. ♦ A u tó m a ta s fin ito s d e te rm in ista s. U n A F D e s un tip o esp ecia l d e a u tó m a ta fin ito , el cual tien e exa cta m en te u n a transición sa lien te d e ca d a esta d o , para c a d a sím b olo d e entrada. T am poco se p erm iten las tran sicion es sobre u n a en trad a vacía. E l A F D se p uede sim ular con facilidad, adem ás d e q ue realiza u n a b u en a im plem en tación d e u n analizador léxico, sim ilar a u n d iagram a d e transición. ♦ A u tó m a ta s fin ito s n o d e te rm in ista s. A los au tó m a ta s q ue n o son A F D s se le s con oce com o n o d eterm in istas. A m enudo, los A F N s son m ás fáciles d e diseñar q ue los A F D s. O tra p osible arquitectura para un analizador léxico es tabular to d o s los esta d o s en los q ue pueden encontrarse los A F N s p ara cad a u no d e lo s p osibles patrones, a m ed id a q ue exp loram os los caracteres d e entrada. ♦ C on versión en tre rep rese n ta cio n es d e p a tro n es. E s p o sib le convertir cualquier expresión regular en un A F N d e u n ta m a ñ o aproxim ado, q ue reconozca el m ism o len gu aje q ue define la exp resión regular. A dem ás, cualquier A F N p uede convertirse e n un A F D para el m ism o p atrón, au nq ue en e l peor d e los ca so s (que n un ca se p resen ta en los lengu ajes d e program ación com u n es), e l tam añ o d e l a u tó m a ta p uede crecer en form a exp on en cial. Tam bién es p osible convertir cualquier a u tó m a ta fin ito no d eterm in ista o d eterm in ista en u n a exp resión regular q ue d efin a el m ism o lengu aje recon ocido por el a u tó m a ta finito. ♦ Lex. H ay u n a fam ilia d e sistem a s d e softw are, incluyendo a L ex y F le x , q ue son genera­ dores d e analizadores léxicos. E l usuario esp ecifica los patrones para los tokens, usando u n a n otación d e exp resion es regulares exten d id a s. L e x con vierte esta s exp resion es e n un analizador léxico, el cu a l en esen cia e s u n a u tó m a ta fin ito d eterm in ista q ue reconoce cu alq uiera d e los patrones. ♦ M in im iza ció n d e a u tó m a ta s fin ito s. P ara ca d a A F D , h ay un A F D co n e l m ínim o núm ero de esta d o s q u e acep ta e l m ism o lenguaje. A dem ás, e l A F D con e l m ínim o núm ero d e esta d o s para un lengu aje d ad o es ú nico, ex cep to por los nom bres q ue se d a a los diver­ sos estad os. 3.11 Referencias para el capítulo 3 3.11 189 R e fe re n c ia s p a r a el c a p ítu lo 3 E n la d écad a d e 1950, K leen e desarrolló p or prim era v ez las exp resion es regulares [9]. K leene e s ta b a interesado e n describir los even tos q ue p odrían representarse p or el m o d elo d e au tóm a­ ta s finitos d e actividad neuronal d e M cC ullough y P it ts [12]. D esd e en ton ces, la s expresiones regulares y los a u tó m a ta s fin ito s s e han u tiliza d o e n g ra n m ed id a e n la c ie n c ia co m p u tacional. D esd e e l com ienzo, se han usado las exp resion es regulares en d iversas form as en m uchas herram ientas populares d e U nix, com o awk, ed , e g r e p , g r e p , l e x , s e d , s h y v i . Los docu­ m en tos d e los están dares IE E E 1003 e IS O /IE C 9945 para la Interfaz d e sistem a s op erativos p ortables (P O S IX ) definen las exp resion es regulares ex ten d id a s d e P O S IX , q ue so n sim ilares a las exp resion es regulares originales d e U n ix , co n algu nas ex cep cio n es co m o la s representaciones d e nem ónicos para las clases d e caracteres. M uchos lengu ajes d e secu en cias d e com an dos com o P erl, P y th o n y T c l han ad optado las exp resion es regulares, pero a m enudo con exten sion es in com patib les. El conocido m odelo d e a u tóm ata finito y la m inim ización d e au tóm atas finitos, com o se vieron en e l A lgoritm o 3.39, provienen de Huffm an [6] y M oore [14]. R abin y S co tt [15] propusieron por prim era vez los au tóm atas finitos no determ inistas; la construcción d e subconjuntos d el Algorit­ m o 3.20, q ue m uestran la equivalencia d e los au tóm atas finitos determ inistas y no determ inistas, provienen d e ahí. M cN aughton y Y am ad a [13] fueron los prim eros en proporcionar un algoritm o p a ra conver­ tir las exp resion es regulares d e m anera d irecta en a u tó m a ta s fin itos d eterm in ista s. A h o utilizó por prim era vez e l algoritm o 3.36 d escrito en la secció n 3 .9 para crear la herram ienta para relacionar exp resion es regulares, co n o cid a com o e g r e p . E s te algoritm o tam bién s e u tilizó en las rutinas para relacionar patrones d e exp resion es regulares en awk [3]. E l m éto d o d e utilizar au tó m a ta s n o d eterm in istas com o interm ediarios se d eb e a T h om p son [17]. E ste ú ltim o artículo tam b ién con tien e e l algoritm o p ara la sim u lación d irecta d e au tó m a ta s fin ito s no determ in istas (A lgoritm o 3.22), q u e T h o m p so n u tilizó en el ed ito r d e tex to QED. Lesk desarrolló la prim era versión d e Lex; d esp u és Lesk y S ch m id t crearon u n a seg u n d a ver­ sión , u tilizan d o el A lgoritm o 3.36 [10]. D esp u és d e ello, s e han im plem en tad o m uchas variantes d e Lex. L a versión d e G N U llam ad a F le x p uede descargarse, ju n to co n s u d ocu m en tación , en [4]. Las versiones populares d e Lex en J ava incluyen a J F le x [7] y JL ex [8]. E l algoritm o d e KM P, q ue describim os en lo s ejercicios p a ra la secció n 3.4, ju sto an tes del ejercicio 3.4 .3 , es d e [11]. Su generalización para m uchas palabras cla v e aparece en [2]; A ho lo u tilizó en la prim era im plem en tación d e la herram ienta f g r e p d e U nix. L a teoría d e los au tóm atas finitos y las exp resion es regulares s e cu b re e n [5]. E n [1] h ay una en cu esta d e técnicas para relacionar cadenas. 1. A ho, A . V ., “A lgorithm s for finding p atterns in strin gs” , en Handbook o f T heoretical C om pu ter S cience (J. van Leeuwen, e d .), V ol. A , C ap. 5, M IT P ress, C am bridge, 1990. 2. A ho, A . V . y M . J. Corasick, “E fficien t strin g m atching: a n aid to b ibliograp hic search” , C om m . A C M 18:6 (1975), pp. 333-340. 3. A ho, A . V ., B . W . K em igh am y P. J. W einberger, The A W K P rogram m in g L anguage, A ddison-W esley, B osto n , M A , 1988. 190 Capítulo 3. Análisis léxico 4. P á g in a inicial d e F le x , h t t p : //w w w . g n u . o r g / s o f t w a r e / f l e x / , F undación d e softw are libre. 5. H opcroft, J. E ., R . M otw ani y J. D . U llm an, In tro d u ctio n to A u to m a ta T heory, L angu a­ ges a n d C o m p u ta tio n , A ddison-W esley, B o sto n M A , 2006. 6 . H uffm an, D . A ., “T h e sy n th esis o f sequ en tial m achines” , J. F ranklin In st. 2 5 7 (1954), pp. 3-4, 161, 190, 275-303. 7. P á g in a in icial d e J F le x , h t t p : / / j f l e x . d e / . 8 . h t t p : / /www. c s . p r i n c e t o n . e d u /~ a p p e l/m o d e r n /j a v a /J L e x . 9. K leene, S. C ., “R ep resen tation o f events in nerve n ets” , en [16], pp. 3-40. 10. Lesk, M . E ., “L ex - a lexical analyzer generator” , C om p u tin g Science T ech. R ep orte 39, B ell L aboratories, M urray Hill, N J, 1975. U n d ocu m ento sim ilar co n e l m ism o nom ­ bre d e l títu lo , pero co n E . S chm idt com o coau tor, aparece en el volu m en 2 d e Unix P rogram m er's M anual, B ell L aboratories, M urray Hill N J , 1975; v e a h t t p : / / d i n o ­ s a u r . c o m p i l e r t o o l s . n e t / l e x / i n d e x . h tm l. 11. K nuth, D . E ., J. H. M orris y V . R . P ratt, “F a st p a tte m m atchin g in strin g s” , S IA M J. C o m p u tin g 6:2 (1977), pp. 323-350. 12. M cC ullough, W . S. y W . P itts , “A logical ca lcu lu s o f th e ideas im m an en t in nervous a c tiv ity ” , B ull. M ath . B io p h y sic s 5 (1943), pp. 115-133. 13. M cN aughton, R . y H. Y am ada, “R egular exp ression s and s ta te grap h s for a u to m a ta ” , IR E Trans, on E lectro n ic C om p u ters E C -9 :1 (1960), pp. 38-47. 14. M oore, E . F ., “G edanken exp erim en ts o n seq u en tia l m achines” , e n [16], pp. 129-153. 15. R abin, M . O . y D . S co tt, “F in ite a u to m a ta and their d ecision problem s” , IB M J. R e s. an d D ev el. 3:2 (1959), pp. 114-125. 16. Shan non , C. y J. M cC arthy (e d s.), A u to m a ta S tu d ie s, P rinceton U niv. P ress, 1956. 17. T h om pson , K ., “R egular exp ression search algorithm ” , C om m . A C M 1 1 :6 (1 9 6 8 ), pp. 419-422. C a p ít u lo 4 Análisis sintáctico E ste cap ítulo e s tá dedicado a los m étodos d e análisis sin táctico q ue se utilizan, por lo general, en los com piladores. Primero presentarem os los conceptos básicos, después las técnicas adecuadas para la im plem entación m anual y, p or últim o, los algoritm os q ue se han utilizado en las herram ientas autom atizadas. D ebido a q ue los programas pueden contener errores sintácticos, hablarem os sobre las extension es d e los m étodos d e análisis sintáctico para recuperarse d e los errores com unes. P or diseño, cad a lengu aje d e program ación tien e reglas precisas, las cu a les prescriben la estru ctu ra sin tá ctica d e los program as bien form ados. P or ejem p lo , e n C un program a está com p u esto d e funciones, u na fun ción d e declaraciones e in stru cciones, u n a in stru cción d e expre­ sion es, y así su cesivam en te. L a sin ta x is d e las con stru cciones d e u n lengu aje d e program ación p u ed e especificarse m ed ian te gram áticas libres d e co n tex to o la notación B N F (Form a d e Backus-N aur), q ue s e presentó en la sección 2.2. Las g ra m áticas ofrecen beneficios considerables, ta n to p ara los diseñ adores d e lengu ajes com o para los escritores d e com piladores. • U na g ra m á tica proporciona u n a especificación sin tá ctica precisa, pero fácil d e entender, d e un lengu aje d e program ación. • A partir d e cierta s clases d e gram áticas, p o d em o s construir d e m anera a u to m á tica un analizador sin tá ctico eficien te q u e d eterm in e la estru ctu ra sin tá ctica d e un program a fuente. C om o b en eficio colateral, e l proceso d e con stru cción d e l analizador sin tá ctico pue­ d e revelar am bigüedades sin tá ctica s y p u n to s p roblem áticos q ue p odrían h aberse pasado por alto d urante la fase inicial d el diseño d el lenguaje. • L a estru ctu ra im p artid a a un lengu aje m ediante u n a g ra m á tica d iseñ a d a en form a apro­ p iad a e s ú til para traducir los program as fuente e n có d ig o o b je to correcto, y para d etectar errores. • U na gram ática perm ite que un lenguaje evolucione o se desarrolle en forma iterativa, agregando nuevas construcciones para realizar nuevas tareas. Estas nuevas construcciones pueden inte­ grarse con más facilidad en una implementación que siga la estructura gram átical del lenguaje. 191 192 4.1 Capítulo 4. A nálisis sintáctico In tro d u c c ió n En e s ta sección, exam in arem os la form a en q u e el analizador sin tá ctico se a co m o d a en un com pilador ordinario. D esp ués analizarem os las gram áticas com unes para las exp resion es arit­ m éticas. Las gram áticas para las exp resion es so n su ficientes para ilustrar la esen cia d e l análisis sin tá ctico, y a q ue d ich as técnicas d e análisis para las exp resion es se transfieren a la m ayoría d e las con stru cciones d e program ación. E s ta sección term in a c o n u n a exp licación sob re e l m anejo d e errores, y a q ue el analizador sin tá ctico d eb e responder d e m anera ad ecu ad a para descubrir q ue s u en trad a no p uede ser generada por s u gram ática. 4 .1 .1 L a f u n c ió n d e l a n a liz a d o r s in tá c tic o En nuestro m odelo d e com pilador, e l analizador sin tá ctico o b tie n e u n a ca d en a d e tokens d el analizador léxico, com o s e m uestra en la figura 4 .1 , y verifica q ue la ca d en a d e nom bres d e los tokens p u ed a generarse m ed ian te la gram ática p ara e l lengu aje fuente. E speram os q ue el anali­ zador sin tá ctico reporte cualquier error sin tá ctico en form a in teligible y q ue se recupere d e los errores q ue ocu rren co n frecuencia para segu ir procesando el resto d e l program a. D e m anera con ceptu al, para los program as b ien form ados, e l analizador sin tá ctico co n stru y e un árbol d e análisis sin táctico y lo pasa al resto d el com pilador para q ue lo sig a procesando. D e hecho, e l árbol d e análisis sin táctico no n ecesita construirse en forma exp lícita, y a q ue las acciones d e com pro­ bación y traducción pueden intercalarse co n e l análisis sintáctico, com o verem os m ás adelante. Por ende, el analizador sin táctico y e l resto d e la interfaz d e usuario podrían im plem entarse sin problem as m ediante un solo m ódulo. F igu ra 4.1: P osición d e l analizador sin tá ctico e n e l m odelo d e l com pilador E xisten tres tip os generales d e analizadores para las gram áticas: universales, d escen dentes y ascendentes. Los m étod os universales d e análisis sin tá ctico com o e l algoritm o d e Cocke-YoungerK asam i y e l algoritm o d e E arley pueden analizar cualquier g ra m á tica (v ea la s n otas bibliográ­ ficas). S in em b argo, esto s m étod os generales so n d em asiad o in eficien tes com o para usarse en la producción d e com piladores. Los m étodos q ue s e utilizan, por lo regular, en los com piladores pueden clasificarse com o descendentes o ascendentes. Según su s nombres, los m étod os descendentes construyen árboles d e análisis sin táctico d e la p arte superior (raíz) a la parte inferior (hojas), m ientras q ue los m étodos ascendentes em piezan d e las h ojas y avanzan hasta la raíz. En cualquier caso, la en trad a al anali­ zador se exp lora d e izquierda a derecha, un sím b olo a la vez. 4.1 In trod ucción 193 Los m éto d o s d escen d en tes y ascen dentes m ás eficien tes só lo funcionan para su b cla ses de gram áticas, pero varias d e esta s clases, e n esp ecia l las gram áticas LL y LR , so n lo bastan te exp resivas com o p ara describir la m ayoría d e las con stru ccion es sin tá ctica s en los lenguajes d e program ación m odernos. L os analizadores sin tá ctico s q ue se im plem entan en form a m anual u tilizan co n frecuencia gram áticas LL; p or ejem plo, e l m éto d o d e análisis sin tá ctico predictivo d e la se cc ió n 2.4.2 fu n cion a p ara las gram áticas LL. Los analizadores para la cla se m á s ex te n ­ s a d e gram áticas L R , por lo general, se con stru yen m ed ia n te herram ientas a u tom atizad as. E n e s te ca p ítu lo vam os a su pon er q u e la sa lid a d el analizador sin tá ctico es c ie r ta repre­ sen tación d e l árbol d e análisis sin tá ctico p a ra e l flujo d e tokens q ue proviene d e l analizador léxico. E n la práctica, hay u na variedad d e tareas q ue p od rían realizarse d urante e l análisis sin táctico, com o la recolección d e inform ación d e varios tokens para colocarla en la ta b la d e sím ­ b olos, la realización d e la com probación d e tip o s y otro s tip o s d e an álisis sem á n tico , a sí com o la generación d e cód ig o interm edio. H em os agrupado to d a s es ta s a ctivid ad es en e l cuadro co n e l títu lo “R esto d el front-end” d e la figura 4.1. E n lo s sig u ien tes ca p ítu lo s cubrirem os co n detalle esta s actividades. 4 .1 .2 R e p r e s e n ta c ió n d e g r a m á t ic a s A lgu n as d e las gram áticas q u e exam in arem os e n e s te ca p ítu lo s e p resen tan para facilitar la representación d e gram áticas. Las con stru ccion es q ue em p iezan co n palabras clave com o w h i l e o in t son m uy fáciles d e analizar, y a q ue la palabra cla v e g u ía la elecció n d e la producción gram átical q u e d eb e aplicarse para hacer q ue co in cid a co n la en trad a. P or lo ta n to , n os concen­ trarem os e n las expresiones, q ue represen tan un reto d eb ido a la asociatividad y la precedencia d e operadores. L a a sociativid ad y la p reced en cia s e resuelvan en la sig u ien te gram ática, q u e e s sim ilar a las q u e u tilizam os en e l cap ítu lo 2 para describir ex p resion es, térm inos y factores. E represen­ t a a las exp resion es q ue co n sisten en térm inos separados p or los sig n o s +, T representa a los térm inos q u e co n sisten en factores separados por lo s sign os * , y F represen ta a lo s factores que p ueden ser exp resion es en tre p arén tesis o identificadores: E T F -+ E + T \ T -► T * F | F - + ( E ) | id (4.1) L a gram ática para exp resion es (4.1) p ertenece a la cla se d e g ra m áticas L R q ue son adecuadas para el an álisis sin táctico ascen dentes. E s ta g ra m á tica p u ed e ad aptarse para m anejar operadores adicionales y niveles adicionales d e precedencia. Sin em bargo, n o p uede usarse para el an álisis sin táctico d escen d en te, y a q u e es recursiva por la izquierda. L a sigu ien te varian te no recursiva por la izquierda d e la g ra m á tica d e exp resion es (4.1) se u tilizará para el an álisis sin tá ctico descendente: E E' T t' F TE' -+ + T E ' | e -► F T ' -► f |e -►( E ) | id * r (4.2) 194 Capítulo 4. A nálisis sintáctico La sigu ien te gram ática tra ta a los sig n o s + y * d e igual form a, d e m anera q ue sirve para ilus­ trar las técn icas para el m anejo d e am bigüedades d urante el an álisis sin táctico: E E + E \ E * E\ ( E) \ i d (4.3) A quí, E representa a las exp resion es d e tod o tipo. L a gra m á tica (4.3) p erm ite m ás d e un árbol d e an álisis sin táctico para las exp resion es com o a + b * c. 4 .1 .3 M a n e jo d e lo s e r r o r e s s in tá c tic o s El resto d e e s ta sección considera la n atu raleza d e los errores sin tá ctico s y las estra teg ia s g e­ nerales para recuperarse d e ellos. D o s d e esta s estra teg ia s, con ocidas com o recuperaciones en m odo d e pánico y a nivel d e frase, se describirán co n m ás d eta lle ju n to co n los m étod os esp e­ cíficos d e an álisis sin táctico. Si u n com p ilad or tu viera q u e procesar só lo program as correctos, s u d iseñ o e im plem entación se sim plificaría en form a considerable. N o ob sta n te, se esp era q u e un com p ilad or ayude al program ador a localizar y rastrear los errores q ue, d e m anera in evitab le, s e infiltran en los pro­ gram as, a pesar d e los m ejores esfuerzos d el program ador. A un qu e parezca increíble, son p o co s los lengu ajes q ue s e d iseñ an ten ien d o en m en te e l m anejo d e errores, au n cu a n d o ésto s so n tan com unes. N u estra civilización sería radicalm ente d istin ta si los lenguajes h ablados tuvieran los m ism os requerim ientos en cu an to a precisión sin tá ctica q ue los lengu ajes d e com p utadora. La m ayoría d e las especificacion es d e los lenguajes d e program ación no describen la form a en q ue u n com pilador debe responder a los errores; e l m anejo d e los m ism os e s resp onsab ilidad d el diseñador d el com pilador. L a p laneación d e l m anejo d e los errores d esd e el principio p u ed e sim plificar la estru ctu ra d e un com p ilad or y m ejorar s u cap acidad para m anejar lo s errores. Los errores d e program ación com unes pueden ocurrir e n m uchos niveles d istin tos. • Los errores léxicos incluyen la escritu ra incorrecta d e los identificadores, las palabras clave o los operadores; p o r ejem p lo, e l u so d e un identificador ta m a n io E lip c e en v e z d e t a m a n io E lip s e , y la om isión d e com illas alrededor d e l tex to q u e se d eb e interpretar com o u n a cadena. • Los errores sin tácticos incluyen la colocación incorrecta d e los signos d e punto y com a, ade­ m ás d e llaves adicionales o faltantes; es d ecir, o C om o otro ejem plo, en C o Java, la aparición d e u na instrucción c a s e sin u n a instrucción s w it c h q ue la encierre es un error sintáctico (sin em bargo, por lo general, e s ta situación la acepta e l analizador sin táctico y se atrap a m ás ad elan te en e l procesam iento, cu an do e l com pilador in te n ta generar código). • Los errores sem ánticos incluyen los conflictos d e tipos entre los operadores y los operandos. U n ejemplo es u na instrucción r e t u r n en un m étodo de Java, con el tipo de resultado v o id . • Los errores lógicos p ueden ser cualquier cosa, d esd e un razonam iento incorrecto d e l pro­ gram ador en e l u so (en un program a en C) d e l operador d e asign ación =, e n vez d el operador d e com paración ==. E l program a q u e co n ten g a = p uede esta r bien form ado; sin em bargo, t a l v e z n o refleje la in tención d el program ador. La precisión d e los m étod os d e an álisis sin tá ctico p erm ite d etecta r los errores sin tá ctico s con m ucha eficien cia. Varios m étod os d e análisis sin tá ctico , com o lo s m étodos LL y L R , d etecta n 4.1 In trod ucción 195 u n error lo m ás pronto posible; es decir, cu a n d o e l flujo d e tokens q u e proviene d el analizador léxico no p uede seguirse an alizan d o d e acuerdo con la g ra m á tica p a ra e l lengu aje. D ich o e n for­ m a m ás precisa, tien en la p ro p ied a d de p re fijo v ia b le , lo cu a l sig n ifica q ue d etecta n la ocurrencia d e un error ta n pronto co m o ven un prefijo d e la en tra d a q ue no p uede com p letarse para formar u n a cad en a vá lid a en el lenguaje. O tra d e las razones para enfatizar la recuperación d e lo s errores d urante el an álisis sin tá cti­ c o es q u e m uchos errores parecen ser sin táctico s, s e a cu a l fuere su ca u sa , y se ex p o n en cu a n d o e l an álisis sin táctico no p uede continuar. A lgunos errores sem án ticos, com o los co n flicto s entre los tip os, tam bién pueden d etectarse con eficiencia; sin em bargo, la d etecció n precisa d e los errores sem án ticos y lógicos en tiem p o d e com p ilación es, por lo general, u na tarea difícil. E l m ango d e errores en un analizador sin tá ctico tien e o b je tiv o s q u e so n sim p les d e declarar, pero d ifíciles d e llevar a cabo: • R eportar la presencia d e errores con claridad y precisión. • Recuperarse d e cad a error lo bastante rápido com o para poder detectar los errores siguientes. • A gregar u na sob recarga m ín im a al procesam iento d e los program as correctos. Por fortuna, los errores com u n es son sim p les, y a m enudo b a sta con un m ecan ism o sim ple para su m anejo. ¿D e q ué m anera u n m ango d e errores d eb e reportar la p resen cia d e un error? C om o m íni­ m o, d eb e reportar e l lugar e n e l program a fuente e n d on d e se d e te c tó un error, y a q ue h ay una b u en a probabilidad d e q u e é s te en s í haya ocurrido en uno d e los p o co s tokens anteriores. U na estr a te g ia com ú n es im prim ir la lín ea d e l problem a co n u n apuntador a la p osición en la que s e d e te c tó el error. 4 .1 .4 E s t r a t e g i a s p a r a r e c u p e r a r s e d e lo s e r r o r e s U n a vez q u e s e d e te c ta un error, ¿cóm o d eb e recuperarse e l analizador sin táctico? A un qu e no hay u n a estra teg ia q ue haya d em ostrad o ser aceptab le en form a universal, algu nos m étodos p ueden aplicarse e n m uchas situ acion es. E l m éto d o m ás sim p le e s q u e e l analizador sin tá ctico term in e con u n m en saje d e error inform ativo cu a n d o d etec te el prim er error. A m enudo se d es­ cu b ren errores adicionales si el analizador sin tá ctico p uede restaurarse a s í m ism o, a u n estad o en el q ue p u ed a continuar el p rocesam ien to d e la entrada, co n esperanzas razonables d e q ue un m ayor p rocesam ien to proporcione inform ación ú til para e l d iagn óstico. S i los errores s e apilan, e s m ejor para el com p ilad or d esistir d esp u és d e exced er cierto lím ite d e errores, q u e producir u n a m olesta avalancha d e errores “fa lso s”. E l resto d e e s ta sección se d ed ica a las sig u ien tes estra teg ia s d e recuperación d e los errores: m od o d e pánico, nivel d e frase, producciones d e errores y corrección global. R ecuperación en m odo de pánico C on este m étod o, al describir un error e l analizador sin tá ctico d esca rta los sím b olos d e entrada, u no a la vez, h a sta encontrar u n con ju n to design ado d e tokens de sin cro n iza ció n . Por lo gene­ ral, los tokens d e sincronización so n delim itadores com o el punto y co m a o >, cu y a función en 196 Capítulo 4. A nálisis sintáctico e l program a fuente es clara y sin am bigüedades. E l d iseñ ador d e l com pilador d eb e seleccionar los tokens de sin cronización apropiados para el lengu aje fuente. A un qu e la corrección en m odo d e p ánico a m en ud o o m ite u na can tid ad considerable d e en tra d a sin verificar errores adiciona­ les, tien e la ven taja d e ser sim p le y, a diferencia d e ciertos m étod os q ue considerarem os más ad elan te, se g aran tiza q u e no en trará en u n ciclo infinito. R ecuperación a nivel de frase A l descubrir u n error, u n analizador sin tá ctico p uede realizar u na corrección lo ca l so b re la en trad a restante; es decir, p uede su stitu ir u n prefijo d e la en trad a resta n te p or algu na ca d en a q ue le p erm ita continuar. U n a corrección local com ú n es su stitu ir u na co m a por un punto y com a, elim inar u n punto y co m a extrañ o o in sertar un p u n to y com a faltan te. L a elección d e la corrección local s e d e ja al diseñador del com pilador. D esd e luego q ue d eb em os tener cu id a d o d e elegir su stitu cio n es q ue no nos lleven h acia ciclos in fin ito s, com o sería, por ejem p lo, si siem pre insertáram os algo en la en trad a ad elan te d el sím b olo d e en trad a actual. La su stitu ción a nivel d e frase se h a u tilizad o en varios com piladores q ue reparan lo s erro­ res, y a que p uede corregir cualquier ca d en a d e en trad a. Su d esv en ta ja principal e s la d ificultad q ue tien e p ara arreglárselas co n situ a cio n es e n la s q ue el error a ctu a l ocurre antes d e l p u n to d e d etección . Producciones d e errores A l anticipar los errores com unes q ue p odríam os encontrar, p o d em o s aum entar la gra m á tica para el len gu aje, co n producciones q ue gen eren la s con stru ccion es erróneas. U n analizador sin tá ctico con stru id o a p artir d e u n a g ra m á tica au m en tad a por es ta s producciones d e errores d etec ta los errores an ticip ados cu an do s e u tiliza u n a producción d e error d u ran te el análisis sin táctico. A sí, e l analizador sin tá ctico p uede generar d iagnósticos d e error apropiados sobre la con stru cción errón ea q u e se haya recon ocido en la entrada. Corrección global Lo ideal sería q ue u n com p ilad or hiciera la m enor ca n tid a d d e ca m b ios en e l p rocesam ien to d e u na cad en a d e en trad a incorrecta. H ay algoritm os para elegir u n a secu en cia m ín im a d e cam b ios, p ara o b ten er u n a corrección con e l m en or c o s to a nivel g lob al. D a d a u n a ca d en a d e en tra d a in correcta x y u na g ra m á tica G, esto s algoritm os buscarán u n árbol d e an álisis sin tá ctico para u na ca d en a y relacionad a, d e ta l form a q ue el núm ero d e inserciones, elim in a ­ cion es y m od ifica cio n es d e los tokens requeridos p a ra transform ar a £ e n y s e a lo m ás p equeño posible. P or desgracia, esto s m éto d o s so n en gen eral d em asiad o co sto so s para im plem entar­ los en térm in os d e tiem p o y esp acio, por lo cu a l e s ta s técn ica s só lo so n d e in terés teó rico en esto s m om entos. H ay q ue observar q ue u n program a ca si correcto ta l v ez no s e a lo q ue e l program ador tem a en m ente. S in em bargo, la noción d e la corrección con el m enor co sto prop orciona u na norm a para evaluar las técn icas d e recuperación d e los errores, la cu a l se h a u tilizad o para buscar cad en as d e su stitu ción ó p tim a s para la recuperación a nivel d e frase. 4.2 Gramáticas libres d e contexto 4.2 197 G ra m á tic a s lib re s d e c o n te x to E n la sección 2.2 se presentaron las gram áticas p a ra describir en form a sis te m á tic a la sin ta x is d e las con stru ccion es d e u n len gu aje d e program ación, com o las exp resion es y las instrucciones. S i utilizam os u n a variable sin tá ctica in s tr para d en otar las instrucciones, y u n a variable ex p r para d en otar las exp resion es, la sigu ien te producción: in s tr -► i f ( ex p r ) in s tr e l s e in s tr (4.4) esp ecifica la estru ctu ra d e e s ta form a d e in stru cción condicional. E n ton ces, o tra s producciones definen con precisión lo q ue es u na expr y q u é m ás puede ser u n a in str. E n e s ta sección repasarem os la definición d e u na gra m á tica libre d e co n tex to y presentare­ m os la term in ología para hablar acerca d el an álisis sin tá ctico . E n esp ecia l, la noción d e deri­ vaciones es m uy ú til para hablar sobre e l orden en e l q u e se aplican la s producciones durante e l an álisis sin táctico. 4 .2 .1 L a d e fin ic ió n f o r m a l d e u n a g r a m á t i c a lib r e d e c o n te x t o E n la sección 2.2 vim os q ue u na gram ática libre d e co n tex to (o sim p lem en te g ra m ática) consis­ t e en term inales, no term inales, un sím b olo in icial y producciones. 1. Los term in a les son los sím b olos básicos a partir d e los cu ales se form an las cadenas. El térm ino “nom bre d e tok en ” es u n sin ón im o d e “term in al” ; con frecuencia usarem os la palabra “to k en ” en vez d e term inal, cu an do e s té claro q ue esta m o s h ablando só lo sobre el nombre d e l token. A sum im os q u e las term inales so n los prim eros com p o n en tes d e los tokens q ue produce e l analizador léxico. E n (4 .4 ), los term in ales son la s palabras reser­ vadas i f y e l s e , y los sím b olos “( ” y “) ”. 2. L os no te rm in a le s son variables sin tá ctica s q ue d en otan con jun tos de ca d en a s. E n (4.4), in s tr y ex p r son no term inales. Los con jun tos d e cad en as d en o ta d o s por los no term inales ayudan a definir el len gu aje generado por la gram ática. Los no term in ales im ponen una estru ctu ra jerárq uica sobre e l lengu aje, q ue representa la clave p a ra e l análisis sin tá ctico y la traducción. 3. E n una gram ática, un no term inal se d istin g u e com o el sím bolo in ic ia l, y e l con ju n to de cad en as q ue d en o ta es e l lengu aje generado p or la gram ática. Por convención, las pro­ duccion es p ara e l sím b olo inicial s e listan primero. 4. L as producciones d e u n a gram ática especifican la form a en q u e p ueden com binarse los term inales y los no term in ales para form ar cad en as. C a d a p rodu cción co n siste en: (a) U n n o term inal, con ocid o com o encabezado o lado izq u ie rd o d e la producción; esta producción d efin e algunas d e las cad en as d en o ta d a s por e l encabezado. (b ) E l sím b olo A lgu nas veces s e h a u tilizad o : := en vez d e la flecha. (c) U n cu erpo o lado derecho, q ue co n siste e n cero o m ás term in ales y n o term in ales. Los com p on en tes d e l cu erpo d escrib en u n a form a en q u e pueden con stru irse las cad en as del no term inal en el en cab ezado. 198 Capítulo 4. A nálisis sintáctico Ejemplo 4.5: L a gram ática en la figura 4 .2 d efine expresiones aritm éticas sim ples. En e s ta gra­ m ática, los sím b olos d e los term in ales son: id + - * / ( ) Los sím b olos d e los no term in ales so n expresión , te rm y f a c to r , y expresión es el sím b olo ini­ cial. □ expresión expresión expresión term te rm te rm f a c to r f a c to r —► —► —* —> —► —> —► —► expresidn + te rm expresidn - term te rm te r m * fa c to r te r m / f a c to r f a c to r ( expresidn ) id F igu ra 4.2: G ram ática para las exp resion es a ritm éticas sim ples 4 .2 .2 C o n v e n c io n e s d e n o ta c ió n P ara ev ita r siem pre tener q ue decir q ue “ésto s so n los term in ales” , “és to s son los no term ina­ les” , etcétera, u tilizarem os las sigu ien tes con ven ciones d e n otación para las gram áticas d urante e l resto d e este libro: 1. E stos sím b olos so n terminales: (a) Las prim eras letras m inúsculas d el alfabeto, com o a, 6 , c. (b) Los sím b olos d e operadores com o + , * , etcétera. (c) Los sím b olos d e pun tu ación com o paréntesis, com a, etcétera. (d) Los d ígitos 0, 1, . . . , 9. (e) Las cad en as en n egrita com o bolo term inal. id o if, ca d a u n a d e las cu ales representa un so lo sím ­ 2. E sto s sím b olos so n no term inales: (a) Las prim eras letras m ayúsculas d e l alfabeto, com o A , B , C. (b) L a letra S q ue, al aparecer es, p or lo general, el sím b olo inicial. (c) Los nom bres en cu rsiva y m inúsculas, co m o ex p r o in str. (d) A l hablar sobre las con stru cciones d e program ación, las letras m ayúsculas pueden utilizarse para representar no term inales. Por ejem plo, lo s no term inales para las exp resion es, los térm inos y los factores s e representan a m enudo m ediante E , T y F, respectivam ente. 4.2 Gramáticas libres d e contexto 199 3. Las ú ltim as letras m ayúsculas d e l alfa b eto , com o X , Y , Z , representan sím bolos g ra m a ti­ cales; es decir, p ueden ser n o term in ales o term inales. 4. Las ú ltim as letras m inúsculas d e l alfa b eto , com o u , v , ... , z, representan cad en as d e ter­ m inales (posiblem ente vacías). 5. Las letras griegas m inú sculas a , 0 , 7 , por ejem p lo , representan ca d en as (posiblem ente vacías) d e sím b olos gram aticales. Por en d e, u n a producción g en érica p u ed e escribirse com o A -► a , en d ond e A e s e l en cab ezad o y a e l cuerpo. 6 . U n conjunto d e producciones A -> a i , A - » a 2, A -*■ a * con un en cab ezado com ún A (las llam arem os p ro d u cc io n e s A ) , p u ed e escribirse co m o A ->■ a i | a 2 | | a*. A a i, a 2, . . . , o¿k les llam am os las a ltern a tiva s para A. 7. A m enos q ue s e indique lo contrario, e l en cab ezad o d e l a prim era producción es el sím ­ b olo inicial. Ejemplo 4 .6 : M ediante esta s con ven ciones, la g ra m á tica d e l ejem p lo 4 .5 p u ed e rescribirse en form a con cisa como: E T -> E + T \ E - T \ T * F \ T / F \ F F -> ( E ) | id T Las convenciones d e n otación nos indican q ue E, T y F son no term inales, y E e s el sím bolo inicial. E l resto d e los sím b olos so n term inales. □ 4 .2 .3 D e r iv a c io n e s L a con stru cción d e u n árbol d e an álisis sin tá ctico p u ed e hacerse p recisa si tom am os u n a v ista d erivacion al, en la cu a l las producciones s e tra ta n com o reglas d e rescritura. E m p ezan d o con el sím b olo inicial, ca d a p aso d e rescritura su stitu y e a u n no term inal por e l cuerpo d e u n a d e sus producciones. E s ta v ista derivacion al corresp ond e a la con stru cción d escen d en te d e un árbol de an álisis sin táctico, pero la precisión q ue ofrecen las derivacion es será m uy ú til cu a n d o hablem os d el an álisis sin tá ctico ascendente. C om o verem os, e l an álisis sin tá ctico ascen dente s e relaciona co n u n a c la se d e derivacion es con ocid as com o derivacion es d e “m á s a la derecha” , en d o n d e el n o term in al p or la d erech a se rescribe en ca d a paso. P or ejem p lo, considere la sigu ien te gram ática, con un so lo no term inal E , la cu a l agrega una producción E -*■ — E a la gram ática (4.3): E -► E + E \ E * E \ - E \ ( E ) \ id (4.7) L a producción E — E significa q ue si E d en o ta una expresión, entonces - E d eb e tam bién d en otar u na expresión. L a su stitu ció n d e u n a so la E por — E se describirá escribiendo lo si­ guiente: E=> - E 200 Capítulo 4. A nálisis sintáctico lo cu a l se lee com o “E d eriva a — E ”. L a producción E ( E ) p uede aplicarse p a ra su stitu ir cualquier in stan cia d e E e n cualquier cad en a d e sím b olos gram aticales por (E ); p or ejem plo, E * E => ( E ) * E o E * E => E * ( E ) . P od em os tom ar u n a s o la E y aplicar p rod uccion es e n for­ m a rep etid a y en cualquier ord en para ob ten er u na secu en cia d e su stitu cio n es. Por ejem plo, E => —E => —( E ) => - ( i d ) A d ich a secu en cia d e su stitu cio n es la llam am os u na d eriva ció n d e - ( i d ) a partir d e E . E s ta d erivación proporciona la p ru eb a d e q ue la ca d en a —( id ) es u n a in sta n cia esp ecífica d e u na expresión. Para u n a definición general d e la derivación, considere u n no term inal A en la m itad d e u na secu en cia d e sím b olos gram aticales, com o en a A ¡3, en d on d e a y 0 so n ca d en a s arbitrarias d e sím b olos gram aticales. Suponga q u e A - > 7 es una producción. E n ton ces, escribim os a A 0 =>■ 0 7 # E l sím b olo =>■ sign ifica, “s e deriva en un p a so ” . C uando u n a secu en cia d e pasos d e d erivación a i =4* c*2 =>■ =>■ a „ se rescrib e com o a i a a n, d ecim os q ue a i d eriva a a n. Con frecuencia es con ven ien te p od er decir, “d eriv a en cero o m ás p asos” . P ara este fin, p od em os usar e l sím b olo => . A sí, 1. a ^ a , para cualquier cad en a a . 2. S i a ^ 0 y 0 => 7 , en to n ces a ^ 7 D e igual form a, i - sign ifica “deriva en uno o m ás p asos” . Si S a , en d on d e 5 es el sím b olo inicial d e u n a gra m á tica G, d ecim os q ue a e s u na fo rm a de fra se d e G. O bserve q ue u na form a d e frase p uede co n ten er tan to term inales com o no term i­ nales, y puede estar vacía. U n e n u n á a d o d e G e s u n a form a d e frase sin sím b olos no term inales. El lenguaje g en erado por u na gram ática es s u con ju n to d e oraciones. Por en d e, u n a ca d en a d e term inales w e s tá e n L (G ) , el lengu aje generado p or G, si y só lo si tí? es un enunciado d e G ( o 5 ^ w ). U n len gu aje q u e p uede generarse m ed ian te u n a g ra m á tica se co n sid era u n lengua­ je Ubre de con texto. Si d os gram áticas gen eran el m ism o len g u a je, se consideran com o equiva­ lentes. La cad en a - ( i d + id ) e s u n en u nciado d e la gra m á tica (4.7), y a q ue h ay u na derivación E => —E = > —( E ) => - ( £ + E ) => - ( i d + E ) => - ( i d + id ) (4.8) Las cad en as E , —E , - ( E ) , . . . , —( i d H- i d ) so n tod as form as d e frases d e e s ta gram ática. Escri­ bim os E => - ( i d + i d ) para indicar q u e —( i d 4- i d ) p uede derivarse d e E. E n cada paso d e u na derivación, h ay d os elecciones por hacer. D ebem os elegir q u é no term inal d ebem os su stitu ir, y habiendo realizado e s ta elección, d eb em os elegir u na producción con ese no term inal com o encabezado. Por ejem plo, la siguiente derivación alternativa d e - ( i d + id ) difiere d e la derivación (4.8) en los ú ltim os d os pasos: E => —E => —( E ) => —(E + E ) => - ( E + id ) => - ( i d + id ) (4.9) 4.2 Gramáticas libres d e contexto 201 C ad a no term inal se su stitu y e por el m ism o cu erpo en las d o s d erivacion es, pero e l ord en de las su stitu cio n e s es distinto. P ara com prender la form a en q u e trab a ja n los analizadores sin tá ctico s, d eb em os conside­ rar las derivacion es e n las q ue el n o term inal q ue se v a a su stitu ir en ca d a p aso se elig e d e la sigu ien te manera: 1. E n las d erivaciones p o r la izq u ie rd a , siem pre se elig e e l no term inal por la izquierda en cad a d e frase. S i a =>■ 0 es un p aso en e l q ue s e su stitu y e e l no term in a l p or la izquierda en a , escribim os a => 3. lm 2. E n las derivacion es p o r la derecha, siem p re se elig e e l no term inal p o r la derecha; en este caso escribim os a => ¡3. rm L a d erivación (4.8) es por la izquierda, por lo q ue p uede rescribirse d e la sigu ien te manera: E => hn —E => bn —( E ) => —(E bn + E) => lm - ( i d + £ )= * * - ( i d + id ) hn O bserve q ue (4.9) es u na d erivación p or la derecha. S i utilizam os n uestras con ven ciones d e n otación, ca d a p a so p or la izquierda p u ed e escribir­ s e com o wA'y => wxfy, en d o n d e w con siste só lo d e term inales, A ->■ S es la producción q ue se aplica, y 7 es u n a cad en a d e sím b olos gram aticales. P ara en fatizar q u e a deriva a ¡3 m ediante u na d erivación por la izquierda, escribim os a => fi. S i S => a , d ecim os q ue a es u n a fo rm a de lm hn frase izqu ierda d e la g ra m á tica e n cu estión . Las análogas d efin icion es son válid as para las derivacion es p or la derecha. A esta s deriva­ cio n es s e les co n o ce algu nas v ec es com o derivacion es canónicas. 4 .2 .4 Á r b o le s d e a n á lis is s in tá c tic o y d e r iv a c io n e s U n árbol d e análisis sin tá ctico es u na representación gráfica d e u na d erivación q u e filtra el orden en el q ue se ap lican las producciones para su stitu ir los no term inales. C a d a nodo interior d e un árbol d e análisis sin táctico representa la aplicación d e u na producción. E l nodo interior se etiq u e ta con el no term inal A en e l en cab ezad o d e la producción; los hijos d el nodo se etiq uetan , d e izquierda a derecha, m ediante los sím bolos e n el cuerpo d e la producción por la q ue s e su sti­ tu yó e s ta A d urante la derivación. P or ejem p lo, el árbol d e an álisis sin tá ctico para —(id + id) en la figura 4 .3 re su lta d e la d erivación (4.8), así com o d e la d erivación (4.9). Las hojas d e un árbol d e análisis sin tá ctico s e etiq u e ta n m ed ian te n o term in ales o term i­ nales y, leídas d e izquierda a derecha, co n stitu y en u na form a d e frase, a la cu a l s e le llam a prod u cto o fro n tera d el árbol. P ara ver l a relación en tre las d erivaciones y los árboles d e an álisis sin tá ctico , considere cu al­ quier d erivación a i =>■ olq =>• • •• => a n, en d on d e a i es un só lo n o term inal A . P a ra c a d a form a d e frase a¿ en la derivación, p od em os construir u n árbol d e an álisis sin tá ctico cu y o producto s e a a¿. E l proceso e s u na inducción sobre i B A SE : E l árbol para a i = A es un solo n o d o , etiq u eta d o com o A . 202 Capítulo 4. A nálisis sintáctico y E E ( E E + id \ ) \ E id F igu ra 4.3: Á rbol d e an álisis sin tá ctico para —( id + id ) IN D U C C IÓ N : Suponga q u e ya h em os con stru id o un árbol d e análisis sin tá ctico con e l pro­ d u c to i = X iX 2 ---X k (ten g a en c u en ta que, d e acuerdo a n uestras convenciones d e notación, ca d a sím b olo gram atical X i es u n no term inal o un term in al). S u p o n g a q ue a¿ se deriva d e a¿_i al su stitu ir Xj, un n o term inal, p or 0 = Y i V2 ■ Ym. E s d ecir, e n e l ¿-ésimo paso d e la derivación, la producción X j - > f i s e ap lica a i p ara derivar a i = X iX 2 ■■■Xj-i¡3Xj+1 P ara m odelar e s te p aso d e la derivación, b uscam os la j-é sim a h oja, p artien do d e la izquierda en e l árbol d e análisis sin táctico actual. E sta h o ja se etiq u e ta com o Xj. A e s ta h o ja le d am os m hijos, etiq u etad os Yh Y2, . . . , Y m, partiendo d e la izquierda. C om o ca so especial, s i m = 0 en ton ­ ces ¡ 3 = €, y proporcionam os a la j-é sim a h oja un hijo etiq u eta d o com o e. E j e m p lo 4 .1 0 : L a secu en cia d e árboles d e an álisis sin tá ctico q u e se con stru yen a partir d e la d erivación (4.8) s e m uestra en la figura 4.4. E n e l prim er p aso d e la derivación, E => —E . P ara m odelar e s te paso, se agregan d o s hijos, etiq u etad o s com o — y E, a la raíz E d el árbol inicial. El resultado e s e l segu n d o árbol. En el segu n d o p aso d e la d erivación, —E —( E) . Por con sigu ien te, agregam os tres hijos, etiq u etad os com o ( , E y ) , a l nodo h o ja etiq u eta d o com o E d el segu n d o árb ol, para ob ten er el tercer árbol co n coséch ale p rod ucto —( E) . Si con tinu am os d e e s ta form a, o b ten em os e l árbol d e an álisis sin táctico com p leto com o el se x to árbol. □ C om o un árbol d e an álisis sin táctico ignora la s variacion es e n e l ord en en e l q ue se su sti­ tu y en los sím b olos en las form as d e las oraciones, h ay u n a relación d e varios a uno entre las derivaciones y los árboles d e an álisis sin táctico. P or ejem plo, am bas derivaciones (4.8) y (4.9) se asocian co n el m ism o árbol d e análisis sin tá ctico final d e la figura 4.4. En lo q ue sigu e, realizarem os con frecuencia el an álisis sin tá ctico p roduciendo u n a deriva­ ción por la izquierda o p o r la derecha, y a q ue h ay u n a relación d e uno a uno en tre los árboles d e análisis sin tá ctico y e s te tip o d e d erivaciones. T an to las derivacion es por la izquierda com o las d e p or la derecha eligen un ord en específico para su stitu ir sím b olos en las form as d e las oracion es, p or lo q ue tam b ién filtran las variacion es en orden. N o e s difícil m ostrar q ue tod os los árboles sin tá ctico s tien en asociadas u n a d erivación ú n ica p o r la izquierda y u n a d erivación ú n ica p or la derecha. 4.2 Gramáticas libres d e contexto 203 E E E E \E / \ \ ( => E - => / \E ( E E - /w zw =s> / \E E ) ( + E E /\\ /w E ) E / \E E ) ( + E £ id id /\\ /\\ E ) + E id F igu ra 4.4: Secu en cia d e árboles d e an álisis sin tá ctico para la d erivación (4.8) 4 .2 .5 A m b ig ü e d a d E n la sección 2.2.4 vim os q u e u n a g ra m á tica q ue produce m ás d e un árbol d e an álisis sin tá ctico para cierto en u nciado es am biguo. D ich o d e o tr a form a, u na g ra m á tica am bigua e s aq uella que p roduce m ás d e u n a d erivación p or la izquierda, o m ás d e u n a d erivación p o r la d erech a para e l m ism o enunciado. E j e m p lo 4 .1 1 : L a g ram ática d e exp resion es a ritm éticas (4.3) p erm ite d o s derivacion es por la izquierda d istin ta s para el enunciado id + id * id : E => => => =» => E + ld + id + id + id + E E E *E id * E id * id E => => => E *E E + E *E id + E * E id + id * E i d + i d * id Los árboles d e an álisis sin tá ctico correspondientes aparecen en la figura 4.5. O bserve q u e el árbol de an álisis sin tá ctico d e la figura 4 .5 (a ) refleja la p reced en cia q ue se asu m e com ú nm en te para + y *, m ientras q ue el árbol d e la figura 4 .5 (b) no. E s decir, lo com ún e s tratar al operador * teniendo mayor precedencia q ue +, en form a corresp ond ien te a l hecho d e que, por lo general, evalu am os la exp resión a + b * c com o a + (b * c), e n v ez d e hacerlo com o ( a + b) * c. □ P ara la m ayoría d e los analizadores sin tá ctico s, es con ven ien te q u e la gram ática n o ten ga am bigüedades, y a q ue d e lo contrario, no p od em os d eterm inar e n form a ú n ica q ué árbol de an álisis sin táctico seleccion ar para un enunciado. E n o tro s ca so s, es con ven ien te usar gram á­ ticas am biguas elegid as con cuidado, ju n to co n reglas p a ra elim in a r la am bigü edad, la s cuales “d escartan ” los árboles sin tá ctico s no deseados, d ejan d o só lo u n árbol para c a d a enunciado. 204 Capítulo 4. A nálisis sintáctico E E I id / l + E E \ E E / l \ * id E E id id / / l \ + l * E \ E I id id (a) (b) F igu ra 4.5: D os árboles d e an álisis sin tá ctico p a ra i d + i d * i d 4 .2 .6 V e rific a c ió n d e l le n g u a je g e n e r a d o p o r u n a g r a m á t i c a A unque los diseñ adores d e com piladores m u y raras veces lo hacen para u na g ra m á tica d e len­ gu a je d e p rogram ación com p leta, es ú til p od er razonar q ue un conjunto dado d e producciones gen era un len gu aje específico. Las con stru ccion es p rob lem áticas pueden estu d ia rse m ediante la escritu ra d e una gram ática a b stracta y concisa, y estu d ian d o e l lengu aje q ue genera. A co n ti­ nuación va m o s a construir u na gram ática d e e s te tip o , para instrucciones con d icion ales. U n a p ru eb a d e q ue u n a gram ática G gen era un len gu aje L co n sta d e d os partes: m ostrar q ue to d a s las cad en as generadas p or G está n en L y, d e m anera inversa, q u e to d a s las cad en as en L p ueden generarse sin d u d a m ed ian te G. E j e m p l o 4 . 1 2 : C onsidere la sigu ien te gram ática: S - + ( S ) S \e (4.13) Tal v e z no s e a evid en te d esd e un principio, pero e s ta gra m á tica sim p le g en era to d a s las cad en as d e paréntesis balanceados, y só lo ese tip o d e cad en as. P a ra v er por qué, prim ero m os­ trarem os q ue to d a s las frases q u e se derivan d e S son balanceadas, y d esp u és q ue to d a s las cad en as balancead as se derivan d e S. P ara m ostrar q u e to d a s las frases q u e p ueden derivar­ se d e 5 son balanceadas, u tilizarem os u na prueba in d u ctiv a so b re el núm ero d e pasos n e n una derivación. BA SE: L a base e s n = 1. L a ú n ica cad en a d e term in ales q ue p uede derivarse d e 5 en un paso es la cad en a vacía, q ue sin d u d a e s tá balanceada. IN D U C C IÓ N : A hora su p o n g a q ue to d a s las d erivacion es d e m en os d e n p asos producen fra­ ses b alancead as, y considere una d erivación p or la izquierda, co n n pasos ex a cta m en te. D icha d erivación d eb e ser d e la sigu ien te forma: 5 => ( 5 ) 5 ^ lm Im (x )S ^ ( x )y Im Las derivacion es d e x y y q ue provienen d e 5 requieren m enos d e n pasos, por lo q ue en b ase a la h ip ótesis in du ctiva, x y y está n b alancead as. P or lo ta n to , la ca d en a ( x) y d eb e ser balanceada. E s d ecir, tien e un núm ero eq u ivalen te d e paréntesis izquierdos y derechos, y ca d a prefijo tien e, por lo m enos, la m ism a can tid ad d e p arén tesis izquierdos q u e derechos. 4.2 Gramáticas libres d e contexto 205 H abiendo dem ostrado en to n ces q ue cualquier ca d en a q u e s e d eriv a d e 5 e s tá balanceada, d eb em os ahora m ostrar q ue to d a s las cad en as b alanceadas se derivan d e S. P a ra ello, utiliza­ rem os la inducción sob re la lon gitu d d e u n a cadena. B A SE : S i la cad en a es d e lon gitu d 0 , d eb e ser e, la cu al e s tá balanceada. IN D U C C IÓ N : Prim ero, ob serve q u e to d a s las ca d en a s b a la n cea d a s tien en lo n g itu d uniform e. S u p o n g a q u e to d a s las cad en as b alan cead a s d e u n a lon gitu d m enor a 2 n s e d erivan d e 5, y considere u na ca d en a b alan cead a w d e lon gitu d 2n, n > 1. S in duda, w em p ieza co n un parén­ tesis izquierdo. H agam os q ue (x ) se a e l prefijo n o vacío m ás corto d e w, q ue ten g a el m ism o núm ero d e p arén tesis izquierdos y derechos. A sí, w puede escribirse co m o w — ( x ) y , e n donde x y y está n balanceadas. C om o x y y tien en u n a lon gitu d m enor a 2n, p ueden derivarse d e S m e­ d ia n te la h ip ótesis in d u ctiva. P or en d e, p od em o s buscar u n a d erivación d e la sigu ien te forma: s=* (S)Sk- (x)S b- (x)y co n lo cu a l dem ostram os q ue w = ( x ) y tam b ién p uede derivarse d e 5. 4 .2 .7 □ C o m p a r a c ió n e n t r e g r a m á ti c a s lib r e s d e c o n te x t o y e x p r e s io n e s r e g u la r e s A n tes d e dejar e s ta sección sobre las gram áticas y su s propiedades, establecem os q ue la s gram á­ ticas son u na notación m ás p od erosa q ue las expresiones regulares. C ada construcción q ue pue­ d e describirse m ediante u na expresión regular p uede describirse m ediante u n a gram ática, pero no al revés. D e m anera alternativa, cada lenguaje regular es un lenguaje libre d e contexto, pero no al revés. P or ejem p lo, la expresión regular ( a | b ) * a b b y la sig u ien te gram ática: Aq —► qA q |bAo |a,Ai A\ —► bA 2 A2 Az -► bAz “* € describ en el m ism o len gu aje, e l con ju n to d e ca d en a s d e as y 6s q ue term inan en abb. P od em os construir d e m anera m ecánica u n a g ra m á tica para reconocer el m ism o lenguaje q ue un a u tó m a ta fin ito n o d eterm in ista (A F N ). L a g ra m á tica anterior s e co n stru y ó a p artir del A F N d e la figura 3.24, m ediante la sigu ien te construcción: 1. P ara ca d a e sta d o i d e l A F N , crear un no term in a l Ai. 2. Si el estad o i tien e u na transición al esta d o j con la en trad a a, agregar la producción A t ->■ aAj. Si e l estad o i p asa al estad o j co n la en trad a €, agregar la p roducción A{ ->• A j 3. Si i es un esta d o d e aceptación, agregar A i e. 4 . Si i es e l esta d o inicial, hacer q ue A t s e a e l sím b olo in icial d e la gram ática. 206 Capítulo 4. A nálisis sintáctico Por o tra parte, el lengu aje L = { a nbn \ n > 1} co n u n núm ero eq u ivalen te d e as y bs e s un ejem p lo d e p rototip o d e u n len gu aje q ue p uede describirse m ediante u n a gram ática, p ero no m ediante u n a exp resión regular. P ara ver p or qué, su p o n g a q ue L es e l lengu aje d efinido por alguna expresión regular. C onstruiríam os un A F D D con un núm ero finito d e estad os, por decir k, para aceptar a L. C om o D só lo tien e A;estados, para u na en trad a q ue em p ieza con m ás d e A; as, D d eb e entrar a cierto esta d o d o s veces, p or decir s¿, com o en la figura 4 .6 . S u p on ga q ue la ru ta d e Si d e v u e lta a s í m ism o s e etiq u e ta co n u n a secu en cia a T % . C om o a'b1e s tá e n e l lengu aje, d eb e haber u n a ru ta etiq u eta d a com o bl d esd e Si h a sta un e sta d o d e a cep tación f Pero, entonces tam bién h ay u n a ru ta q u e sa le d esd e el esta d o s 0 y Pa sa a través d e para llegar a /, etiq u eta d a com o a?b\ co m o se m uestra en la figu ra 4 .6 . Por en d e, D tam b ién a ce p ta a a’b1, q ue n o e s tá en e l len gu aje, lo cu a l con trad ice la su p osición d e q u e L es e l len gu aje acep tad o p or D. ruta etiquetada com o a 3 - i ruta etiquetada como a* so )---------- ► ... ruta etiquetada com o bl ----------- ► (Si- F igu ra 4.6: U n A F D D que a cep ta a a*6* y a atb* En lengu aje coloqu ial, d ecim os q ue “lo s au tó m a ta s finitos n o pueden con tar” , lo cu a l sig ­ nifica q ue un a u tó m a ta fin ito n o p uede aceptar un len gu aje com o { a nbn \ n > 1 }, q u e requiera q ue e l a u tó m a ta lleve la cu en ta d el núm ero d e as an tes d e v er las bs. D e igual form a, “u n a gra m ática p uede con tar d o s elem en tos pero no tres” , com o verem os cu a n d o h ablem os sobre las con stru cciones d e lenguajes q u e n o so n libres d e co n tex to en la secció n 4.3.5. 4 .2 .8 E je rc ic io s p a r a la s e c c ió n 4 .2 E j e r c i c i o 4 .2 .1 : C onsidere la sigu ien te g ra m á tica libre d e contexto: S —►S S + | S S * | a y la ca d en a aa + a*. a) P rop orcion e u n a d erivación p or la izquierda para la cadena. b) P rop orcion e u n a d erivación p or la derecha para la cadena. c) P rop orcion e u n árbol d e an álisis sin tá ctico para la cadena. ! d ) ¿L a g ra m á tica es am bigua o no? Ju stifiq ue su respuesta. ! e) D escrib a e l len gu aje generado p or e s ta gram ática. E j e r c i c i o 4 . 2 . 2 : R ep ita el ejercicio 4.2.1 para cad a u na d e las sigu ientes gram áticas y cadenas: 4.2 Gramáticas libres d e contexto 207 a) 5 —► 0 5 1 | 0 1 co n la cad en a 0 0 0 111 . b) 5 —► + 5 5 | * S S | a c o n la cad en a + * aaa. le ) 5 —► 5 ( 5 ) 5 | e con la cad en a (()()). ! d) 5 —► 5 + 5 | 5 5 | ( 5 ) | 5 * | a co n la cad en a (a + a) * a. le ) 5 —► ( L ) | a y L !! f ) 5 L , S \ S c o n la cad en a ((a , a ), a, (a)). —► a 5 6 5 | b S a S | e co n la ca d en a aabbab. ! g ) L a sigu ien te gram ática para las exp resion es booleanas: bexpr b te rm b fa c to r -► -► -» bexpr o r b te rm \ bterm b te rm a n d b fa c to r \ b fa cto r n o t b fa c to r | ( b e x p r ) | t r u e | fa ls e E j e r c ic io 4 .2 .3 : D iseñ e gram áticas p ara los sigu ientes lenguajes: a ) El con ju n to d e to d a s las cad en as d e Os y l s , d e ta l form a q ue ju sto antes d e ca d a 0 vaya por lo m en os un 1 . ! b ) E l con ju n to d e tod as las cad en as d e Os y l s q ue sea n p a lín d ro m o s; es d ecir, q ue la cad en a se lea igual al derecho y a l revés. ! c) E l con ju n to d e to d a s las cad en as d e Os y l s co n un núm ero igual d e Os y ls. !! d ) E l con ju n to d e to d a s las cad en as d e Os y l s co n un núm ero d esigual d e Os y ! e) E l con ju n to d e to d a s las cad en as d e Os y l s e n d o n d e 011 no aparece com o dena. ls . u n a su bca- !! f ) E l con ju n to d e to d a s las cad en as d e Os y l s d e la form a xy, en d on d e x * y, y x y y tienen la m ism a longitud. E j e r c ic io 4 .2 .4 : H ay u n a n otación d e gra m á tica ex te n d id a d e u so com ún. E n e s ta notación, los corch etes y las llaves e n los cu erp os d e las producciones son m eta sím b olos (com o o |) c o n los sigu ien tes significados: i) Los corch etes alrededor d e u n sím b olo o sím b olos gram aticales d e n o ta q u e esta s cons­ tru cciones so n opcion ales. Por en d e, la producción A -► X [Y ] Z tien e e l m ism o efecto q u e las d o s p roducciones A - * X Y Z y A - + X Z. ii) Las llaves alrededor d e un sím b olo o sím b olos gram aticales indican q ue esto s sím bolos p ueden rep etirse cualquier núm ero d e veces, in clu yen d o cero. P or en d e, A X { Y Z} tien e el m ism o efecto q u e la se cu en cia in fin ita d e p ro d u ccio n es A X , A - * X Y Z, A -► X Y Z Y Z, y así sucesivam ente. 208 Capítulo 4. A nálisis sintáctico M uestre q ue esta s d o s exten sion es n o agregan p o te n c ia a la s gram áticas; es decir, cualquier lengu aje q ue p u ed a generarse m ed ian te u na gram á tica co n es ta s ex ten sion es, p o d rá generarse m ediante u na gram ática sin las extension es. E j e r c ic io 4 .2 .5 : U se las llaves d escritas en el ejercicio 4 .2 .4 para sim plificar la sigu ien te gra­ m á tica para los bloqu es d e instrucciones y las instrucciones condicionales: in s t r -► h s ta ln s tr | -► i f ex p r t h e n in s tr e l s e in s tr i f in s tr t h e n in s tr b e g i n k s ta ln s tr e n d in s tr ; k s ta ln s tr \ in s tr E j e r c ic io 4 .2 .6 : E x tie n d a la id ea d el ejercicio 4 .2 .4 p a ra p erm itir cualquier exp resión regular d e sím b olos gram aticales en el cuerpo d e u na producción. M uestre q ue e s ta ex ten sió n no per­ m ite q ue las gram áticas d efinan nuevos lenguajes. E j e r c ic io 4 .2 .7 : U n sím b olo gram atical X (term inal o no term inal) es in ú til si no h ay deri­ vación d e la form a S ^ w X y ^ wxy. E s d ecir, X n u n ca p od rá aparecer e n la d erivación d e un enunciado. a) P rop orcion e u n algoritm o para elim inar d e u n a gra m á tica to d a s la s producciones q ue con ten gan sím b olos inútiles. b) A plique su algoritm o a la sigu ien te gram ática: S A B 0 IA AB -► 1 E j e r c ic io 4 .2 .8 : L a g ra m á tica en la figura 4 .7 gen era d eclaracion es para un so lo id en tificad or num érico; e s ta s d eclaracion es involucran a cu a tro p ropiedades d istin ta s e in d ep en d ien tes d e núm eros. in s tr h staO pcion es opcion m odo escala p re cisio n base -¥■ d e c l a r e id U staO pciones -► h staO pcio n es o p tio n \ e -► m o d o \ escala \ p re c isio n \ base —► r e a l | c o m p l e x —► f i x e d | f l o a t i n g -► s i n g l e | d o u b l e -► b i n a r y | d e c i m a l F igu ra 4.7: U na gram ática para declaraciones con varios atributos a) G eneralice la gram ática d e la figura 4 .7 , p erm itien d o n o p cio n es Ai, para algu nas n fijas y para i = 1, 2, . . . , n, en d o n d e A t p u ed e ser a¿ o S u gra m á tica d eb erá usar só lo 0 ( n ) sím b olos gram aticales y tener u n a longitud to ta l d e prod uccion es igual a O(n). 4.3 Escritura d e una gram ática 209 ! b ) La g ra m á tica d e la figura 4 .7 y su gen eralización en la parte (a) p erm ite declaraciones que son con trad ictorias o redundantes, ta les como: declare foo real fixed real floating P odríam os in sistir e n q ue la sin ta x is d el len gu aje prohíbe d ich as declaraciones; es decir, ca d a declaración gen erad a p or la gra m á tica tien e ex a cta m en te un valor para ca d a una d e las n op cion es. Si lo hacem os, en to n ces para cualquier n f ij a hay só lo un núm ero fini­ to d e declaraciones legales. Por ende, el lenguaje d e declaraciones legales tiene u na gram á­ tica (y tam bién u na expresión regular), al igual que cualquier lenguaje finito. La gram ática obvia, en la cu al el sím bolo inicial tiene u na producción para ca d a declaración legal, tiene n! producciones y u na longitud de producciones to ta l d e 0 { n x n!). H ay que esforzarse más: una b n g itu d d e producciones total que se a 0 (n2 n). !! c ) M uestre q ue cualquier gram ática para la parte (b ) d e b e ten er u n a longitud d e produc­ cion es to ta l d e por lo m en os 2 n. d ) ¿Q ué d ice la p arte (c) acerca d e la via b ilid a d d e im poner la no redundancia y la no con trad icción entre las op cio n es en las d eclaraciones, a través d e la sin ta x is d el lenguaje d e program ación? 4 .3 E s c r itu r a d e u n a g ra m á tic a Las gram áticas so n cap aces d e describir casi la m ayoría d e la sin ta x is d e lo s len g u a jes d e pro­ gram ación. Por ejem plo, el requerim iento d e q ue los identificadores d eb en declararse antes de usarse, n o p uede describirse m ediante u na gra m á tica libre d e co n tex to . Por lo ta n to , las secuen­ cia s d e los tokens q ue acep ta un analizador sin tá ctico form an un su perconjun to d el lenguaje d e program ación; las fases sigu ien tes d e l com p ilad or d eb en analizar la sa lid a d e l analizador sin táctico, p ara asegurar q ue cu m p la co n las reglas q ue no verifica e l analizador sin táctico. E sta sección em p ieza con u na d iscu sión acerca d e có m o divid ir el trab ajo en tre u n anali­ zador léxico y un analizador sin táctico. D esp u és considerarem os varias transform aciones que p odrían aplicarse para ob tener u n a gram á tica m ás ad ecu ad a para e l análisis sin tá ctico . U na téc n ic a p uede elim inar la am bigüedad e n la gram ática, y las o tra s (elim inación d e recursividad por la izquierda y factorización por la izquierda) son ú tiles p a ra rescribir las gram áticas, de m anera q ue sean ad ecu ad as para e l anáfisis sin tá ctico descen dente. C oncluirem os e s ta sección con sid erand o algu nas con stru ccion es d e los lengu ajes d e program ación q ue n ingu na gram ática p u ed e describir. 4 .3 .1 C o m p a ra ció n e n tre análisis léx ico y an álisis sin tá ctico C om o ob servam os en la sección 4.2 .7 , tod o lo q ue p uede describirse m ediante u na expresión regular tam bién p u ed e describirse m ediante u n a gram ática. P or lo ta n to , sería razonable pre­ guntar: “¿P or q u é usar exp resion es regulares p a ra definir la sin ta x is lé x ica d e un lenguaje?” E x isten varias razones. 210 Capítulo 4. A nálisis sintáctico 1. A l separar la estru ctu ra sin tá ctica d e un lengu aje en p artes léxicas y no léxicas, se pro­ p orcion a u na m anera con ven ien te d e colocar e n m ódulos la interfaz d e usuario d e un com pilador en d os com p on en tes d e un tam a ñ o m anejable. 2. L as reglas léxicas d e un len gu aje son con frecuencia b a sta n te sim p les, y para describirlas no n ecesitam os u n a n otación tan p o d e ro sa co m o las gram áticas. 3. Por lo general, las exp resion es regulares proporcionan u n a n otación m ás co n cisa y fácil de entender para los tok en s, en com paración co n las gram áticas. 4. P u ed en con stru irse analizadores léxicos m ás eficien tes en form a a u to m á tica a partir d e exp resion es regulares, en com paración con las gram áticas arbitrarias. N o h ay lincam ientos firm es en lo q ue se d eb e poner en la s reglas léxicas, en co n tra ste a las re­ glas sin tácticas. Las exp resion es regulares so n m uy ú tiles para describir la estru ctu ra d e las con stru cciones com o los identificado res, las co n sta n tes, la s palabras reservadas y e l esp a cio en blanco. Por o tro lado, las gram áticas son m uy útiles para describir estructuras anidadas, com o los paréntesis balanceados, las instrucciones begin-end relacionadas, las instrucciones if-then-else correspondientes, etcétera. E stas estructuras anidadas no p ueden describirse m ediante las expre­ siones regulares. 4.3.2 E lim in ació n de la am b igü ed ad A lgunas veces, u na gram ática am b igu a p u ed e rescribirse para elim inar la am bigüedad. C om o ejem plo, vam os a elim inar la am bigüedad d e la sig u ien te gra m á tica d el “else co lg a n te” : in s tr ->• i f e r p r t h e n in s tr i f e r p r t h e n in s tr e l s e in s tr o tra (4.14) A quí, “o t r a ” representa a cualquier o tr a instrucción. D e acuerdo co n e s ta gram ática, la si­ g u ien te in stru cción con d icion al com puesta: i f E \ t h e n S i e l s e i f E¿ t h e n S -2 e l s e S 3 Ei 52 53 F igu ra 4.8: Á rb ol d e an álisis sin tá ctico para una in stru cción con d icion al 211 4.3 Escritura d e una gram ática tien e e l árbol d e an álisis sin tá ctico q ue se m uestra en la figura 4 .8 .1 L a gra m á tica (4 .1 4 ) es am bigua, y a q ue la cad en a i f E i t h e n ¡ f 2% t h e n S i e l s e S 2 (4 1 5 ) tien e los d os árboles d e an álisis sin táctico que s e m uestran e n la figu ra 4.9. instr E-2 Si S2 Si F igu ra 4.9: D os árboles d e an álisis sin tá ctico para u n en u nciado am biguo E n to d o s los lenguajes d e program ación co n instrucciones con d icion ales d e e s ta form a, se prefiere el prim er árbol d e an álisis sin táctico . L a regla general es, “R elacion ar ca d a e l s e con el t h e n m ás cercano q ue no esté relacionado ” .2 E s ta regla p a ra elim inar am bigüedad p u ed e, en teoría, incorporarse d irectam en te en u na gram ática, pero en la p ráctica raras veces se integra a las producciones. E j e m p lo 4 .1 6 : P od em os rescribir la gram ática d e l else co lgan te (4.14) com o la siguiente gra m á tica sin am bigüedades. L a id ea es q u e u na in stru cción q ue aparece en tre un t h e n y un e l s e d eb e estar “relacionada” ; e s decir, la instrucción interior no d eb e term inar co n un t h e n sin relacionar o abierto. U n a instrucción relacionada es u n a in stru cción ¡ f - t h e n - e l s e q ue no co n tien e instrucciones ab iertas, o es cualquier o tro tip o d e instrucción in con dicion al. Por ende, p od em os usar la g ra m á tica d e la figura 4.1 0 . E s ta gra m á tica g en era la s m ism as cad en as que la g ra m á tica d e l else colgan te (4 .1 4 ), pero só lo p erm ite un an álisis sin tá ctico para la cad en a (4.15); e n específico, e l q u e aso cia a cad a e l s e con la in stru cción t h e n m ás cercana q ue no h aya e sta d o relacionad a antes. □ 1Los su b ín d ice s e n E y S s o n sólo p a r a d ife re n c ia r las d is tin ta s o c u rre n c ia s d e l m ism o no te rm in a l, p o r lo c u a l no im p lican no te rm in a le s d istin to s. 2 H ay q u e te n e r e n c u e n ta q u e C y s u s d eriv ad o s s e in clu y en e n e s t a clase. A u n c u a n d o la fa m ilia d e len g u ajes C n o u tiliz a la p a la b ra c la v e th e n , s u función s e r e p re s e n ta m ed ia n te e l p a rén tesis d e c ie rre p a r a la con d ició n q u e v a d esp u é s d e i£ 212 Capítulo 4. A nálisis sintáctico in s tr in str.rela cio n a d a -► in str.rela cio n a d a | in str.a b ie rta - * i f expr t h e n in str.rela cio n a d a e l s e in str.rela cio n a d a o tra in str.a b ie rta -> | i f ex p r t h e n in s tr i f e x p r t h e n in str.rela cio n a d a e l s e in str.a b ie rta F igu ra 4.10: G ram ática sin am bigüedades para la s instrucciones if-then-else 4 .3 .3 E lim in a c ió n d e la r e c u r s i v id a d p o r la iz q u ie r d a U n a gram ática es recursiva p o r la izquierda si tien e u na term inal A ta l q u e haya u na derivación A =$► A a para cierta cad en a a . Los m étodos d e análisis sin táctico d escendentes no pueden m a­ nejar las gram áticas recursivas por la izquierda, por lo q ue se n ecesita u na transform ación para elim inar la recursividad por la izquierda. E n la sección 2 .4 .5 hablam os sobre la recu rsividad in m ediata p o r la izqu ierda, en donde hay u na producción d e la form a A -► A a . A q u í estu dia­ rem os el caso general. En la sección 2.4.5, m ostram os cóm o el par recursivo p or la izquierda de producciones A -+ A a \ 0 p o d ía su stitu irse m ediante las siguientes producciones n o recursivas por la izquierda: A -> 0 A' A ' -> a A ' | e sin cam biar las cad en as q ue se derivan d e A . E sta reg la p o r s í s o la b a sta p a ra m uchas gram á­ ticas. E j e m p lo 4 .1 7 : L a gram ática d e exp resion es no recursivas p or la izquierda (4 .2 ), q ue se rep ite a continuación: E -+ T E ' E' -* + T E ' T -+ F T ' T '^ > * F T ' F - + ( E ) | id se o b tien e m ed ian te la elim inación d e la recursividad in m ediata p or la izquierda d e la gram á­ tica d e exp resion es (4.1). E l p ar recursivo por la izquierda d e las prod uccion es E E + T \ T se su stitu y e m ediante E - + T E ' y E ' + T E ' \ e. L as n uevas producciones para T y f se o b tien en d e m anera sim ilar, elim in an d o la recursividad in m ed ia ta p or la izquierda. □ La recursividad in m ed iata por la izquierda p uede elim inarse m ediante la sigu ien te técnica, que fu n cion a para cualquier núm ero d e p roducciones A . E n prim er lugar, se agrupan las pro­ d uccion es d e la sigu ien te manera: A - + A a x | A a 2 | ••• | A a m | A en d ond e n in gu n a lo siguiente: | & | — | & term in a con u n a A . D esp ués, se su stitu y en la s producciones A m ediante 4.3 Escritura d e una gram ática 213 A -► & A ' I Ih A ' I ... I jfcA' A ! ol\ A! | | ••• | a mA ' \ e E l n o term inal A gen era las m ism as cad en as que antes, pero y a no es recursiva p or la izquier­ d a . E ste p rocedim ien to elim in a to d a la recursividad por la izquierda d e las producciones A y A! (siem pre y cu an d o n in gu n a se a e), pero n o elim in a la recursividad por la izquierda que in clu ye a las derivacion es d e d o s o m ás p asos. Por ejem plo, considere la sig u ien te gram ática: A í . i A c | S d | e (4.18) v ' E l no term inal S es recursiva p or la izquierda, y a q u e S => A a => S d a , p ero no e s inm ediata­ m en te recursiva por la izquierda. E l A lgoritm o 4.19, q u e se m uestra a con tinu ación, elim in a e n form a siste m á tic a la recursivi­ d a d p or la izquierda d e u n a gram ática. Se g a ra n tiza q ue fu n cion a si la g ra m á tica no tien e ciclos (derivaciones d e la form a A =5* A ) o producciones e (producciones d e la form a A -► e). L os ci­ clo s pueden elim inarse en form a siste m á tic a d e u n a gram ática, a l igual q ue las producciones e (v ea los ejercicios 4 .4 .6 y 4.4.7). A lg o r i t m o 4 .1 9 : E lim in ación d e la recursividad por la izquierda. E N T R A D A : L a gram ática G sin ciclos ni p roducciones e. SA L ID A : U na gram ática eq u ivalen te sin recursividad p or la izquierda. M ÉTO D O : A plicar e l algoritm o de la figura 4 .11 a G. O bserve q ue la gra m á tica no re cursiva por la izquierda resu ltan te p uede tener prod uccion es e. □ 1) 2) 3) 4) ordenar los n o term in ales d e cierta form a A h A2, ..., A n. f o r ( cad a i d e 1 a n ) { f o r ( ca d a j d e 1 a i — 1 ) { su stitu ir cad a producción d e la form a A i - > A jy p o r las p roducciones A t -► ô tf \ ó¿y \ • •- | <5*7 , en donde A j -+ Si | £2 | ••• | Sk sea n to d a s producciones f a c t u a l e s 5) 6) 7) } elim inar la recursividad in m ed ia ta p o r la izquierda en tre la s producciones A { } F igu ra 4.11: A lgoritm o p ara elim inar la recursividad p o r la izquierda d e u na gram ática El procedim iento en la figura 4.11 funciona de la siguiente m anera. En la prim era iteración para i = 1, e l ciclo for extern o d e las líneas (2) a la (7) elim in a cualquier recursividad inm ediata por la izquierda entre las producciones A h Cualquier producción A i restante d e la form a Ay ->■ A ta deb e, por lo tanto, tener l > 1. D espués de la ¿-1-ésim a iteración d e l ciclo for externo, todas las no term inales Ak, en donde k < i, se “lim pian” ; e s decir, cualquier producción Ak -► A ¡a debe ten er l > k. C om o resultado, e n la ¿-ésim a iteración, e l ciclo interno d e las líneas (3) a la (5) elev a e n form a progresiva el lím ite inferior en cualquier producción A { ->■ A ma , h a sta tener m > i 214 Capítulo 4. A nálisis sintáctico D esp ués, la elim in ación d e la recursividad in m ed ia ta por la izquierda p a ra las producciones A , en la lín ea ( 6 ) o b lig a a q u e m se a m ayor q ue i E j e m p lo 4 .2 0 : V am os a aplicar e l A lgoritm o 4 .1 9 a la g ra m á tica (4 .1 8 ). T écnicam ente, no se garan tiza q u e el algoritm o vaya a funcionar debido a la producción e, pero e n este caso, la producción A - * e resu lta ser inofensiva. O rdenam os los n o term in ales 5 , A . N o h ay recursividad in m ed ia ta p or la izquierda entre las producciones 5, por lo q ue no ocurre n ad a d urante el ciclo extern o para i = 1. P a ra i = 2, su stitu im o s la 5 e n A -► S d p ara ob ten er las sigu ientes prod uccion es A . A A c \A a d \ b d \ e A l elim inar la recursividad in m ed iata por la izquierda entre las producciones A produce la sigu ien te gram ática: S —►A a | b A -+ b d A! | A! A ' - » c A! | a d A! \ e 4 .3 .4 F a c to r iz a c ió n p o r la iz q u ie r d a La factorización por la izquierda es u na transform ación gram átical, ú til para producir u n a gra­ m á tica adecuada para el an álisis sin táctico predictivo, o d escen d en te. C uan do la elecció n entre d os producciones A altern ativas no e s tá clara, tal v e z p o d a m o s rescribir las producciones para diferir la d ecisión h a sta haber v isto la su ficiente en tra d a co m o para p od er realizar la elección correcta. Por ejem p lo, s i ten em o s las sigu ien tes dos producciones: in s t r -► i f e x p r t h e n i n s tr e l s e in s tr i f ex p r t h e n in s tr al ver la en trad a if, no p od em os saber d e in m ediato q ué p rod ucción elegir p a ra exp an d ir in str. En gen eral, si A a 0 i \ a 0 ¿ son d os producciones A , y la en trad a em p ieza co n u na ca d en a no v a cía d erivad a d e a , n o sab em o s si d eb em os expandir A a a f a o a a/%. N o o b sta n te , p od em os diferir la d ecisión si exp an d im os A a a A'. A sí, d esp u és d e v er la en trad a d erivad a d e a , exp an ­ d im os i ' a f t o a f t - E s decir, si se factorizan por la izquierda, las producciones originales se con vierten en: A -> a A ' A' —*• | 02 A lg o r it m o 4 .2 1 : F actorización por la izquierda d e u na gram ática. E N T R A D A : L a gram ática G. SALID A: U n a gram ática eq u ivalen te factorizada p or la izquierda. 4.3 Escritura d e una gram ática 215 M ÉTO D O : P ara ca d a no term in al A , encontrar el prefijo a m ás largo q ue s e a com ú n p a ra una o m ás d e su s alternativas. S i a * e (es decir, si hay un prefijo com ún no trivial), se su stitu y en to d a s las producciones A , A -+ a p i | afi¿ | ••• |a fin | 7 , en d ond e 7 representa a to d a s las alter­ n ativas q ue no em p iezan co n a , m ediante lo siguiente: A —►olA! I 7 A’ | 02 | | 0n A q u í, A' es u n no term inal nuevo. Se ap lica e s ta transform ación en form a rep etid a h a sta que n o h aya d o s altern ativas para un no term inal q ue ten gan un prefijo com ún. □ E j e m p lo 4 .2 2 : L a sigu ien te gram ática ab strae el p rob lem a d el “else co lg a n te”: S - * i E t S \ i E t S e S \ E b a [ ó) A qu í, i, t y e representan a if , t h e n y e l s e ; E y S representan “expresión con d icion al” e “ins­ tru cción ”. S i se factoriza a la izquierda, e s ta g ra m á tica se con vierte en: S -► i E t S S' | a S'-+eS | € b (4.24) A sí, p od em os expandir S a iE tS S ' con la en tra d a ¿, y esperar h a sta q ue se haya v isto iE tS para decidir si se v a a expandir S ' a e S o a e. D esd e luego q ue e sta s g ra m áticas son am biguas, y con la en trad a e no quedará claro q u é altern a tiv a d eb e elegirse para S '. E l ejem p lo 4 .3 3 h ab la sobre cóm o salir d e e s te d ilem a. □ 4 .3 .5 C o n s tr u c c io n e s d e le n g u a je s q u e n o s o n lib r e s d e c o n te x t o A lgu n as con stru cciones sin tá ctica s q ue se en cu en tran en los lenguajes d e p rogram ación ordina­ rios no p ueden especificarse só lo m ed ian te e l u so d e gram áticas. A q u í considerarem os d o s de esta s con stru cciones, usand o lengu ajes ab stra cto s sim p les para ilustrar las d ificu ltad es. E j e m p lo 4 .2 5 : E l lengu aje en e s te ejem p lo abstrae el problem a d e com probar q ue se declaren los identificadores an tes d e poder usarlos en un p rogram a. E l len gu aje c o n siste e n ca d en a s d e la form a w cw , en d on d e la prim era w representa la declaración d e un identificador w , c representa u n fragm ento interm edio del program a, y la seg u n d a w represen ta e l u so d e l identificador. E l lengu aje ab stracto es L i = {w c w \ w e s tá en (a|b)*}. L i co n siste en tod as las palabras co m p u estas d e u n a ca d en a rep etid a d e as y bs separadas por c, com o aabcaab. A un qu e no lo vam os a dem ostrar aquí, la ca racterística d e no ser libre d e co n tex to d e L \ im plica d irectam ente que los lenguajes d e program ación com o C y J a v a no sea n libres d e co n tex to , los cu ales requie­ ren la d eclaración de los identificadores antes d e usarlos, ad em ás d e p erm itir identificadores de lon gitu d arbitraria. P or e s ta razón, u n a gram ática para C o J a v a no hace diferencias en tre los identificadores que so n cad en as d istin ta s d e caracteres. E n vez d e ello , to d o s los identificadores se representan 216 Capítulo 4. A nálisis sintáctico m ediante un token com o ¡d en la gram ática. E n un com p ilad or p a ra dicho lengu aje, la fa se d e análisis sem án tico com p ru eb a q ue los identificadores se declaren an tes d e usarse. □ E j e m p lo 4 .2 6 : E l lengu aje, q u e n o e s in d ep en d ien te d e l co n tex to en e s te ejem p lo, ab strae el problem a d e com probar q ue e l núm ero d e p arám etros form ales e n la d eclaración d e u n a función coin cid a co n el núm ero d e parám etros actu ales e n un u so d e la función. E l lengu aje co n siste en cad en as d e la form a anbmc1ld m. (R ecuerde q ue an sign ifica a escrita n v eces). A quí, an y bm podrían representar las listas d e parám etros form ales d e dos funciones declaradas para tener n y ¡n argu m en tos, resp ectivam en te, m ientras q u e cn y cT representan las lista s d e los parám etros actu ales en las llam adas a esta s d o s funciones. El len gu aje ab stracto es | n > 1 y m > 1}. E s d ecir, L¿ co n siste d e cad en as en e l lengu aje generado por la expresión regular a*b*c*d*, d e ta l form a q u e el núm ero d e as y es y d e bs y ds se a igual. E ste lengu aje no es in d ep en d ien te d e l con tex to . D e nuevo, la sin ta x is com ú n d e las declaraciones d e las funciones y los u sos no s e responsa­ biliza d e con tar el núm ero d e parám etros. P or ejem p lo, la llam ad a a u n a función en u n lengu aje sim ilar a C p od ría especificarse d e la sigu ien te manera: in s tr hst(L expr -► -+ | i d ( h sta-expr) ksta^expr, ex p r ex p r con p roducciones ad ecu ad as para expr. L a com probación de q ue el núm ero d e p arám etros en una llam ad a s e a correcto s e realiza p or lo general d u ra n te la fase d el análisis sem án tico. □ 4 .3 .6 E je rc ic io s p a r a la s e c c ió n 4 .3 E j e r c ic io 4 .3 .1 : L a sigu ien te gram ática e s para exp resion es regulares sobre los sím b olos a y b so lam en te, usando + en vez d e | para la unión, co n lo cu a l s e e v ita e l con flicto con e l u so d e la barra vertical com o un m eta sím b olo e n las gram áticas: re x p r r te r m r fa c to r r p rim a rio -► -* -> -> re x p r + r te r m \ rte rm r te r m r f a c to r \ r ja c to r r f a c to r * | rp rim a rio a | b a) F actorice e s ta gram ática por la izquierda. b) ¿L a factorización por la izquierda hace a la g ra m á tica ad ecu ad a para e l an álisis sin tá cti­ co descendente? c) A d em ás d e la factorización por la izquierda, elim in e la recursividad p o r la izquierda d e la gram ática original. d) ¿L a gram ática resultante es ad ecu ad a p ara e l an álisis sin tá ctico descendente? E j e r c ic io 4 .3 .2 : R ep ita el ejercicio 4.3.1 con las sig u ien tes gram áticas: a) L a gram ática d el ejercicio 4.2.1. b) L a gram ática d el ejercicio 4 .2 .2 (a). 4.4 A nálisis sintáctico descendente 217 c) L a gram ática d e l ejercicio 4 .2 .2 (c). d ) L a gram ática d e l ejercicio 4 .2 .2 (e). e) L a gram ática d e l ejercicio 4 .2 .2 (g ). E j e r c ic io 4 .3 .3 : S e propone la sigu ien te gra m á tica para elim inar la “am bigüedad d e l else co lg a n te” , d escrita en la sección 4.3.2: in s tr -► in strR ela c io n a d a -► i f ex p r t h e n in s tr in strR ela cio n a d a i f expr t h e n in strR ela c io n a d a e l s e in s tr o tr a M u estre q ue e s ta g ra m á tica sigu e siend o am bigua. 4.4 A n á lisis s in tá c tic o d e s c e n d e n te E l an álisis sin táctico d escen d en te p uede verse com o e l p rob lem a d e construir un árbol d e anár lisis sin tá ctico para la ca d en a d e entrada, p artien do desde la raíz y crean do los n od os d e l árbol d e an álisis sin tá ctico en preorden (profundidad prim ero, com o vim os en la secció n 2 .3 .4 ). D e m anera eq u ivalen te, p od em os considerar el an álisis sin tá ctico d escen dente co m o la búsqueda d e u na d erivación por la izquierda para u na ca d en a d e entrada. E j e m p lo 4 .2 7 : L a secu en cia d e árboles d e an álisis sin tá ctico en la figura 4 .1 2 para la en trad a i d + i d * i d es u n an álisis sin tá ctico d escen d en te, d e acuerdo co n la gra m á tica (4 .2 ), q ue repeti­ m os a continuación: E E' T r F —► —► —► —► —► TE' + TE' | e F T * FT' \ e (E ) (4.28) | id E s ta secu en cia d e árb oles corresp ond e a u n a d erivación p or la izquierda d e la en trad a. □ E n ca d a p aso d e un análisis sin táctico d escen d en te, e l problem a cla v e es e l d e determ inar la producción q ue d eb e aplicarse para un n o term inal, p o r decir A . U n a vez q u e se elige una producción A , el resto d el proceso d e an álisis sin tá ctico co n siste en “relacionar” los sím bolos term in ales e n el cu erpo d e la producción co n la cad en a d e entrada. E sta sección em p ieza co n u na form a general d el an álisis sin tá ctico descen dente, con ocid a com o análisis sin táctico d e d escen so recursivo, la cu a l p uede requerir d e u n rastreo h acia atrás para encontrar la producción A correcta q ue d eb e aplicarse. L a sección 2 .4 .2 introdujo e l anáfi­ sis sin tá ctico predictivo, un ca so esp ecia l d e anáfisis sin tá ctico d e d escen so recursivo, en donde n o se requiere un rastreo h acia atrás. E l an álisis sin tá ctico p red ictivo elig e la p rod ucción A correcta m ed ian te u n análisis por ad elan tad o d e la entrada, en d ond e se v e un núm ero fijo de sím b olos adelantados; p or lo general, só lo n ecesitam os v er u n sím b olo por ad elan tad o (es decir, e l sigu ien te sím b olo d e en trad a). 218 Capítulo 4. A nálisis sintáctico E => E lm T => lm / id E / Ef T E => \ / Ef T E ? F T' F T T /\ F Tr id id / / 4- / TN^ Ef A\ V id T id E / F Ef. T' F E T / \ => lm E[ F T' + T E ? mí / ;r id * F V 7* id / E => \ lm T E' /I / w F T* + T E ? I eI id / \ * F T Jid * F T' E / \ T F?^ /I / F T* 4T F id / \ e id id lm \ F T I I id 6 Ef Ef / L /I X , F T' + T E T / 4- 6 Ef =* lm E[ /I F T E lm / /\ T F E lm \ /\ Ef. 6 E lm l=* m \ T /I F r => lm / \ 1 f f id * /T \ F 7 Jid 1 f F igu ra 4.12: A nálisis sin tá ctico d escen d en te para i d + i d * i d Por ejem plo, considere e l an álisis sin táctico d escen d en te en la figura 4 .1 2 , en la cual se con stru ye u n árbol con d os n od os etiq u etad os co m o E '. E n el prim er nodo E ' (en preorden), se elige la producción E ' 4- TE'; en el segu n d o n o d o E?, se elig e la producción E ' -»• e. Un analizador sin táctico predictivo p uede elegir u n a d e la s p roducciones E ' m ed ian te e l an álisis d el sigu ien te sím b olo d e entrada. A la clase d e gram áticas para las cu a les p od em os construir analizadores sin tá ctico s predictiv o s q u e analicen k sím b olos por ad elan tad o en la en trad a, s e le co n o ce algu nas v eces com o la clase L L (k). E n la sección 4 .4 .3 hablarem os sobre la cla se L L (1), pero presentarem os antes ciertos cálcu los, llam ados PRIMERO y SIGUIENTE, en la secció n 4.4.2. A p artir d e los con jun tos PRIMERO y SIGUIENTE para u n a gram ática, con stru irem os “ta b la s d e an álisis sin tá ctico pred ictivo” , las cu ales hacen ex p líc ita la elección d e la p rod ucción d u ra n te e l an álisis sin tá ctico d escen dente. E sto s con jun tos tam b ién so n ú tiles d urante e l an álisis sin tá ctico ascendente. En la sección 4 .4 .4 proporcionarem os u n algoritm o d e análisis sin tá ctico n o recursivo q ue m antiene u na p ila e n form a ex p líc ita , en vez d e hacerlo en form a im p lícita m ed ian te llam adas recursivas. Por ú ltim o, en la sección 4.4.5 hablarem os sobre la recuperación d e errores d urante e l an álisis sin táctico descendente. 4.4 A nálisis sintáctico descendente 4 .4 .1 219 A n á lis is s in tá c tic o d e d e s c e n s o r e c u r s iv o void 1) 2) 3) 4) 5) 6) 7) A () { E legir u na producción A , A X iX 2 X k\ for ( i = 1 a k ) { if ( X i es u n n o term inal ) llam ar a l procedim iento X¿(); else if ( X i e s igual al sím b olo d e en tra d a actu al a ) avanzar la en trad a h a sta e l sigu ien te sím bolo; else /* h a ocurrido un error * /; } } Figura 4.13: Un procedimiento ordinario para un no terminal en un analizador sintáctico descendente U n program a d e análisis sin táctico d e d escen so recursivo co n siste en un con ju n to d e procedi­ m ien tos, u no para ca d a n o term in al. L a ejecución em p ieza co n e l procedim iento para e l sím bolo inicial, q u e se d etien e y anuncia q ue tu vo é x ito si el cuerpo d e su p rocedim ien to ex p lo ra to d a la cad en a co m p leta d e entrada. E n la figura 4 .1 3 aparece e l seu d o có d ig o para un no term inal com ú n . O bserve q u e e s te seu d ocód igo es no d eterm in ista, y a que em p ieza eligiend o la produc­ ción A q u e d eb e aplicar d e u na form a no especificada. E l d escen so recursivo gen eral p uede requerir d e un rastreo h acia atrás; es d ecir, ta l vez requiera exploracion es rep etid as sob re la entrada. S in em bargo, raras veces se n ecesita el ras­ treo h acia atrás para analizar las con stru cciones d e u n lengu aje d e program ación, por lo que los analizadores sin tá ctico s co n é s te n o se ven con frecuencia. In clu so para situ acion es com o el an álisis sin tá ctico d e un lengu aje natural, e l rastreo h acia atrás no es m uy eficien te, por lo cu al s e prefieren m étod os tabulares com o e l algoritm o d e program ación d in ám ico d el ejercicio 4.4.9, o el m éto d o d e E arley (v ea las n otas b ib liográficas). P ara p erm itir el rastreo h acia atrás, hay q ue m odificar e l có d ig o d e la figura 4.13. E n primer lugar, no p od em os elegir u na producción A ú n ica en la lín ea (1 ), p o r lo q u e d eb em os probar ca d a u n a d e las d iversas producciones e n cierto orden. D esp ués, e l fallo e n la lín ea (7) no e s defi­ n itiv o , sin o q ue sólo su giere q ue n ecesitam os regresar a la línea (1) y probar o tr a producción A. S ólo si no hay m ás p roducciones A p ara probar es cu an do d eclaram os q ue s e h a en con trad o un error en la entrada. P ara p o d er probar otra p rod ucción A , d eb em os restablecer el apuntador de en trad a a la p osició n en la que se en con trab a cu a n d o llegam os p o r prim era v ez a la lín ea ( 1 ). E s decir, s e requiere u n a variable local para alm acenar e s te apuntador d e entrada, para u n uso futuro. Ejemplo 4.29: C onsidere la sigu ien te gram ática: S A —> c A d a b | a P ara construir un árbol d e análisis sin tá ctico d escen d en te para la ca d en a d e en trad a w = cad, em p ezam os co n un árbol q ue co n siste e n un so lo n o d o etiq u eta d o com o 5 , y e l apuntador d e en­ tra d a a p u n ta a c, el prim er sím b olo d e w. S só lo tien e u n a producción, por lo q u e la utilizam os 220 Capítulo 4. A nálisis sintáctico para expandir S y obtener el árbol de la figura 4.14(a).La hoja por la izquierda, etiquetada como c, coincide con el primer símbolo de la entrada tí?, por lo que avanzamos el apuntador de entrada hasta a, el segundo símbolo de w,y consideramos la siguiente hoja, etiquetada c o m o A. S c A S d d A c a (a) S b (b) c A d a (c) Figura 4.14: Los pasos de un análisis sintáctico descendente Ahora expandimos A mediante la primera alternativa A -► a b para obtener el árbol de la figura 4.14(b). Tenemos una coincidencia para el segundo símbolo de entrada a, por lo que avanzamos el apuntador de entrada hasta d, el tercer símbolo de entrada, y comparamos a d con la siguiente hoja, etiquetada con b. C o m o b no coincide con d, reportamos un error y re­ gresamos a A para ver si hay otra alternativa para A que no hayamos probado y que pueda producir una coincidencia. Al regresar a A , debemos restablecer el apuntador de entrada a la posición 2, la posición que tenía cuando llegamos por primera vez a A, lo cual significa que el procedimiento para A debe almacenar el apuntador de entrada en una variable local. La segunda alternativa para A produce el árbol de la figura 4.14(c). L a hoja a coincide con el segundo símbolo de tí?y la hoja d coincide con el tercer símbolo. C o m o hemos producido un árbol de análisis sintáctico para tí?, nos detenemos y anunciamos que se completó el análisis sintáctico con éxito. □ U n a gramática recursiva por la izquierda puede hacer que un analizador sintáctico de des­ censo recursivo, incluso uno con rastreo hacia atrás, entre en un ciclo infinito. Es decir, al tratar de expandir una no terminal A , podríamos en un mome nt o dado encontramos tratando otra vez de expandir a A , sin haber consumido ningún símbolo de la entrada. 4.4.2 P R IM E R O y S IG U IE N T E La construcción de los analizadores sintácticos descendentes y ascendentes es auxiliada por dos funciones, PRIM E RO y SIGUIENTE, asociadas con la gramática G. Durante el análisis sintáctico descendente, PRIM E RO y SIGUIENTE nos permiten elegir la producción que vamos a aplicar, con base en el siguiente símbolo de entrada. Durante la recuperación de errores en m o d o de pánico, los conjuntos de tokens que produce SIGUIENTE pueden usarse como tokens de sincronización. Definimos a PRIMERO(a), en donde a es cualquier cadena de símbolos gramaticales, como el conjunto de terminales que empiezan las cadenas derivadas a partir de a. Si a => e, entonces 6 también se encuentra en PRIM E RO (a). Por ejemplo, en la figura 4.15, A c y ™por lo que c está en PRIMERO(^4). Para una vista previa de c ó m o usar P R I M E R O durante el análisis sintáctico predictivo, considere dos producciones A , A a |¿3, en donde PRIM ER O (a) y PRIME R O (0) son conjuntos 4.4 A nálisis sintáctico descendente 221 Figura 4.15: El terminal c está en P R I M E R 0 (j4) y a está en SIGUIENTE(;4) separados. Entonces, podemos elegir una de estas producciones A si analizamos el siguiente símbolo de entrada a, ya que a puede estar a lo m á s en P R I M E R O (a) o en P R I M E R O (/3), pero no en ambos. Por ejemplo, si a está en PRIMERO(/?), elegimos la producción A - > 0. Exploraremos esta idea en la sección 4.4.3, cuando definamos las gramáticas LL(1). Definimos a SIGUIENTE(Á), para el no terminal A , c o m o el conjunto de terminales a que pueden aparecer de inmediato a la derecha de A en cierta forma de frase; es decir, el conjunto de terminales A de tal forma que exista una derivación de la forma S olA ü0 , para algunas a y 0, c o m o en la figura 4.15. Observe que pudieron haber aparecido símbolos entre A y a, en algún m o m e n t o durante la derivación, pero si es así, derivaron a e y desaparecieron. Además, si A puede ser el símbolo por la derecha en cierta forma de frase, entonces $ está en SIGUIENTE (A); recuerde que $ es un símbolo “ delimitador”especial, el cual se supone que no es un símbolo de ninguna gramática. Para calcular PRI ME R O( X ) para todos los símbolos gramaticales X, aplicamos las siguientes reglas hasta que no pueden agregarse m á s terminales o e a ningún conjunto PRIMERO. 1. Si X es un terminal, entonces P R I M E R O ( X ) = {X}. 2. Si X es un no terminal y X Y \ Y2 ••• Yk es una producción para cierta k > 1, entonces se coloca a en PR I ME R O( X ) si para cierta ¿, a está en P R I M E R O (Y¿), y e está en todas las funciones PRIMERO(Yi), ..., P R I M E R O (Vj-i); es decir, Yi ••• Y¿_i => e. Si € está en PRIMERO( Y j) para todas las j — 1,2, ..., k, entonces se agrega e a PRIMERO(X). Por ejem­ plo, todo lo que hay en PRIMERO( Y \) se encuentra sin duda en PRIMERO(X). Si Y \ no deriva a e, entonces no agregamos nada m á s a PRIMERO(X), pero si Y \= > e, entonces agregamos PRIMERO( Y¿), y así sucesivamente. 3. Si X ->* e es una producción, entonces se agrega e a PRTMERO(X). Ahora, podemos calcular P R I M E R O para cualquier cadena X \ X 2 X n de la siguiente m a ­ nera. Se agregan a P R I ME RO ( Xi X 2 X n) todos los símbolos que no sean e de P R I M E R O (Xi). También se agregan los símbolos que no sean e de PR.IMERO(X2), si e está en PRIMERO(Xi); los símbolos que no sean e de P R I M E R O ( X 3), si e está en PRIMERO(Xj) y P R I M E R 0 ( X 2); y así suce­ sivamente. Por último, se agrega e a P R I M E R O (X iX 2 X n) si, para todas las ¿, e se encuentra en P R I M E R O (X¿). Para calcular SIGUIENTE(v4) para todas las no terminales A ,se aplican las siguientes reglas hasta que no pueda agregarse nada a cualquier conjunto SIGUIENTE. 1. Colocar $ en SIGUIENTE(5), en donde S es el símbolo inicial y $ es el delimitador derecho de la entrada. 222 Capítulo 4. A nálisis sintáctico 2. Si hay una producción A está en SIGUIENTE(B). aB/3, entonces todo lo que hay en P R I M E R O (/3) excepto e 3. Si hay una producción A -* aB , o una producción A aB¡3, en donde PRIMERO(/?) contiene a e, entonces todo lo que hay en SIGUIENTE(í4) está en SIGUIENTE(B). Ejemplo 4.30: Considere de nuevo la gramática no recursiva por la izquierda (4.28). Entonces: 1. PRIMERO(F) = P R I M E R O (T) = PRIMERO(E) = {(, id}. Para ver por qué, observe que las dos producciones para F tienen producciones que empiezan con estos dos símbolos termi­ nales, id y el paréntesis izquierdo. T sólo tiene una producción y empieza con F. C o m o F no deriva a e, PR IM E RO ( T) debe ser igual que P R I M E R O (F). El mismo argumento se cumple con P R I M E R O (E ). 2. P R I M E R O (E ') = { + , e } . La razón es que una de las dos producciones para E ' tiene un cuerpo que empieza con el terminal +, y la otra es e. C a d a vez que un no terminal deriva a €, colocamos a e en P R I M E R O para ese no terminal. 3. PRIMERO(T') = {*, e}. El razonamiento es análogo al de PRIMERO(-E')4. SIGUIENTE ( £ ) = SIGUIENTE^') = { ) , $ }. C o m o E es el símbolo inicial, SIGUIENTE(£) debe contener $. El cuerpo de la producción ( E ) explica por qué el paréntesis derecho está en SIGUIENTE(£). Para E \ observe que esta no terminal sólo aparece en los extre­ m o s de los cuerpos de las producciones E. Por ende, SIGUIENTE) i?') debe ser el mismo que SIGUIENTE(£). 5. SIGUIENTE) T) = SIGUIENTE) V ) — {+, ), $}. Observe que T aparece en las producciones sólo seguido por E '. Por lo tanto, todo lo que esté en P R I M E R O (l^), excepto e, debe estar en SIGUIENTE) T); eso explica el símbolo +. N o obstante, c o m o PRIMERO) E ') contiene a e (es decir, E ' % e), y E f es la cadena completa que va después de T e n los cuerpos de las producciones E ,todo lo que hay en SIGUIENTE)2?) también debe estar en SIGUIENTE) T). Eso explica los símbolos $ y el paréntesis derecho. E n cuanto a T', c o m o aparece sólo en los extremos de las producciones T, debe ser que SIGUIENTE) T ') = SIGUIENTE) T). 6. SIGUIENTE(F) = { + , *, ) ,$ } . El razonamiento es análogo al de T en el punto (5). 4 .4 .3 G r a m á t i c a s L L (1 ) Los analizadores sin tá ctico s predictivos, es d ecir, los analizadores sin tá ctico s d e d escen so re­ cursivo q ue no n ecesitan rastreo h acia atrás, p ueden construirse para u na cla se d e gram áticas llam adas L L )1). L a prim era “L ” en L L )1) es p ara explorar la en trad a d e izquierda a d erech a (por left e n in g lés), la seg u n d a “L ” p ara producir u n a d erivación p or la izquierda, y el “1” para usar u n sím b olo d e en trad a d e an ticip ación en ca d a paso, para tom ar las decision es d e acción d el análisis sin táctico. 4.4 A nálisis sintáctico descendente 223 D ia g r a m a s d e tr a n s ic ió n p a r a a n a liz a d o re s s in tá c tic o s p re d ic tiv o s Los diagramas de transición son útiles para visualizar los analizadores sintácticos pre­ dictivos. Por ejemplo, los diagramas de transición para las no terminales E y E ' de la gramática (4.28) aparecen en la figura 4.16(a). Para construir el diagrama de transición a partir de una gramática, primero hay que eliminar la recursividad por la izquierda y después factorizar la gramática por la izquierda. Entonces, para cada no terminal A, 1. Se crea un estado inicial y un estado final (retorno). 2. Para cada producción A -► X iX 2 ••• X k., se crea una ruta desde el estado inicial hasta el estado final, con los flancos etiquetados c o m o X h X 2, . . . , X k. Si A e, la ruta es una línea que se etiqueta c o m o e. Los diagramas de transición para los analizadores sintácticos predictivos difieren de los diagramas para los analizadores léxicos. Los analizadores sintácticos tienen un diagra­ m a para cada no terminal. Las etiquetas de las líneas pueden ser tokens o no terminales. U n a transición sobre un token (terminal) significa que tomamos esa transición si ese token es el siguiente símbolo de entrada. U n a transición sobre un no terminal A es una llamada al procedimiento para A. C o n una gramática LL(1), la ambigüedad acera de si se debe tomar o no una línea e puede resolverse si hacemos que las transiciones e sean la opción predeterminada. Los diagramas de transición pueden simplificarse, siempre y cuando se preserve la secuencia de símbolos gramaticales a lo largo de las rutas. También podemos sustituir el diagrama para un no terminal A, en vez de una línea etiquetada como A. Los diagramas en las figuras 4.16(a) y (b) son equivalentes: si trazamos rutas de E a un estado de aceptación y lo sustituimos por E \ entonces, en ambos conjuntos de diagramas, los símbolos gramati­ cales a lo largo de las rutas forman cadenas del tipo T + T + ••• + T. El diagrama en (b) puede obtenerse a partir de (a) mediante transformaciones semejantes a las de la sección 2.5.4, en donde utilizamos la eliminación de recursividad de la parte final y la sustitución de los cuerpos de los procedimientos para optimizar el procedimiento en un no terminal. L a clase de gramáticas LL(1) es lo bastante robusta c o m o para cubrir la mayoría de las construcciones de programación, aunque hay que tener cuidado al escribir una gramática ade­ cuada para el lenguaje fuente. Por ejemplo, ninguna gramática recursiva por la izquierda o ambigua puede ser LL(1). U n a gramática G es LL(1) si, y sólo si cada vez que A a \ 0 son dos producciones dis­ tintas de G,se aplican las siguientes condiciones: 1. Para el no terminal a, tanto a c o m o 0 derivan cadenas que empiecen con a. 2. A lo más, sólo a o 0 puede derivar la cadena vacía. 3. Si 0 e, entonces a no deriva a ninguna cadena que empiece con una terminal en SIGUIENTE (A). D e igual forma, si a ^ c, entonces 0 no deriva a ninguna cadena que empiece con una terminal en SIGUIENTE(i4). 224 Capítulo 4. A nálisis sintáctico E: Ef : (a) (b) Figura 4.16: Diagramas de transición para los no terminales E y E ' de la gramática 4.28 Las primeras dos condiciones son equivalentes para la instrucción que establece que P R I M E R O (a) y PRIMERO(/?) son conjuntos separados. L a tercera condición equivale a decir que si e está en P R I M E R O (/3), entonces PRIMERO(a) y SIGUIENTE( í4) son conjuntos separados, y de igual forma si e está en PRIMERO(a). Pueden construirse analizadores sintácticos predictivos para las gramáticas LL(1), ya que puede seleccionarse la producción apropiada a aplicar para una no terminal con sólo analizar el símbolo de entrada actual. Los constructores del flujo de control, con sus palabras clave distintivas, por lo general, cumplen con las restricciones de LL(1). Por ejemplo, si tenemos las siguientes producciones: in s tr -► | if ( e x p r ) i n s t r e ls e w h ile ( e x p r ) i n s t r { k s ta -in s tr in s tr } entonces las palabras clave if , w h i l e y el símbolo { nos indican qué alternativa es la única que quizá podría tener éxito, si vamos a buscar una instrucción. El siguiente algoritmo recolecta la información de los conjuntos P R I M E R O y SIGUIENTE en una tabla de análisis predictivo M [A , a], un arreglo bidimensional, en donde A es un no terminal y a es un terminal o el símbolo $, el marcador de fin de la entrada. El algoritmo se basa en la siguiente idea: se elige la producción A - > a si el siguiente símbolo de entrada a se encuentra en PRIMERO(a). L a única complicación ocurre cuando a = e, o en forma má s general, a =>• e. E n este caso, debemos elegir de nuevo A - » a si el símbolo de entrada actual se encuentra en SIGUIENTE (^4), o si hemos llegado al $ en la entrada y $ se encuentra en SIGUIENTE) ,4). Algoritm o ENTRADA: SALIDA: 4 .3 1 : Construcción de una tabla de análisis sintáctico predictivo. L a gramática G. L a tabla de análisis sintáctico M. M ÉTO D O : Para cada producción A a de la gramática, hacerlo siguiente: 1. Para cada terminal a en PRIMERO(j4), agregar A -► a a M [A, a]. 2. Si e está en PRIMERO(a), entonces para cada terminal b en SIGUIENTE (A), se agrega A -» a a M [A , 6]. Si e está en P R I M E R O (a) y $ se encuentra en SIGUIENTE(í4), se agre­ ga A a a M [A , $] también. 4.4 A nálisis sintáctico descendente 225 Si d esp u és d e realizar lo anterior, no h ay producción e n M [A , a], en to n ces se esta b lece M [A , a] a e r r o r (que, por lo general, representam os m ed ian te u n a e n tra d a v a cía en la ta b la ). □ E j e m p l o 4 . 3 2 : P ara la gram ática de exp resion es (4.28), el A lgoritm o 4 .31 p rod u ce la ta b la de an álisis sin tá ctico en la figura 4.17. Los esp acios en blanco so n entradas d e error; los espacios que no está n e n blanco in dican u n a p rod ucción con la cu a l se ex p a n d e un no term inal. S ímbolo No TERMINAL id E E —►T E ' Ef T de entrada * + E E' ) $ E '^ e E '^ e TEf +TE' T -» FT' T —)■F T ‘ r T' F ( F - > id *F T/ T ’ -> e F (E ) F igu ra 4.17: T a b la d e an álisis sin tá ctico M p a r a el ejem p lo 4 .32 C onsidere la producción E T E '. C om o P R I M E R O ^ ') = PRIMERO(T) = { (, id } e s ta p rod ucción se agrega a M [E , (] y M [E , id ]. L a p rod ucción E ' ->■ + T E ' se agrega a M [ E \ + ] , y a q u e PRIMERO{+ T E * ) = { + } . C om o SIGUIENTE ( £ ') ) = { ) , $ } , l a p rod ucción E ' -+ e se agrega a M [E ', )] y a M [ E \ $]. □ E l algoritm o 4.31 p uede aplicarse a cualquier gra m á tica G p a ra producir u na ta b la de an álisis sin tá ctico M . P ara c a d a gram ática L L (1), ca d a en tra d a en la ta b la d e an álisis sin tác­ tico id en tifica en form a ú n ica a u na producción, o in d ica un error. S in em bargo, para algunas gram áticas, M p uede ten er algunas entradas q u e ten g a n m ú ltip les d efinicion es. Por ejem p lo, si G es recu rsiva por la izquierda o am bigua, en to n ces M tendrá p o r lo m en os u n a en trad a con m ú ltip les definiciones. A un qu e la elim in ación d e la recursividad por la izquierda y la factorización por la izquierda son fáciles d e realizar, h ay algunas g ram áticas para la s cu ales ningún tipo d e alteración producirá u n a g ram ática L L (1). E l len gu aje en el sigu ien te ejem p lo no tien e u na g ra m á tica L L ( 1 ). 4 . 3 3 : L a sigu ien te gram ática, q ue ab strae el problem a d el else co lg a n te, se repite aq u í d e l ejem p lo 4.22: E je m p lo S -► S ' -+ E -+ iE tS S ' | a eS | e b L a tab la d e an álisis sin tá ctico M [ S ', e] con tien e ta n to a S ' ^ L a gram ática es am b igu a y d u cción usar cu an d o se v e u n a para e s ta g ra m á tica aparece e n la figura 4.18. La en trad a para e S com o a S ' e. la am bigüedad s e m a n ifiesta m ed ian te u na elección d e q ué pro­ e ( e l s e ) . P od em os resolver e s ta am bigüedad eligien d o S ' -► eS. 226 Capítulo 4. A nálisis sintáctico Símbolo No TERMINAL 5 a 6 de entrada e 5 —> a i S t iE tS S ' S' ^ 6 S' S S '^ e S r —» c S E E —» ò F igu ra 4.18: T a b la d e an álisis sin tá ctico M para e l ejem p lo 4 .33 E s ta elección corresponde a la asociación d e un e l s e con e l t h e n anterior m ás cercano. O b­ serve q ue la elección S ' -► e ev ita ría q ue e se m etiera en la p ila o s e elim inara d e la en trad a, y eso d efin itivam en te e s tá m al. □ 4.4.4 A n á lisis sin tá ctico p re d ic tiv o no re cu rsivo P od em os construir un analizador sin tá ctico predictivo no recursivo m ed ian te el m anten im ien to ex p lícito d e u n a pila, en vez d e hacerlo m ediante llam adas recursivas im p lícitas. E l analizador sin tá ctico im ita u na d erivación por la izquierda. S i w es la en trad a q u e se h a relacionado h a sta ahora, en ton ces la p ila con tien e u n a secu en cia d e sím b olos gram aticales a d e ta l form a que: El analizador sin tá ctico con trolad o por u n a tab la , que s e m u estra e n la figura 4 .1 9 , tien e un búfer d e en trad a, u na p ila q u e con tien e u na secu en cia d e sím b olos gram aticales, u na ta b la de análisis sin tá ctico con stru id a por e l A lgoritm o 4 .3 1 , y un flujo d e sa lid a . E l búfer d e en trad a co n tien e la cad en a q ue s e v a a analizar, segu id a p or el m arcador final $. R eu tiliza m o s e l sím ­ b olo $ para m arcar la p arte inferior d e la p ila, q ue al principio co n tien e e l sím b olo in icial d e la gra m ática en cim a d e $. El analizador sin tá ctico s e con tro la m ediante un program a q ue con sid era a X , e l sím b olo en la parte superior d e la pila, y a a, el sím b olo d e en trad a actual. S i X e s un no term in al, el analizador sin tá ctico elige u n a producción X m ed ian te u n a co n su lta a la en trad a M [X , a] d e la ta b la d e an álisis sin táctico M (aq u í p od ría ejecutarse có d ig o adicional; por ejem p lo, el cód igo para construir un n od o en un árbol d e an álisis sin tá ctico ). E n cualquier o tro ca so , verifica si h ay u na coin cid en cia en tre el term inal X y e l sím b olo d e en trad a actu al a. El com p ortam ien to d el analizador sin tá ctico p uede describirse e n térm inos d e su s configura­ ciones, q ue proporcionan e l con ten ido d e la p ila y e l resto d e la entrada. E l sigu ien te algoritm o d escrib e la form a e n q ue se m anipulan las configuraciones. A lg o r it m o 4 .3 4 : A nálisis sin tá ctico p redictivo, con trolad o p or u n a tabla. E N T R A D A : U n a cad en a w y u n a ta b la d e an álisis sin tá ctico M p ara la gra m á tica G. SALID A: Si w e s tá en L (G ), u n a d erivación por la izquierda d e w\ en caso contrario, u n a indi­ cación d e error. 4.4 A nálisis sintáctico descendente 227 F igu ra 4.19: M od elo d e u n analizador sin tá ctico p redictivo, con trolad o p or u n a ta b la M ÉTO D O : A l p rin cip io, e l analizador sin tá ctico se en cu en tra en u n a configuración con en e l búfer d e entrada, y el sím b olo in icial 5 d e G en la p arte su perior d e la pila, p or en cim a d e $. E l program a en la figura 4.20 u tiliza la ta b la d e an álisis sin tá ctico predictivo M p a r a producir u n an álisis sin tá ctico predictivo para la entrada. □ esta b lecer ip para q ue ap un te al prim er sím b olo d e w\ esta b lecer X co n e l sím b olo d e la parte su perior d e la pila; w h i l e ( X * $ ) { / * la p ila no e s tá v a cía * / i f ( X es a ) sacar d e la p ila y avanzar ip; e ls e i f (X e s un term inal ) erro r{); e ls e i f (M [X , a] es u n a en tra d a d e error ) erro rQ ; e ls e i f ( M[ X , a] = X -> Y \Y 2 - Yk ) { enviar d e salid a la producción X Y i Y2 Y k; sacar d e la pila; m eter Y*, Y¿_i, . . . , Yi en la pila, con Yi e n la p arte superior; } estab lecer X co n e l sím b olo d e la p a rte superior d e la pila; } F igu ra 4.20: A lgoritm o d e an álisis sin tá ctico predictivo 4 . 3 5 : C onsidere la g ra m á tica (4.28); s e m uestra la ta b la de análisis sin tá ctico e n la figura 4 .17. Con la en trad a i d + i d * i d , e l analizador predictivo sin recursividad d e l A lgorit­ m o 4.34 realiza la secu en cia d e m ovim ientos en la figura 4.21. E sto s m ovim ien tos corresponden a u n a d erivación por la izquierda (v ea la figura 4 .1 2 p a ra la d erivación com pleta): E je m p lo E =» bu TE' => bn F T 'E ' => id bu T 'E ' => id bu E' => id bu + T E ' => bu 228 Capítulo 4. A nálisis sintáctico Coincidencia P ila E ntrada id id id id + id + id + id + id id + id id + id * id + id * id + id * id id + id * id id + id * id ES T E 'S F V E 'S id V E ? S VE?S E /S + TE?S T E 'S F V E 'S id V E ? S VE?S * F V E 'S F V E 'S id V E ? S VE?S E?S S id + id * idS id + id * idS id + id * idS id + id * idS + id * idS + id * idS + id * idS id * idS id * idS id * idS *id$ *idS idS idS S s s Acción em itir E TE' em itir T —» F T ' em itir F —>id relacionar id em itir V -»■e em itir B? —>+ T E ' relacionar + em itir T -+ F V em itir F —>id relacionar id em itir V -►* F T ' relacionar * em itir F id relacionar id em itir V —> e em itir E? e F igu ra 4.21: M ovim ientos q u e realiza un analizador sin tá ctico p red ictivo con la en trad a ¡d + id * id O bserve q u e las form as d e frases en e s ta d erivación corresponden a la en trad a q u e y a se h a relacionado (en la colu m n a COINCIDENCIA), se g u id a d el con ten ido d e la pila. L a en trad a rela­ cionad a se m uestra só lo para resaltar la correspondencia. P or la m ism a razón, la p arte superior d e la p ila e s tá a la izquierda; cu an d o considerem os e l análisis sin tá ctico ascen dente, será más n atural m ostrar la p arte su perior d e la p ila a la derecha. E l apuntador d e la en trad a a p u n ta al sím b olo por la izquierda d e la cad en a en la co lu m n a ENTRADA. □ 4.4.5 R e c u p e ra ció n de erro re s en el an álisis sin tá ctico p re d ic tiv o E s ta d iscu sión sobre l a recuperación d e errores s e refiere a la p ila d e un analizador sin tá ctico p red ictivo con trolad o p or u n a tabla, y a q ue hace ex p lícita s lo s term in ales y no term in ales q ue e l analizador sin táctico esp era relacionar con e l resto d e la entrada; las técn ica s tam b ién p ueden usarse con e l an álisis sin táctico de d escen so recursivo. D urante el análisis sin táctico predictivo, un error se d e te c ta cu a n d o e l term inal en la p arte superior d e la p ila no coin cid e con el sigu ien te sím b olo d e en trad a, o cu a n d o e l n o term in al A se en cu en tra e n la p arte superior d e la pila, a es e l sig u ien te sím b olo d e en trad a y M [A , a] es e r r o r (es decir, la en trad a en la ta b la d e análisis sin tá ctico e s tá va cía ). M o do d e p á n ic o La recuperación d e errores e n m odo d e p ánico s e basa e n la id ea d e om itir sím b olos en la en ­ trad a h a sta q u e aparezca un token en un con ju n to seleccion ad o d e tokens d e sincronización. Su 4.4 A nálisis sintáctico descendente 229 efectividad depende de la elección del conjunto de sincronización. Los conjuntos deben elegirse de forma que el analizador sintáctico se recupere con rapidez de los errores que tengan una buena probabilidad de ocurrir en la práctica. Algunas heurísticas son: 1. C o m o punto inicial, colocar todos los símbolos que están en SIGUIENTE (.4) en el conjun­ to de sincronización para el no terminal A. Si omitimos tokens hasta que se vea un ele­ mento de S E G U I M E N T O (A) y sacamos a A de la pila, es probable que el análisis sintáctico pueda continuar. 2. N o basta con usar SIGUIENTE(>1) c o m o el conjunto de sincronización para A. Por ejem­ plo, si los signos de punto y c o m a terminan las instrucciones, c o m o en C, entonces las palabras reservadas que empiezan las instrucciones no pueden aparecer en el conjunto SIGUIENTE del no terminal que representa a las expresiones. U n punto y c o m a faltante después de una asignación puede, por lo tanto, ocasionar que se omita la palabra reser­ vada que empieza la siguiente instrucción. A menudo hay una estructura jerárquica en las construcciones en un lenguaje; por ejemplo, las expresiones aparecen dentro de las instrucciones, las cuales aparecen dentro de bloques, y así sucesivamente. Al conjunto de sincronización de una construcción de bajo nivel podemos agregar los símbolos que empiezan las construcciones de un nivel m á s alto. Por ejemplo, podríamos agregar pala­ bras clave que empiezan las instrucciones a los conjuntos de sincronización para los no terminales que generan las expresiones. 3. Si agregamos los símbolos en P R I M E R O (A) al conjunto de sincronización para el no ter­ minal A ,entonces puede ser posible continuar con el análisis sintáctico de acuerdo con A , si en la entrada aparece un símbolo que se encuentre en P R I M E R O (4). 4. Si un no terminal puede generar la cadena vacía, entonces la producción que deriva a e puede usarse c o m o predeterminada. Al hacer esto se puede posponer cierta detección de errores, pero no se puede provocar la omisión de un error. Este método reduce el número de terminales que hay que considerar durante la recuperación de errores. 5. Si un terminal en la parte superior de la pila no se puede relacionar, una idea simple es sacar el terminal, emitir un mensaje que diga que se insertó el terminal, y continuar con el análisis sintáctico. E n efecto, este método requiere que el conjunto de sincronización de un token consista de todos los demás tokens. E j e m p l o 4.36: El uso de los símbolos en P R I M E R O y SIGUIENTE c o m o tokens de sincroniza­ ción funciona razonablemente bien cuando las expresiones se analizan de acuerdo con la gramár tica usual (4.28). L a tabla de análisis sintáctico para esta gramática de la figura 4.17 se repite en la figura 4.22, en donde “ sinc”indica los tokens de sincronización obtenidos del conjunto SIGUIENTE de la no terminal en cuestión. Los conjuntos SIGUIENTE para las no terminales se obtienen del ejemplo 4.30. L a tabla en la figura 4.22 debe usarse de la siguiente forma. Si el analizador sintáctico busca la entrada M[A, a] y descubre que está en blanco, entonces se omite el símbolo de entrada a. Si la entrada es “ sinc”,entonces se saca el no terminal que está en la parte superior de la pila, en un intento por continuar con el análisis sintáctico. Si un token en la parte superior de la pila no coincide con el símbolo de entrada, entonces sacamos el token de la pila, c o m o dijimos antes. 230 Capítulo 4. A nálisis sintáctico Símbolo No TERMINAL id E E -» TF? Ff T + de entrada * ( E - » TE? E -> + T E ' T —» F T f T —» FT* sinc T' F —» id sinc sinc sinc E -> e E -> e sinc sinc T ' - * c T* —y 6 7 V- > * F 7 V F S ) sinc F -> (E ) sinc sinc F igu ra 4.22: T ok en s d e sincronización agregados a la ta b la d e an álisis sin tá ctico d e la figura 4.17 Con la en trad a errón ea ) i d * + id , el analizador sin tá ctico y e l m ecanism o d e recuperación d e errores d e la figura 4 .2 2 se co m p o rta com o en la figura 4.23. □ P ila ES ES TE' S F T 'E ' S id T 'E 'S T 'E 'S * F T 'E ' S F T 'E ' S T 'E 'S E 'S + T E 'S TE' S F T 'E ' S i d T 'E ' S T 'E 'S E 'S S E ntrada Comentario ) id * + id S error, om itir ) id * + id S id e s tá en PRIMERO(£) id * + id S id * + id S id * + id S * + id S * + id S H-idS error, M[F, + ] = sin c + idS Se sacó F + idS + idS idS idS id S S s s F igu ra 4.23: M ovim ien tos d e an álisis sin tá ctico y recuperación d e errores realizados por un analizador sin tá ctico predictivo La d iscu sión anterior sobre la recuperación e n m odo d e pánico no señ a la el p u n to im portante relacionado co n los m ensajes d e error. E l diseñador d el com pilador d eb e proporcionar m ensajes d e error inform ativos q u e no sólo describan e l error, sin o q u e tam bién llam en la atención hacia e l lugar en donde se descubrió e l error. 4.4 A nálisis sintáctico descendente 231 R e c u p e r a c ió n a n i v e l d e f r a s e L a recuperación d e errores a nivel d e frase se im p lem en ta llenando las entradas e n blanco en la ta b la d e an álisis sin tá ctico predictivo co n apuntadores a rutinas d e error. E sta s ru tinas pueden m odificar, insertar o elim inar sím b olos en la en trad a y em itir m ensajes d e error apropiados. Tam bién p ueden sacar d e la pila. L a alteración d e los sím b olos d e la p ila o el p roceso d e m eter nuevos sím b olos a la p ila es cu estion ab le por d o s razones. E n prim er lugar, los pasos q ue realiza e l analizador sin tá ctico p odrían en to n ces no corresponder a la d erivación d e n ingu na palabra e n el lenguaje. E n segun do lugar, d eb em os asegurarnos d e q u e no haya p osib ilid ad d e un ciclo in finito. V erificar q ue cualquier acción d e recuperación o casion e en u n m om ento d a d o q u e se con su m a un sím b olo d e en trad a (o q u e s e redu zca la p ila si se h a llegado a l fin d e la entrada) e s u n a b u en a form a d e protegerse con tra ta les ciclos. 4.4.6 E je rc ic io s p a ra la sección 4.4 E j e r c ic io 4 .4 .1 : P ara cad a u n a d e las sigu ien tes gram áticas, id ee analizadores sin tá ctico s pred ictiv o s y m uestre las tab las d e an álisis sin tá ctico . P u ed e factorizar p o r la izquierda o elim inar la recursividad por la izquierda d e su s gram áticas prim ero. a) L a gram ática d e l ejercicio 4 .2 .2 (a ). b) L a gram ática d e l ejercicio 4 .2 .2 (b ). c) L a gram ática d e l ejercicio 4 .2 .2 (c). d ) L a gram ática d e l ejercicio 4 .2 .2 (d ). e) L a gram ática d e l ejercicio 4 .2 .2 (e). f) L a gram ática d e l ejercicio 4 .2 .2 (g ). !! E j e r c ic io 4 .4 .2 : ¿E s p osib le, m ediante la m odificación d e la g ra m á tica en cualquier form a, con stru ir un analizador sin táctico predictivo para el len gu aje d el ejercicio 4 .2 .1 (expresiones p ostfijo co n e l operando a)? E j e r c ic io 4 .4 .3 : C alcu le PRIMERO y SIGUIENTE para la gra m á tica d el ejercicio 4 .2 .1 . E j e r c ic io 4 .4 .4 : C alcule PRIMERO y SIGUIENTE para c a d a u n a d e las g ram áticas d el ejercicio 4.2 .2 . E j e r c ic io 4 .4 .5 : L a gram ática 5 - » a S a \ a a gen era to d a s las cad en as d e lon gitu d uniform e d e as. P od em os idear u n analizador sin tá ctico d e d escen so re cursivo co n rastreo h acia atrás para e s ta gram ática. Si elegim os expandir m ediante la p rod ucción S a a prim ero, entonces só lo d eb em os reconocer la ca d en a aa. Por en d e, cualquier analizador sin tá ctico d e descenso recursivo razonable probará S - + a S a prim ero. a ) M uestre q u e e s te analizador sin tá ctico d e d escen so recursivo reconoce las entradas aaaa y aaaaaaaa, pero n o aaaaaa. !! b ) ¿Q ué lengu aje reconoce e s te analizador sin tá ctico d e d escen so recursivo? aa, 232 Capítulo 4. A nálisis sintáctico Los sigu ien tes ejercicios so n pasos ú tiles e n la con stru cción d e u na g ra m á tica e n la “Form a N orm al d e C hom sk y” a partir d e gram áticas arbitrarias, com o se d efin e en e l ejercicio 4.4.8. E j e r c ic io 4 .4 .6 : U n a gram ática es Ubre d e e s i ningún cu erpo d e las producciones es e (a lo cu a l se le llam a produ cción e). a) Prop orcion e un algoritm o para convertir cualquier g ra m á tica en u na gra m á tica libre d e e q ue genere e l m ism o len gu aje (con la p osible ex cep ció n d e la ca d en a vacía; ninguna gram ática libre d e e p u ed e generar a e). b) A plique su algoritm o a la gram ática S -► a S b S \ b S a S \ e. S u geren cia: Prim ero busque tod as las no term in ales q ue sean anulables, lo cu a l sign ifica q ue gen eran a e, ta l v e z m e­ d ia n te u n a d erivación exten sa. E j e r c ic io 4 .4 .7 : U n a produ cción sim p le e s u n a producción cu y o cu erpo e s u n a so la n o term i­ nal; por ejem p lo, u n a producción d e la form a A - » A . a) Prop orcion e un algoritm o para convertir cualquier g ra m á tica en u na gra m á tica libre d e e, sin producciones sim p les, q ue genere el m ism o lengu aje (con la posible ex cep ció n d e la cad en a vacía) S ugeren cia: Prim ero elim in e las producciones e y desp ués averigüe para qué pares d e no term in ales A y B se cu m p le q ue A =>• B m ediante u n a secu en cia d e pro­ d uccion es sim p les. b) A plique su algoritm o a la gram ática (4.1) en la secció n 4 .1 .2 . c) M uestre que, com o con secu en cia d e la p arte (a), p od em os convertir u na gra m á tica en u na gram ática eq u ivalen te q ue no ten g a ciclo s (derivaciones d e uno o m ás p asos, en los que A => A para cierta n o term inal A ) . E j e r c ic io 4 .4 .8 : Se d ice q ue u n a g ra m á tica e s tá en F orm a N o rm a l d e C h om sky (F N C ) s i to d a producción e s d e la form a A B C o d e la form a A a, e n d o n d e A , B y C son no term inales, y a es un term inal. M uestre có m o convertir cualquier g ra m á tica en u n a g ra m á tica F N C para e l m ism o lengu aje (con la p osible excep ción d e la ca d en a vacía; n in gu n a gra m á tica F N C p uede generar a e). E j e r c ic io 4 .4 .9 : T odo lengu aje q ue tien e una g ra m á tica libre d e co n tex to p u ed e reconocerse en un tiem p o m áxim o d e 0 ( n 3) p ara las cad en as d e lon gitu d n. U n a m anera sim p le d e hacerlo, co n o cid a co m o el algoritm o d e Coche- Y o u n g er-K a sa m i (o C Y K ), se b a sa en la program ación d inám ica. E s decir, d a d a una cad en a a ia 2 ••• an, con stru im os u n a ta b la T d e n por n d e ta l form a q u e T y se a e l con ju n to d e n o term inales q u e generen la su b ca d en a a¿a¿+1 ■■■ Si la gra­ m á tica su b yacen te e s tá en F N C (v ea el ejercicio 4 .4 .8 ), en ton ces u n a en trad a en la ta b la p uede llenarse en u n tiem p o O (n), siem p re y cu an do llenem os las en trad as e n e l orden apropiado: el m enor valor d e j — i prim ero. E scriba u n algoritm o q ue llene en form a correcta las entradas d e la tabla, y m uestre q ue su algoritm o requiere u n tiem p o 0 ( n 3). D esp ués d e llenar la ta b la , ¿cóm o p od em os d eterm in ar si a ia 2 ••• an e s tá en e l lenguaje? 4.5 A nálisis sintáctico ascendente 233 E j e r c ic io 4 .4 .1 0 : M uestre có m o , desp ués d e llenar la ta b la com o en el ejercicio 4 .4 .9 , pode­ m os recuperar en u n tiem p o 0 ( n ) un árbol d e an álisis sin tá ctico para a i 02 ••• On- Sugerencia: M odifique la ta b la d e m anera q ue registre, p a ra ca d a no term inal A en ca d a en trad a d e la ta b la T y, cierto par de n o term inales en otra s entradas en la ta b la q ue ju stifiq u en la acción de colocar a A e n Ty. E j e r c ic io 4 .4 .1 1 : M odifique su algoritm o d el ejercicio 4 .4 .9 d e m anera q u e busque, para cualquier cad en a, el m enor núm ero d e errores d e inserción, elim inación y m utación (cad a error d e u n so lo carácter) necesarios para convertir la c a d en a e n u n a ca d en a d el len gu aje d e la gra­ m á tic a subyacente. in s tr c o la ln str i f e t h e n in s tr c o la ln s tr w h i l e e d o in s tr b e g i n k sta e n d s e l s e in s tr € Usta colaL ista in s tr co la L ista ; k sta c F igu ra 4.24: U n a g ra m á tica para cierto s tip o s d e instrucciones E je r c ic io 4 .4 .1 2 : E n la figura 4.24 hay una gram ática para ciertas instrucciones. Podem os considerar que e y s son term inales q ue representan expresiones condicionales y “o tra s instruc­ cion es” , respectivam ente. Si resolvem os e l conflicto en relación con la exp an sión d e la instrucción “else” opcional (la n o term inal colalnstr) al preferir consum ir un e l s e d e la en trad a ca d a vez que veam os uno, p odem os construir un analizador sin táctico predictivo para e s ta gram ática. Usando la id ea d e los sím bolos d e sincronización descritos en la sección 4.4.5: a) C on stru ya una tab la d e an álisis sin tá ctico p red ictivo co n corrección d e errores para la gram ática. b) M u estre e l com p ortam ien to d e su analizador sin tá ctico co n la s sig u ien tes entradas: ( i) (ii) 4.5 if e th e n s ; if e th e n s en d w h ile e d o b e g in s ; i f e t h e n s ; e n d A n á lisis s in tá c tic o a s c e n d e n te U n an álisis sin tá ctico ascen dente corresponde a la construcción d e un árbol d e an álisis sin tác­ tico para u na cad en a d e en trad a que em p ieza en las h o ja s (la p arte inferior) y avan za h acia la raíz (la p arte su perior). E s con ven ien te describir e l análisis sin tá ctico com o e l proceso d e cons­ trucción d e árboles d e an álisis sin táctico, aunque d e hecho un front-end d e usuario podría rea­ lizar u na traducción d irectam en te, sin necesidad d e construir u n árbol ex p lícito . L a secu en cia 234 Capítulo 4. A nálisis sintáctico id * id F * id I id T * id | F id T * F I I F id I id T / l \ T * F I I F id I id E I T / l \ T * F I I F id id F igu ra 4.25: U n an álisis sin tá ctico a scen d en te para id * id d e im ágenes d e árboles en la figura 4.25 ilu stra un an álisis sin tá ctico ascen dente d e l flujo d e tokens id * id, co n resp ecto a la gram ática d e exp resion es (4.1). E sta sección presenta u n estilo gen eral d e an álisis sin tá ctico ascendente, con ocid o com o análisis sin tá ctico d e desplazam iento-reducción. E n las seccion es 4 .6 y 4 .7 hablarem os sobre las g ram áticas LR , la clase m ás e x te n sa d e gram áticas para las cu ales p u ed en con stru irse los analizadores sin tá ctico s d e d esplazam iento-reducción. A un qu e es d em asiad o tra b a jo construir un analizador sin tá ctico L R en form a m anual, las herram ientas co n o cid a s com o generadores a u to m áticos d e analizadores sin tá ctico s facilitan la con stru cción d e analizadores sin tá ctico s LR eficientes a partir d e gram áticas adecuadas. L os con ceptos e n e s ta sección so n ú tiles para escribir gram áticas adecuadas q ue nos p erm itan hacer u n u so efectiv o d e un generador d e analizadores sin tácticos LR. E n la sección 4 .7 aparecen los algoritm os para im plem entar los generadores de analizadores sintácticos. 4 .5.1 R e d u ccio n e s P odem os considerar el análisis sin táctico ascendente com o el proceso d e “reducir” u n a cad en a w al sím b olo inicial de la gram ática. En cad a paso d e reducción, se su stitu y e u na su bcadena especí­ fica q ue coincide con el cuerpo d e u n a producción por e l no term inal q ue se en cu en tra en el enca­ bezado d e e sa producción. Las d ecision es clave d urante e l análisis sin tá ctico ascen dente son acerca d e cu án do reducir y q u é p rod ucción aplicar, a m ed id a q ue procede el an álisis sin táctico. E j e m p lo 4 .3 7 : Las im ágenes e n la figura 4 .2 5 ilustran u na secu en cia d e reducciones; la gra­ m á tica es la gram ática d e exp resion es (4.1). H ablarem os sobre la s reducciones en térm inos d e la sig u ien te secu en cia d e cadenas: id * id, F * id, T * id, T *F, T, E Las cad en as e n e s ta secu en cia se form an a partir d e la s raíces d e to d o s los su bárboles d e las im ágenes. L a secu en cia em p ieza co n la cad en a d e en trad a id * id. La prim era reducción pro­ d u ce F * id al reducir el id por la izquierda a F, u sand o la p rod ucción F ->• id. L a segu n d a reducción p roduce T * id a l reducir F a T. A hora ten em os u na elección entre reducir la ca d en a T, q u e e s el cu erpo d e E T, y la ca d en a q ue co n siste en e l segu n d o id, que es e l cu erpo d e F id. E n vez d e reducir T a £ , e l segu n d o id se reduce a T, con lo cu a l se produce la ca d en a T * F. D espués, e s ta ca d en a se reduce a T. E l análisis sin tá ctico term in a co n la reducción d e T al sím b olo inicial E. □ 4.5 A nálisis sintáctico ascendente 235 P or d efinición, u na reducción es e l inverso d e u n p a so en u n a d erivación (recuerde q ue en u na derivación, un no term inal en u n a form a d e frase s e su stitu y e p o r e l cu erpo d e u n a de su s p roducciones). Por lo tan to, e l o b jetiv o d e l an álisis sin tá ctico ascen dente e s construir una derivación e n form a inversa. L a sigu ien te d erivación corresponde al análisis sin tá ctico e n la figura 4.25: E = > T => T * F => T * ¡d =>- F * id =>- id * ¡d E s ta d erivación es d e hecho u na d erivación p or la derecha. 4.5.2 P o d a de m an gos D u ran te u na exp loración d e izquierda a d erech a de la entrada, e l análisis sin tá ctico ascendente con stru ye u na d erivación p or la d erech a en form a inversa. D e m anera inform al, un “m a n g o ” es u na su b ca d en a q ue coin cid e con el cu erpo d e u n a producción, y cu y a reducción representa un p aso a lo largo d e l inverso d e u na d erivación por la derecha. P or ejem p lo, si agregam os su bín d ices a lo s tokens id para m ejorar la legibilid ad, los m angos d urante e l an álisis sin tá ctico d e idi * id2, d e acuerdo co n la g ra m á tica d e exp resion es (4.1), so n com o en la figura 4 .26. A un qu e T es el cu erpo d e la p rod ucción E T, e l sím b olo T no es u n m ango en la form a d e frase T * id2. S i T se su stitu y era p or E , ob tend ríam os la ca d en a E * id2, lo cu a l no p u ed e derivarse d e l sím b olo in icial E. P or en d e, la su b ca d en a por l a izquierda q u e coin cid e co n e l cu erpo d e algu na producción n o n ecesita ser un m ango. Forma d e frase d e r e c h a idi *id2 F * id2 T * id2 T*F M ango idi F id2 T*F R educción de la producción F-> id T -*F F-> id E ->T * F F igu ra 4.26: M angos d u ran te u n an álisis sin tá ctico d e D e m anera form al, si S ^ ¡di * ¡d2 olAw => a(3w, co m o e n la figura 4.2 7 , entonces la producción A 0 e n la p osición q ue sig u e d esp u és d e a es u n m a n g o d e o¿0w. D e m anera a ltern a tiv a , un m ango d e la form a d e frase d erech a 7 es u n a producción A 0 y u na posición d e 7 en d on d e puede en con trarse la ca d en a 0 , d e tal form a q ue a l su stitu ir 0 e n esa p osición por A se p rod uzca la form a d e frase d erech a anterior en u na d erivación p or la d erech a d e 7 . O bserve q ue la cad en a w a la d erech a d el m ango d eb e contener sólo sím b olos term inales. P or con ven iencia, nos referim os a l cu erpo 0 en vez d e A -► 0 com o u n m ango. O bserve que decim os “un m ango” en vez d e “e l m ango” , y a q ue la gram ática p odría ser am bigua, con m ás de una derivación por la derecha d e a 0 w . Si u na gram ática no tiene am bigüedad, entonces ca d a forma d e frase derecha d e la gram ática tiene sólo un m ango. P u ed e ob tenerse u n a d erivación por la d erech a en form a inversa m ed ian te la “p o d a de m angos” . E s decir, em p ezam os con u na ca d en a d e term in ales w a las q u e se les v a a realizar 236 Capítulo 4. A nálisis sintáctico / X X Á ¿ Q S / I a P IV F igu ra 4.27: U n m ango A -+ p e n el árbol de análisis sin tá ctico p a ra a p w e l an álisis sin tá ctico . Si w es un enunciado de la gra m á tica a la m ano, en ton ces dejam os q ue w = 7 n, en d ond e y n e s la ra-ésima form a d e frase derecha d e a lg u n a d erivación por la derecha, q ue to d a v ía se desconoce: S = 00 => 71 ^ rm rm 72 => **•=>■ 7 n - i => 7n — w rm rm rm P ara reconstruir e s ta d erivación en orden inverso, localizam os el m ango p n en -yn y su sti­ tuim os p n por e l en cab ezad o d e la producción A n -> 0n para ob ten er la form a d e frase d erech a 7 n -i anterior. T enga en c u en ta q ue to d a v ía no sa b em o s cóm o s e van a encontrar los m angos, pero en breve verem os m éto d o s para hacerlo. D espués repetim os e s te proceso. Es decir, localizam os e l m ango p n- 1 en 7 n_ i y reducim os e ste m ango p ara obtener la form a d e frase derecha 7 n_2. Si al continuar este proceso producim os u na form a d e frase derecha q ue con sista sólo en el sím b olo inicial 5, entonces nos d etenem os y anun­ ciam os que el análisis sin táctico se com p letó con éx ito . El inverso d e la secu en cia d e producciones utilizadas en las reducciones es u na derivación por la derecha para la cad en a d e entrada. 4.5.3 A n á lisis sin tá ctico de d esp laza m ien to -red u cció n El an álisis sin tá ctico d e desplazam iento-reducción es u n a form a d e an álisis sin tá ctico ascenden­ te, en la cu a l una p ila con tien e sím b olos gram aticales y u n búfer d e en trad a co n tien e e l resto d e la ca d en a q ue se v a a analizar. C om o verem os, el m ango siem p re aparece en la p arte superior d e la pila, ju sto an tes d e identificarla com o el m ango. U tilizam os el $ para m arcar la p arte inferior d e la p ila y tam b ién el extrem o derecho d e la entrada. Por convención, a l hablar sobre el an álisis sin tá ctico ascen dente, m ostram os la parte superior d e la p ila a la derecha, en vez d e a la izquierda com o h icim os p a ra e l análisis sin tá ctico d escen dente. A l principio la p ila e s tá vacía, y la ca d en a w e s tá e n la en trad a, com o s e m uestra a continuación: P ila $ Entrada w $ D urante u na exp loración de izquierda a derecha d e la ca d en a d e entrada, el analizador sin táctico d esp laza cero o m ás sím b olos d e en trad a y los m ete en la pila, h a sta q ue e s té listo para reducir una cad en a 0 d e sím bolos gram aticales e n la p arte superior d e la pila. D espués reduce p al en ­ cabezado d e la producción apropiada. E l analizador sin tá ctico repite este ciclo h asta q ue haya d etectad o u n error, o h a sta que la p ila co n ten ga e l sím b olo inicial y la en trad a e sté vacía: PILA $ S ENTRADA $ 4.5 A nálisis sintáctico ascendente 237 A l entrar a e s ta configuración, el analizador sin tá ctico s e detien e y an un cia q u e e l análisis sin tá ctico se com p letó co n éx ito . L a figura 4 .2 8 avan za por p asos a través d e las accion es que p od ría realizar un analizador sin tá ctico d e d esp lazam iento-red ucción a l analizar la ca d en a de en trad a i d i * i d 2, d e acuerdo con la g ra m á tica d e exp resion es (4.1). P ila E ntrada S S id i id i * id 2 8 * id 2 8 SF * id 2 8 * id > 8 id 2 S 3T 8T * 8 T * id*> S S s s ST *F ST SE A cc ió n desplazar reducir F —►i d reducir T F desplazar desplazar reducir F -»• i d reducir T T *F reducir E - * T aceptar F igu ra 4.28: C onfiguraciones d e un analizador sin tá ctico d e desplazam iento-reducción, c o n u na en tra d a i d i * i d 2 A un qu e las op eracion es prim arias son d esplazar y reducir, en realidad h ay cu a tro acciones p osib les q ue p uede realizar un analizador sin tá ctico d e desplazam iento-reducción: ( 1 ) despla­ zar, (2) reducir, (3) aceptar y (4) error. 1. D esplazar. D esplazar e l sigu ien te sím b olo d e en trad a y lo co lo ca en la parte superior de la pila. 2. R educir. E l extrem o derecho d e la cad en a q ue se v a a reducir d eb e esta r e n la p arte supe­ rior d e la pila. L ocalizar e l ex trem o izquierdo d e la ca d en a d en tro d e la p ila y decidir con q ué term in al se v a a su stitu ir la cadena. 3. A ceptar. A nunciar q u e e l an álisis sin tá ctico s e co m p letó con éxito. 4 . E rror. D escubrir u n error d e sin ta x is y llam ar a u na r u tin a d e recuperación d e errores. E l uso d e u na p ila e n el análisis sin tá ctico d e d esp lazam iento-red ucción se ju stifica debido a un hecho im portante: e l m ango siem p re aparecerá en algún m om ento d a d o en la p arte supe­ rior d e la pila, n u n ca en e l interior. E ste hecho p uede d em ostrarse si con sid eram os las posibles form as d e d o s pasos su cesivos en cualquier d erivación por la izquierda. L a figura 4 .29 ilu stra los d os p osibles casos. E n e l ca so (1 ), A se su stitu y e por 0 B y , y d esp u és el no term inal B por la d erech a en e l cu erpo ¡3By se su stitu y e por 7 . E n e l ca so (2 ), A se ex p a n d e prim ero o tr a vez, pero ahora e l cu erpo es u na cad en a y q u e co n siste sólo en term inales. E l sigu ien te no term inal B p or la d erech a se en con trará en alguna parte a la derecha d e y. E n o tra s palabras: (1) (2 ) S => otA z => rg rt rm S => o lB x á z rm a p B y z => a f i y y z rm => rm a B x y z => orfxyz rm 238 Capítulo 4. A nálisis sintáctico C a so (1 ) C a so (2) F igu ra 4.29: C asos para d o s pasos su cesiv o s d e u na d erivación por la derecha C onsidere e l caso (1) a la inversa, e n d on d e un analizador sin tá ctico d e d esplazam iento-reduc­ ción acab a d e llegar a la sigu ien te configuración: P il a $ a fry Entrada yz% El analizador sin táctico reduce e l m ango 7 a B p a ra llegar a la sig u ien te configuración: %ol@B yz% A hora el analizador p uede d esplazar la cad en a y y co lo ca rla en la pila, m ed ian te u na secu en cia d e cero o m ás m ovim ientos d e d esp lazam iento para llegar a la configuración %a¡3By 2$ con el m ango ¡5By en la p arte su perior d e la pila, y se reduce a A . A hora considere e l caso (2). E n la configuración $07 xyz% e l m ango 7 e s tá en la p arte su perior d e la pila. D espués d e reducir e l m ango 7 a B , e l analizador sin tá ctico p uede reducir la cad en a x y para m eter el sig u ien te m ango y en la p arte superior d e la pila, listo para reducirse a A: %o¿Bxy z$ En am bos casos, d esp u és d e realizar u na reducción, e l analizador sin tá ctico tu v o q ue desplazar cero o m ás sím b olos para m eter e l sigu ien te m ango e n la pila. N u n ca tu v o q ue buscar el m ango d en tro d e la pila. 4 .5 .4 C o n f lic to s d u r a n t e e l a n á lis is s in tá c tic o d e d e s p la z a m ie n to - r e d u c c ió n E x isten gram áticas libres de co n tex to para las cu a les n o se p uede utilizar e l an álisis sin tá ctico d e d esplazam iento-reducción. C ad a analizador sin tá ctico d e d esp lazam iento-red ucción para u na g ra m á tica d e e s te tip o p u ed e llegar a u n a configuración en la cu a l el analizador sin táctico, co n ocien d o e l con ten ido com p leto d e la p ila y e l sig u ien te sím b olo d e entrada, no p uede decidir 4.5 A nálisis sintáctico ascendente 239 s i v a a desplazar o a reducir (un conflicto d e d esp la za m ie n to /re d u c ció n ), o n o p uede decidir qué reducciones realizar (un conflicto de red u cció n /red u cció n ). A hora verem os algu nos ejem p los de con stru ccion es sin tá ctica s q u e ocasion an ta les gram áticas. T écn icam ente, esta s g ra m áticas no está n en la clase LR(fc) d e gram áticas d efinidas e n la secció n 4.7; nos referim os a ella s com o gram áticas no LR . L a k en L R (k) se refiere al núm ero d e sím b olos d e preanálisis e n la entrada. Las gram áticas q ue s e u tilizan en la com p ilación, por lo general, en tran e n la clase L R (1 ), con u n sím b olo d e an ticip ación a lo m ás. E j e m p l o 4 .3 8 : U n a gram ática am bigua nunca p o d rá ser LR . P or ejem plo, considere la gra­ m á tic a d e l else co lg a n te (4.14) d e la sección 4.3: in s tr -► i f ex p r t h e n in s tr i f expr t h e n i n s tr e l s e in s tr o tra S i ten em os un analizador sin táctico d e d esp lazam iento-red ucción con la sigu ien te configu­ ración: P IL A • i f ex p r t h e n in s tr E N TR A D A e l s e ••• $ n o p od em os sab er s i i f ex p r t h e n i n s tr es el m ango, sin im portar lo q ue aparezca d eb a jo de é l en la pila. A q u í ten em os un con flicto d e d esp la za m ien to /red u cció n . D ep en dien do d e lo que sig a desp ués d e l e l s e en la entrada, p od ría ser correcto reducir i f ex p r t h e n in s tr a in s tr , o p od ría ser correcto d esplazar e l e l s e y d esp u és buscar o tro in s tr para com p letar la expresión a ltern ativa i f ex p r t h e n i n s tr e l s e in str. O bserve q u e el an álisis sin tá ctico d e d esp lazam iento-red ucción p uede adaptarse p a ra ana­ lizar ciertas gram áticas am biguas, com o la gra m á tica if-th en -else anterior. Si resolvem os el con flicto d e d esp lazam ien to/red u cción en e l e l s e a favor d e l d esp lazam iento, e l analizador sin tá ctico se com p ortará com o esperam os, asociand o ca d a e l s e con e l t h e n anterior sin coinci­ d en cia. E n la sección 4 .8 hablarem os sobre los analizadores sin tá ctico s para d ich as gram áticas am biguas. □ O tra configuración com ú n para los co n flicto s ocu rre cu a n d o sa b em o s q u e ten em os un m ango, pero e l con ten id o d e la p ila y el sigu ien te sím b olo d e en trad a n o so n su ficien tes p a ra determ inar q ué producción d eb e usarse e n u n a reducción. E l sig u ien te ejem p lo ilu stra e s ta situ ación . E j e m p l o 4 . 3 9 : S uponga q ue tenem os un analizador léxico q ue devuelve el nombre d e token i d para tod os lo s nombres, sin im portar su tip o . S u p on ga tam b ién q ue nuestro lenguaje in voca a los procedim ientos proporcionando su s nom bres, con los parám etros rodeados entre paréntesis, y q ue los arreglos s e referencian m ediante la m ism a sin ta x is. C om o la traducción d e los índices en las referencias a arreglos y los parám etros en las llam adas a procedim ientos son distintos, querem os usar d istin tas producciones para generar listas d e parám etros e índices actuales. Por lo tanto, n uestra gram ática p odría tener p roducciones com o las d e la figura 4 .3 0 (entre otras). U n a in stru cción que em p ieza co n p ( i , j ) aparecería com o e l flujo d e tokens i d ( i d , i d ) para e l analizador sin táctico. D esp u és d e d esplazar lo s prim eros tres tokens en la p ila, un analizador sin tá ctico d e d esp lazam iento-red ucción ten dría la sig u ien te configuración: 240 Capítulo 4. A nálisis sintáctico (1) (2) (3) (4) (5) (6) (7) ( 8) (9) in s tr in s tr h sta.param etros h sta-param etros param etro expr expr h sta .e x p r h sta .e x p r —► —► —> —> —► —► —► —* —> i d ( h sta -p a ra m etro s ) ex p r := ex p r lista -p a ra m etro s , p a rá m etro pa rá m etro id i d ( h sta .e x p r ) id h sta -ex p r , expr ex p r F igu ra 4.30: P rod ucciones q u e im plican llam adas a p rocedim ien tos y referencias a arreglos P il a id Entrada ( ¡d , i d ) ••• Es ev id en te q ue el i d e n la p arte su perior d e la p ila d eb e reducirse, pero ¿m ediante q ué produc­ ción? L a elección correcta es la producción (5) si p es un procedim iento, pero si p es un arreglo, en ton ces es la producción (7). L a p ila no in d ica q ué inform ación d eb em os usar en la en la ta b la d e sím b olos q ue se o b tie n e a partir d e la d eclaración d e p. U n a solu ción es cam b iar el tok en i d en la producción (1) a p r o c i d y usar u n analizador léxico m ás sofisticad o, q ue d evu elva e l nom bre d e tok en p r o c i d cu an do recon ozca u n lex em a q ue s e a el nom bre d e u n procedim ien to. P ara ello se requeriría q u e el analizador léxico con su l­ tara la ta b la d e sím b olos, antes d e devolver un token. Si realizam os e s ta m odificación, en to n ces al procesar p ( i , j ) el analizador se en con traría en la sigu ien te configuración: P IL A p ro c id ( i d ENTRADA , i d ) ••• o en la configuración anterior. E n e l caso anterior, elegim os la reducción m ediante la producción (5); en el ú ltim o caso m ed ian te la producción (7). O bserve cóm o el tercer sím b olo d e la p arte superior d e la p ila d eterm in a la reducción q ue s e v a a realizar, aun cu an do n o e s tá involucrado en la reducción. E l an álisis sin tá ctico d e d esp lazam iento-red ucción p u ed e utilizar inform ación d e m ás adentro e n la p ila, p ara guiar e l análisis sin tá ctico . □ 4 .5 .5 E je rc ic io s p a r a la s e c c ió n 4 .5 E j e r c ic io 4 .5 .1 : P ara la g ra m á tica S -► 0 S 1 | 0 1 del ejercicio 4 .2 .2 (a ), indique el m ango en ca d a u na d e las sigu ien tes form as d e frases derechas: a) 0 0 0 111 . b) 00511. E j e r c ic io 4 .5 .2 : R ep ita el ejercicio 4.5.1 para la gra m á tica 5 - * 5 S + | 5 5 * | a d e l ejercicio 4 .2 .1 y las sigu ien tes form as d e frases derechas: 4.6 Introducción a l análisis sintáctico LR: SLR (LR sim ple) 241 a) S SS + a * + . b) S S + a * a + . c ) aaa * a + + . E j e r c ic io 4 .5 .3 : P rop orcion e los an álisis sin tá ctico s a scen d en tes para las sig u ien tes cad en as d e en trad a y gram áticas: a) L a en trad a 000111, d e acuerdo a la g ra m á tica d e l ejercicio 4.5.1. b) L a en trad a aaa * a++, d e acuerdo a la g ra m á tica d e l ejercicio 4.5.2. 4.6 In tro d u c c ió n al análisis sin tá c tic o L R : S L R (L R sim ple) E l tip o m ás frecuente d e analizador sin tá ctico a scen d en tes en la actu alid ad se b a sa e n un con cep to con ocid o com o an álisis sin tá ctico LR(fc); la “L ” in d ica la exp loración d e izquierda a derecha de la en trad a, la “R ” in dica la con stru cción d e u n a d erivación por la derecha a la inversa, y la A: para e l núm ero d e sím b olos de en trad a d e preanálisis q ue se u tiliza n al hacer d ecision es d e l an álisis sin táctico. L os casos k = 0 o k = 1 so n d e interés p ráctico, p or lo que aq u í só lo considerarem os los analizadores sin tá ctico s L R co n k < 1. C uan do s e o m ite (&), se asu m e q ue A: es 1. E sta sección presenta los con cep tos b ásicos d e l an álisis sin tá ctico L R y e l m éto d o m ás senci­ llo para construir analizadores sin tá ctico s d e d esp lazam iento-red ucción, llam ados “L R Sim ple” (o SL R ). E s ú til tener cierta fam iliaridad co n los co n cep to s básicos, in clu so si e l analizador sin táctico L R se con stru ye m ed ian te un generador d e analizadores sin tá ctico s au tom ático. Em ­ p ezarem os con “elem en tos” y “estad os d el analizador sin tá ctico ” ; la sa lid a d e d iagn óstico d e un generador d e analizadores sin tácticos LR , p or lo general, incluye esta d o s d e l analizador sin tá cti­ c o , los cu a les p ueden usarse para aislar las fu en tes d e co n flicto s en e l análisis sin táctico. L a sección 4 .7 introduce d o s m étod os m ás com p lejos (L R can ón ico y L A L R ) q u e s e utilizan e n la m ayoría d e los analizadores sin tá ctico s LR. 4 .6 .1 ¿ P o r q u é a n a liz a d o r e s s i n tá c ti c o s L R ? Los analizadores sin tá ctico s L R son con trolad os por tab las, en form a m uy parecida a lo s anali­ zadores sin tácticos LL no recursivos d e la secció n 4 .4 .4 . Se d ice q u e u na gra m á tica para la cual p od em os construir u na ta b la d e an álisis sin tá ctico , usando uno d e los m étod os en e s ta sección y en la sigu ien te, es u n a gram ática L R . D e m anera in tu itiva, para q ue u n a gra m á tica se a LR, b a sta co n q ue un analizador sin tá ctico d e d esp lazam iento-red ucción d e izquierda a derecha p u ed a reconocer m angos d e las form as d e frases derechas, cu a n d o é s ta s aparecen en la p arte su perior d e la pila. E l an álisis sin táctico L R e s atractivo p or u n a variedad d e razones: • P u ed en con stru irse analizadores sin tá ctico s L R p a ra reconocer p rácticam en te to d a s las con stru ccion es d e lenguajes d e program ación para las cu ales puedan escribirse gram áticas libres d e co n tex to . E x isten gram áticas libres d e co n tex to q ue no so n L R , pero p or lo g e n e ­ ral se pueden evitar para las con stru ccion es com u n es d e lo s lengu ajes d e program ación. 242 Capítulo 4. A nálisis sintáctico • E l m étod o d e an álisis sin táctico L R es e l m éto d o d e an álisis sin tá ctico d e d esp lazam iento reducción sin rastreo h acia atrás m ás gen eral q ue s e co n o ce a la fecha, y aún a sí p uede im plem entarse co n la m ism a eficien cia q u e o tro s m étod os m ás prim itivos d e d esp lazam iento-reducción (v ea las n otas bibliográficas). • U n analizador sin táctico L R p uede d etectar u n error sin tá ctico ta n p ron to com o se a p o ­ sib le en u n a exp loración d e izquierda a d erech a d e la entrada. • L a clase d e gram áticas q ue pueden analizarse m ediante los m étod os LR e s un supercon­ ju n to propio d e la clase de gram áticas q ue p ueden analizarse co n m éto d o s p red ictivos o LL. P ara que u n a gram ática se a LR(fc), d eb em o s ser cap aces d e reconocer la ocu rren cia d e l lado derecho d e una producción en u n a form a d e frase derecha, co n k sím b olos d e en ­ tra d a d e preanálisis. E ste requerim iento e s m ucho m enos estr icto q ue para las gram áticas LL(A), en d o n d e d eb em os ser cap aces d e reconocer e l uso d e u n a producción, v ie n d o sólo los prim eros sím b olos k d e lo q ue d eriv a su lado derecho. P or en d e, no d eb e sorprender que las gram áticas L R puedan describir m ás lengu ajes q u e la s gram áticas LL. La principal d esv e n ta ja d e l m étod o L R e s q ue es d em asiad o trab ajo con stru ir un analizador sin tá ctico L R en form a m anual para u n a gram ática com ú n d e un lengu aje d e program ación. Se n ecesita u n a herram ienta especializada: u n generador d e analizadores sin tá ctico s LR . Por fortuna, h ay varios generadores d isp on ib les, y en la secció n 4 .9 hablarem os so b re u no d e los q ue se u tilizan con m ás frecuencia: Y acc. D ich o generador recibe u n a g ra m á tica libre d e co n tex to y produce d e m anera a u tom ática un analizador p a ra esa gram ática. S i la g ra m á tica co n tien e am bigüedades u otras con stru ccion es q u e sean d ifíciles d e analizar en u na exp loración d e iz­ q uierd a a d erech a d e la entrada, en ton ces el generador d e analizadores sin tá ctico s lo ca liza e sta s con stru cciones y proporciona m ensajes de d iagnóstico d etallados. 4 .6 .2 L o s e le m e n to s y e l a u t ó m a t a LR (O ) ¿C óm o sa b e u n analizador sin táctico d e d esp lazam iento-red ucción cu án do d esplazar y cu án do reducir? Por ejem plo, co n e l con ten id o S T d e la p ila y e l sigu ien te sím b olo d e en trad a * en la figura 4.28, ¿cóm o sa b e el analizador sin táctico q u e la T en la p arte superior d e la p ila no es un m ango, p or lo cu a l la acción ap rop iada e s d esplazar y no reducir T a E l U n analizador sin táctico L R realiza las decision es d e desplazam iento-reducción m ediante el m anten im ien to d e estad os, para llevar el registro d e la ubicación q u e ten em o s en un análisis sin tá ctico. Los estad os representan con jun tos d e “elem en to s” . U n elem en to L R ( 0 ) ( elem e n to , para abreviar) d e u na g ra m á tica G e s u na producción d e G con un p u n to en cierta p osición d el cuerpo. P or en d e, la producción A -► X Y Z produce los sig u ien tes cu atro elem entos: A -> .X Y Z A X YZ A -¥ X Y - Z A XYZ• La producción A -► e gen era sólo un elem en to, A D e m anera in tu itiva, un elem en to in dica q u é p arte d e u na p rod ucción h em os v isto e n un punto d ad o d el p roceso d e an álisis sin tá ctico . Por ejem p lo, el elem en to A -+ X Y Z in dica 4.6 Introducción a l análisis sintáctico LR: SLR (LR sim ple) 243 R e p r e s e n ta c ió n d e c o n ju n to s d e e le m e n to s U n generador d e an álisis sin tá ctico q ue produce u n analizador d escen d en te ta l v e z requie­ ra representar elem en tos y con jun tos d e elem en tos en u na form a con ven iente. U n elem en ­ to p uede representarse m ed ian te un par d e enteros, e l prim ero d e lo s cu ales es e l núm ero d e u n a d e las p roducciones d e la gram ática subyacente, y e l segun do d e los cu a les es la p osición d e l punto. Los con ju n tos d e elem en to s p u ed en representarse m ediante u n a lista d e e sto s pares. N o ob sta n te, com o verem os pronto, lo s con jun tos necesarios d e elem en tos a m en ud o incluyen elem en tos d e “cierre” , en d ond e el p u n to se en cu en tra al principio del cuerpo. E sto s siem p re p ueden reconstruirse a partir d e los o tro s elem en to s en el conjunto, por lo q ue n o ten em os q u e incluirlos en la lista. q ue esperam os ver u n a ca d en a q ue p u ed a derivarse d e X Y Z a con tinu ación en la entrada. El elem en to A -► X Y Z in dica q u e acabam os d e ver en la en trad a u n a ca d en a q u e p uede derivarse d e X, y q u e esperam os ver a con tinu ación u na ca d en a q u e p u ed a derivarse d e Y Z. E l elem ento A X Y Z • in d ica q ue hem os v isto el cu erpo X Y Z y q ue p u ed e ser hora d e reducir X Y Z a A . U n a colección d e con jun tos d e elem en to s L R (0 ), co n o cid a com o la colección L R (0) canó­ n ic a , proporciona la base para construir un a u tó m a ta finito d eterm in ista, e l cu a l se u tiliza para realizar decision es e n el análisis sin táctico . A d ich o a u tó m a ta se le co n o ce com o a u tó m a ta L R (0 ) ? E n especial, ca d a esta d o d el a u tó m a ta L R (0) representa un con ju n to d e elem en tos e n la colección L R (0) can ón ica. E l a u tó m a ta para la gra m á tica d e exp resion es (4 .1 ), q ue se m u estra en la figura 4.31, servirá com o ejem p lo ab ierto para hablar sobre la colección L R (0) can ón ica para u n a gram ática. P ara construir la colección L R (0) ca n ón ica de u n a g ra m á tica , d efinim os u n a gra m á tica au­ m en tad a y d os funciones, CERRADURA e ir _ A . Si G e s u na g ra m á tica co n el sím b olo in icial 5, en to n ces G \ la gram ática au m en ta d a para G, e s G co n un nuevo sím b olo inicial S ' y la produc­ ción S ' - * S. E l prop ósito d e e s ta n u eva producción in icial es indicar al analizador sin tá ctico cu án d o d eb e dejar d e analizar para anunciar la aceptación d e la en trad a. E s decir, la aceptación ocurre só lo cu an d o el analizador sin táctico e s tá a punto d e reducir m ediante S ' -► S. C e r r a d u r a d e c o n ju n to s d e e le m e n to s S i I e s u n conjunto d e elem en tos p ara u n a gra m á tica G, en ton ces CERRADURA( / ) es e l conjun­ t o d e elem en tos q ue se con stru yen a partir de I m ed ian te las sig u ien tes d o s reglas: 1. A l principio, agregar ca d a elem en to e n I a CERRADURA(I). 2. Si A a - B 0 e s tá en CERRADURA(Z) y B 7 es u n a producción, en ton ces agregar el elem en to B 7 a CERRADURA(J), s i no se en cu en tra y a ahí. A plicar e s ta regla h asta q ue no puedan agregarse m ás elem en to s nuevos a CERRADURA ( / ) . 3Técnicam ente, el a u tó m a ta d e ja d e se r d eterm inista d e acuerdo a la definición d e la sección 3.6.4, y a que no tenemos un estado m uerto, que corresponde al conjunto vacío d e elem entos. Como resultado, hay ciertos pares estadoe n tra d a p ara los cuales no existe un siguiente estado. 244 Capítulo 4. A nálisis sintáctico F igu ra 4.31: A u tó m a ta LR(O) para la gra m á tica d e ex p resion es (4.1) D e m anera in tu itiva, A - » a -B /3 e n CERRADURA( / ) in dica que, en algún p u n to en el proce­ so d e análisis sin tá ctico , creem os q ue podríam os v er a con tinu ación u na su b ca d en a q u e p ueda derivarse d e Bf3 com o entrada. L a su b ca d en a q u e p u ed a derivarse d e B¡3 ten d rá un prefijo q ue p u ed a derivarse d e B , m ed ian te la aplicación d e u n a de la s producciones B . Por lo ta n to , agre­ gam os elem en tos para to d a s las p roducciones B\ es d ecir, si B 7 es u na producción, tam bién incluim os a B —►*7 en CERRADURA(Z). E j e m p lo 4 .4 0 : C onsidere la sigu ien te g ra m á tica d e exp resion es aum entada: E' E T E -» -+ Si I e s el con ju n to d e un elem en to {[E f ju n to d e elem en tos Iq en la figura 4.31. E E + T \ T T * F| F ( E ) | ¡d • £ ] } , en ton ces CERRADURA( / ) co n tien e e l con ­ 4.6 Introducción a l análisis sintáctico LR: SLR (LR sim ple) 245 P ara ver cóm o se ca lcu la la CERRADURA, E ' —►-E se co lo c a en CERRADURA(J) m ediante la regla (1). C om o h ay u n a E ju sto a la d erech a d e un punto, agregam os las prod uccion es E c o n p un tos en los extrem os izquierdos: E -*• • £ + T y E -+ -T. A hora h ay u n a T ju sto a la d erech a d e un p u n to e n e s te ú ltim o elem en to, por lo q ue agregam os T ^ - T * F y T ^ -F. A con tin u ación , la F a la d erech a d e un p u n to n os o b lig a a agregar F - > -(E ) y F id , pero n o n ecesita agregarse ningú n otro elem en to. □ L a cerradura p uede calcularse com o e n la figura 4.3 2 . U n a m anera con ven ien te d e im plem entar la fun ción cerradura es m antener un arreglo b o o lea n o llam ad o agregado, indexado me­ d ia n te los no term in ales d e G, d e tal form a q u e agregado[B] se esta b lez ca a t r u e si, y só lo si agregam os e l elem en to B - * -7 para c a d a producción B d e la form a B - + 7 . C onjun toD eE lem en tos CERRADURA( / ) { J = I\ repeat f o r ( c a d a elem en to A ^ a-B /3 en J ) f o r ( ca d a p rod ucción B - + 7 d e G ) if ( B *7 no e s tá en J ) agregar B -7 a J; u n t i l no se agreguen m ás elem en to s a J e n u n a ronda; r e t u r n J\ } F igu ra 4.32: C álculo d e CERRADURA O bserve q ue si se agrega u n a producción B al cierre d e / c o n e l punto en e l ex trem o izquier­ d o , en ton ces se agregarán tod as las producciones B d e m anera sim ilar al cierre. P or en d e, no e s necesario en algunas circun stan cias listar lo s elem en to s B - + 7 q ue se agregan a I m ediante CERRADURA. B a sta co n u na lista d e los no term inales B cu yas p roducciones se agregaron. D ivid im os tod os los con jun tos d e elem en to s d e interés en d os clases: 1 . FXementos del corazón : e l elem en to inicial, S ' -► *5, y to d o s lo s elem en tos cu yos p un tos no esté n en e l ex trem o izquierdo. 2. E lem en tos que n o so n del corazón: to d o s lo s elem en to s con su s puntos en e l extrem o izquierdo, ex cep to S ' -► -5. A dem ás, ca d a con ju n to d e elem en tos d e in terés se form a tom an d o la cerradura d e un conjunto d e elem en tos d el corazón; d esd e luego q u e los elem en to s q u e se agregan en la cerradura nunca p odrán ser elem en tos d el corazón. Por lo tanto, p o d em o s representar lo s con jun tos d e elem en­ to s en los q ue realm ente estam os interesados con m uy p o co alm acenam iento si descartam os todos los elem entos que no sean d el corazón, sabiendo que podrían regenerarse m ediante el proceso de cerradura. En la figura 4.31, los elem en tos q ue no so n d el corazón se encuentran en la parte som ­ breada del cuadro para un estado. 246 Capítulo 4. A nálisis sintáctico L a f u n c ió n i r _ A La segu n d a función ú til es ir _ A ( / , X ) , en d on d e I e s un con ju n to d e elem en tos y X es un sím b o­ lo gram atical. ir _ A ( / , X ) se define com o la cerradura d el conjunto d e tod os los elem entos [A -> aX-/3\, d e tal form a q ue [A - » a -X p ] s e encuentre en I. D e m anera in tu itiva, la función ir _ A se u tiliza para definir las tran siciones en e l a u tó m a ta L R (0 ) para u n a gram ática. Los esta d o s d el a u tó m a ta corresponden a los con ju n tos d e elem en tos, y ir _ A (J , X ) esp ecifica la transición q ue proviene d e l esta d o para / , con la en trad a X E j e m p lo 4 .4 1 : S i I e s e l con ju n to d e d os elem en to s { [E ' ir _ A (7 , + ) con tien e los sigu ien tes elem entos: E T T F F —► —► —► —► —► B ] , [E B -f T ]} , en ton ces E + -T -T * F •F •(E ) •id P ara calcu lar ir _ A (J , + ) , exam in am os I en b u sca d e elem en tos co n + ju s to a la d erech a d el punto. E ' E- no es uno d e esto s elem en tos, pero E B + T s í lo es. D esp lazam os el punto sobre e l + para ob tener E - * E + -T y d esp u és tom am os la cerradura d e e s te conjunto sin gleton . □ A hora esta m o s listo s para q ue e l algoritm o co n stru y a a C, la colección ca n ó n ica d e con ­ ju n to s d e elem en tos L R (0 ) para u na gram ática au m en tad a G ’\ el algoritm o se m uestra en la figura 4.33. v o i d e le m e n to ^ G ') { C = CERRADURA( { [S' -+ - 5 ]» ; repeat f o r ( cad a con ju n to d e elem en to s / e n C ) f o r ( cad a sím b olo gram a tica l X ) i f ( i r _ A ( /, X ) n o e s tá vacío y no e s tá en C ) agregar ir _ A ( /, X ) a C; u n t i l no se agreguen nuevos con jun tos d e elem en to s a C e n u n a iteración; } F igu ra 4.33: C álcu lo d e la colección can ón ica d e con jun tos d e elem en tos L R (0) E j e m p lo 4 .4 2 : L a colección can ón ica d e con jun tos d e elem en tos L R (0) para la gra m á tica (4.1) y la fun ción ir _ A s e m uestran e n la figura 4.3 1 . ir _ A se co d ifica m ediante las transiciones en la figura. □ 4.6 Introducción a l análisis sintáctico LR: SLR (LR sim ple) 247 U s o d e l a u t ó m a t a L R (O ) L a id ea central d el análisis sin táctico “L R sim p le” , o SLR, es la construcción d el a u tó m a ta LR (0) a partir d e la gram ática. Los estad os d e este a u tó m a ta son los conjuntos d e elem en tos d e la co ­ lección L R (0) canónica, y las traducciones las proporciona la función ir _ A . El a u tó m a ta LR (0) para la gram ática d e expresiones (4.1) apareció an tes en la figura 4.31. E l estad o inicial d el a u tóm ata L R (0 ) es CERRADURA({ [5 ' -► -5 ]}), en d on d e S ' es el sím ­ b olo inicial d e la gram ática aum entada. T od os lo s esta d o s son d e aceptaciones. D ecim os q ue el “esta d o j ” se refiere al e sta d o q ue corresponde al con ju n to d e elem en tos Ij. ¿Cómo puede ayudar el au tóm ata L R (0) con las d ecisiones d e desplazar-reducir? E stas decisio­ nes pueden realizarse d e la siguiente m anera. Suponga q ue la cad en a 7 d e sím bolos gram aticales lleva el au tóm ata LR (0) d el estad o inicial 0 a cierto estad o j. D espués, se realiza un desplazam iento sobre e l siguiente sím b olo de en trad a a si el estad o j tiene u na transición en a. En cualquier otro caso, elegim os reducir; los elem entos en e l estad o j nos indicarán q ué producción usar. E l algoritm o d e análisis sin táctico LR q ue presentarem os en la sección 4 .6 .3 u tiliza s u pila para llevar el registro d e los estad os, así com o d e los sím bolos gram aticales; d e hecho, e l sím bolo gram atical p uede recuperarse d el estad o, p or lo que la p ila con tien e los estad os. E l siguiente ejem p lo proporciona u na v ista previa acerca de cóm o p ueden utilizarse un a u tó m a ta L R (0) y una p ila d e estad os para realizar decisiones d e desplazam iento-reducción en e l análisis sin táctico. E j e m p lo 4 .4 3 : La figura 4.34 ilu stra las acciones d e un analizador sin táctico d e desplazam ientoreducción con la entrada id * id , usando el a u tó m a ta L R (0) d e la figura 4.31. U tilizam os una pila para guardar los estados; por claridad, los sím bolos gram aticales q ue corresponden a los esta­ d o s en la p ila aparecen en la colu m n a SÍMBOLOS. E n la línea (1 ), la p ila con tien e el esta d o inicial 0 d e l autóm ata; el sím b olo correspondiente es e l m arcador $ d e la parte inferior d e la pila. L ínea P a) (2 ) (3) 0 (4) (5) (C) (7) (8) (9) ila 05 03 02 027 0275 02710 02 01 Símbolos Entrada S S id SF ST ST * S T * id ST* F ST SE id * id S * id S * id S * id S id S S s s s A cción d esplazar reducir F reducir T d esplazar d esplazar reducir F reducir T reducir E aceptar 5 id -> F 7 5 - ¥ id —►T * F T F igu ra 4.34: E l an álisis sin tá ctico d e id * id E l sigu ien te sím b olo d e en trad a e s id y e l esta d o 0 tien e u n a transición en id al esta d o 5. P or lo tan to, realizam os un d esp lazam iento. E n la lín ea (2 ), e l esta d o 5 (sím bolo id ) s e ha m etid o en la pila. N o h ay tran sición desde el esta d o 5 con la en trad a * , p or lo q ue realizam os u n a reducción. D el elem en to [F -► id-] en e l esta d o 5, la reducción es m ed ian te la producción F id . 248 Capítulo 4. A nálisis sintáctico Con los sím b olos, u n a reducción se im p lem en ta sacand o e l cu erpo d e la producción d e la pila (en la lín ea ( 2 ), e l cu erpo es ¡ d ) y m etien d o e l en cab ezad o d e la p rod ucción (en e s te caso, F ) . C on los estad os, sacam os e l esta d o 5 para e l sím b olo ¡d , lo cu a l llev a e l e sta d o 0 a la p arte superior y b uscam os u na transición en F , e l en cab ezad o d e la producción. E n la figura 4 .3 1 , el esta d o 0 tien e u na transición en F al esta d o 3, por lo q u e m etem os el e sta d o 3, co n e l sím b olo F correspondiente; v ea la lín ea (3). C om o otro ejem plo, considere la lín ea (5), con el esta d o 7 (sím bolo * ) e n la parte superior d e la pila. E ste esta d o tien e una transición al esta d o 5 co n la en trad a id , por lo q ue m etem os e l esta d o 5 (sím bolo id ). E l e sta d o 5 no tien e transiciones, a sí q ue lo reducim os m ed ian te F id . A l sacar el e sta d o 5 para el cu erpo id , e l esta d o 7 p a sa a la p arte superior d e la pila. C om o e l esta d o 7 tien e u n a tran sición en F al esta d o 10, m etem os e l esta d o 10 (sím bolo F ) . □ 4 .6 .3 E l a lg o r itm o d e a n á lis is s in tá c tic o L R En la figura 4 .3 5 s e m u estra u n d iagram a d e un analizador sin tá ctico LR . E ste diagram a con ­ sis te en u n a entrada, u n a salid a, una pila, un program a controlador y u n a ta b la d e análisis sin tá ctico q ue tien e d o s p artes (ACCION y e l ir _ A ) . E l program a controlador e s igual para to ­ d os los analizadores sin tácticos LR; só lo la ta b la d e an álisis sin tá ctico ca m b ia d e un analizador sin tá ctico a otro. E l program a d e análisis sin tá ctico lee caracteres d e un búfer d e en tra d a , uno a la vez. E n d ond e u n analizador sin táctico d e d esp lazam iento-red ucción d esp lazaría a u n sím ­ bolo, un analizador sin táctico L R d esp laza a un estado. C ada esta d o sin te tiz a la inform ación co n ten id a en la pila, d eb ajo d e éste. E n trad a P ila Sra—1 ai ... ai ... Ou Program a d e análisis sin tá ctico LR ACCION S Salida ir _ A F igu ra 4.35: M od elo d e un analizador sin tá ctico LR La p ila con tien e u n a secu en cia d e estad os, SoSi s m, en d o n d e $m, se en cu en tra en la parte superior. E n e l m étod o SLR , la p ila con tien e esta d o s d e l a u tó m a ta L R (0); los m étod os LR canónico y L A L R so n sim ilares. P or con stru cción , ca d a e sta d o tien e un sím b olo gram atical correspondiente. R ecuerde q ue los esta d o s corresponden a los con jun tos d e elem entos, y q ue hay u n a tran sición d el estad o i al esta d o j s i ir_A (/¿ , X ) = Ij. T od as las tran siciones al esta d o j d eb en ser para e l m ism o sím b olo gram atical X . P or en d e, ca d a esta d o , ex cep to e l esta d o inicial 0 , tien e un sím b olo gram atical único asociad o co n é l .4 4 Lo o p u esto no n ecesariam en te e s válido; e s d e c ir, m ás d e u n e s ta d o p u e d e te n e r e l m ism o sím b o lo g ra m a tic a l. P o r 4.6 Introducción a l análisis sintáctico LR: SLR (LR sim ple) 249 E s t r u c t u r a d e l a t a b l a d e a n á lis is s i n t á c t i c o L R L a ta b la d e an álisis sin tá ctico co n siste en d o s partes: u n a fun ción d e acción d e an álisis sin tác­ tic o llam ad a ACCION y u n a función ir _ A . 1. L a función ACCION recibe com o argu m en tos un esta d o ¿ y u n term inal a (o $, e l m arcador d e fin d e en trad a). E l valor d e ACCION [i, a] p u ed e tener u n a d e cu a tro formas: (a) D esplazar j , en d o n d e j e s un estad o. L a acción realizada p or e l analizador sin táctico d esp laza en form a efectiv a la en tra d a a h acia la p ila, pero u sa e l esta d o j para repre­ sen tar la a. (b ) R educir A ¡5. L a acción d e l analizador reduce en form a efectiv a a 0 en la p arte superior d e la pila, al en cab ezad o A . (c) A ceptar. E l analizador sin tá ctico a cep ta la en trad a y term in a e l an álisis sin táctico. (d ) Error. E l analizador sin tá ctico d escubre un error e n su en trad a y realiza c ie r ta acción correctiva. E n las seccion es 4 .8 .3 y 4 .8 .4 hablarem os m ás acerca d e cóm o funcionan dich as ru tinas d e recuperación d e errores. 2. E xten d em os la función ir _ A , d efin id a en los con jun tos d e elem entos, a los estados: s i ir _ A [7¿, A] — Ij, en to n ces ir _ A tam bién asigna un esta d o i y un no term in al A al esta d o j C o n f ig u r a c io n e s d e l a n a liz a d o r s i n t á c t i c o L R P ara describir el com p ortam ien to d e u n analizador sin tá ctico LR , es ú til tener u n a notación q ue represente e l esta d o com p leto d e l analizador sin táctico: su p ila y e l resto d e la en trad a. U na configuración d e u n analizador sin tá ctico L R es un par: (S0$1 ■■■3 r o » 1 ••• On§) e n d on d e el prim er com p on en te e s e l con ten id o d e la p ila (parte su perior a la derecha) y el segu n d o com p on en te es el resto d e la en trad a. E sta configuración representa la form a d e frase derecha: X 1X 2 ••• X maiai+1 ••• an b ásicam en te en la m ism a form a en q u e lo haría un analizador sin tá ctico d e d esplazam ientoreducción; la ú n ica diferencia es q u e en vez d e sím b o lo s gram aticales, la p ila co n tien e estad os a partir d e los cu ales pueden recuperarse lo s sím b olos gram aticales. E s decir, X¡ e s el sím bolo gram atical representado m ed ian te e l esta d o O bserve q ue 5o, el esta d o inicial d el analizador sin táctico, no represen ta a un sím b olo gram atical y sirve com o m arcador d e la p arte inferior de la pila, a sí com o tam b ién ju e g a un p ap el im portan te en e l an álisis sin táctico. ejem p lo , v e a los e s ta d o s 1 y 8 e n e l a u tó m a ta L R (0) d e l a fig u ra 4.31, a los cuales s e e n t r a m ed ia n te la s transiciones e n E , o los e s ta d o s 2 y 9 , a los c u ales s e e n t r a m ed ia n te las tran sicio n es e n T. 250 Capítulo 4. A nálisis sintáctico C o m p o rta m ie n to d e l a n a liz a d o r s in tá c tic o L R El sigu ien te m ovim ien to d el analizador sin tá ctico a partir d e la configuración anterior, se d eterm in a m ed ian te la lectu ra d e a¿, e l sím b olo d e en trad a a ctu al, y sm, el esta d o en la p arte superior d e la pila, y d esp u és se con su lta la en trad a ACCION[$m, at] en la ta b la d e acción d el análisis sin táctico. Las configuraciones resu ltan tes d esp u és d e ca d a uno de lo s cu atro tip o s d e m ovim ien to son: 1. Si ACCION[sm, a¡ = d esplazar s, el analizador eje cu ta un m ovim ien to d e desplazam iento; d esp la za e l sigu ien te e sta d o s y lo m ete en la pila, in trodu cien do la sig u ien te configura­ ción: (SoSl ” • 5m5’ fli+ l a n$) E l sím b olo di n o n ecesita guardarse en la pila, y a q ue p uede recuperarse a partir d e s, si es necesario (en la práctica, n un ca lo e s ). A hora, el sím b olo d e en trad a a ctu a l es a*+i2. Si ACCION[sm, a¿] = reducir A - + (3, en ton ces e l analizador sin tá ctico ejecu ta un m ovim ien­ to d e reducción, entrando a la siguiente configuración: ($0Si ••• sm-r$, a>iOi+1 ••• (Ln§ ) en d o n d e r e s la lon gitu d d e /?, y s = ir _ A [$ m_ r, A ]. A quí, e l analizador sin tá ctico prim ero sacó los sím b olos d el esta d o r d e la pila, ex p o n ien d o al esta d o Sm-r. D esp u és e l analiza­ dor sin tá ctico m etió a s, la e n tra d a para ir _ A [ s m_ n >1] en la p ila. E l sím b olo d e en trad a actu al no se cam b ia en un m ovim ien to d e reducción. P a ra los analizadores sin tá ctico s LR q ue vam os a construir, X m-r + i X m, la secu en cia d e los sím b olos gram aticales corres­ p ond ien tes a los esta d o s q u e s e sa ca n d e la pila, siem p re coin cid irá co n ¡3, el lado derecho d e la producción reductora. L a salid a d e un analizador sin táctico L R se g en era d esp u és d e un m ovim ien to d e reduc­ ción, m ediante la ejecución d e la acción sem á n tica a so cia d a con la p rod ucción reductora. Por el m om en to, vam os a su pon er q u e la sa lid a co n siste só lo en im prim ir la producción reductora. 3. Si ACCION [i™, a¿] = aceptar, s e co m p leta el an álisis sin táctico. 4. Si A C C I O N a ¿ ] = error, e l analizador ha d escub ierto u n error y llam a a u n a ru tin a d e recuperación d e errores. A con tinu ación se sin tetiza el algoritm o d e análisis sin tá ctico LR . T odos los analizadores sin tá cticos L R s e co m p ortan de e s ta m anera; la ú n ica diferencia entre un analizador sin tá ctico LR y o tro e s la inform ación en los ca m p o s ACCION e ir _ A d e la ta b la d e análisis sin táctico. A lg o r it m o 4 .4 4 : A lgoritm o d e an álisis sin tá ctico LR. E N T R A D A : U n a cad en a d e en tra d a w y u n a ta b la d e análisis sin tá ctico L R con las funciones ACCION e ir _ A , p ara u n a gram ática G. 4.6 Introducción a l análisis sintáctico LR: SLR (LR sim ple) 251 SA L ID A : Si w e s tá en L( G ), los p asos d e reducción d e un an álisis sin tá ctico ascen dentes para w; en cualquier o tro caso, u na indicación d e error. M ÉTO D O : A l principio, e l analizador sin tá ctico tien e 5o en su pila, en d o n d e so es e l estad o in icial y w $ e s tá e n e l búfer d e entrada. E n to n ces, e l analizador eje cu ta e l program a en la figura 4.36. □ hacer q ue a s e a e l prim er sím b olo d e vM] w h i l e ( l ) { / * repetir in definid am en te * / hacer q ue s s e a e l estad o en la p a rte superior d e la pila; i f ( ACCION[5, a] = d esplazar t ) { m eter t en la pila; hacer q ue a s e a el sigu ien te sím b olo d e entrada; } e l s e i f ( ACCION[5, a] = reducir A ¡5 ) { sacar \/3\ sím b olos d e la pila; hacer q ue e l esta d o t ahora e s té en la p arte su perior d e la pila; m eter ir_A [¿, 4 ] en la pila; enviar d e sa lid a la producción A -► /?; } e l s e i f ( ACCION[s, a] = aceptar ) break; / * term in ó e l an álisis sin tá ctico * / e l s e llam ar a la ru tina d e recuperación d e errores; } F igu ra 4.36: P rogram a d e análisis sin tá ctico LR E j e m p l o 4 .4 5 : La figura 4 .3 7 m uestra las funciones ACCION e ir _ A d e u n a ta b la d e análisis sin tá ctico L R para la gram ática d e exp resion es (4 .1 ), q ue repetim os a con tinu ación con las producciones enum eradas: (1) (2) (3 ) E -+ E + T E -> T T -+ T * F (4) T ^ F (5) T —►(E ) (6 ) F - » i d Los cód igos para las accion es son: 1. s i sign ifica d esplazar y m eter el esta d o i en la pila, 2. rj sign ifica reducir m ediante la producción en u m erad a co m o j , 3. acc sign ifica aceptar, 4 . espacio en blanco sig n ifica error. O bserve que e l valor d e ir _ A [s, a] para el term inal a se en cu en tra en e l cam p o ACCION con ectado con la acción d e desplazam iento en la en trad a a, para e l esta d o 5. E l cam p o ir _ A proporciona ir _ A [s, A] para los no term inales A . A un qu e no hem os exp licado aú n cóm o se se­ leccionaron las en trad as para la figura 4.37 , en breve tratarem os con e s ta cu estión . 252 Capítulo 4. A nálisis sintáctico E stado 0 Acción id 6 7 8 9 10 11 * s5 1 2 3 4 5 + ( ir _ A ) S r2 r4 ace r2 r4 1-6 1-6 94 s6 r2 r4 s7 r4 r6 r6 s5 s4 s5 s5 s4 s4 s6 rl r3 r5 s7 r3 r5 E T F 1 2 3 8 2 3 9 3 10 s il rl r3 r5 rl r3 r5 F igu ra 4.37: T a b la d e an álisis sin táctico para la gra m á tica d e expresiones En la en trad a ¡d * ¡d + id, la se cu en cia d e l co n ten id o d e la p ila y d e la en trad a se m uestra en la figura 4.38. P ara fines d e clarid ad, tam b ién s e m uestran las secu en cias d e lo s sím bolos gram aticales q ue corresponden a los esta d o s con ten id os en la pila. Por ejem p lo, e n la lín ea (1) el analizador LR se encuentra en e l estad o 0, el estad o inicial sin sím bolo gram atical, y con id el prim er sím b olo d e en trad a. L a acción en la fila 0 y la co lu m n a id d el cam p o acción d e la fi­ g u ra 4 .3 7 es s5, lo cu a l sign ifica d esplazar m etien d o e l esta d o 5. E sto es lo q u e h a ocurrido en la línea (2) se h a m etido en la p ila el sím b olo d e estad o 5, m ientras q ue id se h a elim inado d e la entrada. D esp u és, * se con vierte e n e l sím b olo de en trad a a ctu al, y la acción d el esta d o 5 so b re la en ­ trad a * es reducir m ed ian te F -► id. Se saca un sím b olo d e e sta d o d e la p ila. D esp u és s e ex p o n e e l esta d o 0. C om o el ir _ A d e l estad o 0 en F es 3, e l esta d o 3 se m ete a la pila. A hora tenem os la configuración d e la línea (3). C ad a uno d e los m ovim ien tos restan tes se d eterm in a en form a sim ilar. □ 4 .6 .4 C o n s tr u c c ió n d e t a b l a s d e a n á lis is s in tá c tic o S L R El m étod o SL R para construir tab las d e an álisis sin tá ctico es u n b u en p u n to in icial para e stu ­ diar e l an álisis sin táctico LR . N o s referirem os a la ta b la d e an álisis sin tá ctico co n stru id a por este m éto d o com o una ta b la SLR, y a u n analizador sin tá ctico L R que u tiliz a u na ta b la d e análisis sin tá ctico SL R com o un analizador sin tá ctico SLR . L os o tro s d o s m étod os au m entan e l m éto d o SL R co n inform ación d e anticipación. El m étodo SL R em p ieza con elem en tos L R (0) y un a u tó m a ta L R (0 ), q ue presentam os en la sección 4 .5 . E s decir, d a d a u n a gram ática G , la au m entam os para producir G ', con u n nuevo sím b olo in icial S'. A partir d e G ’ con stru im os a C, la colección ca n ó n ica d e co n ju n to s d e ele­ m en tos para G \ ju n to con la fun ción ir _ A . 4.6 Introducción a l análisis sintáctico LR: SLR (LR sim ple) Pila (1 ) (2 ) (3) (4) (5) (6 ) (7) (8) (9) ( 10 ) (11) ( 12 ) Símbolos 0 05 03 02 027 0275 0 2 7 10 02 01 01 6 (13) 0165 0163 0169 (14) 01 id F T T* T * id T*F T E E+ E + id E+ F E+ T E 253 E ntrada id * id + * id -f* id -f * id + id + + + + + Acción id $ id $ id S id $ id $ i d$ id S id $ id S id S $ s $ $ desplazar reducir mediante reducir mediante desplazar desplazar reducir mediante reducir mediante reducir mediante desplazar desplazar reducir mediante reducir mediante reducir mediante aceptar F -* id T -> F F —> id T —►T * F E T F id T -> F E E + T F igu ra 4.38: M ovim ientos d e un analizador sin tá ctico L R co n i d * id + id D esp ués, las en trad as ACCION e ir _ A en la ta b la d e an álisis sin tá ctico se con stru yen u tili­ zan d o e l sigu ien te algoritm o. P ara ello, requerim os con o cer SIGUIENTE(.4) p a ra c a d a no term i­ n al A d e u n a g ra m á tica (v ea la sección 4 .4 ). A lg o r i t m o 4 .4 6 : C onstrucción d e u n a ta b la d e análisis sin tá ctico SLR. E N T R A D A : U n a g ra m á tica au m en tad a G'. SA L ID A : Las funciones ACCION e ir _ A para G ' d e la ta b la d e an álisis sin tá ctico SLR. M ÉTODO: 1. C onstruir C = { /o, I i, . .., In } , la colección d e con jun tos d e elem en tos L R (0 ) para G'. 2. E l esta d o i se con stru ye a partir d e Las accion es d e an álisis sin tá ctico p a ra e l estad o i s e d eterm in an d e la sigu ien te forma: (a) Si [A -> a-a0\ e s tá en ¡i e ir _ A (/„ a) = zar j ”. A quí, a d eb e ser u na term inal. entonces establecer ACCION[¿, a] a “despla­ (b) Si [A -> a-] e s tá en i¡, en to n ces estab lecer ACCION[i, a] a “reducir A a en SIGUIENTE (A )] aq uí, A ta l v ez no se a S'. (c) Si [S' -► 5-] e s tá en a ” para to d a en to n ces esta b lecer ACCION[*, $] a “aceptar”. Si resu lta cualquier acción con flictiv a d eb ido a la s reglas anteriores, d ecim o s q ue la gra­ m ática n o e s S L R (l). E l algoritm o no p roduce un analizador sin tá ctico en e s te caso. 254 Capítulo 4. A nálisis sintáctico 3. L as transiciones d e ir _ A para el esta d o i se co n stru yen para to d o s los no term inales A , usando la regla: S i ir _ A (/¿ , A ) = J¿, en ton ces ir _ A [t, A] = j. 4 T od as las entradas q u e no esté n definidas p or las reglas (2) y (3) se dejan com o “error”. 5. E l esta d o inicial d el analizador sin tá ctico es el q ue se co n stru y ó a partir d e l con ju n to d e elem en tos q ue con tien en [S' - * -5]. A la tab la d e análisis sin táctico q u e co n siste en las funciones ACCION e i r _ A d eterm in adas p or el algoritm o 4.46 s e le co n o ce com o la tabla S L R ( l ) p a ra G. A un analizador sin tá ctico LR q ue u tiliz a la ta b la S L R (l) p ara G se le co n o ce com o analizador sin tá ctico S L R (l) par G, y a u na g ram ática q ue tien e u n a ta b la d e an álisis sin tá ctico S L R (l) se le co n o ce com o S L R ( l ) . Por lo general, om itim os e l “(1 )” d esp u és d e “SL R ” , y a q ue no tratarem os aquí co n lo s analizadores sin tá ctico s q ue tien en m ás d e un sím b olo d e preanálisis. E j e m p lo 4 .4 7 : V am os a construir la ta b la SL R para la gra m á tica d e exp resion es aum entada. La colección can ón ica d e con jun tos d e elem en tos L R (0 ) para la gra m á tica s e m ostró en la figura 4.3 1 . Prim ero considerem os e l con ju n to d e elem en to s Jo: E' ■E E -+ E + T E -+ T T -+ T * F T -y F F - » (E ) F - y ¡d El elem ento F -»• -(E ) produce la en trad a ACCION[0, (] = desplazar 4 , y e l elem ento F id produce la e n tra d a ACCION[0, id ] = d esp lazar 5. Los d em á s elem en to s en lo no producen nin­ g u n a acción. A hora con sid erem os I\. E' E• E - + E- + T El prim er elem ento produce ACCION[1, $] = aceptar, y e l segundo produce ACCION[1, + ] = d es­ plazar 6 . A hora considerem os E - + TT - + T- * F C om o SIGUIENTE(i?) = { $ , + , ) } , e l prim er elem en to produce lo siguiente: ACCION[2, $] = ACCION[2, + ] = ACCION[2, )] = reducir E - + T El segu n d o elem en to p rod uce ACCION[2, *] = d esplazar 7. Si con tinu am os d e e s ta form a o b ­ tendrem os las tab las ACCION y ir _ A q u e s e m uestran en la figura 4 .3 1 . E n e s a figura, lo s nú­ m eros d e las producciones en las acciones d e reducción son lo s m ism os q ue e l orden en el q ue aparecen en la gram ática original (4.1). E s decir, E - + E + T es e l núm ero 1, E ->• T es 2, y así su cesivam en te. □ 4.6 Introducción a l análisis sintáctico LR: SLR (LR sim ple) 255 E j e m p lo 4 .4 8 : C ad a u n a d e las gram áticas S L R (l) no tien e am bigüedad, pero h ay m uchas gram áticas sin am bigüedad q ue no son S L R (l). C onsidere la g ra m á tica co n las sig u ien tes pro­ ducciones: 5 L R L = R | R -+ * R | ¡d L (4.49) C onsiderem os q u e L y R representan 1 va lu é y r-valué, resp ectivam en te, y q ue * es un operador q ue in dica “e l con ten id o d e ” .5 L a colección ca n ó n ica d e co n ju n to s d e elem en to s L R (0 ) para la g ra m á tica (4.49) se m uestra en la figura 4.39. h- S'->-S S^-L = R S^-R L-» - * R L -id -L h ■ L -»■ id- h- S ^ L = -R R - > -L L ^-*R L ->■ -id h: S f — >5* I7 : L h- S L* = R R^L- h- ñ->L- I9 : S ^ L = R - h- S - > R- I4: L —>*-R *R' -L L ^ -* R L -id F igu ra 4.39: C olección L R (0) ca n ó n ica para la gra m á tica (4.49) C onsidere e l conjunto d e elem en tos h . E l prim er elem en to en e s te con ju n to hace q u e ACCION [2, = ] se a “desplazar 6 ”. C om o SIGUIENTE(fí) co n tien e = (para ver p or qué, considere la deri­ vación S => L = R => * R = R), el segundo elem ento establece ACCION[2, = ] a “reducir R -► U \ C om o hay tanto u na entrada de desplazam iento com o u na de reducción en ACCION[2, = ], e l estad o 2 tiene un conflicto d e desplazam iento/reducción con el sím bolo d e entrada = . L a g ra m á tica (4.49) no es am bigua. E ste con flicto d e d esp la za m ien to /red u cció n surge del hecho d e que el m étod o d e con stru cción d el analizador sin tá ctico SL R no es lo b astan te p o­ deroso com o para recordar e l su ficien te co n tex to a la izquierda para decidir q ué acción debe realizar e l analizador sin tá ctico sobre la en trad a = , h abiendo v is to u na ca d en a q ue p u ed e re­ d ucirse a L . Los m étod os canónico y L A L R , q ue verem os a con tinu ación, tendrán éx ito e n una colección m ás e x te n sa d e gram áticas, incluyendo la g ra m á tica (4 .4 9 ). S in em bargo, observe que 5 A l igual q u e e n la sección 2.8.3, u n Uvalue d e s ig n a u n a ubicación y u n r-value e s u n valor q u e p u ed e alm acen arse e n u n a ubicación. 256 Capítulo 4. A nálisis sintáctico hay gram áticas sin am bigüedad para las cu ales to d o s los m éto d o s d e con stru cción d e analiza­ dores sin tácticos L R producirán u n a ta b la d e accion es d e an álisis sin tá ctico co n con flictos. Por fortuna, d ich as gram áticas p ueden, p or lo gen eral, ev ita rse en las ap licacion es d e lo s lengu ajes d e program ación. □ 4 .6 .5 P r e f ijo s v ia b le s ¿Por q u é pueden usarse los au tó m a ta s L R (0) para realizar d ecisio n es d e d esplazam iento-reduc­ ción? E l a u tó m a ta L R (0 ) para u n a gram ática caracteriza la s ca d en a s d e sím b olos gram atica­ les q ue p ueden aparecer e n la p ila d e u n analizador sin tá ctico d e desplazam iento-reducción para la gram ática. E l con ten ido de la p ila d eb e ser un prefijo d e u na form a d e frase derecha. Si la p ila con tien e a a y el resto d e la en trad a es x, entonces u na secu en cia d e reducciones llevará a a x a S. En térm inos d e derivaciones, S =» a x . rm Sin em bargo, no to d o s los prefijos d e las form as d e frases derechas pueden aparecer en la pila, y a que el analizador sintáctico no debe desplazar m ás allá d el m ango. Por ejem plo, su p on ga que: E ^ . F* id ^ rm rm (E ) * id E n tonces, e n diversos m om entos d urante e l análisis sin tá ctico , la p ila con ten drá (, (E y ( £ ) , pero no d eb e con ten er (E )* , y a q ue (E ) es un m ango, q ue e l analizador sin tá ctico d eb e reducir a F a n tes d e d esp lazar a *. Los prefijos d e las form as d e frases derechas que pueden aparecer en la p ila d e un analiza­ dor sin tá ctico d e desplazam iento-reducción s e llam an p refijo s viables. Se d efinen d e la sigu ien te m anera: un prefijo viab le e s un prefijo d e u n a form a d e frase d erech a q ue no co n tin ú a m ás allá d el ex trem o derecho d e l m ango p or la d erech a d e e sa form a d e frase. M ediante esta definición, siem p re es p osible agregar sím b olos term in ales al final d e u n prefijo viab le p a ra ob ten er u na form a d e frase derecha. El análisis sin tá ctico SL R se b asa en el hecho d e q ue lo s au tó m a ta s L R (0 ) reconocen los prefijos viab les. D ecim os q ue e l elem en to A f o f a es vá lid o para un prefijo viab le a p i si h ay u na d erivación S ' a A w =>■ ap]fi¿w . E n general, un elem en to será válid o para m uchos prefijos viables. El hecho d e q u e A ->• fti'fo se a válido para a p i nos d ice m ucho acerca d e si d eb em os despla­ zar o reducir cu an do encontrem os a a p i en la p ila d e análisis sin táctico. E n especial, si #2 * e, en ­ tonces sugiere q ue no hem os d esp lazad o aún e l m ango hacia la pila, por lo q ue e l desplazam iento es nuestro sigu ien te m ovim iento. S i f o = e, en ton ces parece q ue A -► p i es el m ango, y debem os reducir m ediante e s ta producción. D esde luego q ue d os elem en tos válid os pueden indicarnos q ue d ebem os hacer d istin ta s cosas para el m ism o prefijo via b le. P odem os resolver algunos d e estos conflictos analizando e l sigu ien te sím b olo d e entrada, y o tro s p od em os resolverlos m ediante los m étod os d e la sección 4 .8 , pero n o d eb em os su pon er q ue tod os los con flictos d e accion es d e aná­ lisis sin táctico p ueden resolverse si s e ap lica el m étodo L R a u na gra m á tica arbitraria. P od em os calcu lar con facilidad e l con ju n to d e elem en to s válid os para ca d a prefijo viable q ue p uede aparecer e n la p ila d e u n analizador sin tá ctico L R . D e hecho, un teo rem a central d e la teoría d e an álisis sin táctico L R nos d ice q ue e l con ju n to d e elem en tos v á lid o s p a ra u n pre­ fijo v ia b le 7 es exa cta m en te e l con ju n to d e elem en tos a los q u e s e lleg a d esd e e l e sta d o inicial, 4.6 Introducción a l análisis sintáctico LR: SLR (LR sim ple) 257 L o s e le m e n to s c o m o e s ta d o s d e u n A F N P od em os con stru ir un a u tó m a ta fin ito n o d eterm in ista N p ara reconocer prefijos viables si tratam os a los m ism os elem en tos com o estad os. H ay u na tran sición d esd e A -► a -X/3 h acia A -»• a X f i etiq u e ta d a com o X , y h ay u n a tra n sició n d esd e A -► a-B /3 h acia B - » -7 etiq u eta d a com o e. E n ton ces, CERRADURA ( / ) para e l con ju n to d e elem en to s (estad os de N ) I e s exa cta m en te el cierre e d e u n con ju n to d e esta d o s d e un A F N definidos en la sec­ ción 3.7.1. Por en d e, ir _ A (/, X ) proporciona la transición p roveniente d e l e n e l sím b olo X d el A F D con stru id o a partir d e N m ediante la con stru cción d el su b con ju n to. Si lo vem os d e e s ta form a, el p rocedim ien to elem ento$( G ') en la figura 4 .33 es só lo la con stru cción del m ism o su bconjun to q u e se ap lica a l A F N N , co n los elem en tos com o estad os. a lo largo d e la ru ta e tiq u e ta d a com o 7 en el a u tó m a ta L R (0) p a ra la gram ática. E n esen cia, el con ju n to d e elem en tos válid os abarca to d a la inform ación ú til q ue p uede deducirse d e la pila. A un qu e aquí n o d em ostrarem os e s te teorem a, vam os a ver un ejem plo. E j e m p lo 4 .5 0 : V am os a considerar d e nuevo la gram ática d e expresiones aum entada, cuyos con­ juntos de elem entos y la función ir _ A se exhiben en la figura 4 3 1 . Sin dud a, la cad en a E + T * es un prefijo viable d e la gram ática. El au tóm ata d e la figura 4.31 se encontrará en e l estad o 7, después de haber leído E + T *. El estado 7 contiene los siguientes elem entos: T -» T * F -+ id q ue so n precisam en te los elem en tos v álid o s para E + T * . P ara ver por q u é, considere las si­ gu ien tes tres derivaciones por la derecha: E í =>■ E E f => E rm rm => E + T => E + T => rm rm rm => E + T * F rm E* => E rm E + T => E + T * F =>■ E + T * F rm _ rm =$■ E + T * ( E ) => E + T * id rm rm La prim era derivación m uestra la validez d e T - * T * - F , la segunda m uestra la validez d e F - > • ( £ ) , y la tercera m uestra la validez d e F - + -id . Se puede m ostrar que no h ay otros elem entos válidos para E + T * , aunque aquí no dem ostrarem os ese hecho. □ 4 .6 .6 E je r c ic io s p a r a la s e c c ió n 4 .6 E j e r c ic io 4 .6 .1 : D escrib a tod os los prefijos viab les para las sig u ien tes gram áticas: a ) L a g ram ática S 0 S 1 | 0 1 d el ejercicio 4 .2 .2(a). 258 Capítulo 4. A nálisis sintáctico ! b) L a g ra m á tica 5 - ^ 5 5 + | 5 5 * | a d e l ejercicio 4 .2 .1 . ! c) L a g ra m á tica S -► S ( S ) | e del ejercicio 4 .2 .2 (c). E j e r c i c i o 4 .6 .2 : C onstruya los con jun tos SL R d e elem en to s para la g ra m á tica (aum entada) del ejercicio 4.2.1. C alcule la función ir _ A para esto s conjuntos d e elem entos. M uestre la ta b la de análisis sin tá ctico para e s ta gram ática. ¿E s una gra m á tica SLR? E j e r c i c i o 4 . 6 . 3 : M uestre las accion es d e su ta b la d e análisis sin tá ctico d e l ejercicio 4 .6 .2 sobre la e n tra d a a a * a + . E je rc ic io 4 .6 .4 : P ara ca d a u n a d e las gram áticas (aum en tad as) d el ejercicio 4 .2 .2 (a )-(g ): a) C onstruya los con jun tos SL R d e elem en tos y s u función ir _ A . b) Indique cualquier con flicto d e acciones en su s con jun tos d e elem entos. c) C onstruya la ta b la d e análisis sin tá ctico SLR , si es q u e ex iste. E j e r c i c i o 4 . 6 . 5 : M uestre q u e la sigu ien te gram ática: S A B —► A a A b \ B b B a -+ e e es L L (1), pero no S L R (l). E j e r c i c i o 4 . 6 . 6 : M uestre q u e la sigu ien te gram ática: S A SA | A -+ a es S L R (l), pero no L L ( 1 ). !! E j e r c i c i o 4 . 6 . 7 : C onsidere la fam ilia d e gram áticas Gn definidas por: S A, -* a.j A i | a.j para 1 < i, j < A i bipara 1 < i < n n e i* j M uestre que: a) Gn tien e 2n 2 — 2 producciones. b) Gn tien e 2n2 + n2 + n con jun tos d e elem en tos L R (0). c) G n es S L R (l). ¿Q ué d ice e s te an álisis acerca d e la ex ten sió n q u e p u ed en llegar a tener los analizadores sin ­ tá cticos LR? 4.7 A nalizadores sintácticos LR m ás poderosos 259 E j e r c ic io 4 .6 .8 : Sugerim os q u e los elem en to s in dividu ales pudieran considerarse com o esta ­ d o s d e u n a u tó m a ta finito no d eterm in ista, m ientras q ue los co n ju n to s d e elem en to s válidos so n los esta d o s d e un a u tó m a ta fin ito d eterm in ista (vea el recuadro titu la d o “L o s elem en tos com o estad os d e u n A F N ” en la sección 4 .6 .5 ). P ara la g ra m á tica 5 - ^ 5 5 + | 5 5 * | a d e l ejercicio 4.2.1: a ) D ib uje el diagram a d e tran sición (A F N ) para los elem en to s válid os d e e s ta gram ática, d e acuerdo a la regla q u e s e p rop orciona en el recuadro antes citado. b ) A pliqu e la construcción d e su bconjim tos (A lgoritm o 3.20) a su A F N , a partir d e (a). ¿C óm o se com p ara e l A F D resu ltan te con el con ju n to d e elem en to s L R (0) p a ra la gra­ m ática? !! c ) M uestre q u e en to d o s los casos, la con stru cción d e su bconjun tos q ue se ap lica al A F N q ue proviene d e los elem en tos válid os para u n a gra m á tica p roduce los con jun tos L R (0) d e elem entos. E j e r c ic io 4 .6 .9 : L a sigu ien te es u n a g ra m á tica am bigua: 5 A -► A S\ b S A | a C on stru ya para e s ta gram ática su colección d e co n ju n to s d e elem en tos L R (0 ). Si tratam os de con stru ir u na ta b la d e an álisis sin táctico L R para la gram ática, hay ciertas accion es en conflic­ to . ¿Q ué son? S u p on ga q u e tratam os d e usar la ta b la d e an álisis sin tá ctico eligien d o en form a n o d eterm in ista u n a p osible acción , ca d a vez q ue haya un con flicto. M uestre to d a s la s p osibles secu en cias d e accion es co n la en trad a abab. 4 .7 A n a liz a d o re s s in tá c tic o s L R m á s p o d e ro so s E n e s ta sección vam os a exten d er las técn ica s anteriores d e an álisis sin tá ctico LR , para usar un sím b olo d e preanálisis en la entrada. H ay d os m étod os distintos: 1 . E l m étod o “L R can ón ico” , o sim p lem en te “L R ” , q u e u tiliza al m áxim o e l (los) sím b olo(s) d e preanálisis. E ste m étod o u tiliza un ex te n so con ju n to d e elem entos, co n o cid o s com o elem en tos L R ( 1 ). 2. E l m étod o “L R co n sím b olo d e preanálisis” o “L A L R (look ah ead L R )” , q ue se b asa en los con jun tos d e elem en tos L R (0 ), y tien e m ucho m en os esta d o s q ue los analizadores sin ­ tácticos com unes, basados en los elem en to s L R ( 1 ). Si introducim os con cu id ad o lecturas an ticip adas e n los elem en tos L R (0 ), p od em os m anejar m uchas gram áticas m ás co n el m étodo L A L R q ue co n e l SLR , y construir ta b la s d e análisis sin tá ctico q ue n o sea n m ás grandes q ue las tab las SLR. L A L R es e l m éto d o d e elección en la m ayoría d e las situ a ­ ciones. D esp u és d e presentar am bos m étodos, concluirem os con u n a ex p licación acerca d e cóm o com ­ p actar las ta b la s d e an álisis sin tá ctico L R para lo s en torn os co n m em oria lim itada. 260 Capítulo 4. A nálisis sintáctico 4 .7 .1 E le m e n to s L R (1 ) c a n ó n ic o s A hora presentarem os la técn ica m ás gen eral para con stru ir u na ta b la d e an álisis sin tá ctico LR a partir d e u na gram ática. R ecuerde q ue en el m éto d o SLR , e l esta d o i llam a a la reducción m ediante A -+ a si e l con ju n to d e elem en tos Ii co n tien e el elem en to [A a-\ y a s e en cu en tra en SIGUIENTE(^4). N o ob sta n te, en algu nas situ acion es cu a n d o el esta d o i aparece en la p arte superior d e la pila, el prefijo v ia b le 0 a e n la p ila es ta l q ue 0 A n o p uede ir se g u id a d e a en ninguna form a d e frase derecha. P or en d e, la reducción m ediante A -► a d e b e ser inválida con la e n tra d a a. E j e m p lo 4 .5 1 : V am os a reconsiderar el ejem p lo 4 .4 8 , en d on d e en e l e sta d o 2 ten ía m o s el elem en to R -► L , e l cu al p o d ía corresponder a la A -> a anterior, y a p o d ía ser e l sign o =, q ue se en cu en tra en SIGUIENTE(R ). Por en d e, e l analizador sin tá ctico SL R llam a a la reducción m ediante R -> L en el esta d o 2, co n = com o e l sig u ien te sím b olo d e en trad a (tam bién se llam a a la acción d e d esp lazam iento, d eb ido al elem en to S -► L -= R e n el esta d o 2). Sin em b argo, no hay form a d e frase d erech a d e la gram ática en el ejem p lo 4 .48 q ue em p iece com o /? = •■-. Por lo ta n to, e l estad o 2, q ue e s el esta d o corresp ond ien te al prefijo v ia b le L solam en te, en realidad no d eb ería llam ar a la reducción d e e sa L a R . □ Es p osib le transportar m ás inform ación en el esta d o , q ue n os p erm ita descartar algu nas d e esta s reducciones in válidas m ed ian te A a . A l divid ir esta d o s segú n s e a necesario, p od em os hacer q ue cada esta d o d e u n analizador sin táctico L R indique co n ex a c titu d q ué sím b olos d e en trad a p ueden ir d esp u és d e un m ango a para e l cu a l h a y a u na p osible reducción a A . La inform ación adicional s e incorpora al e sta d o m ediante la redefinición d e elem en tos, para q ue incluyan un sím b olo term inal com o un segu n d o com p onente. L a form a general d e un ele­ m ento se convierte en [A - * a • 0 , a] , en d on d e A -► a 0 es u na producción y a es u n term inal o e l d elim itad or $ derecho. A un o b je to d e e s te tip o le llam am os elem en to L R (1 ). E l 1 se refiere a la lon gitu d d e l segu n d o com p on en te, co n ocid o co m o la lectura a n ticip a d a d el elem en to .6 La lectura an ticip ada no tien e efecto sobre u n elem en to d e la form a [A -+ a - 0 , a], e n d ond e 0 no es €, pero un elem en to d e la form a [A -* - a -, a] llam a a u na reducción m ed ian te A -► a só lo si e l sigu ien te sím b olo d e en trad a e s a. P or en d e, n os vem os ob ligad os a reducir m ed ian te A ->■ a só lo con eso s sím b olos d e en trad a a para los cu ales [A a -, a] es u n elem ento L R ( 1 ) en el esta d o en la p arte superior d e la pila. E l con ju n to d e ta les as siem p re será un su b co n ju n to d e SIGUIENTE(^4), pero p od ría ser u n su b con ju n to p rop io, com o en e l ejem p lo 4.51. D e m anera form al, d ecim os q ue e l elem en to L R ( 1 ) [A -► a - 0 , a] e s vá lid o para un prefijo viab le 7 si hay una d erivación S ^ rm S A w => 6 a 0 w , e n donde tví 1 . 7 = 6a , y 2 . a es e l prim er sím b olo d e w, o w es e y, a es $. E j e m p lo 4 .5 2 : C onsiderem os la sigu ien te gram ática: 6D esd e luego q u e so n posibles las le c tu ra s a n tic ip a d a s q u e se a n cad e n a s d e u n a lo n g itu d m ay o r a uno, p e ro no las co n sid erarem o s e n e s te libro. 4.7 A nalizadores sintácticos LR m ás poderosos 261 S -► B B B —► a B | b H ay u na d erivación por la d erech a 5 ^ rm aaB ab =» aaaBab. P od em os v er q ue el elem en to [B - * rm a-B, a] es válido para un prefijo viable 7 = aaa, si dejam os q ue o = aa, A = B, w = ab a = a y 0 = B e n la definición anterior. Tam bién hay u n a d erivación p or la d erech a S B a B =*• BaaB . rm rm D e e s ta derivación p od em os ver q ue e l elem en to [B -► a-i?, $] es válid o para e l prefijo viab le Sao. □ 4 .7 .2 C o n s tr u c c ió n d e c o n ju n to s d e e le m e n to s L R (1 ) E l m étod o para construir la colección d e co n ju n to s d e elem en tos L R (1 ) válidos es en esen cia el m ism o q u e para construir la colección can ón ica d e con jun tos d e elem en to s L R (0 ). S ólo necesi­ ta m o s m odificar los d os p rocedim ien tos CERRADURA e ir _ A . C onjun toD eE lem en tos CERRADURA( / ) { repeat f o r ( ca d a elem en to [A -»• a -B ¡3, a] en I ) f o r ( ca d a producción B 7 en G ' ) f o r ( ca d a term inal b e n PRIMERO(/?a) ) agregar [B - » -7 , 6] al con ju n to /; u n t i l no se agreguen m ás elem en to s a /; r e t u r n /; } C onjun toD eE lem en tos ir _ A (J , X ) { inicializar J para que se a e l con ju n to vacío; f o r ( ca d a elem en to [A ->■ a-X(3, a] en I ) agregar el elem en to [A -*> a X 0 , a] al con ju n to J; r e t u r n CERRADURA(J); } v o i d elem entos^G*) { inicializar C a CERRADURA({[5" ->■ -5, $]}); repeat f o r ( ca d a con ju n to d e elem en tos / e n C ) f o r ( ca d a sím b olo gram a tica l X ) ¡ f ( ir _ A ( /, X ) no e s tá v a cío y n o e s tá e n C ) agregar ir _ A (J , X ) a C; u n t i l n o se agreguen nuevos con jun tos d e elem en to s a C; } F igu ra 4.40: C onstrucción d e con jun tos d e elem en tos L R (1 ) para la g ra m á tica G' 262 Capítulo 4. A nálisis sintáctico P ara apreciar la n u eva definición d e la operación CERRADURA, en esp ecia l, p or q ué b d e­ b e estar en PRIMERO(/3a), considere un elem en to d e la form a [A -»■ a - B 0 , a] en e l con jun ­ to d e elem entos válido para cierto prefijo viable 7 . Entonces hay u na derivación por la derecha S SA ax => ÓaBfiax, en d ond e 7 = 6a . Suponga q ue ¡3ax deriva a la ca d en a d e term inales rm rm by. E n ton ces, para ca d a producción d e la form a B r¡ para cierta r¡, ten em os la derivación S => 7 B b y => 7 r¡by. Por en d e, [B -> -77, 6] es v á lid a p ara 7 . O bserve q ue b p uede ser e l prim er terim rm jj. m inal derivado a partir d e 0 , o q ue es p osible que 0 derive a € e n la d erivación 0 ax => by y, rm por lo tan to, b p uede ser a. P ara resumir am bas p osibilid ades, decim os q ue b p uede ser cualquier term inal e n PRIMERO(0a x ), en d on d e PRIMERO es la fun ción d e la sección 4 .4 . O bserve q ue x no p uede contener la prim era term inal d e by, p or lo q u e PRIMERO(0 a x ) = PRIMERO(/?a). A hora proporcionarem os la con stru cción d e los con jun tos d e elem en tos L R (1 ). F igu ra 4.41: E l gráfico d e ir _ A para la gra m á tica (4.55) A lg o r it m o 4 .5 3 : C onstrucción d e los con ju n tos d e elem en to s L R (1). E N T R A D A : U n a gram ática au m en tad a G'. SALID A: Los con ju n tos d e elem en tos L R ( 1 ) q ue so n e l con ju n to d e elem en tos válid o para uno o m ás prefijos v iab les d e G'. 4.7 A nalizadores sintácticos LR m ás poderosos 263 M ÉTO D O : L os p rocedim ien tos CERRADURA e ir _ A, y la ru tin a p rincipal d e m e n to s para cons­ truir los con jun tos d e elem en tos se m ostraron e n la figu ra 4.4 0 . □ E j e m p lo 4 .5 4 : C onsidere la sigu ien te gra m á tica aum entada: Sf S C -+ -» -► S CC c C | d (4.55) E m pezam os por calcular la cerradura de { [S' -► -S, $]}. R elacionam os e l elem ento [Sf - > -5, $] co n e l elem en to [A - * a-B/3, a] en el procedim iento CERRADURA. Es decir, A = 5 ', a = €, B = 5, / ? = e y a = $ . L a función CERRADURA nos indica q ue d ebem os agregar [B -*■ -7 , 6] para cada producción B -► t /y la term inal b en PRIMERO(/3a). E n térm inos d e la gram ática actual, B 7 debe ser 5 -> CC, y com o f i e s e y a es $, b sólo puede ser $. Por ende, agregam os [S - * • CC, $]. P ara seguir calculando la cerradura, agregam os to d o s los elem en tos [ C - » -7 , 6] para 6 en PRIMERO( C $). E s d ecir, s i relacionam os [S-> • CC, $] con [j4 -> a-B¡3, a], tenem os q ue A = 5, a = €, 5 = C, /? = ¿ 7 y a = $. C om o C n o deriva a la ca d en a vacía, PRIMERO(C$) = PRIMERO(C ). C om o PRIMERO(C) con tien e los term inales c y á, agregam os los elem en tos [ C - * -cC , c], [C —► •cC, á], [ C - ^ -á, c] y [C - > -á, d ]. N inguno d e los elem en tos nuevos tiene un no term inal ju sto a la derecha del punto, p o r lo q ue hem os com p letad o nuestro prim er conjunto d e elem entos L R (1). E l conjunto inicial d e elem en tos es: lo 1 S —►•$ , $ S - > -C C , $ C -► -cC , c / d C -► -á, c / á H em os om itid o los corch etes por con ven ien cia d e notación, y u tiliza m o s la n otación [ C - > -cC, c/á ] com o abreviación para los d os elem en to s [ C - * -cC , c] y [ C -cC, á]. A hora calcu lam os ir _ A ( /0, X ) para los diversos valores d e X . P ara X = S debem os la cerra­ d u ra d el elem en to [S' -> 5-, $]. N o es p osib le u n a cerradura adicional, y a q u e el punto e s tá en e l extrem o derecho. Por en d e, ten em os e l sig u ien te con ju n to d e elem entos: h: 5'->5-, $ P ara X = C cálcu los la cerradura [S -► C-C, $]. A gregam os las producciones C co n e l segundo com p on en te $ y d esp u és n o p od em os agregar m ás, p rod ucien do lo siguiente: h : S - > C-C, $ C - * -cC, $ C - > -á, $ A hora, dejam os q u e X = c. D eb em os calcular la cerradura { [C c-C, c /á ]} . A gregam os las producciones C co n e l segun do com p on en te c ¡ d , produciendo lo siguiente: 264 Capítulo 4. A nálisis sintáctico I3 : C o C , c /d C -► *cC7, c /d C -► •d, c /d Por ú ltim o, dejam os q u e X = d, y term inam os con e l sigu ien te con ju n to d e elem entos: Z4 : C —► d», c /d H em os term in ado d e considerar a ir _ A con I0. N o o b ten em os nuevos con jun tos d e ¿i, pero J2, tien e ir _ A en C, c y d. P ara ir _ A ( / 2, C), ob ten em o s lo siguiente: k : 5 - * CC-, $ sin q ue se requiera u na cerradura. P ara calcu lar ir _ A ( /2, c) tom am os la cerradura d e {[ C o C , $], para ob ten er lo siguiente: k : C -* o C , $ -cC , S C - > -d, $ O bserve q ue /6 difiere d e /3 só lo e n los segun dos com p on en tes. M ás ad elan te verem os q ue es co ­ m ún para ciertos con jun tos d e elem en tos L R ( 1 ) q u e u n a gra m á tica ten g a los m ism os prim eros com p onentes y q ue d ifieran en su s segu n d os com p on en tes. C uan do con stru yam os la colección d e co n ju n tos d e elem en tos L R (0) para la m ism a gram ática, ca d a con ju n to d e L R (0 ) coincidirá con e l con ju n to d e los prim eros com p on en tes d e u no o m ás con jun tos d e elem en to s L R ( 1 ). C uando h ablem os sobre el an álisis sin táctico L A L R , verem os m ás sobre e s te fenóm eno. C ontinuando co n la fun ción ir _ A para /2, i r _ A ( / 2, d) se v e d e la sigu ien te manera: I7 : C - > d r ,$ Si pasam os ahora a /3, lo s ir _ A d e ^ e n c y d s o n /3 e ¿4, resp ectiv a m en te, y ir _ A (7 3, C) es: 1% : C c G , c /d I4 e /5 no tien en ir _ A s , y a q ue tod os los elem en to s tien en su s p un tos en el ex trem o derecho. Los ir _ A s d e /6 en c y d so n J6 e Í 7, resp ectivam en te, y ir _ A ( J6, C) es: I9 : C cC -, $ Los con jun tos restantes d e elem en tos no producen m as ir _ A , p or lo q ue h em os term inado. La figu ra 4 .41 m u estra los d iez con ju n tos d e elem en to s co n su s ir _ A . □ 265 4.7 A nalizadores sintácticos LR m ás poderosos 4 .7 .3 T a b la s d e a n á lis is s in tá c tic o L R (1 ) c a n ó n ic o A hora proporcionarem os las reglas para construir las funciones ACCION e ir _ A d e L R (1 ), a partir d e los con ju n tos d e elem en tos L R (1 ). E sta s funciones se representan m ediante u na tabla, com o an tes. L a ú n ica diferencia e s tá e n los valores d e las entradas. A lg o r i t m o 4 .5 6 : C onstrucción d e ta b la s d e an álisis sin tá ctico L R canónico. E N T R A D A : U n a g ra m á tica au m en tad a G'. SA L ID A : Las funciones ACCION e ir _ A d e la tabla d e análisis sintáctico LR canónico para G'. M ÉTODO: 1. C onstruir C" = { i¡j, A , 4 }, la colección d e con jun tos d e elem en tos L R (1 ) p a ra G'. 2. E l e sta d o i d e l analizador sin táctico se co n stru y e a p artir d e 4 sin táctico para e l esta d o i se d eterm in a d e la sigu ien te m anera. L a acción d e análisis (a) Si [A - ► a- a0, b] e s tá en J¿, e ir_A (/¿, a) = Ij, entonces hay que establecer ACCION[¿, a] a “d esplazar f . A qu í, a d eb e ser u n a term inal. (b ) Si [A - > a -, a] e s tá en 7¿, A * 5 ', en to n ces h ay q ue estab lecer ACCION[¿, a] a “reducir A a ”. (c) Si [S' - * 5-, $] e s tá en en to n ces h ay q ue estab lecer ACCION [i, $] a “aceptar” . Si resu lta cualquier acción con flictiv a d eb ido a la s reglas anteriores, d ecim o s q ue la gra­ m ática n o es L R (1 ). E l algoritm o n o p rod uce un analizador sin tá ctico en este caso. 3. Las tran siciones ir _ A para el esta d o i se con stru yen para to d o s los no term in ales A usando la regla: Si ir_A (J¿, A ) = Ij, en ton ces ir_A [¿, A] = j. 4. T od as las en trad as n o d efinidas por las reglas (2) y (3) se v u elven “error”. 5. E l esta d o in icial d e l analizador sin tá ctico es e l q ue se con stru ye a partir d el conjunto de elem en tos q ue con tien en [S' -► -5, $]. □ A la ta b la que se form a a partir d e la acción d e análisis sin tá ctico y las funciones produci­ d a s p or e l A lgoritm o 4 .4 4 s e le co n o ce com o la ta b la d e an álisis L R ( 1 ) canónica. Si l a función d e acción d e an álisis sin tá ctico no tien e entradas d efinidas en form a m ú ltip le, en to n ces a la gra m á tica d a d a s e le co n o ce com o gram ática L R ( 1) . C om o a n tes, o m itim o s el “(1)” si q u ed a com p rend ida su función. E j e m p lo 4 .5 7 : La tab la d e análisis sin táctico canónica para la gram ática (4.55) se m uestra en la figura 4.42. Las producciones 1, 2 y 3 son S -► CC, C - * c C y C d, respectivam ente. □ C ada gram ática S L R (l) es u na g ra m á tica L R ( 1 ), pero para una gra m á tica S L R (l) el ana­ lizador sin táctico L R canónico p uede tener m ás esta d o s q u e el analizador sin tá ctico SL R para la m ism a gram ática. L a gram ática d e los ejem plos anteriores es S L R , y tien e u n analizador sin tá ctico SL R co n sie te estad os, e n com paración con los d iez d e la figura 4 .4 2 . 266 Capítulo 4. A nálisis sintáctico A cción E stado 0 1 2 3 4 c d s3 s4 s6 s3 r3 s7 s4 r3 s6 s7 9 S C 1 2 5 8 rl 7 8 S acc 5 6 ir_A 9 r3 r2 r2 r2 F igu ra 4.42: T ab la d e análisis sin tá ctico ca n ó n ica para la g ra m á tica (4.55) 4 .7 .4 C o n s tr u c c ió n d e t a b l a s d e a n á lis is s in tá c tic o L A L R A hora presentarem os nuestro ú ltim o m étod o d e con stru cción d e analizadores sin tá ctico s, la técn ica L A L R (L R c o n lectura a n ticip a d a ). E ste m éto d o s e u tiliza con frecuencia en la p ráctica, y a q ue las tablas q ue se obtienen so n considerablem ente m enores q ue las tablas L R canónicas, y a pesar d e ello la m ayoría d e las con stru ccion es sin tá ctica s com unes d e los lengu ajes d e progra­ m ación pueden expresarse en form a con ven ien te m ed ia n te u na gra m á tica LA L R . Lo m ism o es ca si válido para las gram áticas SLR , p ero hay algu nas con stru ccion es q u e las técn icas SL R no pueden m anejar d e m anera con ven ien te (vea e l ejem p lo 4 .48). Para u n a com paración del tam añ o d e los analizadores sin tá ctico s, las tab las SLR y LA L R para u na gram ática siem p re tien en el m ism o núm ero d e esta d o s, y este núm ero co n siste, p or lo general, en cien tos d e estad os, para un lenguaje com o C . La ta b la LR canónica tendría, p or lo gene­ ral, varios m iles d e esta d o s para e l len gu aje c o n el m ism o tam añ o. Por en d e, e s m ucho m ás fácil y económ ico construir ta b la s SL R y L A L R q ue las ta b la s L R canónicas. Con e l fin d e u na introducción, considerem os d e nuevo la g ra m á tica (4.55), cu yos con jun tos d e elem en tos L R (1 ) se m ostraron en la figura 4 .41 . T om em os un par d e esta d o s con apariencia sim ilar, com o /4 e I-¡. C ad a u no d e esto s esta d o s sólo tien e elem en to s con el prim er com p on en te C - * d-. E n J4, los sím bolos d e anticipación son c o d; en J7, $ es e l único sím bolo d e anticipación. P ara ver las diferencias entre las funciones d e I \ e h en el analizador sin tá ctico , observe q ue la g ra m á tica g en era e l len gu aje regular c * d c * d . A l leer u n a en tra d a cc■• • cdcc•• • cd, e l analizador sin tá ctico d esp la za e l prim er gru p o de es y la d su b sig u ien te, y las m ete en la p ila, entrando al esta d o 4 d esp u és d e leer la d. D esp u és, el analizador llam a a u n a reducción m ediante C -+ d, siem pre y cu an do e l sigu ien te sím b olo d e en trad a se a c o d. E l requerim iento d e q ue sig u e c o d tien e sentid o, y a q ue ésto s so n los sím b olos q ue p odrían em pezar ca d en a s e n c ‘ d . Si $ sig u e d es­ pués d e la prim era d, ten em os u n a en tra d a com o ccd, q ue n o e s tá en e l lengu aje, y e l esta d o 4 declara en form a correcta un error si $ es la sigu ien te entrada. El analizador sin tá ctico en tra al esta d o 7 desp ués d e leer la segu n d a d. D esp ués, e l analiza­ dor d eb e ver a $ en la entrada, o d e lo contrario em p ezó con u n a ca d en a q ue no es d e la form a 4.7 A nalizadores sintácticos LR m ás poderosos 267 c* d c* d . P or en d e, tien e sen tid o q ue e l esta d o 7 d eb a reducir m ed ian te C -► d e n la en trad a $, y declarar un error en entradas com o c o d. A hora vam os a su stitu ir J4 e I 7 p o r J47, la u n ión de h e I7 , q ue co n siste en e l con ju n to d e tres elem en tos representados p or [ C - > d•, c/d/% ]. Las tran sacciones ir _ A en d q ue pasan a ^ o a / j d esd e f t, i , ¿ e k ahora en tran a h i- L a acción d el esta d o 4 7 e s reducir en cualquier entrada. E l analizador sin tá ctico revisado s e co m p o rta en esen cia igual q ue el original, aunque podría reducir d a C en circun stan cias en las q ue e l original declararía un error, por ejem p lo, en una en trad a com o ccd o cdcdc. E n u n m om ento d ado, e l error se atrapará; d e hecho, s e atrapará an tes d e q ue se d esp lacen m ás sím b olos d e entrada. E n form a m ás general, p od em os buscar con jun tos d e elem en to s L R (1) q u e ten gan el m is­ m o corazón; es decir, e l m ism o con ju n to d e prim eros com p on en tes, y p od em os com binar esto s con ju n tos con corazones com u n es en un so lo con ju n to d e elem en tos. Por ejem plo, en la figura 4.41, I4 e I 7 form an d ich o par, co n el corazón { C d •}. D e m anera sim ilar, J3 e 1$ form an otro par, con e l corazón { C -► c-C , C -► -cC , C •d}. H ay u n p ar m ás, I8 e / 9, co n e l corazón co ­ m ún { C - * cC -}. O bserve q ue, en general, un corazón es un con ju n to d e elem en tos L R (0) para la gram ática en cu estión , y q ue u n a gram á tica L R (1 ) p u ed e producir m ás d e d o s co n ju n to s de elem en tos con el m ism o corazón. C om o e l corazón d e ir _ A (J , X ) dep en de sólo d el corazón d e I, las transacciones ir _ A d e los conjuntos com binados pueden com binarse entre s í m ism os. Por ende, no h ay problem a al revisar la función ir _ A a m edida q ue com binam os conjuntos d e elem entos. Las funciones activas se m odi­ fican para reflejar las acciones sin error d e to d o s los conjuntos d e elem entos en la com binación. S u p on ga q ue ten em os una gram ática L R (1 ), es decir, u n a cu y o s con jun tos d e elem en tos L R ( 1 ) n o produzcan co n flictos d e accion es en e l an álisis sin tá ctico . Si su stitu im o s to d o s los esta d o s q ue ten gan e l m ism o corazón co n su u nión, es p osible q ue la unión resu lta n te ten g a un co n flicto , pero es p oco probable d eb ido a lo siguiente: S u p on ga q u e en la unión h ay un conflicto e n el sím b olo an ticip ado, d eb ido a q ue hay un elem en to [A - * a -, a] q ue llam a a u n a reducción m ediante A a , y que hay otro elem ento [B ¡3-ay, 6] q ue llam a a un desplazam iento. Enton­ c e s, cierto conjunto d e elem entos a partir d el cu a l se formó la unión tien e e l elem ento [A a -, a], y com o los corazones d e to d o s e sto s esta d o s so n iguales, d eb e tener un elem en to [ B f r a y , c] para algu na c. P ero en ton ces, este esta d o tien e el m ism o co n flicto d e d esp la za m ien to /red u cció n e n a, y la gram ática no era L R (1 ) com o su pusim os. Por en d e, la com binación d e esta d o s con corazones com unes n u n ca p od rá producir un con flicto d e d esp lazam ien to/red u cción q ue no haya esta d o presente en uno d e los esta d o s originales, y a q ue las acciones d e d esp lazam iento dependen só lo d el corazón, y no del sím b olo anticipado. S in em bargo, es p o sib le q ue u n a com binación produzca u n con flicto d e redu cción /redu cción , com o se m uestra en e l sigu ien te ejem plo. E j e m p lo 4 .5 8 : C onsidere la sigu ien te gram ática: 5' S A B -► -* —► —► S a A d | bB d \ aB e \ bA e c c la cu a l gen era las cu atro cad en as acd, ace, bcd y bce. E l lector p u ed e com probar q u e la gram áti­ c a es L R (1) m ediante la con stru cción d e los con jun tos d e elem en tos. A l hacer e s to , encontram os 268 Capítulo 4. A nálisis sintáctico e l con ju n to d e elem en tos {[A c-, d ], [B o , e]} válid o para el prefijo viable a c y { [ A ^ o , e], [ B -+ c-, d ]} válido para b e N inguno de esto s conjuntos tiene un conflicto, y su s corazones son iguales. Sin em bargo, su unión, que es: A -► c-, d / e B - * c-, d /e gen era un con flicto d e red u cción /red u cción , y a q ue las reducciones m ediante A se llam an para las entradas d y e . □ cy B c A hora esta m o s preparados para proporcionar e l prim ero d e d o s algoritm os d e construcción d e ta b la s LA L R . L a id ea general e s construir los con jun tos de elem en tos L R (1 ), y si n o surgen con flictos, com binar los con jun tos con corazones com u nes. D esp ués, con stru irem os la ta b la d e análisis sin tá ctico a partir d e la colección d e con jun tos d e elem en to s com b inad os. E l m étodo q ue vam os a describir sirve principalm ente com o u na d efinición d e las gram áticas L A L R (l). El proceso d e construir la colección co m p leta d e con jun tos d e elem en to s L R (1) requiere d em asiado espacio y tiem p o com o para q ue se a ú til en la práctica. A lg o r it m o 4 .5 9 : U n a con stru cción d e tab las L A L R sencilla, pero q ue con su m e espacio. E N T R A D A : U n a gram ática au m en tad a G ’. SALID A: Las funciones d e la ta b la d e an álisis sin tá ctico L A L R ACCION e ir _ A para G'. M ÉTODO: 1. C onstruir C — {/o, / i , . .., / n}, la colección d e con jun tos d e elem en tos L R (1). 2. P ara ca d a corazón presen te entre e l con ju n to d e elem en tos L R (1 ), buscar tod os los con ­ ju n to s q ue ten gan e se corazón y su stitu ir e sto s con jun tos p or su unión. 3. D ejar q ue C = {J o , J i, . .., J m} sean los con jun tos resu ltan tes d e elem en tos L R (1 ). Las accion es d e an álisis sin tá ctico para e l esta d o i se con stru yen a partir d e d e la m ism a form a q ue en e l A lgoritm o 4 .5 6 . Si h ay u n co n flicto d e accion es en e l an álisis sin tá cti­ co, el algoritm o n o p rod uce u n analizador sin tá ctico y d ecim os q ue la g ra m á tica n o es L A L R (l). 4. L a ta b la ir _ A se con stru ye d e la sigu ien te m anera. S i J es la u n ión d e u no o m ás con ju n to s d e elem en tos L R ( 1 ) , es decir, J = i i fl I2 n fl Ik, en ton ces lo s corazones d e ir _ A ( /i, X ), ir _ A ( /2, X ), . .., ir _ A (J fc, X ) son iguales, y a q ue J i, J2, ... , /¿ tie n e n e l m ism o corazón. D ejar que K s e a la unión d e tod os los con jun tos d e elem en tos q ue tien en el m ism o corazón q ue i r _ A ( / i , X ) . E n ton ces, ir _ A ( J, X ) — K . A la tab la p rod ucida por e l algoritm o 4 .5 9 se le co n o ce co m o la tabla de a n á lisis sin tá ctico L A L R para G. Si n o hay con flictos d e accion es en e l an álisis sin tá ctico , en ton ces se d ice q ue la gra m ática d ad a es una gram ática L A L R ( l) . A la colección d e con jun tos d e elem en to s q ue se con stru ye e n el p aso (3) s e le co n o ce com o colección L A L R ( Í ) . 4.7 A nalizadores sintácticos LR m ás poderosos 269 E j e m p lo 4 .6 0 : C onsidere d e nuevo la g ra m á tica (4.55), cu y o gráfico d e ir _ A se m ostró e n la figu ra 4.41. C om o d ijim os an tes, h ay tres pares d e con jun tos d e elem en to s q ue p ueden com bi­ narse. k e Iq s e su stitu y en por su unión: fe: C - + c - C , c/d/% C - + •c C , c/d/% C - » -d, c/d/% Z47: C - + d -,c /d /$ h e h se su stitu y en por su unión: d esp u és, / 8 e /9 se su stitu y en por s u unión: fe : C - * c G , c/d/% Las funciones d e acción e ir _ A L A L R para los con jun tos com b inad os d e elem en to s se m uestran e n la figu ra 4.43. ACCIÓN E stado C s36 d 0 1 2 36 47 s36 s36 r3 s47 s47 r3 5 89 r2 r2 ir_A S s47 5 C 1 2 acc 5 80 r3 rl r2 F igu ra 4.43: T ab la d e an álisis sin tá ctico LA L R para la gra m á tica d e l ejem p lo 4 .54 P ara ver cóm o s e calculan los ir _ A , considere e l ir _ A ( /36, C ). E n e l conjunto original d e ele­ m en tos L R ( 1 ), ir _ A ( /3, C ) = f e y ahora J8 e s p arte d e f e , por lo q ue hacem os q ue i r _ A ( f e , C ) se a h 9- Podríam os haber llegado a la m ism a con clusión si consideráram os a k , la o tr a p arte de /36. E s d ecir, ir _ A ( f e C ) = f e y ahora Ig form a parte d e f e . P ara otro ejem plo, considere a ir _ A ( f e c), u n a en trad a q ue s e ejerce d esp u és d e la acción d e d esp lazam iento d e h en la en trad a c. E n los conjuntos originales d e elem en tos L R (1 ), ir _ A ( / 2 , c) — f e C om o Iq form a ahora parte de /36, ir _ A ( /2, c) se con vierte en f e . Por lo ta n to , la en trad a en la figura 4 .4 3 para el esta d o 2 y la en trad a c se convierte e n s36, lo cual sign ifica desplazar y m eter e l esta d o 36 e n la pila. □ C uan do se les p resen ta una ca d en a d el lengu aje c* d c* d , tan to el analizador sin tá ctico LR d e la figura 4 .4 2 com o el analizador sin tá ctico L A L R d e la figura 4 .43 realizan exactam en ­ t e la m ism a secuencia d e desplazam ientos y reducciones, aunque los nombres d e los estad os en la p ila p ueden diferir. P or ejem p lo, si e l analizador sin tá ctico L R m ete a J3 o Iq en la p ila, el analizador sin tá ctico LA L R m eterá a I 36 en la pila. E s ta relación se ap lica e n gen eral para 270 Capítulo 4. A nálisis sintáctico una gram ática L A L R . L os analizadores sin tá ctico s L R y L A L R s e im itarán u no al o tro en las entradas correctas. Si se le p resen ta u n a en trad a errónea, e l analizador sin tá ctico L A L R ta l vez p roceda a rea­ lizar ciertas reducciones, una v e z q ue e l analizador sin tá ctico L R haya declarad o un error. Sin em bargo, e l analizador sin táctico L A L R n u n ca d esp lazará o tro sím b olo desp ués d e q ue el anali­ zador sin táctico L R d eclare un error. Por ejem p lo, en la en trad a ccd se g u id a d e $, e l analizador sin tá ctico L R d e la figura 4 .4 2 m eterá lo sigu ien te en la pila: 03 34 y en el esta d o 4 descubrirá u n error, y a q u e $ es e l sig u ien te sím b olo d e en trad a y e l e sta d o 4 tien e u n a acción d e error en $. E n con traste, el analizador sin tá ctico LA L R d e la figura 4.43 realizará los m ovim ien tos corresp ond ien tes, m etien d o lo sig u ien te e n la pila: 0 36 36 47 Pero el esta d o 47 en la en trad a $ tien e la acción d e reducir C L A L R cam biará, p or lo ta n to , s u p ila a: d. E l analizador sin tá ctico 0 36 36 89 A hora, la acción d e l estad o 89 en la en trad a $ es reducir C siguiente: cC . L a p ila se co n v ierte en lo 0 36 89 en d o n d e se llam a a u n a reducción sim ilar, co n lo cu a l se o b tien e la pila: 0 2 Por ú ltim o, e l esta d o 2 tien e u n a acción d e error en la en trad a S, por lo q ue ah ora se descubre e l error. 4 .7 .5 C o n s tr u c c ió n e fic ie n te d e ta b la s d e a n á lis is s in tá c tic o L A L R H ay varias m odificaciones q ue p od em os realizar al A lgoritm o 4 .5 9 para ev ita r con stru ir la co ­ lección co m p leta d e con jun tos d e elem en tos L R ( 1 ) , en e l p roceso d e crear u n a ta b la d e análisis sin tá ctico L A L R (l). • E n prim er lugar, p od em os representar cualquier con ju n to d e elem en to s I L R (0) o L R (1) m ed ian te su corazón (kernel); es d ecir, m ediante aquellos elem en to s q ue sea n e l elem ento inicial, [S' - + •S ] o [5 ; -► -5, $], o q ue ten ga n el p u n to e n algún lugar q u e no s e a a l prin­ cip io d el cu erpo d e la producción. • P od em os construir los corazones d e los elem en tos L A L R (l) a p artir d e los corazones de los elem en tos L R (0), m ediante un proceso d e propagación y generación e sp o n tá n ea d e lec­ turas ad elan tad as, lo cu al describirem os en breve. • Si ten em os los corazones L A L R (l), p od em os generar la ta b la d e an álisis sin tá ctico L A L R (l) cerrando ca d a corazón, usando la función CERRADURA d e la figura 4 .4 0 , y d es­ pués calcu land o las en trad as en la ta b la m ediante e l A lgoritm o 4.5 6 , co m o si los conjuntos d e elem en tos L A L R (l) fueran con ju n tos d e elem en to s L R (1) canónicos. 4.7 A nalizadores sintácticos LR m ás poderosos 271 E j e m p lo 4 .6 1 : V am os a usar, com o un ejem p lo d el eficien te m éto d o d e con stru cción d e una ta b la L A L R (l), la gram ática q ue no es SL R d el ejem p lo 4 .4 8 , la cu a l reproducim os a continua­ ción en s u form a aum entada: S' s L R —► —► —► —► 5 L = R *R | : L E n la figura 4 .3 9 s e m ostraron los con jun tos co m p leto s d e elem en tos L R (0) para e s ta gram á­ tica. L os corazones d e esto s elem en tos se m uestran en la figura 4 .4 4 . □ ¡o- S ' -> -S h: L —> id- h: S '-> S - h- S h- S L- = R R ^ L - h- L —^ *7?- h- S ^ R - h: R -> L - h: L -> * -R h- S ^ L = R- L = *R F igu ra 4.44: C orazones d e los con jun tos d e elem en to s L R (0) p a ra la gra m á tica (4.49) A hora d eb em os adjuntar los sím b olos d e anticipación apropiados para los elem en to s L R (0) e n los corazones, para crear los corazones d e lo s con jun tos d e elem en tos L A L R (l). H ay dos form as en q ue se puede adjuntar un sím b olo d e anticipación b a un elem en to L R (0) B -► 7 •<$, e n cierto con ju n to d e elem en tos L A L R (l) J: 1. H ay un con ju n to d e elem en tos /, co n un elem en to d e corazón A -► a-/?, a, y J = ir _ A (/, X ) , y la con stru cción de ir_A (C ER R A D U R A ({[^ - > a /? , a ]} ), X ) com o s e prop orciona en la figura 4.40 , co n tien e [B -► 7 •<$, 6], sin im portar a. Se considera que d ich o sím b olo d e an ticip ación b se gen era e n form a espon tán ea para B 7 -6 . 2. C om o caso esp ecial, e l sím b olo d e an ticip ación $ se gen era en form a esp o n tá n ea para el elem en to S ' -► -5 en e l con ju n to in icial d e elem entos. 3. T odo es com o en (1), pero a — b e ir_A(CEKRADURA({[>l - + a -¡3, 6] } ), X ), com o se propor­ ciona en la figura 4.40, con tien e [B -► 7 •<$, b] sólo porque A - » a -{3 tiene a b com o uno d e sus sím bolos d e anticipación asociados. En ta l caso, decim os q ue los sím bolos d e anticipación se propagan d esd e A -► a ¡3 en e l corazón d e /, h a sta B -*■ 7 -6 en e l corazón d e J. Observe que la propagación no dep en de d el sím b olo d e anticipación específico; o to d o s los sím bolos de anticipación se propagan d esd e un elem ento h a sta otro, o ninguno lo hace. 272 Capítulo 4. A nálisis sintáctico D eb em os d eterm in ar los sím b olos d e an ticip ación generados en form a esp o n tá n ea para ca d a conjunto d e elem entos L R (0), y tam b ién d eterm inar cu áles elem en tos propagan los sím bolos d e anticipación desde cuáles otros. En realidad, la prueba es bastan te sim ple. H agam os q ue # sea un sím bolo q ue n o esté en la gram ática en cuestión. H agam os q ue A a-/3 se a un elem ento d e cora­ zón L R (0) e n e l con ju n to I. C alcule, para cad a X , J = ir_A(CERRADURA( { [A -+ a-/3, # ] } ) , X ) . Para cad a elem ento d e corazón en J, exam inam os su conjunto d e sím bolos d e anticipación. Si # es u n sím b olo d e an ticip ación , en ton ces los sím b olos d e anticipación se propagan h acia ese elem en to d esd e A - * a -0 . C ualquier o tro sím b olo d e an ticip ación s e g en era d e m anera esp o n tá ­ nea. E sta s ideas se hacen precisas e n el sigu ien te algoritm o, e l cu a l tam b ién hace uso d e l hecho d e q ue los únicos elem en tos d e corazón e n J d eb en ten er a X ju s to a la izqu ierda d e l punto; es decir, d eb en ser d e la form a B -► 7 X-5. A lg o r it m o 4 .6 2 : D eterm inación d e los sím b olos d e anticipación. E N T R A D A : E l corazón K d e un con ju n to d e elem en tos L R (0) I y u n sím b olo gram atical X . SALID A: Los sím b olos d e an ticip ación generados en form a esp o n tá n ea por lo s elem en tos en /, para los elem en tos d e corazón e n ir _ A ( /, X ) y los elem en to s en / , a partir d e los cu ales los sím b olos d e anticipación se propagan h acia los elem en tos d e corazón en ir _ A (/, X ) . M ÉTO D O : E l algoritm o se prop orciona e n la figura 4.4 5 . □ f o r ( ca d a elem en to A a -0 en K ) { J : = CERRADURA({[>1 a-/?, # ] } ); i f ( [B - * 7 -X5, a] e s tá e n J, y a no es # ) con cluir q ue el sím b olo d e an ticip ación a se gen era en form a esp on tán ea para e l elem en to B —►y X -5 en ir _ A ( J, X ) \ i f ( [B y X Ó , # ] e s tá en J ) con cluir q ue los sím b olos d e anticipación se propagan d esd e A -+ a /3 e n I h acia B —►7 X -5 e n ir _ A (7 , X ) \ } F igu ra 4.45: D escub rim iento d e sím b olos d e anticipación propagados y esp on tán eos A hora esta m o s listos para adjuntar los sím b olos d e anticipación a los corazones d e los con ­ ju n to s d e elem en tos L R (0 ) para form ar los con jun tos d e elem en tos L A L R (l). E n prim er lugar, sab em os q ue $ es un sím b olo d e an ticip ación para S ' -► -S en e l conjunto inicial d e elem en tos L R (0). E l A lgoritm o 4 .6 2 n os p rop orcion a to d o s los sím b olos d e an ticip ación q ue se generan en form a esp on tán ea. D esp u és d e listar to d o s esos sím b olos d e an ticip ación , d eb em o s perm itir q ue se propaguen h a sta q ue y a no puedan hacerlo m ás. H ay m uchos m étod os d istin to s, tod os los cu ales en cierto sen tid o llevan la cu en ta d e los “n u ev o s” sím b olos d e anticipación q u e se han propagado en u n elem en to , p ero q u e to d a v ía no se propagan h acia fuera. E l sig u ien te algoritm o d escrib e u na técn ica para propagar los sím b olos d e an ticip ación h acia to d o s lo s elem entos. A lg o r it m o 4 .6 3 : C álculo eficien te d e los corazones d e la colección d e con jun tos d e elem entos L A L R (l). E N T R A D A : U n a gram ática au m en tad a G'. 4.7 A nalizadores sintácticos LR m ás poderosos 273 SA L ID A : Los corazon es d e la colección d e con jun tos d e elem en to s L A L R (l) para G'. M ÉTODO: 1. C onstruir los corazones d e los con ju n to s d e elem en to s L R (0) para G. S i el espacio no es d e ex trem a im portancia, la m anera m ás sim p le es construir los co n ju n to s d e elem en tos L R (0), com o en la sección 4.6 .2 , y d esp u és elim inar los elem en tos q ue no sea n d el cora­ zón. Si el esp acio e s tá restringido e n ex trem o , ta l v e z s e a con ven ien te alm acenar só lo los elem entos d el corazón d e cad a conjunto, y calcular ir _ A para un conjunto d e elem en tos /, para lo cu a l prim ero d eb em os calcu lar la cerradura d e I. 2. A plicar el A lgoritm o 4 .6 2 al corazón d e ca d a con ju n to d e elem en tos L R (0) y el sím b olo gram atical X para d eterm inar q u é sím b olos d e anticipación se gen eran en form a esp on ­ tá n ea para los elem en tos d el corazón en ir _ A (/, X ), y a partir los cu a les se propagan los elem en tos en los sím b olos d e an ticip ación I a los elem en tos d el corazón en ir _ A (/, X ) . 3. Inicializar u n a tab la q ue proporcione, para ca d a elem en to d e l corazón en ca d a conjunto d e elem entos, los sím b olos d e anticipación asociados. A l principio, ca d a elem ento tiene aso­ ciados sólo los sím bolos d e anticipación q ue determ inam os en e l paso ( 2 ) q ue se generaron en form a espontánea. 4 . Hacer pasadas rep etid as sob re los elem en to s d e l corazón e n to d o s los con ju n tos. AI v i­ sita r un elem en to i, buscam os los elem en to s d el corazón para los cu ales i propaga sus sím b olos d e an ticip ación , usand o la inform ación q ue s e ta b u ló e n e l p aso (2 ). E l conjunto actu al d e sím b olos d e anticipación para i se agrega a los q ue y a e stá n asociados con ca d a uno d e los elem en tos p ara los cu ales i propaga su s sím b olos d e an ticip ación . C ontinua­ m os realizando pasadas sobre los elem en to s d e l corazón h a sta q ue n o s e propaguen más sím b olos nuevos d e anticipación. E j e m p lo 4 .6 4 : V am os a construir los corazones d e los elem en tos L A L R (l) para la gram á­ tic a d e l ejem p lo 4.61. Los corazones d e los elem en to s L R (0) s e m ostraron en la figura 4.44. A l aplicar e l A lgoritm o 4 .6 2 al corazón d el con ju n to d e elem en to s /o, prim ero calculam os CERRADURA ( { [5 ' -► -5, # ] } ) , q u e v ie n e siendo: 5' - > - 5 , # S -L = R , # S -> - R , # #/= L - + -id , # / = R -> • £ , # E ntre los elem en tos e n la cerradura, vem os d o s en d on d e se h a generado el sím b olo d e antici­ p ación = en form a esp on tán ea. E l prim ero d e ésto s es L - * • * R . E s te elem en to , co n * a la derech a d e l punto, produce [L -*■ * -fí, = ] . E s d ecir, = es un sím b olo d e an ticip ación generado en form a esp o n tá n ea para L *-fí, q ue s e en cu en tra en el con ju n to d e elem en to s h - D e ma­ nera sim ilar, [L -id , = ] n o s in d ica q ue = es un sím b olo d e anticipación generado en form a esp o n tá n ea para L -► id - en J5. C om o # es un sím b olo d e anticipación para los seis elem en to s en la cerradura, determ ina­ m os q ue el elem en to S ' - * S en I0 propaga los sím b olos d e an ticip ación h acia lo s sigu ientes seis elem entos: 274 Capítulo 4. A nálisis sintáctico S' S* in Ti S L* = R in I 2 S —> R ' in /3 D J0: L - > * -R in h L - > id- in 15 i? —> L* in Í 2 H esde 5' -5 h h S L- = R R ^ L S ^ R L * .R h h h I2: S ^ L - I 4: L — » * aR h: = R. S ^ L = -R acia Sr h h h h S- L —>id* S ^ L = -R L — ► *-R Ti h L —>id* L —> *R» R - > L- h L -> *-R h h h L —» id* R - > LS ^ L = R- F igu ra 4.46: P rop agación d e los sím b olos d e anticipación En la figura 4.47, m ostram os los pasos (3) y (4) d el A lgoritm o 4.63. La colum na etiq uetad a com o INIC m uestra los sím bolos d e anticipación generados en forma esp on tán ea para ca d a ele­ mento d el corazón. É stas son sólo las d os ocurrencias d e = que vim os antes, y e l sím bolo d e anti­ cipación $ espontáneo para e l elem ento inicial S ' -► *5. En la prim era pasada, el sím b olo $ d e anticipación se p rop aga d e S ' -► S en lo h acia los seis elem en tos listad os en la figura 4.46. E l sím b olo = d e anticipación se p rop aga d esd e L *-R en I4 h acia los elem en tos L —> * R- en y R —►L- en /g. T am bién s e propaga h acia s í m ism o y hacia L id- en J5, pero esto s sím b olos d e anticipación y a e stá n presentes. E n la seg u n d a y tercera pasada, el único sím b olo nuevo d e an ticip ación q u e se propaga es $, d escub ierto para los su cesores d e h e I4 en la p asad a 2 y p ara e l su cesor d e /6 en la p a sa d a 3. E n la p asada 4 no se propagan nuevos sím b olos d e an ticip ación , p or lo q u e e l con ju n to final d e sím b olos d e a nticipación s e m u estra en la colu m n a por la derecha d e la figura 4.4 7 . O bserve q ue el con flicto d e d esp lazam ien to/red u cció n en el ejem p lo 4 .48 q ue u tiliz a el m éto ­ d o SL R h a desaparecido co n la técn ica L A L R . L a razón es q ue sólo el sím b olo $ d e anticipación e s tá asociado co n R L- en J2, p or lo q u e no h ay con flicto con la acción d e análisis sin táctico d e d esp lazam ien to en =, gen erad a p or el elem en to S - * L -= R e n /2. □ 4.7 A nalizadores sintácticos LR m ás poderosos Conjunto 275 E lemento I nic /o: S'^-S h: S S ímbolos de anticipación P asada 1 P asada 2 P asada 3 S S S S f —►5- S S h- S->L- = R R ^ L - S S S S s s s h- S ^ R - S s 8 — =/s =/s = /S — =/s =/s = /S s S h: L —>id* h- S ^ L = -R h- L —►*R* = =/s =/S h- R = =/s h: S ^ L = R- =/s s L- F igu ra 4.47: C álcu lo d e lo s sím b olos d e anticipación 4 .7 .6 C o m p a c ta c ió n d e la s t a b l a s d e a n á lis is s i n tá c tic o L R U n a g ra m á tica d e lengu aje d e program ación com ún, con u n a ca n tid a d d e 50 a 100 term inales y 100 producciones, p uede tener u n a ta b la d e análisis sin tá ctico L A L R co n varios cien to s de estad os. L a función d e acción p od ría fácilm ente tener 2 0 0 0 0 en trad as, ca d a u n a requiriendo por lo m enos 8 b its para codificarla. E n los d isp o sitiv o s p eq ueños, p uede ser im p ortan te tener u na cod ificación m ás eficien te q ue un arreglo bidim ensional. E n breve m encionarem os algunas técn icas q u e se han u tilizad o para com prim ir los cam p o s ACCION e ir _ A d e u n a ta b la d e aná­ lisis sin táctico LR. U na téc n ic a ú til para com p actar el cam p o d e acción e s reconocer que, por lo general, mu­ ch as filas d e la ta b la d e accion es son idénticas. P or ejem p lo, en la figura 4 .4 2 los esta d o s 0 y 3 tien en entradas d e acción id én ticas, al igual q ue los esta d o s 2 y 6 . Por lo tanto, p od em os ahorrar u n a can tid ad d e esp acio considerable, co n m uy p o co co sto en relación co n el tiem po, si cream os un apuntador para ca d a estad o en un arreglo unidim ensional. Los apuntadores para los esta d o s con las m ism as accion es apuntan a la m ism a ubicación. P ara acceder a la informa­ ción d esd e e s te arreglo, asignam os a ca d a term inal un núm ero d esd e cero h a sta u no m enos que e l núm ero d e term inales, y u tilizam os e s te en tero com o u n d esp lazam iento a p artir d e l valor del apuntador para ca d a estado. E n u n esta d o dado, la acción d e an álisis sin tá ctico para la ¿-ésima term inal se en con trará a i u bicacion es m ás allá d e l valor d el apuntador para e se estad o. P u ed e lograrse u n a mejor eficiencia en cu an to al espacio, a ex p en sa s d e un analizador sintác­ tico un p oco m ás lento, m ediante la creación d e u na lista para las acciones d e ca d a estad o. E sta lista con siste en pares (term inal-sím bolo, acción). L a acción m ás frecuente para un esta d o puede 276 Capítulo 4. A nálisis sintáctico colocarse al final d e una lista, y en lugar d e un term inal p odem os usar la notación “c u a l q u i e r a ” , indicando que si no se h a encontrado e l sím bolo de entrada actual h asta ese punto en la lista, de­ bem os realizar e sa acción sin im portar lo q ue se a la entrada. A dem ás, las entradas d e error pueden sustituirse sin problem as por acciones d e reducción, para u na mayor uniformidad a lo largo d e una fila. Los errores se d etectarán m ás adelante, antes d e un m ovim iento d e desplazam iento. E j e m p lo 4 .6 5 : C onsidere la tab la d e análisis sin tá ctico d e la figu ra 4.3 7 . E n prim er lugar, observe q ue las accion es para los estad os 0, 4 , 6 y 7 coin cid en . P od em os representarlas todas m ediante la sigu ien te lista: SÍMBOLO id ( c u a lq u ie r a ACCIÓN s5 s4 error El esta d o 1 tien e u n a lista sim ilar: + $ c u a lq u ie r a s6 acc error En el estad o 2, p od em os su stitu ir las entradas d e error p or r2, para q u e se realice la reducción m ediante la producción 2 en cualquier en trad a excep to *. Por ende, la lista para e l esta d o 2 es: * c u a lq u ie r a s7 r2 El esta d o 3 tien e só lo entradas d e error y r4. P od em os su stitu ir la p rim era p or la segunda, d e m anera q u e la lis ta para el e sta d o 3 co n sista sólo e n e l par ( c u a l q u i e r a , r4 ). Los esta d o s 5, 10 y 11 pueden tratarse e n form a sim ilar. L a lista para e l esta d o 8 es: + ) c u a lq u ie r a s6 s il error * ) c u a lq u ie r a s7 s il rl y para el esta d o 9 es: □ Tam bién p od em os codificar la ta b la ir _ A m ediante u na lista , pero aquí e s m ás eficien te crear u n a lista d e pares para ca d a n o term in al A . C ad a par en la lista para A es d e la form a (esta d o A ctu a l, sigu ien teE stadó) , lo cu a l in d ica que: ir_ A [e s ta d o A c tu a l, A] = sig u ien teE sta d ó 4.7 A nalizadores sintácticos LR m ás poderosos 277 E s ta técn ica e s ú til, y a q ue tien d e a haber m enos esta d o s e n cualquier colu m n a d e la ta b la ir _ A . L a razón es q ue el ir _ A en el no term inal A sólo p u ed e ser un esta d o q u e p u ed a deri­ varse a partir d e un con ju n to d e elem en tos e n los q ue algu nos elem en tos ten g a n a A ju sto a la izquierda d e un punto. N in gún con ju n to tien e elem en to s con X y Y ju sto a la izquierda d e un p u n to si X * Y. Por en d e, ca d a esta d o aparece com o m áxim o en u na co lu m n a ir _ A . P ara u n a m ayor reducción d e l espacio, h ay q ue observar q ue las en trad as d e error en la ta b la d e ir _ A nunca se con su ltan . Por lo tanto, p o d em o s su stitu ir ca d a en trad a d e error por la en trad a m ás com ún sin error en s u colum na. E s ta en trad a s e con vierte en la o p ció n prede­ term inada; s e represen ta e n la lista para ca d a co lu m n a m ed ian te u n par co n c u a l q u i e r a en v e z d e estadoA ctu al. E j e m p lo 4 .6 6 : C onsidere d e nuevo la figura 4 .3 7 . L a co lu m n a p a ra F tien e la en tra d a 10 para e l estad o 7, y to d a s las d em á s entradas so n 3 o error. P o d em o s su stitu ir error por 3 y crear, para la co lu m n a F , la sigu ien te lista: ESTADOACTUAL SlG U IENTEESTA DO 7 c u a lq u ie r a 10 3 D e m anera sim ilar, u n a lista ad ecu ad a para la colu m n a T es: 6 9 c u a lq u ie r a 2 P ara la co lu m n a E p od em os elegir 1 o 8 com o la op ción predeterm inada; son necesarias d o s en­ trad as e n cualquier caso. Por ejem plo, p od ríam os crear p a ra la co lu m n a E la sigu ien te lista: 4 c u a lq u ie r a 8 1 E l ahorro d e esp acio e n esto s p eq ueños ejem plos p uede ser en gañ oso, y a q ue e l núm ero to ta l d e entradas en las listas creadas en e s te ejem p lo y e l anterior, ju n to con los apuntadores desde los esta d o s h acia las listas d e acción, y d esd e la s no term in ales h acia las lista s d e los sigu ientes estad os, producen u n ahorro d e esp acio m ínim o, en com paración con la im plem en tación d e una m atriz d e la figura 4.37. E n las gram áticas p rácticas, e l esp a cio necesario para la representa ción d e la lista es, por lo general, m enos d el d iez p or cien to d e lo necesario para la representa­ ción d e la m atriz. Los m étod os d e com p resión d e tab las para los au tó m a ta s fin itos q u e v im o s en la sección 3.9 .8 pueden usarse tam b ién para representar la s ta b la s d e an álisis sin tá ctico LR. 4 .7 .7 E je r c ic io s p a r a la s e c c ió n 4 .7 E j e r c ic io 4 .7 .1 : C on stru ya los con ju n tos d e elem en tos a) L R canónicos, y b) LA L R . para la g ra m á tica 5 - * S S + | 5 S * | a d e l ejercicio 4 .2 .1 . 278 Capítulo 4. A nálisis sintáctico E j e r c i c i o 4 . 7 . 2 : R ep ita e l ejercicio 4.7.1 para ca d a u n a d e las gram áticas (aum en tad as) d el ejercicio 4 .2 .2 (a )-(g ). E j e r c i c i o 4 . 7 . 3 : P ara la gram ática d e l ejercicio 4 .7 .1 , u se el A lgoritm o 4.63 para calcular la colección d e con ju n tos d e elem en tos L A L R , a partir d e los corazon es d e lo s con jun tos d e ele­ m en tos L R (0). E j e r c i c i o 4 . 7 . 4 : M uestre q u e la sigu ien te gram ática: 5 A -► A a \ b A c \ d e —► d \ b d a es L A L R (l), pero n o S L R (l). E j e r c i c i o 4 . 7 . 5 : M uestre q u e la sigu ien te gram ática: s A B —► A a —► —► d d es L R ( 1 ) , pero no L A L R (l). 4.8 U so d e g ra m á tic a s a m b ig u a s Es un hecho q u e n in gu n a gram ática am bigua es L R y , p or en d e, no s e en cu en tra en n inguna d e las clases d e gram áticas q u e hem os v isto en las d o s seccion es anteriores. N o o b sta n te, cier­ tos tip os d e gram áticas am biguas so n b astan te ú tiles e n la especificación e im plem en tación d e lenguajes. P ara las con stru cciones d e lenguajes com o las expresiones, u n a gra m á tica am bigua proporciona u na especificación m ás co r ta y natural q ue cualquier g ra m á tica n o am b igu a equi­ valente. O tro u so d e las gram áticas am biguas e s e l d e aislar las con stru ccion es sin tá ctica s q ue ocurren con frecuencia para la op tim ización d e casos esp eciales. Con u n a gra m á tica am bigua, p od em os especificar las con stru cciones d e casos esp eciales, agregando con cu id ad o nuevas pro­ d uccion es a la gram ática. A unque las gram áticas q u e u sam os n o so n am biguas, e n to d o s los casos esp ecificam os re­ glas para elim inar la am bigüedad, las cu ales sólo perm iten un árbol d e an álisis sin tá ctico para ca d a enunciado. D e e s ta form a, se elim in an las am bigüedades d e la especificación gen eral d el lenguaje, y algunas veces es posible diseñar un analizador sin táctico L R q ue sig a las m ism as opciones para resolver las am bigüedades. D eb em os enfatizar q u e las construcciones am biguas d e­ ben utilizarse con m edida y en un form a estrictam ente controlada; d e no ser así, no p uede haber garantía en e l lenguaje q ue reconozca un analizador sintáctico. 4.8 Uso d e gram áticas ambiguas 4 .8 .1 279 P r e c e d e n c ia y a s o c ia tiv id a d p a r a r e s o lv e r c o n flic to s C onsidere la g ra m á tica am bigua (4.3) para la s exp resion es co n lo s operadores + y *, q u e repe­ tim o s a continuación por conveniencia: E + E | E * E \ (E ) | id E s ta g ra m á tica es am bigua, y a q ue no esp ecifica la a so cia tiv id a d ni la p reced en cia d e los op e­ radores + y *. L a gram ática sin am bigüedad (4 .1 ), q ue incluye las producciones E E + T y T —► T * F , genera el m ism o lenguaje, pero o to rg a a + u na precedencia menor q ue la d e * , y hace q u e am bos operadores sean asociativos por la izquierda. H ay d o s razones por las cuales p od ría se r m ás con ven ien te preferir el u so d e la g ra m á tica am bigua. E n prim er lugar, com o verem os m ás ad elan te, p od em os cam biar con facilidad la a so ciativid ad y la p reced en cia d e los operadores + y * sin perturbar las p roducciones d e (4.3) o el núm ero d e esta d o s en e l anali­ zador sin táctico resultante. E n segundo lugar, e l analizador sin tá ctico para la g ra m á tica sin am bigüedad invertirá u n a fracción considerable d e su tiem p o realizando reducciones m ediante las p roducciones E - » T y T F , cu y a ú n ica fun ción es hacer valer la a so cia tiv id a d y la precedencia. E l analizador sin tá ctico para la gra m á tica sin am bigüedad (4.3) no desperdiciará tiem p o realizando reducciones m ediante e sta s prod uccion es sim p les (producciones cu y o cuerpo c o n siste en u n so lo no term in al). Los con ju n tos d e elem en tos L R (0) para la g ra m á tica d e ex p resion es sin am bigüedad (4.3) au m en tad a por E ' - + E se m uestran e n la figura 4.4 8 . C om o la g ra m á tica (4.3) es am bigua, h ab rá co n flictos d e acciones d e an álisis sin tá ctico cu an do tratem os d e producir u n a ta b la de an álisis sin táctico L R a partir d e los con jun tos d e elem entos. L os esta d o s q u e corresponden a los con jun tos d e elem en tos /7 e J8 generan esto s con flictos. S u p on ga q u e utilizam os e l m étodo SL R para construir la tab la de acciones d e análisis sintáctico. El conflicto generado por I7 entre la reducción m ediante E E + E y el desplazam iento en + o * no p uede resolverse, y a q ue + y * s e en cu en tran en SIGUIENTE(22). Por lo tan to , se llam aría a am bas accion es e n las en trad as + y *. J8 gen era un con flicto sim ilar, entre la reducción m ediante E - y E * E y e l d esp lazam iento e n las en trad as + y *. D e hecho, ca d a uno de n uestros m éto d o s d e con stru cción d e ta b la s de an álisis sin táctico L R generarán e sto s con flictos. N o o b sta n te, esto s problem as pueden resolverse m ediante el uso d e la inform ación so b re la p reced en cia y la asociativid ad para + y *. C onsidere la en trad a i d + i d * i d , la cu a l hace que u n analizador sin tá ctico b asado en la figura 4 .4 8 entre al esta d o 7 desp ués d e procesar i d + i d ; d e m anera esp ecífica, el analizador sin táctico lleg a a la sig u ien te configuración: P r e fijo E + E P ila E n tra d a 0 14 7 * id $ P or con ven iencia, los sím b olos q ue corresponden a lo s esta d o s 1, 4 y 7 tam b ién se m uestran b ajo PREFIJO. S i * tien e precedencia sobre + , sab em os q ue e l analizador sin tá ctico d eb ería d esplazar a * h acia la pila, preparándose para reducir el * y su s sím b olos i d circun dan tes a u n a expresión. El analizador sin táctico SL R d e la figura 4.37 realizó e s ta elección , con base e n u na g ra m á tica sin am bigüedad para e l m ism o lengu aje. Por o tr a parte, si + tien e p reced en cia sobre * , sabem os q ue el analizador sin tá ctico d eb ería reducir E + E a E. Por lo ta n to , la p reced en cia relativa 280 Capítulo 4. A nálisis sintáctico I0: E '^ - E E E E E h: I 5: ^ -E + E ^ -E*E - » *(E) —» -id & ->EE -> E- + E E -> E - * E E E E E E -> Í' E) -» • E + h- E -» id* h: E E E E E h- E ^ E * - E E ^ -E + E E - > -E* E E-+ÍE) E -+ -id I q: E->(E-) E E E- + E E**E h: E E E E + E • E- + E E -+ - * E h- E E E -> E * E -* E - + E -> E - * E h- E -»• (£)* E •E*E <E) •id -¥E + -E -> • E + E -> • E * E <E) -> •id F igu ra 4.48: C onjuntos d e elem en tos L R (0) para u n a g ra m á tica d e exp resion es au m entada d e + seguid o d e * d eterm in a en form a ú n ica la m anera en q ue d eb ería resolverse e l conflicto d e accion es d e análisis sin tá ctico en tre la reducción E E + E y e l d esp lazam iento so b re * en e l esta d o 7. Si la en tra d a hubiera sid o ¡d + id + id, e l analizador sin tá ctico llegaría d e to d a s form as a u na configuración en la cu a l ten dría la p ila 0 1 4 7 d esp u és d e procesar la en trad a id + id. En la en trad a + hay d e nuevo u n con flicto d e d esp la za m ien to /red u cció n en el e sta d o 7. Sin em ­ bargo, ahora la asociativid ad d el operador - f d eterm in a cóm o d eb e resolverse este con flicto. Si + es asociativo a la izquierda, la acción correcta e s reducir m ed ian te E - + E + E. E s d ecir, los sím b olos id q u e rodean el prim er + d eb en agruparse prim ero. D e nuevo, e s ta elecció n coincide con lo q u e haría e l analizador sin tá ctico SL R para la gra m á tica sin am bigüedad. En resum en, si asum im os q ue + es asociativo p or la izquierda, la acción d el esta d o 7 en la en trad a + d eb ería ser reducir m ed ian te E - » E + E, y su p on ien d o q u e * tien e precedencia sobre + , la acción d el esta d o 7 en la en trad a * sería d esp lazar. D e m anera sim ilar, su pon ien d o q ue * se a asociativo p or la izquierda y ten g a p reced en cia sobre + , p od em os argum entar que e l esta d o 8 , q ue p u ed e aparecer en la parte superior d e la p ila sólo cu a n d o E * E son los tres sím b olos gram aticales d e la p arte superior, d eb ería ten er la acción d e reducir E -► E * E en las entradas + y *. E n el caso d e la en trad a + , la razón e s q ue * tien e p reced en cia so b re + , m ientras q ue e n el caso d e la en tra d a *, el fun dam en to es q u e * e s a so cia tiv o p o r la izquierda. 4.8 Uso d e gram áticas ambiguas 281 S i procedem os d e e s ta form a, ob tend rem os la ta b la d e análisis sin tá ctico L R q ue se m uestra e n la figu ra 4 .49. Las producciones de la 1 a la 4 so n E —►E + E, E —►E * E, —►( E ) y E i d , resp ectivam en te. E s in teresante q ue u na ta b la d e accion es d e an álisis sin tá ctico sim ilar se p rod uzca elim in an d o las reducciones m ediante las producciones sim p les E ->■ T y T -► F a par­ tir d e la ta b la SL R para la g ram ática d e exp resion es sin am bigüedad (4.1) q ue se m uestra en la figu ra 4.37. L as g ram áticas am biguas com o la q ue s e u sa para las exp resion es pueden m anejarse e n u n a form a sim ilar, en el co n tex to d e los an álisis sin tá ctico s LA L R y L R canónico. ACCIÓN ir_A E sta do id 0 + * s4 so r4 r4 s3 1 2 4 s4 rl 6 7 r2 r3 8 9 S s5 s5 r2 r3 E 1 acc 6 r4 r4 S2 S2 s3 s3 5 ) s2 s3 3 ( S2 7 8 s9 rl rl r3 r2 r3 F igu ra 4.49: T ab la d e an álisis sin tá ctico para la gra m á tica (4.3) 4 .8 .2 L a a m b ig ü e d a d d e l “e lse c o lg a n te ” C onsidere d e nuevo la sigu ien te gram ática para las instrucciones condicionales: in s tr -► | ¡ f expr t h e n in s tr e l s e in s tr ¡ f e r p r t h e n in str o tra s C om o v im o s e n la sección 4.3 .2 , e s ta gram á tica no tien e am bigüedades, y a q ue no resuelve la am bigüedad d e l else colgan te. P ara sim plificar la d iscu sión , v a m o s a considerar u n a abstracción d e e s ta gram ática, en d on d e i represen ta a i f expr t h e n , e representa a e l s e , y a representa a “tod as las d em ás producciones”. D e e s ta form a p od em os escribir la gram ática, co n la produc­ ción au m en tad a S ' -+ 5 , com o S ' S -> S -► i S e S (a a | iS | a 7^ { 0( ) L os con ju n tos d e elem en tos L R (0) para la gra m á tica (4.67) se m uestran en la figura 4.50. La am bigüedad en (4.67) p roduce un conflicto d e d esp la za m ien to /red u cció n en J4. A h í, S -»• iS -eS llam a a un d esp lazam iento d e e y, com o SIGUIENTE(5) = { e , $ } , e l elem en to 5 -*■ iS • llam a a la reducción m ediante 5 -► iS e n la en trad a e. 282 Capítulo 4. A nálisis sintáctico /o: h: h- S'^-S S -> •iSeS S^-iS S -a S'^SS - ¥ i-ScS S i‘S S •iSeS S - ¥ •iS S^-a h- S -ya- IA: S -> iS-eS h- S -¥ iSc-S S -> -iSeS S -> 4S S h'- -a S -> iSeS F igu ra 4.50: E stad os L R (0 ) para la g ra m á tica au m en tad a (4.67) T raduciendo e s to d e v u e lta a la term in ología ¡ f - t h e n - e l s e , s i ten em o s a: i f e x p r t h e n in s tr en la pila y a e l s e com o el prim er sím b olo d e en trad a, ¿d eb em os d esplazar e l e l s e h acia la p ila (es decir, d esplazar a e) o reducir i f ex p r t h e n in s tr (es decir, reducir m ed ian te S -*■ i S ) ? L a resp u esta es q ue d eb em os d esplazar el e l s e , y a q u e e s tá “asociado” co n e l t h e n anterior. En la term in ología d e la gram ática (4.6 7 ), la e en la entrada, q ue representa a e l s e , só lo p u ed e form ar parte d e l cuerpo q ue em p ieza con la i S q u e e s tá ah ora en la p arte superior d e l a pila. Si lo q u e sig u e d esp u és d e e en la en trad a no p uede analizarse com o u n a 5, p a ra co m p leta r el cu erpo iS e S , en ton ces p od em os dem ostrar q ue no hay otro an álisis sin tá ctico posible. C oncluim os q u e el con flicto d e d esp lazam ien to /red u cció n en I4 d eb e resolverse a favor d el d esp lazam iento e n la en trad a e. L a ta b la d e análisis sin tá ctico SL R q ue s e con stru yó a p artir de los con jun tos d e elem en tos d e la figura 4 .48, q u e u tiliz a e s ta resolución d el con flicto d e acciones d e análisis sin tá ctico en J4 con la en trad a e, se m uestra en la figura 4.5 1 . Las producciones d e la 1 a la 3 so n S -► iS e S , S iS y S -► a, resp ectivam en te. Acción ir _ A Es t a d o t 0 e S a s2 s3 s2 3 6 4 s3 r3 s5 4 5 1 ace 1 2 5 s2 r3 r2 6 s3 rl rl F igu ra 4.51: T abla d e análisis sin tá ctico L R para la gra m á tica d el “else co lg a n te” 4.8 Uso d e gram áticas ambiguas 283 Por ejem plo, en la en trad a n aea , e l analizador sin táctico realiza los m ovim ientos q ue se mues­ tran en la figura 4.52, correspondientes a la resolución correcta d el “else colgante” . E n la línea (5), el estad o 4 selecciona la acción d e desplazam iento en la en trad a e, m ientras q ue en la lín ea (9), el estad o 4 llam a a la reducción m ediante S - + iS en la en trad a $. P ila 0 a) (2 ) 0 ‘2 (3 ) 0 2 2 (4 ) 0 2 2 3 (5 ) 0 2 2 4 (6 ) (7 ) 0 2 2 4 5 (8 ) 0 2 2 4 5 6 (9 ) (1 0 ) S ím b o lo s 0 2 2 4 5 3 0 2 4 0 1 i ii iza as iiSe iiSea USeS iS S E ntrada A c c ió n iiaeaS iaea S aea 8 ea% ea.§ a$ d e s p la z a r d e s p la z a r d e s p la z a r d e s p la z a r re d u c ir S —>a d e s p la z a r $ re d u c ir $ re d u c ir $ re d u c ir $ a c e p ta r S —>a S —>iSeS 5 —> iS F igu ra 4.52: A cciones d e análisis sin tá ctico co n la en trad a iia ea C on e l fin d e com parar, si n o p od em os usar u na gra m á tica am bigua para especificar instruc­ cion es con d icion ales, en ton ces tendríam os q ue usar una g ra m á tica m ás rob u sta a lo largo d e las líneas d e l ejem p lo 4.16. 4 .8 .3 R e c u p e r a c ió n d e e r r o r e s e n e l a n á lis is s in tá c tic o L R U n analizador sin táctico L R d etec ta r á un error al con su ltar la ta b la d e accion es d e análisis sin tá ctico y encontrar u n a en trad a d e error. Los errores n u n ca se d etecta n al con su ltar l a ta­ b la de ir _ A . U n analizador sin táctico L R anunciará un error ta n pronto com o no h a y a una con tinu ación válida para la porción d e la en trad a q u e s e h a exp lorado h a sta ese m om ento. Un analizador sin táctico L R can ón ico no realizara ni siquiera u n a so la reducción an tes d e anunciar u n error. Los analizadores sin tá ctico s SL R y LA L R pueden realizar varias redu ccion es antes de anunciar u n error, pero n u n ca d esplazarán u n sím b olo d e en trad a erróneo h acia la pila. E n e l an álisis sin táctico LR, p od em os im plem entar la recuperación d e errores en m od o de p ánico d e la sigu ien te m anera. E xp loram os la p ila en form a d escen d en te h a sta encontrar un e sta d o s con un ir _ A en un n o term inal A específico. D esp ués, se d escartan cero o m ás sím bolos d e en trad a h a sta encontrar un sím b olo a q u e p ueda seguir a A d e m anera legítim a. A conti­ nuación, e l analizador sin táctico m ete e l esta d o ir _ A ( s , A ) en la p ila y co n tin ú a con el análisis sin tá ctico norm al. P odría haber m ás d e u na o p ció n p a ra e l no term in al A . Por lo general, ésto s serían n o term in ales q ue representen las piezas principales d el program a, com o u n a expresión, u n a in stru cción o u n bloque. P or ejem plo, si A es e l n o term in al in s tr , a p odría ser u n p u n to y co m a o } , lo cu a l m arca el final d e u n a secu en cia d e instrucciones. E ste m étod o d e recuperación d e errores tra ta d e elim inar la frase q ue co n tien e e l error sin ­ tá ctico . E l analizador sin tá ctico d eterm in a q ue u n a ca d en a q u e p uede derivarse d e A con tien e u n error. P arte d e e sa cad en a y a se h a p rocesado, y e l resu ltad o d e e s te procesam iento es una 284 Capítulo 4. A nálisis sintáctico secu en cia d e estad os en la p arte superior d e la pila. E l resto d e la ca d en a sig u e e n la entrada, y el analizador sin tá ctico tra ta d e om itir el resto d e e s ta ca d en a buscando un sím b olo en la en trad a q ue p u ed a segu ir de m anera leg ítim a a .A. A l elim inar esta d o s d e la pila, e l analizador sin tá ctico sim u la q ue h a en con trad o u n a in stan cia d e A y co n tin ú a con e l an álisis sin tá ctico norm al. P ara im plem entar la recuperación a nivel d e frase, exam in am os ca d a en trad a d e error en la ta b la d e an álisis sin táctico L R y d ecidim os, en base a l u so d e l lenguaje, el error m ás probable del programador que pudiera ocasionar ese error. D espués podem os construir un procedim iento de recuperación d e errores apropiado; se supone que la parte superior d e la p ila y los primeros sím bolos de entrada se modificarían d e u na form a que se considera com o apropiada para ca d a entrada de error. A l d iseñ ar ru tinas d e m anejo d e errores esp ecíficas para un analizador sin tá ctico L R , p o d e­ m os rellenar cad a en trad a en blanco en e l cam p o d e acción con un apuntador a u n a ru tin a d e error q ue tom e la acción apropiada, seleccion ad a por el diseñador d e l com pilador. L as acciones pueden incluir la inserción o elim in ación d e sím b olos d e la p ila o d e la en trad a (o d e am bas), o la alteración y tran sp osición de los sím b olos d e entrada. D eb em os realizar nuestras eleccion es d e ta l form a q ue e l analizador sin táctico L R no entre en un ciclo in finito. U n a e stra teg ia segura asegurará q ue por lo m en os se elim in e o se d esp lace un sím b olo d e en trad a e n un m om ento dado, o que la p ila se red u zca si hem os llegado al final d e la en trad a. D eb em os ev ita r sacar un e sta d o d e la p ila q ue cu b ra un no term inal, y a q ue e s ta m odificación elim in a d e la p ila una con stru cción q ue y a se h aya analizado con éxito. Ejemplo 4.68: C onsidere d e nuevo la sigu ien te g ra m á tica d e expresiones: E - * E + E \ E * E \ ( E) | ¡d La figura 4.53 m uestra la tab la d e an álisis sin tá ctico L R d e la figura 4 .4 9 para e s ta gram á­ tica, m od ificad a para la d etección y recuperación d e errores. H em os m odificado ca d a esta d o q ue llam a a u n a reducción esp ecífica en ciertos sím b olos d e entrada, m ed ian te la su stitu ció n d e las entradas d e error e n ese esta d o por la reducción. E ste cam b io tien e el efecto d e p osp on er la d etección d e errores h a sta q ue se realicen u n a o m ás reducciones, pero e l error seg u irá atrapán­ d o se antes d e que s e realice cualquier d esp lazam ien to. Las en trad as restan tes en blanco d e la figura 4 .4 9 se han su stitu id o por llam adas a las rutinas d e error. Las ru tinas d e error son las siguientes: e l : E sta ru tina se llam a d esd e los esta d o s 0, 2, 4 y 5, y tod os ello s esp eran e l principio d e un operando, y a se a u n id o un paréntesis izquierdo. E n v ez d e ello, se encontró + , * o el final d e la entrada. m eter e l esta d o 3 (el ir _ A d e los esta d o s 0, 2, 4 y 5 en em itir e l d iagn óstico “fa lta op eran d o” . ¡d); e 2 : Se llam a d esd e los esta d o s 0, 1, 2, 4 y 5 a l encontrar u n p arén tesis derecho. elim inar el paréntesis derecho d e la entrada; em itir e l d iagn óstico “p arén tesis derecho d esb alancead o” . 4.8 Uso d e gram áticas ambiguas E stado 0 1 2 3 4 5 6 7 8 9 285 ACCIÓN ir_A id + * ( ) S s3 e3 s3 r4 s3 s3 e3 rl 1-2 r3 el s4 el r4 el el s4 rl r2 r3 el s5 el r4 el el s5 s5 r2 r3 s2 e3 s2 r4 s2 S2 e3 rl r2 r3 e2 e2 e2 r4 e2 e2 s9 rl r2 r3 el ace el r4 el el e4 rl r2 r3 E 1 6 7 8 F igu ra 4.53: T a b la d e an álisis sin tá ctico L R con ru tin a s d e error e 3 : Se llam a desde los estad os 1 o 6 cuando se espera un operador y se encuentra u n i d o parén­ tesis derecho. m eter el esta d o 4 (correspondiente al sím b olo + ) e n la pila; em itir e l d iagn óstico “fa lta un operador” . e 4 : Se llam a d esd e e l e sta d o 6 cu an do se en cu en tra e l final d e la entrada. m eter el esta d o 9 (para un p arén tesis derecho) a la pila; em itir e l d iagn óstico “fa lta paréntesis d erech o”. E n la en trad a errón ea id + ) , la secu en cia d e configuraciones q ue introduce e l analizador sin tá ctico se m u estra e n la figura 4.54. □ 4 .8 .4 E je r c ic io s p a r a la s e c c ió n 4 .8 Ejercicio 4.8.1: L a sigu ien te es u n a gram á tica am bigua para las exp resion es con n operadores binarios infijo, co n n niveles d istin to s d e precedencia: E -► E 6i E | E 02 E | ••• E Qn E | ( E ) | id a) C om o u n a función de n, ¿cuáles so n los con jun tos d e elem en tos SLR? b) ¿C óm o resolvería los co n flictos en los elem en to s SLR , d e m anera q ue to d o s los operado­ res sean asociativos a la izquierda, y que ten g a precedencia sobre 02, q ue tien e prece­ d en cia sobre 03, y así su cesivam en te? c) M uestre la tab la d e análisis sin táctico SL R q ue resu lta d e su s decision es en l a p arte (b). 286 Capítulo 4. A nálisis sintáctico Pila 0 03 01 014 Símbolos id + )« + )3 E E+ 014 E+ 0143 0147 01 E + E+ E+ Entrada Acción id +) S )S S id s s s “p a rén tesis derecho d esb alancead o” e2 elim in a e l paréntesis derecho “fa lta u n op era n d o ” e l m ete e l esta d o 3 en la p ila F igu ra 4.54: M ovim ientos d e análisis sin tá ctico y recuperación d e errores realizados p or un analizador sin táctico LR d ) R ep ita las p a rtes (a) y (c) para la gram ática sin am bigüedad, la cu a l d efine e l m ism o con ju n to d e exp resion es, com o s e m u estra en la figura 4.55. e) ¿C óm o se com paran los con teos d el núm ero d e con jun tos d e elem en to s y los tam años d e las tab las para las d o s gram áticas (am bigua y sin am bigüedad)? ¿Q ué n os d ice e sa com paración acerca d e l u so d e las gram áticas d e exp resion es am biguas? Ei E¿ —> E i 0 Eo | E 2 - + E 2 O E% | E% En E-n+i —> —» En 6 E n + l \ E n+l ( E i ) | id F igu ra 4.55: G ram ática sin am bigüedad para n operadores E j e r c i c i o 4 . 8 . 2 : E n la figura 4 .5 6 h ay u n a gram á tica p a ra cierta s in stru cciones, sim ilar a la que vim os en el ejercicio 4.4.12. D e nuevo, e y s so n term inales q ue representan exp resion es con d icion ales y “otras in stru cciones” , resp ectivam en te. a) C onstruya u n a ta b la de an álisis sin tá ctico L R para e s ta g ra m á tica , resolviendo los con ­ flictos d e la m anera usual p ara el prob lem a d el else colgante. b) Im p lem en te la corrección d e errores, llenando la s en trad as en blanco e n la ta b la d e análi­ sis sin tá ctico co n accion es d e reducción adicionales, o ru tinas d e recuperación d e errores adecuadas. c) M uestre el com p ortam ien to d e s u analizador sin tá ctico co n las sig u ien tes entradas: (i ) (n ) if e then s ; if e then s end while e do begin s ; if e then 5 ; end 4.9 Generadores d e analizadores sintácticos in s tr Usta 287 | if e then in s tr ¡f e then in s tr else while edo in s tr begin Usta end I 5 -► -* | Usta ; in s tr ¿n$£r F igu ra 4.56: U n a g ra m á tica p a ra cierto s tip o s d e instrucciones 4.9 G e n e ra d o re s d e a n a liz a d o re s s in tá c tic o s E n e s ta sección verem os cóm o p uede usarse un generador d e analizadores sin tá ctico s para facilitar la con stru cción d el front-end d e usuario d e un com pilador. U tilizarem os e l generador d e analizadores sin tácticos L A L R d e nom bre Y acc co m o la base d e n uestra ex p lica ció n , y a que im p lem en ta m uchos d e los co n cep to s q ue vim os en las d os seccio n es anteriores, y s e em p lea m ucho. Y acc sign ifica “y e t another com piler-com piler” (o tro com pilador-de com piladores m ás), lo cu a l refleja la popularidad d e los generadores d e analizadores sin tácticos a principios d e la d écad a d e 1970, cu an do S. C. Johnson creó la prim era versión d e Yacc. E ste generador e s tá d isp o­ nible en form a de com ando en el sistem a en U N IX , y se h a utilizado para ayudar a im plem entar m uchos com piladores d e producción. 4 .9 .1 E l g e n e r a d o r d e a n a liz a d o r e s s in tá c tic o s Y a c c P u ed e con stru irse un trad u ctor m ed ian te el u so d e Y acc d e la form a q ue s e ilu stra en la figura 4 .57. E n prim er lugar s e prepara u n archivo, por decir t r a d u c i r .y , el cual co n tien e u na espe­ cificación d e Y acc d e l traductor. E l sigu ien te com an d o d el siste m a U N IX: yacc tr a d u c ir .y tran sform a el archivo t r a d u c i r . y en u n program a en C llam ad o y . t a b . c , u sand o e l m étodo LA L R d escrito en e l algoritm o 4.63. E l program a y . t a b . c es u n a representación d e un anali­ zador sin táctico L A L R escrito en C , ju n to co n otra s ru tinas en C q ue e l usuario p u ed e haber preparado. L a ta b la d e análisis sin tá ctico L R se co m p a cta segú n lo d escrito en la secció n 4.7. A l com pilar y . t a b . c ju n to co n la b ib lioteca l y q ue co n tien e e l program a d e an álisis sin táctico L R m ediante el uso d el com ando: cc y .t a b .c - l y o b ten em o s e l program a o b je to a . o u t d esea d o , el cu a l realiza la traducción esp ecifica d a por el program a original en Y acc .7 Si s e n ecesitan o tro s p roced im ien tos, p ueden com p ilarse o cargarse c o n y . t a b . c , d e igual form a q u e co n cualquier program a en C. U n program a fuente en Y acc tien e tres partes: 7 E l n o m b r e l y e s d e p e n d ie n te d e l sistem a. 288 Capítulo 4. A nálisis sintáctico E specificación d e Y a cc----traducir.y y.tab.c --- en trad a F igu ra 4.57: C reación d e un traductor d e en tra d a /sa lid a con Yacc declaraciones 11 reglas de traducción TI sop orte d e las rutinas en C 4 . 6 9 : P ara ilustrar cóm o preparar u n program a fuente e n Y acc, vam os a construir una calcu lad ora d e escritorio sim p le q ue lee una exp resión aritm ética, la evalúa e im prim e su valor num érico. V am os a construir la calcu lad ora de escritorio em p ezan d o co n la sig u ien te gra­ m á tica para las exp resion es aritm éticas: E je m p lo E T R E + T 1T T* F | F -> (E ) | digit El token dígito e s u n solo d íg ito en tre 0 y 9. E n la figura 4 .5 8 se m uestra u n program a d e calcu ladora de escritorio e n Y acc, derivado a p artir d e e s ta gram ática. □ L a p a rte d e la s d e c la r a c io n e s Hay d os secciones en la p arte d e las declaraciones d e un program a en Y acc; am bas so n o p cio­ nales. E n la prim era sección, colocam os las declaraciones ordinarias en C , d elim ita d a s m ediante 7Á y 7o>- A q u í colocam os las declaraciones d e cualquier valor tem poral u sad o por las reglas d e trad ucción o los procedim ientos d e las seccion es seg u n d a y tercera. E n la figura 4 .5 8 , e s ta sección con tien e sólo la sigu ien te instrucción d e inclusión: # in c lu d e < c t y p e .h > la cu al o ca sio n a q ue e l preprocesador d e C incluya e l archivo d e encabezado están dar < cty p e .h>, e l cu al con tien e el predicado i s d i g i t . A dem ás, en la parte d e las declaraciones se en cu en tran las declaraciones d e lo s tokens d e gram ática. E n la figura 4.58, la instrucción #/otoken DIGITO 4.9 Generadores d e analizadores sintácticos 289 /{ # in c lu d e < c t y p e .h > %} %token DIGITO U lin e a : { p r i n t f ("°/0d \n " , $ 1 ) ; } expr )\ n > exp r t : e x p r >+ > ter m I ter m { $ $ = $1 + $ 3 ; } term » : term }* } f a c t o r I fa c to r { $ $ = $1 * $ 3 ; } fa c to r » : >( > e x p r I DIGITO {$ $ = $2; } °/o°/o y y le x O { in t c; c = g etc h a r(); if (is d ig it(c )) { y y l v a l = c - ’ 0 *; r e t u r n DIGITO; > r e tu r n c; } F igu ra 4.58: E specificación d e Y acc d e u na calcu lad ora d e escritorio sim ple d eclara a DIGITO com o un tok en . Los tokens declarados en e s ta sección pueden usarse en las p artes seg u n d a y tercera d e la especificación d e Y acc. Si s e u tiliza L ex p a ra crear el analizador léxico q ue p asa el tok en al analizador sin tá ctico Y acc, en to n ces esta s declaraciones d e tokens tam b ién se vu elven d isp on ib les para e l analizador gen erad o por Lex, com o v im o s en la sección 3.5.2. La parte de las reglas de traducción E n la p arte d e la especificación d e Y acc d esp u és d e l prim er par d e I ! , colo ca m o s las reglas de traducción. C ad a regla co n siste e n u n a producción gram a tica l y la acción sem á n tica asociada. U n con ju n to d e p roducciones q ue hem os esta d o escribien do como: (encabezado) -*■ (cuerpo)i | (cu erp o ^ p od ría escribirse en Y acc d e la sigu ien te manera: | ••• | (cuerpo)„ 290 Capítulo 4. A nálisis sintáctico (encabezado) : (cuerpo) i I (cuerpo )2 { (acción sem án tica) i > { (acción sem á n tica )2 } I { (acción sem án tica) n > (cuerpo) n En u na producción d e Yacc, las cad en as sin com illas d e letras y d íg ito s q ue no se declaren com o tokens se consideran com o no term inales. U n so lo carácter entre co m illa s, por ejem p lo yc } , se con sid era co m o el sím b olo term inal c , a sí com o e l có d ig o en tero para e l tok en representado por e se carácter (es decir, L ex d evolvería el cód ig o d e carácter p a ra *c , al analizador sin táctico, com o u n en tero). L os cu erp os altern ativos pueden separarse m ed ian te una barra vertical; ade­ m ás s e co lo c a un p u n to y co m a d esp u és d e ca d a en cab ezad o con su s altern ativas y su s acciones sem án ticas. E l prim er en cab ezad o se con sid era com o e l sím b olo inicial. U n a acción sem á n tica d e Y acc e s u n a secu en cia d e instrucciones e n C . E n u n a acción se­ m ántica, el sím b olo $$ se refiere al valor del atrib u to asociado co n e l no term in al d el en ca b e­ zado, m ientras q ue $¿ s e refiere al valor asociado co n e l ¿-ésim o sím b o lo gram atical (term inal o no term inal) d el cuerpo. L a acción sem án tica se realiza cada v ez q ue reducim os m ediante la producción asociada, por lo que norm alm ente la acción sem á n tica ca lcu la u n valor para $$ en térm inos d e los $¿’s . E n la especificación d e Y acc, h em os escrito las d o s prod uccion es E siguientes: £ -* E + T | T y su s accion es sem án ticas asociadas como: ex p r : e x p r } + } ter m I ter m { $$ = $1 + $ 3 ; } O bserve q ue e l no term inal ter m en la prim era producción es el tercer sím b olo gram atical d el cuerpo, m ientras q ue + es el segundo. L a acción sem á n tica asociad a c o n la p rim era producción agrega e l valor d e la e x p r y la term d el cuerpo, y asign a el resu ltad o com o el va lo r p a ra e l n o term inal e x p r del en cab ezado. H em os o m itid o d el to d o la acción sem á n tica p a ra la segunda producción, y a q ue copiar e l valor es la acción predeterm inada para la s producciones co n un solo sím b olo gram atical en el cuerpo. E n general, { $$ = $ 1 ; } es la acción sem á n tica p rede­ term inada. O bserve q ue hem os agregado u na n ueva producción inicial: lin e a : expr , \ n > { p r i n t f ("°/od\n", $ 1 ) ; } a la especificación d e Y acc. E s ta p rod ucción in d ica q ue u n a en trad a para la calcu lad ora d e escritorio d eb e ser una expresión segu id a d e u n carácter d e nueva línea. L a acción sem á n tica asociad a con e s ta producción im prim e el valor d ecim al d e la expresión q ue v a se g u id a d e un carácter d e nueva línea. 4.9 Generadores d e analizadores sintácticos 291 La parte de las rutinas de soporte en C L a tercera p arte d e u n a especificación d e Y acc co n siste e n las rutinas d e so p o rte en C . D ebe proporcionarse un analizador léxico m ed ian te el nom bre y y l e x ( ) . L a elección com ú n es usar L ex para producir y y l e x ( ) ; v ea la sección 4 .9 .3 . P u ed en agregarse o tro s p rocedim ien tos com o las ru tinas d e recuperación d e errores, seg ú n s e a necesario. E l analizador léxico y y l e x O produce tokens q u e co n sisten e n un nom bre d e token y su valor d e atrib u to asociado. S i se d evu elv e e l nom bre d e un token com o DIGITO, e l nom bre del token d eb e declararse en la prim era sección d e la especificación d e Y acc. E l valor d e l atributo asociad o co n un token s e com u n ica a l analizador sin tá ctico , a través d e u n a variable y y l v a l d efin id a por Y acc. E l analizador léxico en la figura 4 .5 8 es b astan te burdo. L ee un carácter d e en tra d a a la vez, usand o la función d e C g e t c h a r ( ) . Si el carácter es u n d ígito, el valor d el d íg ito se alm acena e n la variable y y l v a l y se d evu elv e e l nom bre d e token DIGITO. E n cualquier otro caso, se d evu elv e e l m ism o carácter com o e l nom bre d e token. 4 .9 .2 U s o d e Y a c c c o n g r a m á ti c a s a m b ig u a s A hora vam os a m odificar la especificación d e Y acc, d e ta l form a q ue la calcu lad ora d e escrito­ rio resu ltan te se a m ás ú til. E n prim er lugar, vam os a p erm itir q u e la calcu lad ora d e escritorio ev a lú e u na secu en cia d e expresiones, d e u na a u n a lín ea. Tam bién vam os a p erm itir lín eas en b lanco en tre las exp resion es. P ara ello, cam biarem os la prim er reg la a: lin e a s : l in e a s expr )\ n ) I lin e a s }\ n } I /* v a c ia * / { p r i n t f ("70g \ n " , $ 2 ) ; > » E n Y acc, u n a altern a tiv a vacía, com o lo es la tercera lín ea, d en o ta a e. E n segun do lugar, d eb em os agrandar la cla se d e exp resion es para incluir núm eros en vez d e d íg ito s individuales, y para incluir los operadores aritm éticos + , —, (ta n to binarios com o u n a rio s), * y / . L a m anera m ás se n c illa d e especificar e s ta cla se d e exp resion es es utilizar la sigu ien te g ra m á tica am bigua: E E + E | E —E | E * E \ E / E \ —E | numero L a especificación resu ltan te d e Y acc se m u estra e n la figura 4.59. C om o la gram ática en la especificación d e Y acc en la figura 4.59 e s am bigua, el algoritm o LA L R generará con flictos d e accion es d e an álisis sin tá ctico . Y acc reporta el núm ero d e con ­ flictos d e accion es d e an álisis sin tá ctico q ue se generan. P od em os ob ten er u n a d escrip ción de los con ju n tos d e elem en tos y lo s co n flictos d e accion es d e an álisis sin tá ctico si in vocam os a Y acc con u na op ción - v . E s ta o p ción g en era u n archivo adicional y .o u t p u t , e l cu a l con tien e los corazones d e los con jun tos d e elem en to s en con trad os para la gram ática, u n a descripción d e los co n flictos d e accion es d e an álisis sin tá ctico generados p o r el algoritm o L A L R , y una representación legible d e la ta b la d e an álisis sin tá ctico L R q ue m uestra cóm o se resolvieron los con flictos d e accion es d e an álisis sin táctico . C ad a v e z q ue Y acc rep o rta q u e h a encontrado 292 Capítulo 4. A nálisis sintáctico %í #include <ctype.h> #include <stdio.h> #define YYST YPE double / * t i p o d o u b l e p a r a l a p i l a d e Y a c c */ 7o> °/0t o k e n N U M E R O %left >+ \ >/> Xleft %right UMENOS II li n e s : l ines expr I lines \n > { p r i n t f (" 7 o g \n " , $2); > 'Xn* I / * v a c i a */ expr : expr ’+ ’ expr { $$ = $1 + $3; } 1 expr expr { $$ = $1 - $3; } 1 expr expr { $$ = $1 * $3; } 1 expr ' / ’ expr { $$ = $1 / $3; } 1 '( ’ expr { $$ = $2; > 1 »-» e x p r % p r e c U M E N O S { $ $ = - $2; I NUMERO 7.7o yylexO { i n t c; while ( ( c = getchar() ) ) = * y ) ; if ( ( c = = > . ' ) M (isdigit(c)) ) { unget(c, stdin); scanf( "7olf" , &yyval) ; return N U M E R O ; > r e t u r n c; F igu ra 4.59: E specificación d e Y acc para u n a calcu ladora d e escritorio m á s avanzada 4.9 Generadores d e analizadores sintácticos 293 co n flictos d e accion es d e an álisis sin táctico, e s con ven iente crear y co n su lta r e l archivo y . o u tp u t para ver p or q u é se generaron los co n flictos d e accion es d e an álisis sin tá ctico y si se resolvieron e n form a correcta. A m enos q ue se indique lo contrario, Y acc resolverá to d o s los co n flicto s d e las accion es de an álisis sin táctico m ediante las sigu ien tes d o s reglas: 1. U n con flicto d e red u cción /red u cción se resu elve eligiend o la producción en co n flicto que se presen te prim ero en la especificación d e Y acc. 2. U n con flicto d e d esp lazam ien to/red u cció n se resu elve a favor d el d esp lazam ien to. E sta regla resuelve en form a correcta e l con flicto d e d esp la za m ien to /red u cció n o ca sio n a d o por la am bigüedad d e l else colgante. C om o esta s reglas p redeterm inadas no siem p re p ueden ser lo q u e d esea e l escritor de com p ilad ores, Y acc prop orciona un m ecanism o gen eral p a ra resolver los con flictos d e despla­ zam ien to/red u cción . E n la p orción d e las d eclaraciones, p od em os asignar precedencias y asocia tiv id a d es a las term inales. L a sigu ien te declaración: #/o le f t hace q ue + y - sean d e la m ism a p reced en cia y a sociativos a la izquierda. P od em os declarar un operador com o asociativo a la d erech a si escribim os lo siguiente: % right y p od em os forzar a un operador para q ue se a u n operador binario sin a so ciativid ad (es d ecir, no p ueden com b inarse d o s ocurrencias d e l operador d e n inguna m anera) escribien do lo siguiente: 7 o n o n asso c }< y Los tokens reciben las precedencias en e l orden e n e l q u e aparecen en la parte d e las decla­ racion es, en d ond e la m enor p reced en cia va prim ero. Los tokens en la m ism a d eclaración tienen la m ism a precedencia. A sí, la declaración •/«right UMENOS e n la figura 4 .59 proporciona a l token UMENOS un nivel d e precedencia m ayor q u e e l d e la s cinco term in ales anteriores. Y acc resu elve los con flictos d e d esp lazam ien to /red u cció n adjuntando u na precedencia y una asociativid ad a cad a u n a d e las producciones involucradas en u n con flicto, a sí com o tam b ién a ca d a term inal involucrada e n un con flicto. S i d eb e eleg ir entre desplazar e l sím b olo d e en trad a a y reducir m ediante la producción A a , Y acc redu ce s i la p reced en cia d e l a p rod ucción es m ayor q ue la de a, o si las precedencias son igu ales y la a so ciativid ad d e la producción e s l e f t . E n cualquier otro ca so , e l d esp lazam iento es la acción elegida. P or lo general, la precedencia d e u n a producción se con sid era igual a e l d e s u term inal por la derecha. É s ta es la decisión se n sa ta e n la m ayoría d e los casos. P or ejem plo, d ad as las sigu ien tes producciones: E E + E I E+ E 294 Capítulo 4. A nálisis sintáctico sería preferible reducir m ed ian te E -► E + E co n e l sím b olo d e anticipación +, y a q u e el + en e l cu erpo tien e la m ism a p reced en cia q ue e l sím b olo d e an ticip ación , pero es asociativo a la izquierda. C on e l sím b olo d e an ticip ación *, sería m ás preferible desplazar, y a q u e é s te tien e u na precedencia m ayor q ue la d el + e n la producción. En esa s situ a cio n es e n las q ue el term inal p or la d erech a no p rop orciona la precedencia apropiada a u n a producción, p od em os forzar e l u so d e u n a precedencia si adju ntam os a u na p roducción la sigu ien te etiqueta: c/0p r e c (term inal) La p reced en cia y la asociativid ad d e la producción serán en ton ces igu ales q u e la d e l term inal, q ue se su p on e está definida en la sección de declaraciones. Y acc n o reporta los con flictos d e d esp lazam ien to/red u cción q ue se resu elven usando este m ecanism o d e precedencia y a so cia ti­ vid ad. E ste “term in al” p od ría ser un receptáculo com o UMENOS en la figura 4.59: e l analizador léxi­ co n o d evu elv e e s te term inal, sin o q ue e s tá declarado c o n e l único fin d e definir u n a p reced en cia para u n a producción. E n la figura 4.59, la declaración °/«right UMENOS asign a al token UMENOS u na p reced en cia m ayor q ue la d e * y / . E n la parte d e las reglas d e traducción, la etiqueta: °/0p r e c UMENOS al final d e la producción exp r : *-* e x p r h ace q ue el operador d e r e sta im ario en e s ta producción te n g a u na m enor p reced en cia q ue cualquier otro operador. 4 .9 .3 C r e a c ió n d e a n a liz a d o r e s lé x ic o s d e Y a c c c o n L e x Lex se d iseñ ó para producir analizadores léxicos q ue pudieran utilizarse co n Y acc. L a b ib lio te­ c a 11 d e Lex proporciona un program a controlador llam ad o y y l e x ( ) , e l nom bre q ue Y acc re­ quiere para su analizador léxico. S i se u tiliza L ex para producir e l analizador léxico, su stitu im os la ru tin a y y l e x ( ) en la tercera p arte de la especificación d e Y acc con la sigu ien te instrucción: # in c lu d e " l e x . y y .c " y hacem os q ue ca d a acción d e L ex d evu elva un term inal co n o cid o a Y acc. A l usar la instruc­ ción # in c lu d e " l e x . y y .c " , e l program a y y l e x tien e acceso a los nom bres d e Y a cc para los tokens, y a q ue el archivo d e salida d e Lex se com p ila com o parte d el archivo d e salida y . t a b . c d e Yacc. En el siste m a U N IX , si la especificación d e L ex e s tá en el archivo p r im e r o . 1 y la especifi­ cación d e Y acc e n s e g u n d o .y , p od em os escribir lo siguiente: 4.9 Generadores d e analizadores sintácticos 295 lex primero.1 yacc segundo.y cc y.tab.c -ly -11 para ob tener e l trad uctor deseado. L a especificación de L ex en la figura 4 .6 0 p uede usarse e n v e z d e l analizador léxico d e la figu ra 4.59. E l ú ltim o patrón, q ue sig n ifica “cualquier carácter” , d eb e escribirse com o \ n l . y a q u e e l punto en L ex coin cid e con cualquier carácter, ex cep to el d e n u eva línea. numero TI [ ] {numero} \nl. [0 -9 ]+ \ e . ? | [0 -9 ] * \ e .[0 - 9 ]+ { /* omitir espacios en blanco */ { sscanf(yytext, "%lf", fcyylval); return NUMERO; } { return yytext[0]; } } F igu ra 4.60: E specificación d e L ex p a ra y y le x O en la figura 4.59 4 .9 .4 R e c u p e r a c ió n d e e r r o r e s e n Y a c c E n Y acc, la recuperación d e errores u tiliza u na form a d e producciones d e error. E n prim er lu­ gar, e l usuario d ecide q ué n o term inales “im p ortan tes” tendrán la recuperación d e errores aso­ ciad o co n ellas. L as eleccion es típ icas so n cier to su bconjun to d e los no term inales q ue generan exp resion es, in stru cciones, bloqu es y funciones. D esp u és e l usuario agrega a la s p roducciones de error gram aticales d e la form a A -+ e r r o r a , e n d ond e A e s un no term inal im p ortan te y a es u na cad en a d e sím b olos gram aticales, tal vez la ca d en a vacía; e r r o r es una palabra reservada d e Y acc. Y acc generará un analizador sin tá ctico a partir d e d ich a especificación, tratan d o a las producciones d e error com o p roducciones ordinarias. N o o b sta n te , cu an d o e l analizador sin tá ctico generado p or Y acc en cu en tra un error, tra ta a los estad os cu yos con jun tos d e elem en to s co n tien en producciones d e error d e u na m anera esp ecial. A l encontrar u n error, Y acc sa c a sím b olos d e su p ila h a sta q u e en cu en tra e l esta d o en la parte superior d e su p ila cuyo conjunto subyacente d e elem entos incluya a un elem ento d e la form a A —> e r r o r a . D espués, el analizador sin táctico “desplaza” un token ficticio e r r o r hacia la pila, com o si hubiera v isto el token e r r o r en su entrada. C uan do a e s e, se realiza u na reducción a A d e inm ediato y s e in voca la acción sem á n tica aso cia d a con la producción A ->■ • e r r o r (que p o d ría ser u n a ru tina d e recuperación d e errores esp ecificad a p o r el u suario). D esp ués, e l analizador sin tá ctico d esca rta los sím b olos d e en trad a h a sta que en cu en tra uno co n e l cu a l p ueda continuar e l an álisis sin tá ctico norm al. S i a no e s tá vacía, Y acc sig u e recorriendo la en trad a, ignorando los sím b olos h a sta que en cu en tra u n a su b ca d en a q u e p u ed a reducirse a a . Si a co n siste só lo e n term inales, entonces b u sca e s ta cad en a d e term in ales en la en trad a y los “reduce” al d esp lazarlas h acia la pila. En e s te p u n to, el analizador sin tá ctico ten drá a e r r o r a en la parte superior d e s u p ila. D espués, e l analizador sin tá ctico reducirá e r r o r a a i y continuará con e l an álisis sin tá ctico norm al. P or ejem p lo, u n a p rod ucción d e error d e la sig u ien te forma: 296 Capítulo 4. A nálisis sintáctico °/oí # in c lu d e < c t y p e .h > # in c lu d e < s t d i o .h > # d e f in e YYSTYPE d o u b le / * t i p o d o u b le p a r a l a p i l a d e Y ace * / °/o> #/otoken NUMERO 7 o le ft >+ > >-> % le ft >*> >/* % right UMENOS Ti lin e a s : I I I l in e a s expr , \ n > { p r in tf ( " % g \n " , $ 2 ) ; } lin e a s }\ n í /* v a c ia * / e r r o r , \ n > { y y e r r o r ( " r e in t r o d u z c a l i n e a a n t e r i o r : " ) ; yyerrok; > expr ex p r ex p r expr } * } e x p r >/> ex p r ex p r NUMERO ex p r ex p r ex p r ex p r $1 + $ 3 ; $1 - $3; $1 * $ 3 ; °/,prec UMENOS $1 / $ 3 ; $2 ; > 5$ = - $2; Ti # in c lu d e " l e x . y y .c " F igu ra 4.61: C alculadora d e escritorio co n recuperación d e errores in s tr —►e r r o r ; esp ecificaría al analizador sin tá ctico q ue d eb e om itir lo q ue e s té m ás a llá d esp u és d e l siguiente p unto y co m a al ver un error, y d eb e su pon er q ue se h a en con trad o u n a instrucción. L a rutina sem á n tica p ara e s ta producción d e error no ten d ría q u e m anipular la entrada, pero p o d r ía g e­ nerar un m en saje d e d iagn óstico y estab lecer u na bandera para inhibir la generación d e cód igo o b jeto , por ejem plo. E j e m p lo 4 .7 0 : L a figura 4 .61 m u estra la calcu lad ora d e escritorio Y acc d e la figu ra 4 .5 9 , con la sig u ien te producción d e error: lin e a s : e r r o r *\n * E s ta producción d e error hace q ue la calcu lad ora d e escritorio su sp en d a el análisis sin tá ctico norm al al encontrar un error sin táctico en u na línea d e entrada. A l encontrar e l error, e l ana­ 4.10 Resumen d el capítulo 4 297 lizador sin tá ctico e n la calcu ladora d e escritorio em p ieza a sacar sím b olos d e su p ila h a sta que en cu en tra un esta d o co n una acción de d esp lazam iento en el token e r r o r . E l esta d o 0 es un esta d o d e e s te tip o (en e s te ejem p lo, es el ú n ico esta d o así), y a q ue su s elem en to s incluyen: lineas - » - e r r o r , \ n > A dem ás, el e sta d o 0 siem p re se en cu en tra e n la p arte inferior d e la pila. E l analizador sin tá cti­ co d esp la za el token e r r o r hacia la pila y desp ués co n tin ú a ignorando sím b olos en la en trad a h a sta encontrar u n carácter d e n u eva línea. E n e s te p u n to , e l analizador sin tá ctico d esp la za el carácter d e n u eva lín ea h acia la p ila, reduce e r r o r , \ n > a lin eas, y em ite e l m en saje d e diag­ n óstico “rein trodu zca lin ea anterior:” . L a ru tina esp ecia l d e Y acc llam ad a y y e r r o k restablece e l analizador sin tá ctico a su m od o norm al d e operación. □ 4 .9 .5 E je r c ic io s p a r a la s e c c ió n 4 .9 E j e r c ic io 4 .9 .1 : E scriba u n program a en Y a cc q ue recib a ex p resion es boolean as com o en trad a [según lo indicado p or la gram ática d e l ejercicio 4 .2 .2(g)] y p rod uzca e l valor verdadero d e las expresiones. E j e r c ic io 4 .9 .2 : E scriba un program a e n Y acc q ue recib a lista s (según lo d efinido p or la gra m á tica d e l ejercicio 4 .2 .2 (e ), p ero co n cualquier carácter in dividu al com o elem en to, no sólo a) y p rod uzca com o sa lid a u n a representación lineal d e la m ism a lista; por ejem p lo , u na lista in dividu al de los elem en tos, en e l m ism o orden en el q ue aparecen e n la entrada. E j e r c ic io 4 .9 .3 : E scrib a u n program a e n Y acc q u e indique si s u en trad a es u n p alín drom o (secu en cia d e caracteres q ue se leen igu al al derecho y a l revés). E j e r c ic io 4 .9 .4 : E scriba un program a en Y acc q ue reciba expresiones regulares (según lo de­ finido por la gram ática del ejercicio 4 .2 .2(d), pero con cualquier carácter individual com o ar­ gu m ento, no só lo a) y produzca com o salid a u na ta b la d e transición para un a u tó m a ta finito no d eterm in ista q ue reconozca e l m ism o lenguaje. 4 .10 R e su m e n d e l c a p ítu lo 4 ♦ A n alizadores sin tá c tic o s. U n analizador sin tá ctico recibe com o en trad a tokens d e l anali­ zador léxico, y tr a ta los nom bres d e los tokens com o sím b olos term inales d e u n a gram ática libre d e co n tex to . D esp ués, el analizador con stru ye un árbol d e an álisis sin táctico para su secu en cia d e tokens d e entrada; e l árbol d e análisis sin tá ctico p uede construirse en sentido figurado (pasando por los pasos d e derivación correspondientes) o en form a literal. ♦ G ram áticas libres d e con texto. U n a gra m á tica esp ecifica u n con ju n to d e sím b olos ter­ m inales (entradas), otro con ju n to d e no term in a les (sím bolos q ue representan construc­ cion es sin tácticas) y un con ju n to d e producciones, ca d a u n a d e la s cu ales proporciona u na form a en la q ue s e p ueden construir la s cad en as representadas por u n no term inal, a partir d e sím b olos term inales y cad en as representados p or o tro s no term in ales. U na producción co n siste en un en cab ezad o (el no term inal a su stitu ir) y un cu erpo (la cad en a d e sím b olos gram aticales d e su stitu ció n ). Capítulo 4. A nálisis sintáctico D eriva cio n es. A l proceso d e em pezar con el no term inal inicial d e u n a g ra m á tica y su s­ titu irlo en form a rep etid a p or el cu erpo d e u n a d e su s producciones se le co n o ce com o derivación. S i siem p re se su stitu y e el n o term inal por la izquierda (o por la d erech a), en ­ ton ces a la d erivación se le llam a por la izquierda (o resp ectivam en te, p or la derecha). Árboles de análisis sintáctico. U n árbol d e análisis sin táctico es u na im agen de u na deriva­ ción, en la cual hay un nodo para cad a no term inal que aparece en la derivación. Los hijos de un nodo son los sím bolos m ediante los cuales se su stitu ye este no term inal en la derivación. Hay u na correspondencia d e uno a uno entre los árboles d e análisis sintáctico, las derivacio­ nes por la izquierda y las derivaciones por la derecha d e la m ism a cad en a d e terminales. A m bigüedad. U n a gram ática para la cu a l cierta ca d en a d e term inales tien e d os o más árboles d e análisis sin tá ctico d istin tos, o en form a eq u ivalen te, d os o m ás derivaciones por la izquierda, o d o s o m ás d erivaciones por la derecha, se con sid era am bigua. E n la m ayoría d e los casos d e interés p ráctico, es p o sib le rediseñar u n a g ra m á tica am b igu a d e tal form a q ue se co n vierta en u n a gram ática sin am bigüedad para e l m ism o lenguaje. N o ob stan te, las gram áticas am biguas con cierto s trucos aplicados n os llevan algunas veces a la producción d e analizadores sin tá ctico s m ás eficientes. A n á lisis sin tá c tic o d escen d en te y ascen den te. Por lo general, los analizadores sin tá ctico s se diferencian en base a si trabajan d e arriba h acia a b ajo (si em p iezan con e l sím b olo inicial d e la gram ática y con stru yen el árbol d e an álisis sin tá ctico partiendo d e la p arte superior) o d e ab ajo h acia arriba (si em p iezan con los sím b olos term in ales q ue form an las h ojas d e l árbol d e an álisis sin tá ctico y con stru yen e l árbol partiendo d e la parte inferior). Los analizadores sin tá ctico s d escen dentes incluyen los analizadores sin tá ctico s con d es­ cen so recursivo y LL , m ientras que las form as m ás com u n es d e analizadores sin tá ctico s ascen dentes son analizadores sin tá ctico s LR. D iseñ o de gram áticas. A m enudo, las gram áticas ad ecu ad as p a ra e l an álisis sin tá ctico d escen d en te son m ás d ifíciles d e d iseñ ar q ue las u tilizad as por los analizadores sin tá ctico s ascendentes. E s necesario elim inar la recursividad p or la izquierda, u n a situ a ció n en la q ue un no term inal deriva a u n a cad en a q ue em p ieza co n el m ism o no term inal. Tam bién d eb em os factorizar por la izquierda; las p roducciones d e grupo para e l m ism o n o term i­ nal q ue ten gan u n prefijo com ú n e n el cuerpo. A n alizadores sin tá c tic o s d e descen so recu rsivo. E sto s analizadores sin tá ctico s usan un procedim iento para ca d a no term inal. E l p rocedim ien to a n a liza s u en tra d a y d ecid e q ué pro­ ducción aplicar para s u no term inal. Los term inales en el cu erpo d e la producción se relacionan con la en trad a en e l m om ento apropiado, m ientras q ue las no term in a les en el cu erpo producen llam adas a su procedim iento. E l rastreo h a cia atrás, en e l ca so de cu an do se elige la producción incorrecta, es u n a posibilidad. A n alizadores sin tá c tic o s L L (1 ). U n a gram á tica en la q ue es p o sib le elegir la producción correcta co n la cu a l s e p u ed a expandir un no term inal d ado, con so lo analizar e l sigu ien te sím b olo d e entrada, s e con oce com o L L (1). E sta s g ram áticas nos p erm iten construir u na ta b la d e an álisis sin tá ctico p red ictivo q ue proporcione, para ca d a no term inal y cada sím b olo d e preanálisis, la elección d e la producción correcta. L a corrección d e errores se p uede facilitar a l colocar las ru tinas d e error en algunas, o en to d a s las entradas en la ta b la q ue no ten gan u na producción legítim a. 4.10 Resumen d el capítulo 4 299 ♦ A n á lisis sin tá c tic o de desplazam ien to-redu cción . P or lo gen eral, los analizadores sin tác­ ticos ascen d en tes op eran m ed ian te la elección , en base a l sig u ien te sím b olo d e en trad a (sím bolo de anticipación) y e l con ten ido d e la p ila, d e s i d eb en d esp lazar la sig u ien te en­ trad a hacia la pila, o reducir algunos sím b olos en la parte su perior d e la m ism a. U n paso d e reducción to m a u n cu erpo d e producción d e la p arte su perior d e la p ila y lo su stitu y e por el en cab ezad o d e la producción. ♦ P refijos viables. E n e l análisis sin táctico d e desplazam iento-reducción, e l con ten ido d e la p ila siem p re es u n prefijo viable; es decir, u n prefijo d e cierta form a d e frase d erech a que term in a a la derecha, no m ás allá d el final d el m ango d e ésta . E l m ango es la su bcadena que se introdujo e n e l ú ltim o p aso d e la d erivación por la derecha d e e sa form a d e frase. ♦ E lem en tos válid o s. U n elem en to es u n a producción co n un punto en algu na p a rte del cuerpo. U n elem en to e s válid o para un prefijo viab le si la producción d e e s e elem en to se u tiliza para generar e l m ango, y e l prefijo viab le incluye to d o s eso s sím b olos a la izquier­ d a d e l punto, p ero no los q ue está n abajo. ♦ A n alizadores sin tá c tic o s L R . C a d a uno d e los diversos tip o s d e analizadores sin tá ctico s LR o p era construyendo prim ero los conjuntos d e elem entos válidos (llam ados estad os LR) para tod os los prefijos viab les posibles, y llevando e l registro d e l esta d o para c a d a p re­ fijo en la pila. E l con ju n to de elem en to s válidos g u ía la d ecisión d e análisis sin tá ctico de desplazam iento-reducción. Preferim os reducir si h ay un elem en to válido con e l punto en el extrem o derecho del cu erpo, y d esplazam os e l sím b olo d e anticipación h acia la p ila s i ese sím b olo aparece ju sto a la derecha d el punto, en algún elem en to válido. ♦ A n alizadores sin tá c tic o s L R sim ples. E n un analizador sin tá ctico SLR , realizam os una reducción im plicad a por un elem en to válid o c o n u n p u n to en el extrem o d erech o, siem pre y cu an d o el sím b olo d e an ticip ación pueda seguir e l en cab ezad o d e e s a producción en algu na forma de frase. L a gram ática es SLR , y este m éto d o p uede aplicarse si no hay con flictos d e accion es d e análisis sin táctico; es decir, q u e p a ra ningún con ju n to d e ele­ m en tos y para ningún sím b olo d e anticipación haya d o s producciones m ediante la s cuales se p u ed a realizar u n a reducción, n i e x is ta la o p ció n d e reducir o desplazar. ♦ A n alizadores sin tá c tic o s L R canónicos. E sta form a m ás co m p leja d e analizador sin táctico LR u tiliza elem en tos que s e au m entan m ed ian te el con ju n to d e sím b olos d e anticipación que p ueden seguir el uso d e la producción su byacen te. Las reducciones sólo se eligen cuando hay u n elem en to válido co n e l punto en e l ex trem o derecho, y e l sím b olo actual d e an ticip ación es u no d e los p erm itid os para e s te elem en to. U n analizador sin táctico LR can ón ico p u ed e ev ita r algu nos d e los co n flicto s d e accion es d e an álisis sin tá ctico que están presentes en los analizadores sin tácticos SLR; pero a m enudo tien e m ás estad os q ue el analizador sin táctico SLR para la m ism a gram ática. ♦ Analizadores sin tácticos L R con lectura anticipada. Los analizadores sintácticos LA LR ofre­ cen m uchas d e las ventajas d e b s analizadores sintácticos SLR y LR canónicos, m ediante la (om binación d e estad os que tienen los m ism os corazones (conjuntos d e elem entos, ignorando los conjuntos asociados de sím bolos d e anticipación). Por ende, el número d e estad os es el mismo que e l d el analizador sintáctico SLR, pero algunos conflictos d e acciones de análisis sintáctico presentes en el analizador sintáctico SLR pueden elim inarse en e l analizador sintác­ tico L A L R Los analizadores sintácticos LA LR se han convertido en el m étodo m ás usado. 300 Capítulo 4. A nálisis sintáctico ♦ A n áhsis sintáctico ascendente de gram áticas ambiguas. En m uchas situaciones im portantes, com o en el análisis sintáctico d e expresiones aritm éticas, podem os usar u na gram ática am­ bigua y explotar la información adicional, com o la precedencia d e operadores, para resolver conflictos entre desplazar y reducir, o entre la reducción m ediante d os reducciones distintas. Por ende, las técnicas de análisis sintáctico LR se extienden a muchas gram áticas ambiguas. ♦ Yacc. El generador d e analizadores sin tácticos Y acc recibe una gram ática (posiblem ente) am bigua ju n to con la inform ación d e resolución d e conflictos, y construye los estad os d el LALR. D esp ués produce u na función q ue u tiliza esto s esta d o s p ara realizar un análisis sin ­ táctico ascendente y llam a a u na función asociad a ca d a v ez q ue se realiza u na reducción. 4.11 R e fe re n c ia s p a r a el c a p ítu lo 4 El form alism o d e las gram áticas libres d e co n tex to se originó co n C hom sk y [5], com o p arte d e un estu d io acerca d el lengu aje natural. L a id ea tam b ién se u tilizó en la descrip ción sin tá ctica d e d os d e los prim eros lenguajes: Fortran por B ackus [2] y A lgol 60 por N aur [26]. E l erud ito P anini id eó u n a n otación sin tá ctica eq u ivalen te para especificar las reglas d e la gra m á tica S anskrit en tre los años 400 a.C . y 200 a.C . [19]. C antor [4] y F loyd [13] fueron los prim eros q ue observaron e l fen óm eno d e la am bigüedad. La Form a N orm al d e C hom sk y (ejercicio 4 .4 .8 ) p roviene d e [6]. L a teoría d e las gram áticas libres d e co n tex to se resum e e n [17]. El an álisis sin tá ctico d e descenso recursivo fue el m éto d o preferido p a ra los prim eros com ­ piladores, com o [16], y los sistem a s para escribir com p ilad ores, com o M E T A [28] y T M G [25]. Lew is y Stearns [24] introdujeron las gram áticas LL. E l ejercicio 4 .4 .5 , la sim u lación e n tiem po lineal d e l d escen so recursivo, proviene d e [3]. U n a d e las prim eras técnicas d e an álisis sin tá ctico , q ue se d eb e a F loyd [14], im plicab a la p recedencia d e los operadores. W irth y W eber [29] generalizaron la idea para las p artes d el lengu aje q ue no involucran operadores. E stas técn ica s se u tiliza n raras veces h oy e n día, pero p od em os verlas com o líderes en u n a ca d en a d e m ejoras para e l an álisis sin tá ctico LR. K nuth [22] introdujo los analizadores sin tá ctico s LR , y las ta b la s d e an álisis sin tá ctico LR can ón icas se originaron ahí. E ste m étod o no se consideró p ráctico, d eb ido a q ue la s tab las d e análisis sin tá ctico eran m ás gran d es q ue las m em orias principales d e las com p utadoras típicas d e e s a ép o ca , h a sta q ue K orenjak [23] prop orcionó u n m éto d o para producir ta b la s d e análisis sin tá ctico d e un tam añ o razonable para los lengu ajes d e program ación com unes. D eR em er d e­ sarrolló los m étod os LA L R [8] y SLR [9] q ue se usan en la actualidad. La con stru cción d e las tab las d e an áhsis sin táctico L R para las gram áticas am biguas provienen d e [1] y [12]. El generador Y acc d e Johnson d em ostró con m ucha rapidez la h abilidad p rá ctica d e generar analizadores sin tácticos co n un generador d e analizadores sin tá ctico s L A L R para los com p ila­ dores d e producción. E l m anu al para e l generador d e analizadores sin tá ctico s Y acc se encuentra en [20]. L a versión d e cód igo-abierto, B is o n , s e d escrib e en [10]. H ay un generador d e analiza­ dores sin tá ctico s sim ilar llam ado CUP [18], el cual se b a sa en L A L R y so p o rta acciones escritas en Java. Los generadores d e analizadores sin tá ctico s d escen dentes incluyen a A n t lr [27], un generador d e analizadores sin tá ctico s d e d escen so recursivo q ue acepta accion es en C + + , J a v a o C # , y LLGen [15], q ue e s un generador basado en L L (1). D ain [7] proporciona u n a bibliografía acerca d el m anejo d e errores sin tá ctico s. 4.11 Referencias para el capítulo 4 301 E l algoritm o d e análisis sin tá ctico d e program ación d in á m ica d e p rop ósito gen eral d escrito e n el ejercicio 4.4.9 lo inventaron en form a in depend iente J. C ocke (sin p ublicar), Y ounger [30] y K asam i [21]; d e aquí q u e s e le d en om in e “algoritm o C Y K ” . H ay un algoritm o m ás com plejo d e prop ósito gen eral q ue creó E arley [11], q ue ta b u la los elem en to s L R para c a d a su b ca d en a de la en trad a dada; e s te algoritm o, q ue tam b ién requiere un tiem p o 0 (n3) en general, só lo requiere u n tiem p o 0 ( n 2) en las gram áticas sin am bigüedad. 1. A ho, A . V ., S. C . Johnson y J. D . U llm an, “D eterm in istic parsin g o f am biguous gram ­ m ars” , C om m . A C M 1 8:8 (A gosto, 1975), pp. 441-452. 2. Backus, J. W , “T h e sy n ta x an d sem an tics o f th e proposed in tern ational algebraic lan­ gu age o f th e Z urich-A C M -G A M M C onference” , P roc. In tl. Conf. In fo rm a tio n P ro ce s­ sin g , U N E S C O , P aris (1959), pp. 125-132. 3. Birm an, A . y J. D . U llm an, “P arsing algorithm s w ith backtrack” , In fo rm a tio n an d C on trol 2 3:1 (1 9 7 3 ), pp. 1-34. 4 . C an tor, D . C ., “O n th e am b igu ity problem o f B acku s s y s te m s ” , J. A C M 9:4 (1962), pp. 477-479. 5. C hom sky, N ., ‘T h r e e m odels for th e d escrip tion o f language” , IR E Trans, on In fo rm a ­ tio n T h e o ry I T -2 :3 (1956), pp. 113-124. 6 . C hom sky, N ., “On certain form al p roperties o f gram m ars” , In fo rm a tio n a n d C on trol 2:2 (1959), pp. 137-167. 7. D ain, J ., “Bibliography on S yn tax Error H andling in L anguage T ranslation S y stem s” , 1991. D isp on ib le e n e l gru p o d e n o ticia s c o m p .c o m p ile r s; vea h t t p : / / c o m p i l e r s , i e c c . c o m /c o m p a r c h /a r t ic le /9 1 - 0 4 - 0 5 0 . 8. D eR em er, F ., “P ractical Translators for LR(fc) L an guages” , T ésis P h .D ., M IT, C am ­ bridge, M A , 1969. 9. D eR em er, F ., “Sim ple LR(fc) gram m ars” , C om m . A C M 1 4 :7 (Julio, 1971), pp. 453-460. 10. D onnelly, C. y R . Stallm an , “Bison: T h e Y A C C -com patible Parser G enerator” , h t t p : / / w w w .g n u .o r g /s o f t w a r e /b is o n /m a n u a l/. 11. Earley, J ., “A n efficien t con text-free parsing algorithm ” , C om m . A C M 13:2 (Febrero, 1970), pp. 94-102. 12. Earley, J ., “A m b igu ity and p recedence in sy n ta x d escrip tion ” , A cta In fo rm á tica 4:2 (1975), pp. 183-192. 13. F loyd, R . W ., “O n am bigu ity in p hras e-stru ctu re languages” , C om m . A C M 5:10 (O c­ tu b re, 1962), pp. 526-534. 14. F lo y d , R . W ., “S y n ta c tic a n a ly sis and o p era to r p reced en ce” , J. A C M 1 0 :3 (1 9 6 3 ), pp. 316-333. 302 Capítulo 4. A nálisis sintáctico 15. G ruñe, D . y C. J. H. Jaco b s, “A program m er-friendly L L (1) parser generator” , S o ft­ w are P ra ctice a n d E xp erien ce 18:1 (Enero, 1988), p p . 29-38. V ea tam b ién h t t p : //w w w . e s . v u .n l / ~ c e r i e l / L L g e n .h t m l . 16. H oare, C . A . R ., “R ep o rt on th e E llio tt A lgol tra n sla to r” , C o m p u te r J. 5:2 (1 9 6 2 ), pp. 127-129. 17. H opcroft, J. E ., R . M otw ani y J. D . U llm an, In tro d u ctio n to A u to m a ta T h eo ry, Langua­ ges, a n d C o m p u ta tio n , A ddison-W esley, B o sto n , M A , 2001. 18. H u dson , S. E . e t a l , “C U P L A L R Parser G enerator in J a v a ” , D isp on ib le en h t t p : / / www2 . c s . turn. e d u /p r o j e c t s / c u p / . 19. In germ an , P. Z ., “P an in i-B a ck u s form su g g e ste d ” , C om m . A C M 10:3 (M arzo, 1 9 6 7 ), p. 137. 20. Joh nson , S. C ., “Y acc — Y et A n oth er C om piler C om piler” , C om p utin g Science T echni­ c a l R ep ort 32, B ell L aboratories, M urray Hill, N J , 1975. D isp onib le e n h t t p : / / d i n o ­ sau r .c o m p ile r t o o ls .n e t /y a c c /. 21. Kasam i, T ., “A n efficient recognition and sy n ta x analysis algorithm for context-free lan­ guages” , AFCR I^65-758, A ir Force Cam bridge Research Laboratory, Bedford, M A , 1965. 22. K nuth, D . E ., “O n the tran slation o f languages from left to rig h t” , In fo rm a tio n an d C on trol 8:6 (1965), pp. 607-639. 23. K orenjak, A . J ., “A practical m eth od for co n stru ctin g LR(Ar) processors” , C om m . A C M 12:11 (N oviem bre, 1969), pp. 613-623. 24. Lew is, P. M . II y R . E . S te a m s, “S yntax-d irected tran sdu ction ” , J. A C M 15:3 (1968), pp. 465-488. 25. M cClure, R M., ‘T M G — a syntax-directed com piler” , proc. 2 0 th A C M N atl. Conf. (1965), pp. 262-274. 26. N aur, P. e t a l., “R ep o rt on th e algorithm ic language A LG O L 6 0 ” , C om m . A C M 3:5 (M ayo, 1960), p p . 299-314. V ea tam b ién C om m . A C M 6:1 (Enero, 1963), pp. 1-17. 27. Parr, T ., “A N T L R ” , h t t p : / / w w w . a n t l r . o r g / . 28. Schorre, D . V ., “M eta-II: a syn tax-orien ted com piler w ritin g language” , P roc. 1 9 th A C M N a tl. C on f. (1964), pp. D 1 .3 -1 -D 1 .3 .-1 1 . 29. W irth , N . y H. W eber, “Euler: a gen eralization o f A lgol an d its form al definition: P art I ” , C om m . A C M 9:1 (E nero, 1966), pp. 13-23. 30. Y ounger, D . H ., “R ecogn ition and parsing o f con text-free lan guages in tim e n3” , Infor­ m a tio n a n d C on trol 10:2 (1967), pp. 189-208. C a p ít u lo 5 Traducción orientada por la sintaxis E ste ca p ítu lo d esarrolla e l tem a d e la secció n 2.3: la traducción d e los lenguajes gu ia d o s por las gram áticas libres d e co n tex to . L as técn ica s d e traducción d e e s te ca p ítu lo se aplicarán en e l cap ítu lo 6 a la com probación d e tip o s y la generación d e có d ig o interm edio. E stas técnicas so n tam b ién ú tiles en la im plem en tación d e pequeños lengu ajes para tareas especializadas; este ca p ítu lo incluye un ejem p lo d e com p osición tipográfica. P ara asociar la inform ación con u na con stru cción d e l lengu aje, adjuntam os a trib u to s al (los) sím b o lo (s) gram atical(es) q ue representa(n) la con stru cción, com o v im o s en la sección 2.3.2. U n a definición orien tad a por la sin ta x is esp ecifica los valores d e los a trib u to s m ed ian te la aso­ ciación d e las reglas sem án ticas con las producciones gram aticales. P or ejem plo, un traductor d e infijo a p ostfijo p od ría tener la sigu ien te producción co n la sig u ien te regla: P r o d u c c ió n E ^ r e g l a s e m á n t ic a Ei + T E .co d ig o = E i.co d ig o || T .codigo || '+' (5.1) E s ta producción tien e d o s n o term inales, E y T; e l su bín d ice en E \ diferencia la ocurrencia d e E en e l cu erpo d e la producción d e la ocu rren cia d e E co m o e l en cab ezado. T anto E com o T tien en un atrib u to codigo co n valor d e cadena. L a reg la sem á n tica esp ecifica q u e la cad en a E .codigo d e b e form arse m ed ian te la con caten ación d e E i.co d ig o , T .codigo y e l carácter V . A un qu e la regla d eja exp lícito q ue la trad ucción d e E se conform a a p artir d e las traducciones d e E i, T y V , p u ed e ser ineficiente im plem entar la trad ucción en form a d irecta, m ed ian te la m anipulación d e cadenas. C om o vim os en la sección 2.3.5, un esq u em a d e traducción orientado por la sin ta x is incrusta fragm entos d e program a, llam ados acciones sem án ticas, con cuerpos d e producciones, com o en E E i + T { p r in t '+' } (5.2) P or convención, las accion es sem án ticas s e encierran en tre llaves (si las llaves ocurren com o sím b olos gram aticales, las encerram os en tre co m illas sencillas, com o en '{ ' y '} '). L a posición 303 304 Capítulo 5. Traducción orientada por la sintaxis d e u n a acción sem á n tica en e l cu erpo d e u n a producción d eterm in a e l orden en e l q ue se eje­ c u ta la acción. E n la producción (5.2), la acción ocu rre al final, desp ués d e to d o s los sím b olos gram aticales; en general, las accion es sem án ticas p u ed en ocurrir en cualquier posición dentro d el cu erpo d e u na producción. E ntre las dos notaciones, las d efinicion es dirigidas por la sin ta x is pueden ser m ás leg ib les, y por en d e m ás ú tiles para las especificacion es. N o o b stan te, los esqu em as d e trad ucción pueden ser m ás eficien tes y, p or lo tanto, m ás ú tiles para la s im plem entaciones. El m étod o m ás general p ara la trad ucción orien ta d a p o r la sin ta x is e s construir un árbol d e análisis sin tá ctico o un árbol sin táctico, y d esp u és calcular los valores d e los atrib u tos en los nodos d e l árbol, v isitán d olas. E n m uchos caso s, la traducción p uede realizarse d urante el análisis sin tá ctico sin construir un árbol ex p lícito . Por lo tanto, vam os a estu d iar u na cla se d e traducciones orien tad as a la sin taxis, con ocidas com o “traducciones co n atrib u tos heredados por la izquierda” (L in dica d e izquierda a derecha), lo s cu ales abarcan p rácticam ente to d a s las traducciones q ue pueden realizarse d urante e l análisis sin tá ctico . Tam bién estu diarem os u na cla se m ás pequeña, llam ad a “trad uccion es con atrib utos sin tetiza d o s” (S d e sin tetiza d o s), las cu ales p ueden realizarse co n facilidad en con exión con un análisis sin tá ctico ascendente. 5.1 D e fin icio n es d irig id a s p o r la s in ta x is U n a defin ición dirigida p o r la sin ta x is e s u n a gra m á tica libre d e co n tex to , ju n to co n atributos y reglas. Los atrib u tos sin tetizad os se asocian co n los sím b olos gram aticales y las reglas se aso­ cian con las producciones. Si X es u n sím b olo y a es u no d e su s atrib u tos, en to n ces escribim os X . a para d en otar e l valor d e a en e l nodo específico d e un árbol d e an álisis sin tá ctico , etiq u e­ ta d o com o X . Si im plem en tam os los n od os d e l árbol d e an álisis sin tá ctico m ed ian te registros u o b jetos, en ton ces los atrib u tos d e X pueden im plem entarse m ed ian te ca m p o s d e d a to s en los registros, q ue representen los nodos para X . L os atrib u tos p ueden ser d e cualquier tipo: por ejem p lo, núm eros, tip os, referencias d e tab las o cad en as. Las ca d en a s p ueden in clu so ser secu en cias largas d e cód igo, por decir cód igo ten em os e l lengu aje interm edio u tilizad o por un com pilador. 5 .1 .1 A t r i b u t o s h e r e d a d o s y s in te tiz a d o s V am os a m anejar d o s tip o s d e atrib u tos para los no term inales: 1. U n atribu to sin te tiza d o para un no term inal A en un nodo N d e un árbol sin tá ctico se d efine m ed ian te u na regla sem á n tica aso cia d a co n la producción e n N. O bserve q u e la producción d eb e tener a A com o su en cab ezado. U n a trib u to sin tetiza d o en el n o d o N se d efin e só lo e n térm inos d e los valores d e los atrib utos en el hijo d e N , y en e l m ism o N. 2. U n atribu to h eredado para un no term in al B en e l nodo iV d e un árbol d e análisis sin tác­ tico s e d efin e m ediante u n a regla sem á n tica asociad a con la producción en el padre d e N. O bserve q ue la producción d eb e tener a B com o u n sím b olo en s u cuerpo. U n atributo heredado en e l nodo N se d efin e sólo en térm inos d e los valores d e los atrib utos en el padre d e N , e n e l m ism o N y en su s herm anos. 5.1 Definiciones dirigidas p o r la sintaxis 305 U n a d e fin ic ió n a l t e r n a t i v a d e lo s a t r i b u t o s h e r e d a d o s N o se habilitan traducciones adicionales si perm itim os q ue un atributo heredado B . c en un nodo N se defina en términos de b s valores de los atributos en los hijos d e N , así com o en el m ism o N , en su padre y en su s hermanos. D ichas reglas pueden “simularse” m ediante la creación d e atributos adicionales d e B, por ejem plo, B .ch B.c% ... . É stos son atributos sinte­ tizados que copian los atributos necesarios d e los hijos d el nodo etiquetado com o B. D espués calculam os a B .c com o un atributo heredado, usando los atributos B . ci, B.c% ... en vez d e los atributos en el hijo. D ichos atributos sintetizados se necesitan raras veces en la práctica. A un qu e no p erm itim os q ue u n atrib uto heredado e n el nodo N s e d efina en térm inos d e los valores d e los atrib u tos en el hijo d el nodo N , s í p erm itim os q ue un a trib u to sin tetiza d o en el n od o N s e d efin a e n térm inos d e los valores d e lo s atrib u tos heredados en el m ism o n o d o N. Los term in ales pueden tener atrib u tos sin tetiza d o s, pero n o atrib u tos heredados. Los atri­ b u to s para los term inales tien en valores léxicos q ue su m in istra el analizador léxico; no hay reglas sem án ticas en la m ism a definición d irig id a por la sin ta x is para calcu lar e l va lo r d e un atrib u to para un term inal. Ejemplo 5.1: La definición dirigida por la sin ta x is e n la figura 5.1 se b asa en nuestra conocida gram ática para las expresiones aritm éticas con los operadores + y *. Evalúa las expresiones que term inan con un m arcador final n . En la definición dirigida por la sin taxis, ca d a u na d e los no ter­ m inales tiene un solo atributo sin tetizad o, llam ado val. Tam bién su pon em os q ue e l term inal dígito tien e un atributo sin tetizad o valex, e l cu a l es un valor entero q ue devuelve el analizador léxico. P r o d u c c ió n R eglas s e m á n t ic a s 1) L E n L .val = E .val 2) E Ei + T E .va l = E i.v a l + T.vol 3) E ^ T 4) T->Ti 5) T->F T .val = F.val 6) F -> ( E ) F.vol = E .val 7) F —>d í g i t o F.val = d ig ito .le x v a l E .v a l = T .val * F T .val = T \.v o l x F.vol F igu ra 5.1: D efinición orien tad a por la sin ta x is d e u na calcu ladora d e escritorio sim p le L a regla para la producción 1, L E n , esta b lece L .v a l a E .v a l, q ue verem os q ue es el valor num érico d e t o d a la expresión. L a producción 2 , E -+ E \ + T, tam b ién tien e u n a regla, la cu a l ca lcu la e l a trib u to v a l para e l en cab ezad o E com o la sim ia d e los valores en E± y T. E n cualquier nodo N d e un árbol sin­ tá ctico , etiq u eta d o com o E , e l valor d e val para E es la su m a d e los valores d e v a l en los hijos d e l n od o N , etiq u eta d o s com o E y T. 306 Capítulo 5. Traducción orientada por la sintaxis La producción 3, E T , tien e u n a so la regla q ue d efin e el valor d e v a l para E com o el m ism o q u e e l valor d e v a l en e l hijo p ara T. L a producción 4 e s sim ilar a la seg u n d a producción; su regla m u ltip lica los valores en los hijos, en vez d e su m arlos. Las reglas para las producciones 5 y 6 cop ian los valores en u n hijo, com o e l d e la tercera producción. L a producción 7 propor­ cio n a a F .v a l e l valor d e un dígito; es d ecir, el valor num érico d el tok en d í g i t o q ue d evolvió el analizador léxico. □ A u n a definición dirigida por la sin taxis q ue só lo involucra atrib utos sin tetiza d o s se le co n o ­ ce com o definición d irigid a por la sin ta x is con a trib u to s sin te tiz a d o s ; la definición d irigid a p or la sin taxis e n la figura 5.1 tien e e s ta propiedad. E n u n a definición d irig id a p or la sin ta x is con atrib utos sin tetizad os, ca d a regla calcu la un atrib u to para e l n o term inal en e l en cab ezad o d e u na producción, a partir d e los atrib u tos q ue se tom an d e l cu erpo d e la producción. Por sim p leza, los ejem plos en e s ta sección tien en reglas sem án ticas sin efecto s adicionales. En la práctica, es con ven iente perm itir q ue las definiciones dirigidas por la sin ta x is ten gan efectos adicionales lim itados, com o im prim ir el resultado calcu lado p or u na calcu lad ora d e escritorio o interactuar co n u na ta b la d e sím b olos. U n a v ez q u e veam os el orden d e evaluación d e los atrib u tos en la sección 5.2, perm itirem os q ue las reglas sem án ticas ca lcu len funciones arbitrarias, lo cu a l es probable q ue involucre efecto s adicionales. U n a definición dirigida por la sin ta x is con atrib utos sin tetiza d o s p uede im plem entarse d e m anera natural, en con jun ción co n un analizador sin tá ctico L R . D e hecho, l a d efinición dirigi­ d a p or la sin taxis en la figura 5.1 es un reflejo d e l program a d e Y acc d e la fig u ra 4.5 8 , el cual ilu stra la trad ucción durante el an álisis sin táctico LR . L a diferencia es q ue, en la regla para la p roducción 1, el program a d e Y acc im prim e e l valor E v a l co m o un efecto ad icion al, e n vez d e definir e l atrib u to L .v a l A u n a definición dirigida p o r la sin ta x is sin efecto s ad icion ales se le lla m a algunas veces gram ática atribu ida. L as reglas e n u n a gram ática atrib uida d efinen e l valor d e un atrib uto, sólo en térm inos d e los valores d e otros atrib u tos y con stantes. 5 .1 .2 E v a lu a c ió n d e u n a d e fin ic ió n d ir i g id a p o r la s in ta x is e n lo s n o d o s d e u n á r b o l d e a n á lis is s in tá c tic o P ara visualizar la traducción especificada p or u na definición dirigida por la sin taxis, es útil trabajar con los árboles d e análisis sin táctico, aun cuando un traductor en realidad no necesita construir un árbol d e análisis sin táctico. Im agine, p or lo ta n to , q ue las reglas d e u na definición dirigida por la sin taxis se aplican construyendo primero un árbol d e análisis sin táctico, y d es­ pués usando las reglas para evaluar tod os los atributos en ca d a uno d e los nodos d el árbol. A un árbol sin táctico, q ue m u estra el (los) valor(es) d e su (s) a trib u to(s) se le co n o ce co m o árbol de a n álisis sin tá c tic o an otado. ¿C óm o con stru im os un árbol d e análisis sin tá ctico anotado? ¿E n q ué orden evaluam os los atributos? A n tes d e p od er evaluar un atributo en un nodo d el árbol d e análisis sin táctico, d eb e­ m os evaluar to d o s los atributos d e los cu ales d ep en de su valor. Por ejem p lo, si tod os lo s atribu­ to s sin tetizad os so n sin tetizad os, com o en e l ejem p lo 5.1, en ton ces d ebem os evaluar lo s atributos val en tod os los hijos d e un nodo, para p od er evaluar e l atrib uto v a l en el m ism o nodo. Con los atrib utos sin tetizad os, p o d e m o s evaluar los atrib utos e n cualquier ord en d e abajo h acia arriba, com o el de u n recorrido p ostorden d e l árbol d e análisis sin táctico; en la sección 5 .2 .3 hablarem os sob re la evaluación d e las d efinicion es co n a trib u to s sin tetizad os. 5.1 Definiciones dirigidas p o r la sintaxis 307 P ara las d efinicion es dirigidas p or la sin ta x is con atrib utos heredados y sin tetiza d o s, no hay gara n tía de que h aya siq uiera un orden en e l q ue se puedan evaluar los a trib u to s en lo s nodos. P or ejem p lo, considere los n o term inales A y B, con los atrib u tos sin tetiza d o s y heredados A .s y B .i, resp ectivam en te, ju n to co n la sigu ien te p rod ucción y las sigu ientes reglas: P r o d u c c ió n A —► B r eg la s s e m á n t ic a s A .s — B .i ; B .i = A .s + 1 E sta s reglas so n circulares; e s im p osib le evaluar A .s en un nodo N o B .i com o e l hijo d e iV sin prim ero evaluar e l otro. L a d ep en d en cia circular d e A s y B .i e n cierto par d e n od os e n un árbol sin tá ctico se su giere m ed ian te la figura 5.2. Figura 5.2: L a d ep en d en cia circular d e A s y B .i, u no d e l otro E n térm inos co m p u tacion ales, es d ifícil d eterm inar s i ex iste n o no circularidades e n cu al­ q uiera d e los árboles d e an álisis sin tá ctico q ue ten g a q ue trad ucir u n a definición d irigid a por la sin ta x is d a d a . 1 P or fortuna, h ay su b clases ú tiles d e d efinicion es dirigidas por l a sin ta x is que b a stan para garantizar q ue e x is ta un orden d e evaluación, com o verem os e n la sección 5.2. E j e m p lo 5 .2 : L a figura 5.3 m u estra un árbol d e an álisis sin tá ctico anotado para la c a d en a de en tra d a 3 * 5 + 4 n , con stru id a m ediante el u so d e la g ra m á tica y las reglas d e la figura 5.1. Se su p on e q u e el analizador léxico p rop orciona los valores d e valex. C ad a uno d e los n od os para los no term inales tiene e l atributo val calculado en orden d e abajo hacia arriba, y p od em os ver los valores resu ltan tes asociados con cad a nodo. Por ejem plo, en e l n o d o con un hijo etiq u etad o com o *, d esp u és d e calcu lar T .v a l = 3 y F .va l = 5 en su s hijos prim ero y tercero, aplicam os la regla q ue d ice q u e T .v a l es e l producto d e esto s d o s valores, o 15. □ Los atrib utos heredados so n ú tiles cu an do la estru ctu ra d e un árbol d e an álisis sin tá ctico n o “co in cid e” co n la sin taxis a b stracta d el cód igo fuente. E l sigu ien te ejem p lo m u estra cóm o p ueden usarse los atrib u tos heredados p ara solu cionar d ich o con flicto, d eb ido a u n a gram ática d iseñ ad a para e l an álisis sin táctico, en vez d e la traducción. 'Sin entrar en detalles, aunque el problema puede decidirse, no puede resolverse mediante un algoritmo en tiempo polinomial, incluso si V = AÍP, ya que tiene una complejidad de tiempo exponencial. 308 Capítulo 5. Traducción orientada por la sintaxis L .va l = 19 E .v a l= 15 E .val = 19 n 4- T.vaL = 4 T .va l = 15 T .val = 3 * F .val = .3 F.uaZ = 4 F .v a l= 5 d íg ito . va lex = 4 d íg ito , va/ex = 5 digíto.va/ex = 3 Figura 5.3: Á rbol d e an álisis sin tá ctico anotad o para 3 * 5 + 4 n E j e m p lo 5 .3 : La definición dirigida p or la sin ta x is e n la figura 5 .4 ca lcu la térm inos com o 3 * 5 y 3 * 5 * 7. E l an álisis sin tá ctico d escen d en te d e la en trad a 3 * 5 em p ieza con la producción T F T '. A qu í, F g en era e l d íg ito 3, pero el operador * se genera m ed ian te V . Por en d e, el operando izquierdo 3 aparece e n un su b árb ol d istin to d el árbol de an álisis sin tá ctico d e *. Por lo ta n to, se utilizará un atributo heredado para pasar e l op eran d o a l operador. La gram ática e n e s te ejem p lo es u n ex tra cto de u na versión no recursiva por la izquierda d e la co n ocid a gram ática d e expresiones; utilizam os d ich a g ra m á tica com o u n ejem p lo para ilustrar el análisis sin tá ctico d escen d en te en la secció n 4.4. 1) P r o d u c c ió n Reglas T ^ F V T '.h e r = F .val sem á n t ic a s T .v a l = T '.sin 2) V * FT[ T l . h e r = T '.h e r x F .val T '.s in = T \. sin 3) r ^ e T '.s in = V .h e r 4) F —> d í g it o F .va l = d íg it o , valex F igu ra 5.4: U n a definición d irigida por la sin ta x is b a sa d a e n u n a g ra m á tica adecuada para el análisis sin tá ctico d e d escen dente C ada u no d e los n o term in ales T y F tien e un a trib u to sin tetiza d o val, el term inal d í g i t o tien e u n atrib u to sin tetiza d o valex. E l no term inal V tien e d o s atributos: un a trib u to heredado h e r y un atributo sin tetiza d o sin.. 5.1 Definiciones dirigidas p o r la sintaxis 309 Las reglas sem án ticas s e basan en la id ea d e q u e e l op eran d o izquierdo d e l operador * es heredado. D icho en form a m ás precisa, e l en cab ezad o V d e la p rod ucción T ' - * * F T [ hereda el op eran d o izquierdo d e * en el cu erpo d e la p roducción. D ad o un térm in o x * y * 2 , la raíz del subárbol para * y * z hereda a x. Entonces, la raíz d el subárbol para * 2: hereda e l valor d e x * y, y así en lo su cesivo, si hay m ás factores en e l térm in o. U n a vez q u e se han acum ulado to d o s los factores, e l resultado se p a sa d e v u e lta al árbol, m ediante el u so d e a trib u to s sin tetizad os. P ara ver cóm o se u tilizan las reglas sem á n tica s, considere el árbol d e an álisis sin tá ctico an otad o para 3 * 5 e n la figura 5.5. L a h oja d e m ás a la izquierda en el árbol d e análisis sin tác­ tico, etiq u e ta d a com o d í g i t o , tien e e l valor d e atributo va lex = 3, en d on d e e l 3 lo su m inistra e l analizador léxico. Su padre e s para la producción 4 , F -> d í g i t o . L a ú n ica regla sem án tica aso cia d a co n e s ta producción d efine a F .v a l = d i g í t o .valex, q ue es igual a 3. T.vcd = 15 d ig íto . valex = 5 e F igu ra 5.5: Á rb o l d e an álisis sin tá ctico a n otad o para 3 * 5 E n el segu n d o hijo d e la raíz, el atrib u to heredado T '.h e r se d efine m ed ian te la regla sem án­ tic a T '.h e r = F .v a l, aso cia d a co n la producción 1. Por en d e, e l operando izquierdo 3 para el operador * se p asa de izquierda a derecha, a lo largo d e los hijos d e la raíz. L a producción en e l nodo p ara T ' es T ' * F T { (retenem os e l su bín d ice 1 en e l árbol de an álisis sin táctico an otad o para diferenciar entre los d os nodos para T 1) . E l a trib u to heredado T {.h e r s e d efine m ediante la regla sem á n tica T [ . h e r = T '.h e r x F .v a l a so cia d a co n la produc­ ción 2 . C on T '.h e r = 3 y F .v a l = 5, ob ten em o s T [.h e r = 15. E n e l nodo inferior para T'h la pro­ d u cción es T ' - > e. L a regla sem án tica T '.s in — T '.h e r d efine T [.s in — 15. Los atrib utos s in ­ te tiza d o s e n los n od os para T ' pasan e l valor 15 h acia arriba d el árbol, h a sta e l nodo para T, e n d ond e T .v a l = 1 5 . □ 5 .1 .3 E je r c ic io s p a r a la s e c c ió n 5 .1 E j e r c ic io 5 .1 .1 : E n la definición d irigid a por la sin ta x is d e la figura 5 .1 , proporcione árboles d e an álisis sin tá ctico an otad os para las sigu ientes expresiones: a) (3 + 4 ) * (5 + 6 ) n . 310 Capítulo 5. Traducción orientada por la sintaxis b) 1 * 2 * 3 * (4 + 5) n . c) (9 + 8 * (7 + 6 ) + 5) * 4 n. E j e r c ic io 5 .1 .2 : E x tie n d a la definición dirigida p or la sin ta x is d e la figura 5.4 para m anejar las exp resion es co m o en la figura 5.1. E j e r c ic io 5 .1 .3 : R ep ita e l ejercicio 5.1 .1 , u sand o su definición d irigida p o r la sin ta x is d el ejercicio 5.1.2. 5.2 Ó rd e n e s d e e v a lu a c ió n p a r a las d e fin ic io n es d irig id a s p o r la s in ta x is Los “grafos d e d ep en d en cias” son u na herram ien ta ú til en la d eterm in ación d e u n orden d e evaluación p ara las in stancias d e los atrib u tos en un árbol d e an álisis sin tá ctico d a d o . M ientras q ue un árbol d e an álisis sin táctico an otad o m uestra los valores d e los atrib utos, un grafo d e d ep en dencias nos ayuda a d eterm in ar cóm o pueden calcularse esos valores. En e s ta sección, adem ás d e los grafos d e d ep en d en cias d efinirem os d o s clases im portantes d e definiciones dirigidas por la sintaxis: la definición d irig id a por la sin ta x is “co n atrib utos sin ­ tetizad os” y la definición d irigida por la sin ta x is m ás general “co n atrib utos heredados por la izquierda”. Las traducciones especificadas por esta s d o s c la ses s e adaptan bien con los m étod os d e análisis sin tá ctico q u e h em os estu d iad o, y la m ayoría d e las tran siciones q u e s e encuentran en la p ráctica pueden escribirse para conform arse a lo s requerim ientos d e por lo m enos u n a de esta s clases. 5 .2 .1 G rá fic o s d e d e p e n d e n c ia s U n grafo de dep en d en cia s d escrib e e l flujo d e inform ación en tre las in sta n cia s d e atrib u tos en un árbol d e an álisis sin tá ctico específico; u na flecha d e u na in sta n cia d e a trib u to a o tra sign ifica q ue el valor d e la prim era se n ecesita para calcular la segunda. L as flechas expresan las restric­ cion es q u e im ponen las reglas sem án ticas. D icho e n form a m ás detallada: • P ara c a d a nodo d e l árbol d e análisis sin táctico , por decir u n nodo etiq u eta d o m ediante el sím b olo gram atical X , el grafo d e d ep en d en cias tien e un nodo para c a d a a trib u to asociado con X. • S u p on ga q ue u na regla sem á n tica asociad a con u na producción p d efine el valor d el atri­ b u to sin tetiza d o A .b en térm inos d el valor d e X .c (la regla p uede definir a A .b e n térm i­ n os d e los dem ás atrib u tos, ap arte d e X .c ). E n tonces, e l grafo d e d ep en dencias tien e una flecha d esd e X .c h a sta A .b . D icho en form a m ás precisa, en ca d a n o d o iV etiq u eta d o com o A en el q ue se ap lica la producción p, s e crea u na flecha q ue v a a l a trib u to b en N , d esd e e l atrib u to c en el h ijo d e N q ue corresponde a e s ta in sta n cia d el sím b olo X en e l cuerpo d e la p rod u cción .2 2Com o un nodo N puede ten er varios hijos etiq uetad os com o X , d e nuevo suponem os qu e los subíndices diferencian los usos d el m ism o sím b olo en d istin tos lugares en la producción. 5.2 Ó rdenes d e evaluación para la s definiciones dirigidas p o r la sintaxis 311 • S u p on ga q ue u n a regla sem á n tica aso cia d a c o n u n a producción p d efine e l valor d e l atri­ b u to heredado B .c en térm in os d el valor d e X . ql E n tonces, e l grafo d e d ep en dencias tiene una flecha q ue v a d esd e X . a h a sta B . c. P ara c a d a nodo N etiq u eta d o com o B , q u e corres­ p o n d a a u n a ocu rren cia d e e s ta B e n el cu erpo d e la producción p, se crea u n a flecha que va al atrib u to c e n iV, d esd e e l atrib u to a en e l nodo M q ue corresponde a e s ta ocurrencia d e X . O bserve q ue M p od ría ser el padre o u n herm ano d e N. E j e m p lo 5 .4 : C onsidere la sigu ien te p rod ucción y regla: P r o d u c c ió n Ei + r e g l a s e m á n t ic a T E .v a l = E i.v a l + T .va l E n ca d a nodo N etiq u eta d o com o E, con h ijos q ue corresponden al cu erpo d e e s ta producción, e l atrib u to sin tetiza d o va l en N se calcu la u sand o los valores d e v a l en los d o s hijos, etiq u etad os com o E y T. P or en d e, u n a p arte d el grafo d e dep en dencias para c a d a árbol d e anáfisis sin tác­ tico en e l cu a l s e u tilice e s ta producción, se verá com o el d e la figura 5.6. C om o convención, vam os a m ostrar las flechas d e l árbol d e an álisis sin tá ctico com o líneas p unteadas, m ientras que las flechas d el grafo d e d ep en dencias son sólid as. □ E Ei val val + T val F igu ra 5.6: E .v a l se sin te tiz a a partir d e E i.v a l y E 2.va l E j e m p lo 5 .5 : E n la figura 5 .7 aparece u n ejem p lo d e u n grafo d e d ep en d en cias com p leto. Los n od os d e l grafo d e d ependencias, q ue se representan m ed ian te los núm eros d el 1 al 9, corres­ pond en a los atrib u tos en el árbol d e an álisis sin tá ctico a n otad o en la figura 5.5. d ig ito 2 valex e F igu ra 5.7: Grafo d e d ep en d en cias para el árbol d e an álisis sin tá ctico anotado d e la figura 5.5 Los nodos 1 y 2 representan el atributo va lex asociado con las d os hojas etiq uetad as com o d i g i t o . Los nodos 3 y 4 representan el atributo va l asociado con los d os nodos etiquetados com o F. 312 Capítulo 5. Traducción orientada por la sintaxis Las flechas q ue van al nodo 3 d esd e 1 y al n od o 4 d esd e 2 resu ltan d e la regla sem á n tica que d eñ n e a F .v a le n térm in os d e d i g i t o .valex. D e hecho, F .v a l es igual a d i g i t o . va ¿ex, só lo q ue la flecha representa la dep en dencia, no la igualdad. Los n od os 5 y 6 representan el atributo heredado T '.h e r asociado con c a d a u n a d e las o cu ­ rrencias d e l no term inal T '. L a flecha d e 5 a 3 se d eb e a la regla T '.h e r = F .val, la cu a l define a T '.h e r e n e l hijo derecho d e la raíz q u e p arte d e F .v a l en e l hijo izquierdo. V em os flechas q ue v a n a 6 d esd e el n od o 5 para V h e r , y d esd e e l n o d o 4 p a ra F .va l, y a q u e esto s valores se m ultip lican p ara evaluar e l atrib u to h e r en e l n od o 6 . Los n od os 7 y 8 representan el atrib u to sin tetiza d o s in , asociado con las ocu rren cias d e T '. La flecha q ue v a al nodo 7 d esd e 6 se d eb e a la regla sem á n tica T '.s in = T '.h e r asociad a con la producción 3 en la figura 5.4. L a flecha q ue v a al nodo 8 d esd e 7 se d eb e a u n a regla sem á n tica asociad a con la producción 2 . Por ú ltim o, e l nodo 9 representa el atrib u to T .val. L a flecha q ue v a a 9 d esd e 8 se d eb e a la regla sem á n tica T .v a l = T '.s in , aso cia d a co n la producción 1. □ 5 .2 .2 O r d e n d e e v a lu a c ió n El grafo d e d ep en dencias caracteriza los órd en es p osibles en los cu ales p o d em o s evaluar los atrib utos en los diversos n od os d e un árbol d e an álisis sin tá ctico . S i e l grafo d e dep en dencias tien e u n a flecha q ue va d el n od o M al n od o JV, en ton ces e l a trib u to corresp ond ien te a M debe evaluarse an tes del atrib u to d e N. P or en d e, los ú nicos órd en es d e evaluación p erm isib les son aquellas secu en cias d e n od os N h N 2i ... , d e ta l form a q ue si hay u n a flech a d el grafo d e d ep en dencias q ue va d esd e h a sta Nj, en to n ces i < j. D icho ord en am ien to in cru sta un grafo dirigido en un ord en lineal, a lo cu a l s e le co n o ce com o orden topològico d e l grafo. Si hay un ciclo e n e l grafo, en ton ces no h ay órd en es topológicos; es d ecir, no h ay form a d e evaluar la definición d irigida por la sin ta x is e n e s te árbol d e an álisis sin tá ctico . N o ob sta n te, si n o h ay ciclo s, en to n ces hay p or lo m enos un orden topològico. P a ra ver p or qué, d eb ido a que no hay ciclos, d e seguro p od em os encontrar un n o d o en e l q ue no en tren flechas. E n caso d e q u e no hubiera d ich o nodo, p odríam os proceder d e p redecesor en predecesor h a sta regresar a algún nodo q u e y a hayam os v isto , produciendo un ciclo . D eb em os hacer q ue e s te nodo sea e l prim ero en e l ord en topològico, elim inarlo d el grafo d e d ep en dencias y repetir el p roceso en los nodos restantes. E j e m p lo 5 .6 : E l grafo d e dep en dencias d e la figura 5 .7 no tien e ciclo s. U n orden to p o lò g ico es e l orden e n e l q ue y a se han num erado los nodos: 1, 2, ... , 9. O bserve q ue c a d a flecha d el grafo p a sa d e un nodo a o tro d e m ayor num eración, por lo q ue sin d u d a e s te orden es topològico. H ay o tro s órd en es top ológicos tam b ién , com o 1, 3 , 5, 2, 4 , 6 , 7, 8 , 9. □ 5 .2 .3 D e fin ic io n e s c o n a t r i b u t o s s in t e ti z a d o s C om o d ijim os an tes, d a d a u na definición d irigid a por la sin ta x is, e s m uy difícil sa b er si ex isten árboles d e anáfisis sin tá ctico cu yos grafo d e d ep en d en cias ten g a n ciclo s. E n la p ráctica, las traducciones p ueden im plem entarse m ediante el uso d e clases d e d efinicion es d irigidas por la sin ta xis q ue garan ticen un ord en d e evaluación, y a q u e no p erm iten grafos d e d ep en dencias con 5.2 Ó rdenes d e evaluación para la s definiciones dirigidas p o r la sintaxis 313 ciclos. A dem ás, las d o s cla ses presentadas en e s ta secció n p ueden im plem entarse d e m anera eficien te en con exión con e l an álisis sin táctico d escen d en te o ascendente. L a prim era clase se define d e la sigu ien te manera: • U n a definición d irigid a por la sin ta x is tien e a trib u to s sin te tiza d o s si tod os los atributos sin tetizad os so n sin tetizad os. E j e m p lo 5 .7 : L a definición d irigida p or la sin ta x is d e la figura 5.1 es u n ejem p lo d e u n a defini­ ción con atrib utos sin tetizad os. C ad a atrib uto, L .v a l, E .v a l, T .v a l y F .v a l es sin tetiza d o . □ C uan do u na definición d irigida por la sin ta x is tien e atrib u tos sin tetizad os, p o d em o s eva­ luar su s atrib utos en cualquier orden d e abajo h acia arriba d e los nodos d el árbol d e análisis sin táctico. A m enudo, es b asta n te sencillo evaluar lo s atrib u tos m ed ian te la realización d e un recorrido p ostorden d e l árbol y evaluar los atrib u tos en un n o d o N cu a n d o el recorrido sa le de N por ú ltim a vez. E s decir, aplicam os la fun ción p o sto rd en , q ue s e d efine a con tinu ación, a la raíz d e l árbol d e anáfisis sin tá ctico (v ea tam b ién e l recuadro “R ecorridos preorden y p ostorden ” e n la sección 2.3.4): p o sto rd e n (N ) { f o r ( cad a hijo C d e N , em p ezan d o d esd e la izquierda ) p o sto r d e n (C ); evaluar los atrib u tos asociados co n e l nodo N ; } Las d efinicion es d e los atrib utos sin tetiza d o s pueden im plem entarse d urante el análisis sin tá ctico d e ascendente, y a q ue un an álisis sin tá ctico d e e s te tip o corresponde a un recorrido p ostorden. E n form a específica, el p ostorden corresp ond e ex a cta m en te al orden en e l q ue un analizador sin táctico L R reduce e l cu erpo d e u na producción a s u en cab ezado. E s te hecho se u tilizará en la sección 5.4.2 para evaluar los a trib u to s sin tetizad os y alm acenarlos en la pila d u ran te el análisis sin tá ctico LR , sin crear lo s n od os del árbol en form a exp lícita. 5 .2 .4 D e fin ic io n e s c o n a t r i b u t o s h e r e d a d o s A la seg u n d a clase d e definiciones dirigidas por la sin ta x is s e le con oce com o d efin icio n es con a trib u to s heredados. L a id ea d e e s ta clase es que, en tre los atrib utos asociados co n el cu erpo de u n a producción, las flechas d el grafo d e dep en dencias p ueden ir d e izquierda a derecha, pero no a l revés (de aq uí q u e s e les d en om in e “atrib u tos heredados p or la izquierda”). D icho en form a m ás precisa, ca d a atrib u to d eb e ser: 1 . Sintetizado. 2. H eredado, pero con las reglas lim itad as d e la sig u ien te m anera. S u p on ga q ue hay una producción A - + X iX 2 ••• X n, y q ue h ay un a trib u to heredado X¿.a, el cu a l se calcu la m ediante u na regla aso cia d a co n e s ta producción. E n tonces, la regla p uede usar sólo: (a) Los atrib u tos heredados asociados co n el en cab ezad o A . (b ) Los atrib u tos heredados o sin tetiza d o s asociados con las ocu rren cias d e los sím bolos X h X2, . . . , X i - i ubicados a la izquierda d e X t. 314 Capítulo 5. Traducción orientada por la sintaxis (c) Los atrib u tos heredados o sin tetiza d o s asociados co n e s ta m ism a ocu rren cia d e X¡, p ero só lo en u n a form a en la que no haya ciclo s en un grafo d e d ep en d en cias form ado p or los atrib utos d e e s ta E j e m p lo 5 .8 : L a definición d irigida p or la sin ta x is e n la figura 5 .4 tien e atrib utos heredados por la izquierda. P ara ver por qué, con sid ere las reglas sem án ticas para los a trib u to s heredados, q ue repetim os a con tinu ación p or conveniencia: P r o d u c c ió n T F T' T'-> * F T i r eg la s s e m á n t ic a V . h e r = F .va l T i .h e r = T .h e r x F .va l La prim era d e esta s reglas define e l atrib u to heredado T .h e r , usando só lo F .v a l y F aparece a la izquierda de T en e l cuerpo d e la producción, según se requiera. La segu n d a regla define a T i.h e r usando el atrib u to heredado V .h e r , asociad o con el en cab ezado, y F.val, en d ond e F aparece a la izquierda d e T í en e l cuerpo d e la producción. En ca d a uno d e e sto s casos, las reglas u tilizan la inform ación “d e arriba o d e la izquierda” , segú n lo requiera la clase. E l resto d e los atrib u to s sin tetiza d o s so n sin tetiza d o s. Por en d e, la definición d irigid a por la sin taxis tien e atrib u tos heredados p or la izquierda. □ E j e m p lo 5 .9 : C ualquier definición dirigida p or la sin ta x is q ue co n ten g a la sigu ien te produc­ ción y reglas no p uede ten er atrib u tos heredados p or la izquierda: P r o d u c c ió n A B C r eg la s s e m á n t ic a s A . s = B. b; B. i = f ( C . c , A. s ) La prim era regla, A .s = B .b , es u na regla leg ítim a en u na definición d irigida p o r la sin taxis con atrib u tos sin tetiza d o s o atrib utos heredados por la izquierda. D efine a u n a trib u to sin te ti­ zado A .s en térm inos d e un atrib u to en u n hijo (es decir, un sím b olo d en tro d e l cu erpo d e la producción). La segunda regla define a un atributo heredado B .i, d e forma q ue la definición dirigida por la sintaxis com p leta no puede tener atributos sintetizados. A dem ás, aunque la regla es legal, la de­ finición dirigida por la sin taxis no puede tener atributos heredados por la izquierda, debido a que e l atributo C .c se u tiliza para ayudar a definir B .i, y C e s tá a la derecha d e B en el cuerpo d e la producción. A unque los atributos en los herm anos d e un árbol d e análisis sin táctico pueden usarse en las definiciones dirigidas por la sin taxis con atributos heredados por la izquierda, d eb en estar a la izquierda d el sím bolo cuyo atributo se e s tá definiendo. □ 5 .2 .5 R e g la s s e m á n tic a s c o n e f e c to s a d ic io n a le s c o n tr o la d o s En la p ráctica, las traducciones involucran efecto s adicionales: u n a calcu lad ora d e escritorio podría im prim ir un resultado; un generador d e có d ig o p odría introducir e l tip o d e un identificador en u n a ta b la d e sím b olos. C on las d efinicion es dirigidas p or la sin ta x is, encontram os un equilibrio en tre las gram áticas d e atrib utos y lo s esqu em as d e traducción. L as gram áticas atribuidas n o tien en efectos ad icion ales y perm iten cualquier ord en d e evaluación co n sisten te con el grafo d e d ep en dencias. L os esqu em as d e trad ucción im p on en la ev alu ación d e izquierda 5.2 Ó rdenes d e evaluación para la s definiciones dirigidas p o r la sintaxis 315 a d erech a y perm iten q ue las accion es sem án ticas con ten gan cualquier fragm ento d el programa; e n la sección 5.4 hablarem os sobre los esquem as d e traducción. C ontrolarem os los efectos ad icion ales en las d efinicion es dirigidas por l a sin ta x is, en u n a de las d o s form as siguientes: • P erm itir los efectos ad icion ales in cid en tales q u e no restrinjan la evaluación d e los atribu­ to s. E n otras palabras, h ay q u e p erm itir los efecto s ad icion ales cu a n d o la ev alu ación de los atrib utos b asad a en cualquier orden topològico d e l grafo d e d ep en d en cias produzca una trad u cción “correcta” , en d ond e “correcta” dep en de d e la aplicación. • R estringir los órd en es d e evaluación perm itid os, d e m anera q ue s e p rod uzca la m ism a traducción para cualquier orden p erm itido. Las restricciones pueden considerarse com o flechas im plícitas agregadas a l grafo d e d ep endencias. C om o ejem p lo d e u n efecto adicional incidental, vam os a m odificar la calcu lad ora d e escri­ torio d e l ejem p lo 5.1 para im prim ir un resultado. E n vez d e la regla L .v a l = E .val, q ue alm a­ ce n a e l resu ltad o en e l atrib u to sin tetiza d o L .val, considere lo siguiente: 1) P r o d u c c ió n r e g l a s e m á n t ic a L p r in t(E .v a l) E n Las reglas sem á n tica s que s e ejecu ten por su s efecto s adicionales, com o p r in t(E .v a l), se tratarán com o las definiciones de los atrib u tos falsos sin tetizad os, asociados co n el en cab ezad o d e la producción. L a definición d irigida por la sin ta x is m odificada produce la m ism a traducción bajo cualquier orden topològico, y a q ue la in stru cción print se eje cu ta al final, d esp u és d e calcular e l resultado y colocarlo en E .val. E j e m p lo 5 .1 0 : L a definición d irigid a p or la sin ta x is e n la figura 5.8 recibe im a declaración D sim p le, q ue co n siste en un tip o T básico seg u id o de u na lista L d e identificadores. T p uede ser i n t o f l o a t . Para c a d a identificador en la lista , se introduce el tip o en la en trad a en la ta b la d e sím b olos para e se identificador. A sum im os q ue a l introducir e l tip o para un identificador, n o se ve afectad a la en trad a en la ta b la d e sím bolos d e ningún o tro identificador. Por en d e, las en trad as p ueden actu alizarse e n cualquier orden. E s ta definición d irigida p or la sin ta x is no verifica s i un identificador se d eclara m ás d e u na vez; p uede m odificarse p a ra ello. P r o d u c c ió n R eglas s e m á n t ic a s 1) D ^ T L L .h e r = T .tip o 2) T —>• in t T .tip o = in te g e r 3) T - » f lo a t T .tip o = flo at 4) L —>• L \ . id L \.h e r = L .h er 5) L -> id agregarT ipo{iá . en trada, L. her) agregarT ipo(id . en trada, L. her) F igu ra 5.8: D efin ición orien tad a por la sin ta x is para la s declaraciones d e tip o s sim ples 316 Capítulo 5. Traducción orientada por la sintaxis La no term inal D representa u n a declaración que, a partir d e la p rod ucción 1, co n siste en un tip o T seguid o de u n a lista L d e identificadores. T tien e un atrib uto, T .tip o , e l cu al es el tip o en la declaración D . L a no term inal L tien e tam bién un atrib uto, al cual llam arem os h e r para enfatizar q ue es un atrib u to heredado. E l p rop ósito d e L . h e r e s pasar e l tip o declarado hacia abajo en la lista d e identificadores, d e m anera q u e p ueda agregarse a las en trad as apropiadas en la ta b la d e sím b olos. C ad a u n a d e las producciones 2 y 3 evalú an e l a trib u to sin tetiza d o T .tip o , proporcionándole e l valor apropiado, integer o float. E ste tip o se p a sa al a trib u to L .h e r en la reg la para la pro­ d ucción 1. L a producción 4 p asa L .h e r hacia ab ajo e n e l árbol d e análisis sin tá ctico . E s decir, e l valor 1^.h e r se ca lcu la en un nodo d el árbol d e an álisis sin tá ctico m ediante la c o p ia d e l valor d e L .h e r d el padre d e ese nodo; e l padre corresponde al en cab ezad o d e la producción. Las producciones 4 y 5 tam b ién tien en u n a regla en la q u e se hace u n a llam ada a la función agregarT ipo co n d o s argum entos: 1 . i d . en trada, u n valor léxico q ue a p u n ta a un o b je to en la ta b la d e sím b olos. 2. L .h e r, el tip o q ue s e v a a asignar a to d o s lo s identificadores en la lista. S up onem os q ue la función agregarT ipo in sta la e n form a apropiada e l tip o L .h e r com o el tip o d el identificador representado. En la figura 5.9 aparece u n grafo d e d ep en dencias para la ca d en a d e en trad a f l o a t ¡ d i , ¡ d 2, ¡d 3- Los núm eros d e l 1 a l 10 representan los n od os d e l grafo d e d ep en dencias. Los nodos 1, 2 y 3 representan el atrib u to en tra d a asociado con ca d a u n a d e las h ojas etiq u eta d a s com o ¡d . Los nodos 6 , 8 y 10 so n los atrib utos falsos q ue representan la aplicación d e la función agregarT ipo a un tip o y uno de esto s valores entrada. D h er 5 L 6 entrada ida ¡d ‘2 2 inh 9 L ¡d i 3 entrada entrada 10 entrada 1 entrada F igu ra 5.9: G rafo d e d ep en d en cias p ara una declaración f l o a t ¡ d i, ¡ d 2, ¡ d 3 El n od o 4 representa e l atrib u to T .tip o , y en realidad e s en d on d e em p ieza la evaluación de atrib utos. D esp ués, e s te tip o se p a sa a los n od os 5, 7 y 9 q ue representan a L .h e r asociad o con ca d a u n a d e las ocurrencias d el no term inal L. □ 5.2 Ó rdenes d e evaluación para la s definiciones dirigidas p o r la sintaxis 5 .2 .6 317 E je r c ic io s p a r a la s e c c ió n 5 .2 E j e r c i c i o 5 . 2 . 1 : ¿C uáles son to d o s los órdenes to p o ló g ico s para e l grafo d e d ep en d en cias de la figura 5.7? E j e r c i c i o 5 . 2 . 2 : P ara la definición d irigida p or la sin ta x is d e la figura 5.8, proporcione los árb oles d e an álisis sin tá ctico an otad os para las sig u ien tes expresiones: a) int a, b, c. b) float w, x, y, z. E j e r c i c i o 5 . 2 . 3 : Suponga q ue tenem os u na producción A -►B C D . C a d a u na d e los cu atro no term in ales A , B, C y D tien en d o s atributos: s es un atributo sin tetiza d o , e i es u n atributo heredado. Para cad a u no d e los sigu ien tes con jun tos d e reglas, indique si ( i) las reglas son con ­ siste n tes con u n a definición co n atrib u tos sin tetiza d o s, (w ) las reglas son co n sisten tes co n una definición con atrib u tos heredados por la oizquierda, y ( ni ) s i las reglas son co n sisten tes con algún orden d e evaluación. a ) A .s = B .i + C.s. b ) A .s = B .i + C .s y D .i = A .i + B .s. c ) A .s = B .s + D .s. ! d ) A .s = D .i, B .i = A .s + C .s, C .i = B .s y D .i = B .i + C.i. E j e r c i c i o 5 . 2 . 4 : E s ta gram ática gen era núm eros binarios co n u n p u n to “d ecim a l” : S -+ L . L \L L -+ L B \ B B - + 0 1 | D iseñ e u n a definición d irigid a por la sin ta x is co n atrib utos heredados p or la izquierda para calcu lar S .val, e l valor d e núm ero d ecim al d e u n a ca d en a d e entrada. Por ejem p lo , la traducción d e la cad en a 1 0 1 .1 0 1 d eb e ser el núm ero d ecim a l 5.625. Sugeren cia: use u n a trib u to heredado L .la d o q ue nos indique e n q ué lado d e l p u n to d ecim a l s e en cu en tra u n b it. E j e r c i c i o 5 . 2 . 5 : D iseñe u na definición dirigida p or la sin ta x is con a trib u to s sin tetiza d o s para la gram ática y la traducción d escritas en e l ejercicio 5.2.4. E j e r c i c i o 5 . 2 . 6 : Im plem ente el A lgoritm o 3.23, q u e con vierte u na exp resión regular en un a u tó m a ta finito no d eterm in ista, m ediante u na definición d irigida p or la sin ta x is co n atributos heredados p or la izquierda en u n a g ra m á tica analizable m ed ian te el an álisis sin tá ctico descen­ d en te. Suponga q ue h ay u n to k en c a r q ue representa a cualquier carácter, y q ue c a r .va lex es e l carácter q ue representa. Tam bién p uede su pon er la e x iste n c ia d e u n a fun ción n u evo () que d evu elva un nuevo esta d o , e s decir, un esta d o q ue e s ta fun ción nunca haya d ev u elto . U se cu al­ quier n otación con ven ien te para especificar las tran siciones d e l A F N . 318 Capítulo 5. 5.3 Traducción orientada por la sintaxis A p lic a c io n es d e la tra d u c c ió n o r ie n ta d a p o r la s in ta x is Las técnicas d e traducción orientada por la sin taxis d e este ca p ítu lo se aplicarán en e l ca p ítu lo 6 a la com p rob ación de tip os y la generación d e cód ig o interm edio. A q u í considerarem os ejem plos seleccion ad os para ilustrar algu nas d efinicion es d irigidas p or la sin ta x is representativas. La principal ap licación en e s ta sección es la con stru cción d e árboles d e análisis sin táctico. C om o algunos com piladores u tilizan árb oles sin tá ctico s com o u n a representación interm edia, una form a com ú n d e definición d irigida p o r la sin ta x is con vierte s u ca d en a d e en trad a e n un árbol. P ara com p letar la trad ucción e n cód ig o interm edio, e l com p ilad or p uede recorrer el árbol sin tá ctico, usand o o tro con ju n to d e reglas q ue son en realidad u n a definición d irigida por la sin ­ ta x is en e l árbol sin tá ctico , en vez d el árbol d e an álisis sin tá ctico . E l ca p ítu lo 6 tam bién h ab la sobre los m étod os para la gen eración d e cód igo interm edio q ue aplican u na definición d irigida por la sin ta x is sin siq u iera construir un árbol en form a exp lícita. V am os a considerar d os d efinicion es dirigidas por la sin ta x is e n la con stru cción d e árboles sin tá ctico s para las expresiones. L a prim era, u n a definición co n a trib u to s sin tetiza d o s, es ade­ cu a d a para usarse d urante e l an álisis sin tá ctico ascendente. L a segun da, co n atrib utos hereda­ d os por la izquierda, e s ad ecu ad a para usarse d urante el anáfisis sin tá ctico descendente. El ejem p lo final d e e s ta sección e s u na definición con atrib u tos heredados a la izquierda q ue m aneja los tip o s b ásicos y d e arreglos. 5 .3 .1 C o n s tr u c c ió n d e á r b o le s d e a n á lis is s in tá c tic o C om o v im o s en la sección 2.8.2, ca d a n od o en un árbol sin tá ctico represen ta a u na con stru c­ ción; los h ijos d e l nodo represen tan los co m p o n en tes sign ificativos d e la con stru cción. U n nodo d e árbol sin tá ctico q u e representa a u na expresión E i + E>¿ tien e la etiq u e ta + y d os hijos q ue representan las su bexpresiones E \ y E 2. V am os a im plem entar los n od os de u n árbol sin tá ctico m ediante o b je to s co n un núm ero adecuado d e cam p os. C ad a o b je to ten drá un cam p o o p q ue e s l a e tiq u e ta d e l n o d o . L os o b jeto s tendrán los sigu ien tes cam p os adicionales: • S i el n od o es u na h oja, un cam p o adicional co n tien e el valor lé x ico para esa h oja. U n co n s­ tru ctor H o ja (o p , val) crea un o b je to hoja. D e m anera alternativa, si los n od os se ven com o registros, en to n ces H oja d evu elve un apuntador a u n nuevo registro para u n a hoja. • S i e l nodo es interior, h a y ta n to s ca m p o s ad icion ales co m o h ijos q ue tien e el nodo e n el árbol sin táctico. U n con stru ctor N odo recib e dos o m ás argum entos: N odo(op, ci, 02, . .., c*) crea un ob jeto co n e l prim er cam p o o p y k cam pos adicionales para los k hijos ch . . . , c*. E j e m p lo 5 .1 1 : L a definición con atrib u tos sin tetiza d o s en la figura 5 .10 co n stru y e árboles sin tá ctico s para u n a g ra m á tica d e exp resion es sim p le, q u e involucra só lo a los operadores bi­ narios + y —. C om o siem pre, esto s operadores tien en e l m ism o nivel d e precedencia y am bos son a sociativos p or la izquierda. T odos los no term in ales tien en un a trib u to sin tetiza d o llam ado n o d o, el cu a l representa a un nodo d el árbol sin táctico. C ad a v e z q u e s e u tiliz a la prim era producción E - + E i + T, su regla crea un nodo con '+ ' para op y d os hijos, E \.n o d o y T .n o d o, para las subexpresiones. L a seg u n d a p rod ucción tiene u na regla sim ilar. 5.3 Aplicaciones d e la traducción orientada p o r la sintaxis P r o d u c c ió n s e m á n t ic a s 1) E 2) E ^ E i - T E .n o d o = n e w N o d o ( E i . n o d o , T .nodo) 3) E ^ T E .n odo = T .nodo 4) T-> (E ) T .n odo = E .nodo 5) 6) T Ei + T Regla s 319 E .n o d o = n e w N o d o ('+ ', E i.n o d o , T .nodo) id T .n odo = n e w H o ja (id , i d . entrada) num T .n odo = n e w H oja( n u m , n u m .val) F igu ra 5.10: C onstrucción d e árboles sin tá ctico s para exp resion es sim p les P ara la producción 3, E T, no se crea ningún nodo, y a q u e E .n o d o es igual q ue T .nodo. D e m anera sim ilar, no se crea ningún nodo para la producción 4 , T ( E ). El valor d e T .nodo es igual q u e E .n o d o , y a q ue los paréntesis só lo se u tiliza n p a ra agrupar; tie n e n influencia sobre la estru ctu ra d el árbol d e an álisis sin tá ctico y d e l árbol en sí, pero u n a v ez q ue term in a s u trabajo, n o h ay necesidad d e retenerlos en e l árbol sin táctico. Las ú ltim as d o s producciones T tien en un so lo term inal a la derecha. U tilizam os e l cons­ tru ctor H o ja para crear un nodo adecuado, e l cu a l s e con vierte en e l valor d e T.nodo. La figura 5.11 m u estra la con stru cción d e un árbol sin tá ctico para la en tra d a a - 4 + c. Los n od os d el árbol sin tá ctico se m uestran com o registros, con el ca m p o o p prim ero. Las flechas del árbol sin táctico ahora se m uestran com o líneas sólid as. E l árbol d e an álisis sin tá ctico subyacen­ t e , q ue e n realidad no n ecesita construirse, se m uestra c o n flechas punteadas. E l tercer tip o de lín ea , q ue se m uestra d iscon tinu a, represen ta lo s valores d e E .n o d o y T .n o d o ; ca d a lín ea ap un ta a l n odo apropiado d el árbol sin táctico. E n la p arte inferior p od em os ver h ojas p a ra a, 4 y c, con stru id as p or H oja. Suponem os q ue e l valor léxico ¡ d .en trada a p u n ta a la ta b la d e sím b olos, y q ue e l valor léxico n u m . v a l es e l valor num érico d e u n a con stan te. E sta s hojas, o los apuntadores a ellas, se con vierten en el valor d e T .n o d o en los tres nodos d e l árbol sin tá ctico etiq u eta d o s com o T, d e acuerdo co n las reglas 5 y 6 . O bserve q u e en base a la regla 3, el apuntador a la h o ja para a e s tam bién e l valor d e E .n o d o para la E d e m ás a la izquierda en e l árbol d e an álisis sin táctico. L a regla 2 o ca sio n a la creación d e un n o d o co n op igual a l sign o negativo y los apuntadores a las prim eras d os hojas. D esp ués, la regla 1 p roduce e l nodo raíz d e l árbol sin tá ctico , m ediante la com binación d el nodo para - con la tercera hoja. Si las reglas s e evalúan durante un recorrido postorden d e l árbol d e análisis sin táctico, o con reducciones durante un análisis sin táctico ascendente, entonces la secu en cia d e pasos q ue se mues­ tr a en la figura 5.12 term ina co n p¿ apuntando a la raíz d el árbol sin táctico construido. □ C on u n a gram ática d iseñ ad a para el an álisis sin tá ctico d escen d en te se con stru yen los m is­ m os árboles sin tácticos, m ediante la m ism a secu en cia d e p asos, aun cu an do la estru ctu ra d e los árb oles d e an álisis sin tá ctico difiere d e m anera considerable d e la d e los árb oles sin tácticos. E j e m p lo 5 .1 2 : L a definición con atrib utos heredados p or la izquierda en la figura 5 .13 realiza la m ism a trad ucción q u e la definición co n atrib utos sin tetiza d o s en la figura 5.10. Los atributos para los sím b olos gram aticales E , T, id y n u m son com o vim os en e l ejem p lo 5.11. 320 Capítulo 5. Traducción orientada por la sintaxis E.nodo E.nodo 4- \ T.nodo \ E.nodo T.nodo id entrada para a F igu ra 5.11: Á rbol sin tá ctico p a ra a — 4 + c 1) 2) pi = p2 = n e w H o ja (id , en tra d a -a); n e w H oja(n u m , 4); 3) 4) 5) Ps = p4 = p5 = n e w N o d o ^ - \ p h p¿)] n e w H oja(id , en trada-c)\ n e w N o d o ('+ \ p4); F igu ra 5.12: P asos e n la con stru cción d e l árbol sin tá ctico para a — 4 + c Las reglas para con stru ir árboles sin tá ctico s e n e s te ejem p lo so n sim ilares a las reglas para la calcu ladora d e escritorio en el ejem p lo 5.3. E n e s te ejem p lo se evalúo un térm in o x * y, pa­ san d o x com o un atrib u to heredado, y a q ue x y * y aparecían en d istin ta s porciones d el árbol d e análisis sin táctico. A q u í, la id ea es construir un árbol sin tá ctico p a ra x + y, p asan d o x com o un a trib u to heredado, y a q ue x y + y aparecen e n d istin to s su bárboles. E l no term in al E ' es la con trap arte d el no term inal V e n e l ejem p lo 5.3. C om pare e l grafo d e d ep en d en cias para a — 4 + c en la figura 5.14, co n el grafo para 3 * 5 en la figura 5.7. El n o term inal E ' tien e un atrib uto heredado h e r y un a trib u to sin tetiza d o sin. E l atributo E ’.h e r representa e l árbol sin tá ctico parcial q ue se h a con stru id o h a sta ahora. E n form a esp e­ cífica, represen ta la raíz d el árbol para e l prefijo d e la ca d en a d e en trad a q ue s e en cu en tra a la izquierda d e l su b árb ol para E '. E n el nodo 5 en e l grafo d e d ep en d en cias d e la figura 5.14, E ’.h er d en o ta la raíz d el árbol sin táctico parcial para e l identificador a; e s decir, la h o ja para a. En e l nodo 6 , E ’.h er d en o ta la raíz para el árbol sin tá ctico parcial p a ra la en trad a a - 4. En e l n o d o 9 , E ’.h e r d e n o ta el árbol sin tá ctico para a - 4 + c. 321 5.3 Aplicaciones d e la traducción orientada p o r la sintaxis P r o d u c c ió n E ^ T E ' 1) Re g l a s s e m á n t ic a s E .n o d o = E '.sin E ’.h e r = T .nodo E' 2) + T E[ E [ .h e r = n ew N o d o ('+ \ E ’.h e r, T.nodo) E '.s in = E [.sin E '->-TE [ 3) E [ .h e r = n ew n o d o { E ' . h e r , T .nodo) E '.s in = E [.sin 4) E '^ e E '.sin = E '.h e r 5) T -¥ (E ) T .n odo = E .nodo 6) T —» id T .n odo = n e w H o ja (id , i d . entrada) 7) T T .n odo = n e w H o ja (n u m , n u m . entrada) num F igu ra 5.13: C onstrucción d e árboles sin tá ctico s d urante e l análisis sin tá ctico d escen dente t 1 entrada n iim 3 val + T 8 ! 7tentrada id F igu ra 5.14: Gráfico d e d ep en d en cias para a - 4 + c, co n la d efinición d irigida por la sin ta x is d e la figura 5.13 C om o no h ay m ás en trad a, en el nodo 9, E '.h e r a p u n ta a la raíz d e to d o el árbol sin táctico. Los atrib utos sin tetiza d o s pasan e s te valor d e v u e lta h acia arriba d e l árbol d e análisis sin tác­ tico, h a sta q u e se con vierte en e l valor d e E .nodo. D e m anera esp ecífica , el valor d el atributo e n e l n od o 10 se d efine m ed ian te la regla E '.s in = E ’.h e r a so cia d a c o n la producción E ' c. E l valor d e l atrib u to e n el n odo 11 s e d efin e m ed ian te la reg la E '.sin = E [.s in a so cia d a c o n la producción 2 en la figura 5.13. H ay reglas sim ilares q ue d efinen los valores d e los atrib utos en los n od os 12 y 13. □ 5 .3 .2 L a e s t r u c t u r a d e tip o s Los atrib utos heredados son ú tiles cu an d o la estru ctu ra d el árbol d e an álisis sin tá ctico difiere d e la sin ta x is a b stracta d e la entrada; en tonces, los atrib utos pueden usarse para llevar infor­ m ación d e una p arte d e l árbol d e an álisis sin tá ctico a otra. E l sig u ien te ejem p lo m uestra cóm o 322 Capítulo 5. Traducción orientada por la sintaxis un con flicto en la estru ctu ra p u ed e d eb erse al d iseñ o d el len gu aje, y no a las restricciones q ue im pon e el m étod o d e an álisis sin táctico. E j e m p lo 5 .1 3 : E n C, el tip o i n t [2][3] p uede leerse com o “arreglo d e 2 arreglos d e 3 en teros” . La exp resión d e l tip o corresp ond ien te arreglo{2 , arreglo(3, in teg er)) se representa m ediante el árbol en la figu ra 5.15. E l operador arreglo recibe d os parám etros, u n núm ero y un tipo. Si los tip os se representan m ediante árboles, en ton ces e s te operador d ev u elv e u n n o d o d e árbol etiq u eta d o com o arreglo, con d os hijos para e l núm ero y e l tip o . arreglo 2 3 arreglo X \ mteger F igu ra 5.15: E xp resión d e los tip o s p a ra i n t [2] [3] Con la definición d irigida por la sin ta x is en la figura 5.16, el n o term inal T g en era u n tip o básico o un tip o arreglo. E l no term inal B genera u no d e los tip o s básicos i n t y f l o a t . T genera un tip o b ásico cu an do T d eriva a B C y C deriva a e. E n cualquier o tro caso, C g en era com ­ p on en tes d e u n arreglo q ue co n sisten en u n a secu en cia d e enteros, en d on d e ca d a en tero e s tá rodeado p or llaves. P r o d u c c ió n Reg la s s e m á n t ic a s c.t T -» B C t i = C b - B .t B —» in t B .t = integer B -» float C —» [ nirni ] Ci B .t = float C .t = arreglo( n u m .val, C u t) C -> e Ci J) = C b C .t = C b F igu ra 5.16: T g en era un tip o básico o un tip o d e arreglo Los no term inales B y T tien en un atrib u to sin tetizad o t q ue representa un tip o. E l n o ter­ m inal C tiene d o s atributos: u n atributo heredado 6 y un atrib uto sin tetizad o t. Los atributos b heredados pasan un tip o b ásico h acia abajo d el árbol, y la s atrib u tos t sin tetiza d o s acum ulan e l resultado. En la figura 5.17 se m uestra u n árbol d e an álisis sin tá ctico anotad o para la ca d en a d e en ­ trad a i n t [2] [3]. L a exp resión d e tip o corresp ond ien te en la figura 5.15 s e con stru ye p asan d o el tip o m te g er d esd e jB, h acia abajo por la cad en a d e Cs y a través d e lo s atrib u tos heredados b. El tip o arreglo s e sin te tiz a h acia arriba p or la cad en a d e Cs, a través d e los a trib u to s t. Con m ás d etalle, en la raíz para T B C, e l no term in al C hereda el tip o d e B , usando el atrib u to heredado C. b. E n el n od o d e m ás a la d erech a para C, la producción es C -► e, p or lo q ue C .t es igual a C.b. Las reglas sem án ticas para la p rod ucción C -► [ n u m ] C\ form an C .t m ediante la ap licación d e l operador arreglo a los op eran d os n u m . u a / y C \ .t □ 5.4 Esquemas d e traducción orientados p o r la sintaxis 323 T .t = arreglo(2 , aireglo(3, integer)) C.b = integer C .t = arreglo(2 , arreglo(3, integer)) 1 3 .1 = integer C .b = integer C .t = arreglo (3, integer) in t C.b = integer C .t = integer € F igu ra 5.17: T radu cción orien ta d a por la sin ta x is d e los tip o s d e arreglos 5 .3 .3 E je r c ic io s p a r a la s e c c ió n 5 .3 5 . 3 . 1 : A con tinu ación se m u estra u n a g ra m á tica para exp resion es, en la q u e se invo­ lucra e l operador + y los operandos d e en tero o p u n to flotan te. Los núm eros d e p u n to flotan te s e d iferencian d eb ido a que tien en u n p u n to decim al. E je r c ic io E T -* —* E + T | T num . num | num a) P rop orcion e u na definición dirigida p or la sin ta x is para d eterm in ar el tip o d e c a d a tér­ m ino T y ca d a expresión E. b) E xtien d a su definición d irigida por la sin ta x is d e (a) para traducir exp resion es a la nota­ ción postfijo. U se el operador im ario i n t T o F l o a t para convertir un en tero en un núm ero eq u ivalen te d e punto flotante. ! 5 . 3 . 2 : P rop orcion e u n a definición d irigid a por la sin ta x is p a ra traducir las exp resio­ n es infijo co n + y * en exp resion es eq u ivalen tes sin paréntesis redundantes. P or ejem p lo, com o am bos operadores asocian por la izquierda, y * tien e p reced en cia sobre + , ( ( a * ( 6+ c ) ) * (d )) se trad u ce en a * (b + c) * d. ! E j e r c i c i o 5 . 3 . 3 : P roporcione u na definición d irigida p or la sin ta x is p a ra diferenciar expre­ sio n es com o x * (3 * x + x * x), en las q ue se involucren los operadores + y *, la variable x y co n sta n tes. S u p on ga q ue no ocurre n in gu n a sim plificación, d e form a que, por ejem p lo, 3 * x se trad ucirá en 3 * 1 + 0 * x. E je r c ic io 5.4 E sq u e m a s d e tra d u c c ió n o rie n ta d o s p o r la s in ta x is Los esquem as d e traducción orientados por la sin ta x is son u na notación com plem entaria para las definiciones dirigidas a la sintaxis. Todas las aplicaciones d e las definiciones dirigidas por la sintaxis en la sección 5.3 pueden im plem entarse m ediante e l uso d e esquem as d e traducción orientados por la sintaxis. 324 Capítulo 5. Traducción orientada por la sintaxis En la sección 2.3.5 vim os q ue u n esquem a de tra d u cció n o rien ta d o p o r la sin ta x is (esquem a d e trad ucción orien tad o a la sin ta x is) e s u n a g ra m á tica libre d e co n tex to , con fragm entos d e program a incrustados dentro d e los cu erpos d e las producciones. A esto s fragm entos se les co n o ce com o accion es sem á n tica s y p u ed en aparecer en cualquier p osición d en tro d el cuerpo d e u na producción. P or convención, colocam os llaves alrededor d e las acciones; si la s llaves se n ecesitan com o sím b olos gram aticales, en to n ces la s encerram os en tre com illas. P od em os im plem entar cualquier esq u em a d e traducción orientado a la sin ta x is, con stru ­ yen d o prim ero u n árbol d e análisis sin táctico y desp ués realizando la s accion es en un orden d e izquierda a derecha, co n búsqueda e n profundidad; es decir, d urante u n recorrido preorden. En la sección 5.4.3 aparece un ejem plo. Por lo general, los esqu em as d e traducción orien tad os a la sin ta x is s e im plem entan d urante e l an álisis sin táctico, sin construir un árbol d e an álisis sin tá ctico . E n e s ta secció n n os enfocare­ m os en e l uso d e esqu em as d e trad ucción orien tad os a la sin ta x is p a ra im plem entar d o s clases im p ortan tes d e d efinicion es d irigidas por la sintaxis: 1. P u ed e utilizarse el an álisis sin táctico L R en la gra m á tica subyacente, y la definición d i­ rigida p or la sin ta x is tien e atrib u tos sin tetizad os. 2. P u ed e u tilizarse e l an álisis sin táctico LL en la g ra m á tica su byacen te, y la d efinición diri­ g id a por la sin ta x is tien e atrib utos heredados por la izquierda. M ás ad elan te verem os cóm o e n am bos casos, las reglas sem án ticas en u n a definición d irigida por la sin ta x is pueden convertirse e n un esq u em a d e trad u cción orien tad o a la sin ta x is co n ac­ cion es q ue se ejecu ten en e l m om ento adecuado. D urante el an álisis sin táctico, u n a acción en el cu erpo d e u n a producción se eje cu ta tan pronto com o los sím b olos gram aticales a l a izquierda d e la acción ten gan coincidencias. Los esquem as d e traducción orientados a la sin ta x is q ue pueden im plem entar se durante el análisis sin táctico se caracterizan m ediante la introducción d e n o term in a les m arcadores en lugar d e ca d a acción incrustada; cad a m arcador M sólo tiene u n a producción, M ->* e. S i la gram ática con n o term inales m arcadores p uede analizarse m ediante un m étodo dado, entonces e l esquem a d e traducción orientado a la sin taxis puede im plem entarse d urante e l análisis sin táctico. 5 .4 .1 E s q u e m a s d e t r a d u c c i ó n p o s tfijo s H a sta ahora, la im p lem en ta c ió n d e d efin icio n es d irig id a s p or la s in ta x is m ás sim p le o cu rre cu a n d o p od em os an alizar sin tá ctica m en te la g ra m á tica d e a b a jo h a cia arriba, y la d efinición dirigida p o r la sin taxis tiene atrib utos sin tetizad os. E n ese caso, p od em os construir u n esquem a d e traducción orientado a la sin taxis en e l cu al ca d a acción se coloqu e al final d e la producción y se ejecu te ju n to con la reducción del cuerpo p ara e l en cab ezado d e esa producción. Los esque­ m as d e traducción orientados a la sin ta x is con tod as las acciones en los extrem os derechos d e los cuerpos d e las producciones se llam an esquem as d e tradu cción o rien ta d o s a la sin ta x is postfijo. E j e m p lo 5 .1 4 : E l esq u em a d e trad u cción orien tad o a la sin ta x is postfijo en la figura 5.18 im p lem en ta la definición dirigida por la sin taxis d e la calcu ladora d e escritorio d e la figura 5.1, con un cam bio: la acción para la prim era producción im prim e un valor. E l resto d e las acciones son contrapartes ex a c ta s d e las reglas sem án ticas. C om o la gra m á tica su byacen te es LR , y la definición d irigida por la sin ta x is tien e atrib utos sin tetizad os, es ta s accion es p ueden realizarse en form a correcta, ju n to con los pasos de reducción d e l analizador sin tá ctico . □ 5.4 Esquemas d e traducción orientados p o r la sintaxis L E E T T F F ->■ -)■ —y E n E i+T T T\ * F F (E) d ig ito { { { { { { { 325 im prim ir(E .va l): } E .v a l = E i .v a l + T .v a l: } E .v a l = T.vah. } T .v a l = T i.v a l x F.val: } T .v a l = F.val: } F .va l = E .vaí: } F .va l = d i g i t o .valer, } F igu ra 5.18: Im plem en tación de un esq u em a d e trad u cción orientado a la sin ta x is p ostfijo d e la calcu lad ora d e escritorio 5 .4 .2 I m p le m e n ta c ió n d e e s q u e m a s d e tr a d u c c i ó n o r ie n ta d o s a la s in ta x is p o s tf ijo c o n la p ila d e l a n a liz a d o r s in tá c tic o Los esqu em as d e trad ucción orien tad os a la sin ta x is p o stfijo p u ed en im plem en tarse d u ra n te el a n álisis sin tá ctico L R m ed ian te la ejecu ció n d e las accion es cu a n d o ocu rren la s reducciones. E l (los) atrib u to (s) d e ca d a sím b olo gram atica l p u ed e(n ) colocarse e n la pila, en u n lugar en el q ue puedan encontrarse d urante la reducción. E l m ejor plan es colocar los a trib u to s ju n to con los sím b olos gram aticales (o co n los esta d o s L R q u e represen tan esto s sím b o lo s) en registros e n la m ism a pila. En la figura 5.19, la pila d el analizador sin tá ctico con tien e registros con un ca m p o para un sím b olo gram atical (o esta d o del analizador sin tá ctico ) y, d eb ajo d e él, un ca m p o para un atri­ buto. L os tres sím bolos gram aticales X Y Z está n en la parte superior d e la pila; tal v ez estén a punto d e reducirse en base a u n a producción com o A X Y Z. A quí, m ostram os X . x com o el único atributo d e X , y a sí en lo sucesivo. E n general, p od em os perm itir m ás atrib utos, y a sea haciendo los registros lo bastan te ex ten so s o colocando apuntadores a registros en la p ila. Con atrib utos pequeños, p uede ser m ás sim p le hacer los registros lo b astan te grandes, aun cuando algunos cam p os no se u tilizan la mayor p arte d el tiem po. N o o b sta n te, si uno o m ás atributos sin tetizad os so n d e u n tam añ o sin lím ite (por decir, s i son cad en as d e caracteres), en ton ces sería m ejor colocar u n apuntador al valor d el atributo e n e l registro d e la p ila y alm acenar e l valor real en algu na área d e alm acenam iento com partido m ás extensa, q u e no form e p arte d e la pila. X X. x Y Y-y z Z. z Estado/símbolo gramatical Atributo(s) sintetizado(s) tope F igu ra 5.19: L a p ila d e l analizador sin táctico , co n u n ca m p o para los atrib utos sin tetizad os Si los atrib utos sin tetiza d o s son to d o s sin tetizad os, y las acciones ocu rren en los extrem os d e las producciones, en to n ces p od em os calcu lar los atrib u tos para el en cab ezad o cu a n d o re­ d u zcam os e l cu erpo al en cab ezad o. S i reducim os m ed ian te u n a p rod ucción co m o A X Y Z, en to n ces ten em os to d o s los atrib u tos d e X , Y y Z d ispon ib les, en p o sicio n es con ocidas d e la pila, com o e n la figura 5.19. D esp ués d e la acción, A y su s atrib u tos sin tetiza d o s se encuentran e n la p arte su perior d e la pila, en la p osición d e l registro para X. 326 Capítulo 5. Traducción orientada por la sintaxis E j e m p lo 5 .1 5 : V am os a rescribir las acciones d el esq u em a d e traducción orien tad o a la sin ­ ta x is d e la calcu lad ora d e escritorio d el ejem p lo 5 .1 4 , d e m anera q ue m anip ulen la p ila d el analizador sin táctico en form a ex p lícita . P or lo general, el analizador sin tá ctico es el q u e realiza en form a a u tom ática la m anipulación d e la pila. P r o d u c c ió n L —►E n A c c io n e s { im prim ir(pila[tope - 1 ].vat)\ tope — tope — 1 ; } E E\ + T { pila [to p e — 2].val = p ila [to p e — 2].v a l + pila[tope].val, tope — tope - 2 ; } T T - * Ti * F { pila [to p e - 2].v a l = p ila [to p e - 2].v a l x p ila[tope].val) tope — tope — 2 ; } T —►F F~* ( E ) { pila [to p e - 2].val = p ila [to p e - 1 ].val; tope — tope — 2 ; } F —> d i g i t o F igu ra 5.20: Im plem entación d e la calcu lad ora d e escritorio en u na p ila d e análisis sin tá ctico ascendente S u p on ga q ue la p ila se m an tien e en u n arreglo d e registros llam ad o p ila , en d on d e tope es un cursor para la parte superior d e la pila. Por en d e, pila[tope] se refiere al registro superior en la p ila, pila [su p erio r — 1] al registro d eb ajo d e éste , y así e n lo su cesivo. A dem ás, su pon em os q ue ca d a registro tien e u n cam p o llam ado va l, el cu al co n tien e el a trib u to d e cualquier sím b olo gram atical q u e se represente en ese registro. Por en d e, p od em os referim os a l a trib u to E .va l q ue aparece en la tercera p osición en la p ila co m o pila[tope — 2] .v a l E l esq u em a d e trad ucción orientado p or la sin ta x is com p leto se m uestra en la figura 5.20. Por ejem p lo, e n la seg u n d a p rod ucción , E E i + T , recorrem os d o s p o sicio n es d eb a jo d e la p arte su perior p ara ob ten er e l valor d e E i, y en con tram os el valor d e T en superiores to p e. La su m a resu ltan te s e co lo ca e n d ond e d eb e aparecer e l en cab ezad o E d esp u és d e la reducción; es d ecir, d o s p osiciones d eb ajo d el to p e actu al. L a razón es q u e , d esp u és d e la reducción, los tres sím b olos d e la p arte d el to p e d e la p ila se su stitu y en p or u no solo. D esp u és d e calcular E .v a l, sacam os d o s sím b olos d e l to p e d e la pila, p or lo q ue e l registro en d ond e colo ca m o s E .va l ahora esta r á e n el to p e d e la pila. En la tercera producción, E T, n o es necesaria n ingu na acción y a q u e la longitud d e la pila no cam bia, y e l valor d e T .v a l e n e l to p e d e la p ila sim p lem en te se con vertirá e n e l valor de E .val. L a m ism a ob servación s e ap lica a las producciones T -> F y F -+ d í g i t o . L a producción F -► ( E ) e s u n p o co d istin ta. A un qu e el valor no cam b ia, d o s p o sicio n es se elim in an d e la pila d urante la reducción, por lo q u e e l valor tien e q ue avanzar a la p osición q u e e s tá desp ués d e la reducción. O bserve q ue hem os o m itid o los p asos q ue m anipulan e l prim er ca m p o d e los registros d e la pila; e l cam p o q u e prop orciona e l esta d o L R o , en cualquier otro caso, q ue representa e l sím b olo gram atical. Si vam os a realizar un análisis sin táctico LR , la ta b la d e análisis sin tá ctico nos in­ 5.4 Esquemas d e traducción orientados p o r la sintaxis 327 d ica cu ál es el nuevo esta d o c a d a vez q ue realizam os u n a reducción; vea el algoritm o 4.4 4 . Por en d e, sim p lem en te p od em os colocar e l estad o en el registro para e l nuevo to p e d e la pila. □ 5 .4 .3 E s q u e m a s d e t r a d u c c ió n o r i e n t a d o s a la s in ta x is c o n a c c io n e s d e n t r o d e la s p r o d u c c io n e s P u ed e colocarse u n a acción e n cualquier posición d en tro d e l cu erpo d e u n a p rod ucción . É sta se eje cu ta d e inm ediato, d esp u és d e procesar to d o s los sím b olos a su izquierda. Por en d e, si ten em os u n a producción B X { a } F , la acción a se realiza d esp u és d e q u e reconozcam os a X (si X es un term inal) o to d o s los term inales d erivados d e X (si X es un no term in al). D icho e n form a m ás precisa, • Si e l an álisis sin tá ctico es ascendente, en to n ces ejecu tam os la acción a ta n p ron to com o aparezca e s ta ocu rren cia d e X en el to p e d e la p ila d e an álisis sin táctico. • Si el an álisis sin táctico e s descen dente, ejecu tam os la acción a ju sto an tes d e tratar de expandir e s ta ocu rren cia d e Y (si Y es u na no term in al) o com p rob am os a Y en la en trad a (si Y es una term inal). Los esqu em as d e trad ucción orientados a la sin ta x is q ue p u ed en im plem en tarse d urante el an álisis sin tá ctico incluyen a los esqu em as de trad ucción orien tad os a la sin ta x is postfijos y a u n a clase d e esqu em as d e trad ucción orien tad os a la sin ta x is q ue verem os e n la secció n 5.5, los cu a les im plem en tan d efin icion es co n atrib utos heredados por la izquierda. N o to d o s los esque­ m as d e trad ucción orientados a la sin ta x is p ueden im plem entarse d u ran te el análisis sin táctico, com o verem os e n e l sigu ien te ejem plo. E j e m p lo 5 .1 6 : C om o un ejem plo extrem o d e un esq u em a d e traducción orientado a la sin taxis problem ático, su p o n g a q ue con vertim os nuestro ejem p lo d e u na calcu ladora d e escritorio e n un esq u em a d e traducción orientado a la sin tax is q ue im prim e la form a prefijo d e u n a expresión, en v e z d e evaluar esa expresión. E n la figura 5.21 se m uestran las producciones y las acciones. 1) 2) 3) 4) 5) 6) 7) L E E T T F F —¥ -> E n { printC'+O: } E 1 + T T { print('*'): } T i * F —► F (E ) d í g i t o { printfdigito.va/ea:); } -¥ F igu ra 5.21: E sq u em a d e traducción orien tad o a la sin ta x is prob lem ático para la trad ucción d e infijo a p ostfijo durante e l an álisis sin tá ctico P or desgracia, es im posible im plem entar este esq u em a d e trad ucción orientado a la sin ta x is d urante e l an álisis sin tá ctico d escen d en te o ascen dente, d eb id o a q ue el analizador sin tá ctico ten d ría que realizar accion es críticas, com o im prim ir in stancias d e * o + , m ucho an tes d e saber s i esto s sím b olos aparecerán e n su entrada. U sand o los n o term inales com o m arcadores y M 4 para las accion es e n las producciones 2 y 4, resp ectivam en te, e n la en trad a 3 u n analizador sin tá ctico d e desplazam iento-reducción (v ea la sección 4.5.3) tien e conflictos en tre reducir m ediante M 2 -► e, reducir m ediante M 4 -► e, o d esplazar e l d ígito. □ 328 Capítulo 5. Traducción orientada por la sintaxis C ualquier esq u em a d e traducción orientado a la sin ta x is p uede im plem entarse d e la sigu ien ­ te manera: 1. Ignorando las acciones, se a n aliza sin táctica m en te la en tra d a y se produce u n árbol d e an álisis sin tá ctico com o resultado. 2. D esp ués se exa m in a c a d a nodo interior JV, por ejem plo, u no para la producción A a . Se agregan h ijos adicionales a iV p ara las accion es en a , para q ue los h ijos d e iV de izquierda a d erech a ten gan exa cta m en te los sím b olos y las accion es d e a. 3. R ealizar un recorrido e n preorden (v ea la secció n 2 .3 .4 ) d e l árb ol, y tan pronto com o se v isite un nodo etiq u eta d o por u na acción, realizar e s a acción. Por ejem plo, la figura 5.22 m uestra e l árbol d e an álisis sin tá ctico para la expresión 3 * 5 + 4 con accion es insertadas. Si v isitam os los n od os en preorden, o b ten em os la form a prefijo d e la expresión: + * 3 5 4 . { print('+'); } { p rin t(V ); } T E * d í g i t o { p rin t(4 ); } F NN S d í g i t o { p rin t(o ); } d í g i t o { p rin t(3 ); } F igu ra 5.22: Á rbol d e análisis sin tá ctico co n accion es incrustadas 5 .4 .4 E lim in a c ió n d e la r e c u r s i v id a d p o r la iz q u ie r d a d e lo s e s q u e m a s d e t r a d u c c ió n o r i e n t a d o s a la s in ta x is C om o n inguna gram ática co n recursividad por la izquierda p uede analizarse sin tá ctica m en te en form a d eterm in ista, d e form a d escen d en te, en la sección 4 .3 .3 ex a m in a m o s la elim in ación d e la recursividad por la izquierda. C uan do la gram ática form a parte d e un esq u em a de traducción orientado a la sin ta x is, tam b ién d eb em os preocuparnos d e cóm o se m anejan la s acciones. En prim er lugar, considere e l ca so sim ple, e n donde lo único q ue n os im p orta es el orden en e l q ue se realizan las accion es en un esq u em a d e trad ucción orien tad o a la sin ta x is. Por ejem plo, si ca d a acción só lo im prim e u n a cad en a, só lo n os preocupa e l orden en el q ue se im prim en las cad en as. E n e s te caso, el sigu ien te principio p uede se rv im o s d e guía: • A l transform ar la g ram ática, trate a las accion es com o si fueran sím b olos term inales. 5.4 Esquemas d e traducción orientados p o r la sintaxis 329 E ste principio se b asa en la id ea d e q u e la transform ación gram atical preserva e l orden d e los term in ales e n la cad en a gen erada. Por lo ta n to , las accion es se ejecu ta n en e l m ism o orden en cualquier análisis sin tá ctico d e izquierda a derecha, d e arriba h acia abajo o d e abajo hacia arriba. E l “truco” para elim inar la recursividad por la izquierda es tom ar d os producciones: A A ol | 0 q u e gen eren cad en as q ue co n sisten en u n a 0 y cualquier núm ero d e o s , y su stitu irla s p or pro­ d u ccion es q ue gen eren las m ism as cad en as, usando un nuevo no term inal R (d e “resto”) d e la prim era producción: A -► 0 R R -*■ oíR | e S i 0 n o em p ieza co n A , en ton ces A y a no tien e u na producción recursiva por la izquierda. En térm in os d e las d efinicion es regulares, con am bos con jun tos d e prod uccion es, A s e d efin e m e­ d ia n te 0 (a )* . E n la sección 4.3.3 p o d rá con su ltar la secció n sobre el m anejo d e situ a cio n es en las q ue A tien e m ás producciones recursivas o n o recursivas. E j e m p lo 5 .1 7 : C onsidere las sigu ien tes p roducciones i? d e un esq u em a d e traducción orienta­ d o a la sin taxis, para trad ucir exp resion es infijo a la n otación postfijo: E E -+ Ey + T T { p r in t ( V ) ; } Si aplicamos la transformación estándar a E , e l resto d e la producción recursiva por la izquierda es: a = + T { p rin t('+ 0 : } y 0 , e l cu erpo d e la o tr a producción es T. Si in trodu cim os R para el resto d e E, o b ten em os el sigu ien te con ju n to d e producciones: E R R TR - + + T { p rin t('+ '); } R —► € C uan do las accion es d e una definición d irigida por la sin ta x is calcu lan atrib u tos en vez de só lo im prim ir la salid a, d eb em os ten er m ás cu id ad o en la form a d e elim inar la recursividad por la izquierda d e u n a gram ática. N o ob sta n te, si la definición d irig id a p or la sin ta x is tiene atrib u tos sin tetizad os, en to n ces siem p re podrem os con stru ir un esq u em a de trad ucción orien­ tad o a la sin ta x is colocan do las accion es d e cálcu lo d e atrib u tos e n p o sicio n es apropiadas en las producciones nuevas. V am os a ver un esq u em a gen eral para el caso d e u n a so la producción recursiva, u n a so la producción no recursiva, y u n so lo atrib u to d e l n o term inal recursiva por la izquierda; la ge­ neralización a m uchas producciones d e ca d a tip o no e s difícil, pero e n cu a n to a n otación es com p leja. S u p on ga q ue las d os producciones son: 330 Capítulo 5. A A -+ Traducción orientada por la sintaxis A l Y { A . a = g ( Ai . a , Y . y ) } X {A.a = f(X.x)} A quí, A . a es el atrib u to sin tetiza d o d e l no term inal A recursivo por la izquierda, y X y Y son sím b olos gram aticales in dividu ales con los atrib u tos sin tetiza d o s X . x y Y. y , respectivam ente. É stos p o d ría n representar a una cad en a d e varios sím b olos gram aticales, ca d a u no co n su (s) propio(s) a trib u to (s), y a q ue el esq u em a tien e u na fun ción arbitraria g q u e ca lcu la a A a en la producción recursiva, y u na función a r b itr a r ia /q u e ca lcu la a A. a en la seg u n d a producción. En ca d a caso, f y g reciben com o argum entos los atrib u tos a los q u e ten gan perm itid o el acceso, si la d efinición d irigid a p or la sin ta x is tien e atrib utos sin tetizad os. Q uerem os convertir la g ra m á tica su b yacen te en: X R Y R La figura 5.23 sugiere lo que d eb e hacer el esquem a d e traducción orientado a la sin taxis con la nueva gram ática. En (a) p od em os ver e l efecto d el esquem a d e traducción orientado a la sin taxis postfijo sobre la gram ática original. A plicam os / u na vez, que corresponde al uso d e la producción A X , y después aplicam os g tod as las veces q ue utilicem os la producción A A Y. C om o R gen era un “resid uo” d e Y s, su traducción d ep en d e d e la ca d en a a su izquierda, u n a ca d en a d e la form a X Y Y -Y. C ad a u so d e la p rod ucción R -► Y R resu lta e n u n a ap licación d e g. P ara R , u tilizam os un atributo heredado R .i para acum ular e l resu ltad o d e aplicar la fun ción g en form a su cesiva, em p ezan d o co n e l valor d e A .a . A -a = g ( g ( f (X .x). Yi .y). Y¿.y) A .a = g ( f ( X . x ) , Y u y) A. a = f ( X . x ) K i = g ( f ( X .x ) ,Y i,y ) Y2 (a) R .i = g ( g ( f ( X . x ) , Y i .y), Y2.y) (b) F igu ra 5.23: E lim inación d e la recursividad por la izquierda d e u n esquem a d e trad ucción orientado a la sin ta x is postfijo A dem ás, R tien e u n atributo sin tetiza d o R .s , el cu a l n o se m uestra en la figura 5.23. E ste atrib u to se ca lcu la prim ero cu an d o R term in a su generación d e sím b olos Y , com o se in dica m ediante el u so d e la producción R -► e. D esp ués, R .s se co p ia h acia arriba en e l árbol, para q ue p u ed a convertirse en el valor d e A .a para to d a la expresión X Y Y — Y. E l ca so en el q u e A gen era a X Y Y s e m uestra en la figu ra 5.23, y p od em o s ver q ue el valor d e A .a e n la raíz d e (a) tien e d os u sos d e g. Lo m ism o p asa co n R .i e n la parte inferior d e l árbol (b ), y es e l valor de R .s el q ue se co p ia h acia arriba d e e se árbol. P ara lograr e s ta traducción, u tilizam os el sigu ien te esquem a d e tradu cción o rie n ta d o a la sintaxis: 5.4 Esquemas d e traducción orientados p o r la sintaxis A R R X { R . i = f(X.x)} R { A . a = R . s } Y { R i . i = g ( R .i,Y .y ) } f íi { R . s = e { R . s — R .i} 331 R i.s } O bserve q ue e l atrib u to heredado R .i s e ev a lú a d e inm ediato, an tes d e usar R en e l cuerpo, m ientras q ue los atrib utos sin tetiza d o s A .a y R .s s e ev alú an al final d e las producciones. Por en d e, cu alq uiera q u e sean los valores q ue se ten g a n q ue calcular, e sto s atrib utos estarán d isp o ­ n ib les en lo q u e se h aya calcu lado a la izquierda. 5 .4 .5 E s q u e m a s d e t r a d u c c ió n o r i e n t a d o s a la s in ta x is p a r a d e fin ic io n e s c o n a t r i b u t o s h e r e d a d o s p o r la iz q u ie r d a E n la sección 5.4.1 vim os la conversión d e definiciones dirigidas por la sin taxis con atributos sin­ tetizad os en esquem as d e traducción orientados a la sin ta x is p ostfijo, con acciones en los extrem os derechos d e las producciones. Siem pre y cuando la gram ática subyacente se a LR, los Esque­ m as d e traducción orientados a la sin taxis postfijos podrán analizarse sintácticam ente y traducirse d e abajo hacia arriba. A hora, vam os a considerar e l caso m ás gen eral d e un definición d irigida p or la sin ta x is con atrib utos heredados por la izquierda. V am os a su pon er q ue la g ra m á tica su byacen te puede analizarse d e arriba h acia ab ajo, p orq ue d e lo contrario sería c o n frecuencia im p o sib le realizar la traducción en con exión co n un analizador sin tá ctico LL o L R . C on cualquier gram ática, la téc n ic a an tes m en cion ada puede im plem entarse ad ju ntand o las acciones a un árbol d e análisis sin tá ctico y ejecu tán dolas d urante el recorrido preorden d e l árbol. A con tinu ación se m uestran las reglas para convertir u na definición d irigid a p or la sin ta x is co n atrib u tos heredados por la izquierda e n un esq u em a de traducción orientado a la sintaxis: 1. Incrustar la acción q ue calcu le los atrib u tos heredados para u n no term in al A , ju sto d es­ pués d e esa ocu rren cia d e A e n e l cu erpo d e la producción. Si varios atrib u tos heredados para A d ep en den uno d el o tro en form a acíclica, ordenar la evaluación d e los atributos, d e m anera q u e los q ue se n ecesiten prim ero sea n los q u e s e ca lcu len prim ero. 2. C olocar las accion es q ue calcu lan un a trib u to sin tetiza d o para el en cab ezad o d e una producción, a l final del cu erpo d e e sa producción. V am os a ilustrar esto s principios co n d os ejem plos com pletos. El prim ero involucra a la com ­ posición tipográfica. M uestra cóm o pueden usarse las técnicas d e com pilación en e l procesam ien­ to d e lenguajes, para aplicaciones d istin tas a las q u e consideram os, por lo general, com o lenguajes d e program ación. E l segundo ejem p lo tra ta acerca d e la generación d e cód igo interm edio para u n a construcción com ú n en un lengu aje d e program ación: u n a form a d e instrucción w hile. E j e m p lo 5 .1 8 : E ste ejem p lo e s tá inspirado en lo s lenguajes para las fórm ulas m atem áticas d e la com posición tipográfica. Eqn es uno d e los primeros ejem plos d e dicho lenguaje; las ideas de Eqn se sigu en u tilizan d o en e l siste m a d e co m p o sició n tipográfica T g X , q ue s e u tilizó para pro­ ducir e s te libro. Vamos a concentram os sólo en la capacidad d e definir subíndices, subíndices de subíndices, y así en lo sucesivo, ignorando Jos superíndices, las fracciones y subfracciones y todas las dem ás caracte­ rísticas m atem áticas. En el lenguaje Eqn, escribim os a sub i su b j para establecer la expresión a if. U na gram ática sim ple para los cuadros (elem entos d e tex to delim itados por un rectángulo) es: 332 Capítulo 5. Traducción orientada por la sintaxis B —> B \ B¿ | B i s u b B 2 | ( B i ) | t e x t o D e m anera corresp ond ien te a e sta s cu atro producciones, un cuadro p uede ser: 1. D os cu ad ros y u x ta p u e sto s, co n la p rim era p rod ucción B h a la izqu ierda d e la o tr a pro­ d ucción B¿. 2. U n cu ad ro y un cu ad ro d e su b ín d ice. E l segu n d o cuadro aparece en un ta m a ñ o m ás p e ­ q u eñ o, m ás abajo y a la d erech a d e l prim er cuadro. 3. U n cu ad ro en tre paréntesis, para agrupar cu ad ros y su bín d ices. Eqn y T g X u tilizan llaves p ara agrupar, pero nosotros u sarem os p arén tesis redondos ordinarios para ev ita r q u e se con fun dan co n las llaves q ue rodean a las accion es en los esqu em as d e trad ucción orien­ tad os a la sin taxis. 4. U n a cad en a d e tex to ; e s d ecir, cualquier cad en a d e caracteres. E s ta g ra m á tica e s am bigu a, pero aún p od em os usarla para e l an álisis sin tá ctico ascen dente, si h acem os al su bín d ice y la y u x ta p o sició n asociativos a la derecha, en d ond e s u b te n g a mayor p recedencia q ue la y u xtap osición . Se ap licará la com p osición tipográfica a las exp resion es m ed ian te la con stru cción d e cuadros m ás gran d es q u e d elim iten a los m ás p eq ueños. E n la figura 5.24, se v a a crear u n a y u x ta p o sició n entre los cu ad ros para E i y .a ltu ra , para form ar e l cu ad ro para E h altura. E l cuadro izquierdo para ¿?i s e con stru ye a partir d e l cu ad ro p ara E y e l su b ín d ice 1. P a ra m anejar el su b ín d ice 1, se reduce s u cu ad ro ap roxim adam en te un 30%, se b a ja y se co lo c a d esp u és d e l cu ad ro para E. A unque d eb em os tratar a . altura com o u na cad en a d e tex to , lo s rectángulos d en tro d e su cuadro m uestran cóm o p u ed e con stru irse a partir d e los cu ad ros para las letras individuales. t t A t a ltu ra 4 F igu ra 5.24: C onstrucción d e cu ad ros m ás grandes, a partir d e cu ad ros m ás pequeños En e s te ejem p lo, n os con centram os só lo e n la g eo m etría vertical d e lo s cuadros. L a geom e­ tría horizontal (la anchura d e los cuadros) tam bién es in teresante, en esp ecia l cu a n d o caracteres d istin to s tien en anchuras diferentes. T al vez n o s e a aparente a la v ista , pero ca d a u no d e los caracteres d istin to s en la figura 5.24 tien en anchura diferente. A con tinu ación se d escrib en los valores asociados co n la geo m etría v ertica l d e los cuadros: a) E l tam añ o de p u n to se u tiliza para estab lecer el te x to d en tro d e u n cuadro. V am os a su pon er q u e los caracteres q ue no e s tá n en su b ín d ices s e esta b lecen en u n tip o d e p u n to 10, e l tam añ o d el tip o en e s te libro. A dem ás, s i un cuadro tien e el ta m a ñ o d e p u n to p, en ton ces su cu ad ro d e su bín d ice tien e e l tam añ o d e p u n to m ás p equeño 0.7p. E l atributo heredado B .tp representará el tam añ o d e punto d e l bloque B . E ste a trib u to d eb e ser he­ redado, y a q ue el co n tex to d eterm in a cu án to n ecesita reducirse u n cu ad ro d a d o , d eb ido al núm ero d e niveles d e subíndices. 5.4 Esquemas d e traducción orientados p o r la sintaxis 333 b) C ad a cuadro tien e u n a Unea base, la cu al es u n a p osición vertical q ue corresp ond e a la parte inferior d e las líneas d e texto, sin contar la s letras, com o “g ” q ue se ex tien d e deba­ jo d e la línea base norm al. E n la figura 5.24, la lín ea p unteada representa la línea base para los cu ad ros E , .altu ra y to d a la exp resión co m p leta . L a lín ea base p a ra e l cuadro q u e con tien e e l su b ín d ice 1 se a ju sta para b a ja r el subíndice. c) U n cu ad ro tien e u na altu ra, q u e es la d ista n c ia a partir d e la p a rte superior d e l cuadro h a sta la lín ea base. E l atrib u to sin tetiza d o B .a l proporciona la a ltu ra d e l cu ad ro B. d ) U n cu ad ro tien e u na p ro fu n d id a d , q ue es la d ista n c ia a partir d e la línea base, h a sta la p a rte inferior d e l cuadro. E l atrib u to sin tetiza d o B .p r prop orciona la p rofundidad del cu ad ro B. L a definición d irigid a p or la sin taxis en la figura 5.25 n os prop orciona las reglas para calcu­ lar los tam añ os d e punto, las alturas y las profundidades. L a producción 1 se u tiliza p a ra asignar B .tp com o e l valor inicial 10. P r o d u c c ió n Re g l a s s e m á n t ic a s 1) S ^ B B .tp — 10 2) B —^ I3¡ Bo B \.tp = B. t p B¿.tp — B. t p B .a l — m ax(i?i.a¿, B¿.at) B .p r = m a x (B i.p r, B¿.pr) 3) B —►B ¡ s u b B> Bi . t p = B. t p B¿.tp = 0 .7 x B .tp B .a l = m ax(i?i.a¿, B¿.al — 0 .25 x B .tp ) B .p r = m a x (5 i.p r , B ¿ .p r + 0.25 x B .tp) 4) B -¥ ( B i ) B \.tp = B. t p B .a l = B i.a l B .p r = B hp r 5) B —> te x to B . a l = o b te n e rA l(B .tp , t e x to .valex) B . p r = o b te n e rP r(B .tp , te x to .valex) F igu ra 5.25: D efin ición d irigida p or la sin ta x is para la com p o sició n tip ográfica d e lo s cuadros L a producción 2 m aneja la y u xtap osició n . Los tam añ os d e lo s p un tos se cop ian h acia abajo del árbol d e análisis sintáctico; es decir, d os subcuadros d e u n cuadro heredan e l m ism o tam año de punto d el cuadro m ás grande. Las alturas y las profundidades se calculan hacia arriba d el árbol, tom ando el m áxim o. E sto es, la altura del cuadro m ás grande es e l m áxim o d e las alturas d e sus dos com ponentes, y esto es igual para la profundidad. L a producción 3 m aneja e l u so d e su b ín d ices, y es la m ás su til. E n e s te ejem p lo bastan te sim p lificad o, asum im os q ue e l tam añ o de p u n to d e un cuadro co n su bín d ice es 70% d e l tam añ o d e p u n to d e su padre. L a realidad es m ucho m ás com p leja, y a q ue los su bín d ices n o se pueden 334 Capítulo 5. Traducción orientada por la sintaxis reducir en form a indefinida; en la p ráctica, d esp u és d e unos cu a n to s niveles, los tam añ os d e los su bín d ices ca si no s e reducen. A dem ás, su p on em os que la lín ea base d e u n cuadro d e su bín d ice se reduce u n 25% d e l tam añ o d e p u n to d el padre; d e nuevo, la realidad e s m ás com pleja. La producción 4 co p ia los atrib utos e n form a apropiada, cu an do se u tilizan paréntesis. Por últim o, la producción 5 m aneja las h ojas q u e representan los cu ad ros d e tex to . Tam bién en e s ta cu estión , la situ ación verdadera es com p licada, p o r lo q ue só lo m ostram os d o s funciones sin especificacion es llam ad as o b te n e r A l y o b te n e rP r, la s cu ales exam in an las ta b la s cread as con ca d a fuente para d eterm in ar la m áxim a altu ra y la m á xim a p rofundidad d e cualquier carácter en la ca d en a d e te x to . S e su p on e q ue se prop orciona la m ism a ca d en a com o e l a trib u to valex d e e l term inal t e x t o . N u estra ú ltim a ta re a es convertir e s ta definición d irig id a por la sin ta x is e n un esq u em a d e traducción orientado a la sin taxis, sigu iend o las reglas para u n a definición d irigid a por la sin ta xis co n atrib u tos heredados por la izquierda, y la figura 5.25 es d e este tip o. E l esq u em a d e trad ucción orien tad o a la sin ta x is apropiado se m uestra e n la figura 5.26. P or cu estió n d e legibilidad, com o los cu erpos d e las producciones se v u elv en ex ten so s, los d iv id im o s en tre varias líneas y alineam os las acciones. Por lo tan to, los cu erpos d e las p roducciones co n sisten e n el con ten ido d e tod as las líneas, h a sta e l en cab ezad o d e la sigu ien te producción. □ P 1) r o d u c c ió n S -> A c c io n e s { B .tp = 10; } B 2) B { B i.tp = B .tp; } Bi Z?2 3) 4) 5) B -> B B { B¿.tp = B .tp; } { B . a l = m ax (i? i.a /, B¿.al); B .p r = m ax(2?i.pr, B¿.pr); } { B \.tp = B .tp ; } B\ su b B2 { B¿.tp = 0 .7 x B .tp ; } { B . a l = m ax (i?i.a/, B¿.al —0 .25 x B .tp ); B .p r = m ax(i?i.p r, B ¿ .p r + 0 .2 5 x B .tp ); } ( { B i.tp = B .tp ; } Bi ) { B . a l = Bi.al; B -p r — B i.p r, } te x to { B .a l = o b te n e rA l(B .tp , t e x to .valex); B . p r = o b te n e rP r (B. t p, tex to , valex); } F igu ra 5.26: E squ em a d e traducción orien tad o a la sin ta x is para la com p osición tipográfica d e los cuadros N uestro sigu ien te ejem p lo se con cen tra en u n a instrucción w h ile sim p le y la generación d e cód igo in term ed io para e s te tip o d e instrucción. E l có d ig o in m ediato se tra ta rá com o u n atri­ buto co n valor d e cadena. M ás adelante, explorarem os técnicas q ue involucran la escritu ra d e piezas d e un atrib u to con valor d e cad en a a m ed ida q ue realizam os el análisis sin tá ctico , con lo cu a l evitam os la co p ia d e cad en as ex ten sa s, p ara construir ca d en a s aú n m ás largas. L a técn ica 5.4 Esquemas d e traducción orientados p o r la sintaxis 335 s e p resen tó e n e l ejem p lo 5.17, en d on d e generam os la form a p o stfija d e u na exp resión infija “al in sta n te” , en vez d e calcu larla com o u n atributo. N o o b sta n te, en n uestra prim era form ulación, cream os un atributo con valor d e ca d en a m ed ian te la concatenación. E j e m p lo 5 .1 9 : P ara este ejem plo, sólo n ecesitam os u na producción: 5 w h ile ( C ) S\ A qu í, 5 es el no term inal q ue gen era tod o tip o d e in stru cciones, q ue su p u esta m en te in clu y e ins­ tru cciones if, instrucciones d e asign ación y otras. E n este ejem plo, C representa a u na expresión condicional: u na expresión b o o lea n a q u e se ev a lú a com o verdadera o falsa. E n este ejem p lo d e flujo d e control, lo único q ue vam os a generar son etiq u eta s. Se asum e q u e tod as las d em á s instrucciones d e cód ig o interm edio se van a generar m ediante p artes del esq u em a d e traducción orien tad o a la sin ta x is q u e no se m uestran. E n form a específica, gene­ rarem os instrucciones ex p líc ita s d e la form a e t i q u e t a L, en d o n d e L es u n identificador, para indicar q ue L es la etiq u eta d e la in stru cción q u e le sigu e. A sum im os q ue e l có d ig o interm edio e s com o el que se presentó en la sección 2.8.4. E l propósito d e n uestra in stru cción w h ile es q ue se evalúe la C con d icion al. Si es verdadera, e l con trol p asa a l principio d el cód ig o para S i. Si es falsa, en ton ces el con trol p a sa al có d ig o que sigu e d e l cód ig o d e la in stru cción w hile. E l có d ig o para S i d eb e diseñarse d e m anera q u e sa lte al principio d e l cód igo para la in stru cción w hile al term inar; el sa lto al principio d e l cód igo que e v a lú a a C n o se m uestra en la figura 5.27. U tilizam os los sigu ien tes atrib utos p ara generar e l có d ig o interm edio apropiado: 1. E l atrib u to heredado S .sig u ie n te etiq u e ta e l principio d el có d ig o q ue d eb e ejecu tarse una vez q u e S term ine. 2. E l atrib u to sin tetiza d o S .codigo es la secu en cia d e pasos d e có d ig o interm edio q ue im plem en ta a u n a in stru cción S y term in a c o n un sa lto a S . sigu ien te. 3. E l atrib u to h eredad o C .tru e e tiq u e ta e l p rin cip io d e l có d ig o q ue d e b e ejecu ta rse s i C es verdadera. 4. E l atributo heredado C .false etiq u e ta el principio d e l có d ig o q u e d eb e ejecu tarse si C es falsa. 5. E l atrib u to sin tetiza d o C. codigo es la secu en cia d e pasos d e có d ig o interm edio q ue im plem en ta a la con d ición C, y sa lta a C .tru e o a C .false, d ep en d ien d o d e s i C es verdadera o falsa. L a definición d irigid a por la sin taxis q ue ca lcu la e sto s atrib utos para la instrucción w hile se m u estra e n la figura 5.27. H ay varios p un tos q u e am eritan u na explicación: • L a función n ew g en era nuevas etiq uetas. • Las variables L1 y L2 con tien en etiq u eta s q ue n ecesitam os en el cód igo. L1 es el principio d e l cód ig o para la in stru cción w hile, y ten em o s q ue arreglar q u e S i sa lte a h í u n a v ez que term ine. É s ta es la razón por la cu al esta b lecem o s S i.sig u ie n te a L l . L2 es e l principio del cód igo para S i, y se con vierte en e l valor d e C .tru e, d eb ido a q u e bifurcam os h acia allá cu an d o C e s verdadera. 336 S Capítulo 5. w h ile ( C ) Si Traducción orientada por la sintaxis L l = n ew {)\ L 2 — n ew () S i. sig u ie n te = L l; C.Jalse = S. siguiente; C .tru e — L2; S .codigo = e t i q u e t a || L l || C.codigo || e t i q u e t a || L2 || S i.codigo F igu ra 5.27: E squ em a d e definición d irigid a por la sin ta x is para la s instrucciones w hile • O bserve que C .false s e estab lece a S .sigu ien te, y a q ue cuando l a con d ición es falsa, ejecu­ ta m o s e l cód ig o que vaya desp ués d el cód igo para S. • U tilizam os || com o el sím b olo d e con caten ación d e los fragm entos d e có d ig o interm edio. P or lo tanto, e l valor d e S .codigo em p ieza co n la e tiq u e ta L l , d esp u és e l có d ig o p a ra la con d ición C, o tra etiq u e ta L2 y el cód igo p a ra S\. E sta definición d irigida p or la sin ta x is tien e a trib u to s heredados por la izquierda. A l con ­ vertirla en u n esquem a d e trad ucción orien tad o a la sin ta x is, lo único q ue q ueda p en diente es cóm o m anejar las etiq u etas L l y L2, q ue son variables y n o atrib utos. Si tra ta m o s a la s accio­ nes com o no term inales falsos, en ton ces dichas variables p ueden tra ta rse com o los atrib utos sin tetizad os d e los no term inales falsos. C om o L l y L 2 no d ep en den d e n ingú n otro atributo, pueden asignarse a la prim era acción e n la producción. E n la figura 5.28 se m u estra e l esque­ m a d e traducción orien tad o a la sin ta x is resu ltan te co n accion es in cru stad as q ue im p lem en ta a e s ta definición co n atrib u tos heredados por la izquierda. □ S -> w h i l e ( C ) Si { S i.sig u ie n te = L l; } { S .codigo = e t i q u e t a || L l ||C .codigo || e t i q u e t a F igu ra 5.28: 5 .4 .6 { L l = n e w (); L 2 = n e w (); C .false = S.sigu iente; C .tru e = L2; } E sq u em a d e traducción ||L2 || S i.co d ig o; } orien tad o a la sin ta x is para las instrucciones w hile E je rc ic io s p a r a la s e c c ió n 5 .4 E j e r c ic io 5 .4 .1 : E n la sección 5.4.2 m encionam os q ue es p o sib le ded ucir, a partir d el esta d o LR en la p ila d e an álisis sin táctico, cu á l es el sím b olo gram atical q u e se represen ta m ediante el estad o. ¿C óm o descubriríam os e s ta inform ación? E j e r c ic io 5 .4 .2 : R eescriba el sigu ien te esq u em a d e trad u cción orien tad o a la sintaxis: A -+ A {a } B | A B B -+ B {c } A | B A { 6} | 0 {<*} | 1 d e m anera q ue la gram ática subyacente q uede sin recursividad p or la izquierda. A quí, a, b, c y d son acciones, y 0 y 1 son no term inales. 5.5 Im plementación d e definiciones dirigidas p o r la sin taxis con atributos heredados p o r la izquierda ! 337 E j e r c i c i o 5 . 4 . 3 : El sigu ien te esq u em a de traducción orien tad o a la sin ta x is ca lcu la e l valor de u n a cad en a d e Os y l s , interpretada com o u n en tero binario positivo. B | B i 0 { B .v a l = 2 x B i.v a l} B i 1 {B .v a l = 2 x B i.v a l + 1} 1 {B .v a l = 1} R eescrib a e s te esq u em a de trad ucción orien tad o a la sin ta x is, d e m a n era q u e la gra m á tica su b yacen te no se a recursiva p o r la izquierda, y d e to d a s form as se calcu le e l m ism o valor de B .v a l para to d a la cad en a d e en trad a com p leta. ! E j e r c i c i o 5 . 4 . 4 : E scriba d efinicion es dirigidas p o r la sin ta x is con atrib utos heredados por la izquierda, q ue sean análogas a las d e l ejem p lo 5 .19 para las sig u ien tes prod uccion es, ca d a una d e las cu ales representa a una construcción d e flujo d e control con ocida, com o en e l lengu aje de program ación C . Tal vez d eb a generar u n a in stru cción d e tres d irecciones p a ra saltar h a cia una e tiq u e ta L específica, en cu yo caso d eb e generar g o t o L. ( C ) Si a) 5 -► if b) S -*■ d o c) 5 -► '{' L Si e ls e w h ile L S2 ( C) LS | € O bserve q ue cualquier instrucción en la lista p uede tener u n sa lto d esd e su p arte m edia h a sta la sigu ien te instrucción, por lo q ue n o b a s ta co n só lo generar có d ig o para ca d a in stru cción en orden. 5 . 4 . 5 : C onvierta ca d a una d e su s definiciones dirigidas por la sin ta x is d el ejercicio 5.4.4 en un esq u em a d e trad ucción orien tad o a la sin ta x is, co m o e n el ejem p lo 5.19. E je r c ic io 5 . 4 . 6 : M odifique la definición d irig id a por la sin ta x is d e la figura 5.25 p a ra incluir u n atrib u to sin tetiza d o B .le , la lon gitu d d e un cuadro. L a longitud d e la con caten ación d e dos cu ad ros es la su m a de las lon gitu d es d e cad a uno. D esp u és agregue su s n uevas reglas a las p o ­ sicion es apropiadas en el esq u em a d e traducción orien tad o a la sin ta x is d e la figura 5.26. E je r c ic io E j e r c i c i o 5 . 4 . 7 : M odifique la definición d irig id a por la sin ta x is d e la figura 5.25 p a ra incluir su perín dices d en o ta d o s por e l operador s u p en tre lo s cuadros. S i e l cu ad ro ^ e s u n superíndice d e l cu ad ro ¿?i, en ton ces p osicion e la lín ea b a se d e B¿ a 0 .6 veces e l ta m a ñ o d e p u n to d e B i en­ cim a d e la lín ea base d e B \. A gregue la nueva producción y las reglas al esq u em a d e traducción orien tad o a la sin ta x is d e la figura 5.26. 5.5 Im p le m e n ta c ió n d e d e fin ic io n e s d irig id a s p o r la sin ta x is co n a tr ib u to s h e re d a d o s p o r la iz q u ie rd a D eb id o a q ue p ueden tratarse m uchas ap licacion es de traducción m ediante e l u so d e definicio­ n es co n atrib utos heredados por la izquierda, vam os a considerar su im plem en tación con m ás d eta lle e n e s ta sección. Los sigu ientes m éto d o s realizan la trad ucción m ed ian te el recorrido de u n árbol d e an álisis sintáctico: 338 Capítulo 5. Traducción orientada por la sintaxis 1. C o n stru ir el árbol d e a n álisis sin tá c tic o y a n o ta r. E ste m éto d o funciona para cualquier definición d irigida por la sin ta x is acíclica en cualquier caso. E n la sección 5 .1 .2 v im o s los árboles de an álisis sin táctico anotados. 2. C o n stru ir el árbol d e a n á lisis sin tá c tic o , agregar las a ccion es y ejecu ta rla s en preorden . E ste m étod o fu n cion a para cualquier definición co n atrib u tos heredados por la izquierda. E n la sección 5.4.5 v im o s cóm o convertir u n a definición d irig id a p or la sin ta x is con atri­ b u tos heredados p or la izquierda en un esq u em a d e trad ucción orien tad o a la sintaxis; en especial, hablam os sobre cóm o incrustar las accion es en prod uccion es, d e acuerdo con las reglas sem án ticas d e d ich a definición dirigida por la sin taxis. En e s ta sección, hablarem os sobre los sigu ien tes m étod os para traducir d urante e l análisis sintáctico: 3. U sar u n a n a liza d o r de descen so re cu rsiv o con u n a función para ca d a no term in al. La función para el n o term inal A recibe los atrib u tos heredados d e A com o argum entos, y d evu elve los atrib utos sin tetiza d o s d e A . 4. G en erar código a l in s ta n te , m ed ian te e l uso d e un analizador sin tá ctico d e d escen so re­ cursivo. 5. Im p lem e n ta r un esquem a de tradu cción o rie n ta d o a la sin ta x is en con ju n to con u n a n a li­ za d o r sin tá ctico L L . Los atrib u tos sin tetizad o s se m antien en en la p ila d e análisis sin tá c­ tico , y las reglas o b tien en los atrib u tos necesarios d e ubicaciones co n o cid a s en la pila. 6 . Im p lem e n ta r u n esquem a de tradu cción o rie n ta d o a la sin ta x is en con ju n to con u n a n a li­ za d o r sin tá c tic o L R . E ste m étod o p u ed e sorprenderle, y a q ue por lo general el esquem a d e traducción orien tad o a la sin ta x is para u na definición d irig id a por la sin ta x is con atrib u tos heredados por la izquierda tien e accion es en m edio d e las prod uccion es, y no p od em os estar seguros q ue d u ran te u n anáfisis sin tá ctico L R nos en con trem os siq uiera en esa producción, sin o h a sta q ue se haya con stru id o to d o su cuerpo. S in em bargo, m ás ad elan te verem os q u e si la gram ática su byacen te es LL, siem pre podrem os m anejar ta n to el an álisis com o la trad ucción d e abajo h acia arriba. 5 .5 .1 T r a d u c c ió n d u r a n te e l a n á lis is s in tá c tic o d e d e sc e n so re c u rs iv o U n analizador sin tá ctico d e d escen so recursivo tien e u na función A para ca d a n o term in al A , com o vim os e n la sección 4.4 .1 . P od em os exten d er e l analizador sin tá ctico en un trad uctor, d e la sigu ien te manera: a) L os argum entos d e la función A so n los atrib u tos heredados d el no term in al A . b) E l valor d e retorno d e la función A es la colección d e atrib u tos sin tetiza d o s d e l no ter­ m inal A . En el cu erpo d e la función A , d eb em os analizar y m anejar lo s atributos: 1. D ecidir la producción q ue u tilizarem os para exp an d ir A . 2. C om probar q u e cad a term inal aparezca e n la en trad a cu an do s e le requiera. D eb em os asum ir q ue no es necesario el rastreo h acia atrás, pero la e x ten sió n al anáfisis sin tá ctico d e d escenso recursivo co n e s te rastreo p u ed e llevarse a ca b o m ediante la restauración d e la p osición d e en trad a al m om ento d e la falla, com o vim os en la secció n 4.4.1. 5.5 Im plementación d e definiciones dirigidas p o r la sin taxis con atributos heredados p o r la izquierda 339 3. Preservar en las variables locales los valores d e to d o s los atrib u tos necesarios para calcu­ lar los atrib utos heredados para los no term in ales e n e l cu erpo, o los atrib utos sin tetiza­ d os para el no term inal del encabezado. 4. Llam ar a las funciones corresp ond ien tes a los n o term in ales en e l cu erpo d e la producción seleccion ad a, proporcionándoles los argum entos apropiados. C om o la definición dirigida por la sin ta x is su byacen te tien e atrib u to s heredados por la izquierda, y a hem os calculado esto s atrib u tos y los alm acenam os en variables locales. E j e m p lo 5 .2 0 : V am os a considerar la definición d irigida por la sin ta x is y el esq u em a d e tra­ d u cción orientado a la sin ta x is d e l ejem p lo 5 .19 p a ra las instrucciones w hile. E n la figura 5.29 aparece u na m uestra en seu d ocód igo d e las p artes relevantes d e la fun ción S. c a d e n a 5 ( e t i q u e t a sigu iente) { c a d e n a S codigo, C codigo; / * las variables locales co n tien en fragm entos d e có d ig o * / e t i q u e t a L l , L2; / * las etiq u e ta s locales * / i f ( en trad a actu al = = token w h i l e ) { avanzar ntrada; com probar q ue s i g a '(' en la entrada, y avanzar; L1 — new ( ) ; L 2 — nem( ) ; Ccodigo = C (sigu ien te, L2)\ com probar q ue sig a '(' en la entrada, y avanzar; Scodigo — 5(L 1); r e t u r n ( " e t i q u e t a " || L1 || Ccodigo || " e t iq u e t a " || L 2 || Scodigo); } e l s e / * otros tip o s d e instrucciones * / } F igu ra 5.29: Im plem entación d e instrucciones w hile co n un analizador sin tá ctico d e descenso recursivo M ostram os a S para alm acenar y devolver ca d en as largas. E n la p ráctica, sería m ucho m ás eficien te para las funciones com o S y C devolver apuntadores a registros q ue representen esta s cad en as. A sí, la in stru cción d e retom o en la función S no con catenaría físicam ente los co m p o ­ n en tes m ostrados, sin o q ue con stru iría un registro, o tal vez un árbol d e registros, expresando la con caten ación d e las cad en as representadas p or Scodigo y C codigo, las etiq u e ta s L1 y L 2, y las d o s ocu rren cias d e la cad en a literal " e t iq u e t a " . □ E j e m p lo 5 .2 1 : A hora vam os a tom ar el esq u em a d e trad ucción orien tad o a la sin ta x is d e la figura 5.26 para cuadros d e com p osición tipográfica. Prim ero señalarem os el análisis sin tá ctico , y a q u e la gram ática su b yacen te en la figura 5 .26 es am bigua. L a sig u ien te gra m á tica transfor­ m ad a hace a la y u x ta p o sició n y al uso d e su bín d ices a sociativos a la derecha, en d ond e s u b tien e p reced en cia sobre la yu xtap osición: 340 Capítulo 5. Traducción orientada por la sintaxis s —> B T F B —► T B i | T — F s u b Ti | F —y | tex to > (B) Los d o s nuevos no term inales, T y F , se m otivan m ed ian te térm inos y factores en las expre­ siones. A qu í, un “factor” generado p or F e s un cu ad ro en tre paréntesis o u na ca d en a d e tex to . U n “térm in o” generado p or T e s un “factor” con u n a secu en cia d e su bín d ices, y un cuadro generado por B es u na secu en cia d e “térm inos” yu x ta p u esto s. Los atrib utos d e B se tran sp ortan h acia T y F , y a q ue los n uevas n o term in ales tam bién d en otan cuadros; se introdujeron sólo para ayudar e n el análisis sin tá ctico . Por en d e, ta n to T com o F tien en un atrib u to heredado ¿p, ad em ás d e los atrib utos heredados a l y pr, co n accio­ nes sem án ticas q u e p ueden ad aptarse d el esq u em a d e trad u cción orien tad o a la sin ta x is en la figura 5.26. La gram ática aú n no e s tá lista para el análisis sin tá ctico descen dente, y a q ue las produccio­ nes para B y T tie n e n prefijos com unes. P or ejem plo, considere a T. U n analizador sin táctico d escen d en te n o