codigo intermedio

download codigo intermedio

of 95

Transcript of codigo intermedio

CompiladoresCurso:2001/2002Alumna:LauraM.CastroSoutoProfesores:BernardinoArcayVarelaJoseCarlosDafonteVazquezIndicegeneral1. Introduccion 72. ConceptosBasicos 92.1. LenguajesyGramaticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.1.1. Deniciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.1.2. Gramaticas.Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.1.3. Lenguajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2. GramaticasyAutomatas. . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.2.1. Automatas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.3. Traductores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.3.1. Esquemasdetraduccion . . . . . . . . . . . . . . . . . . . . . . . . 203. AnalisisLexico.Scanners 213.1. ConstrucciondescannersmedianteAFs . . . . . . . . . . . . . . . . . . . 233.1.1. ExpresionesRegulares.Propiedades . . . . . . . . . . . . . . . . . . 233.1.2. Algoritmo(metodo)deThompson . . . . . . . . . . . . . . . . . . . 233.1.3. TransformaciondeunAFNDcon-transicionesenAFD . . . . . . 234. AnalisisSintactico.Parsers 274.1. Tiposdeparsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274.2. Analisisporprecedencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294.2.1. PrecedenciaSimple . . . . . . . . . . . . . . . . . . . . . . . . . . . 294.2.2. PrecedenciaOperador . . . . . . . . . . . . . . . . . . . . . . . . . 314.3. AnalisissintacticoLL(K). . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.3.1. AnalisisLL(1). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.4. AnalisissintacticoLR(K) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354.4.1. AnalisisLR(1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365. AnalisisSemantico 435.1. Notacion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445.2. SistemasdeTipos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.2.1. Tiposbasicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.2.2. Equivalenciadeexpresionesdetipo . . . . . . . . . . . . . . . . . . 485.2.3. Conversoresdetipo. . . . . . . . . . . . . . . . . . . . . . . . . . . 495.2.4. Sobrecarga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4934INDICEGENERAL6. CodigoIntermedio 516.1. Notaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.1.1. NotacionPolacaInversa(RPN) . . . . . . . . . . . . . . . . . . . . 526.1.2. Cuartetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.1.3. Tercetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.1.4. Codigoatresdirecciones . . . . . . . . . . . . . . . . . . . . . . . . 546.2. MaquinaObjeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.2.1. MetododelasCajas . . . . . . . . . . . . . . . . . . . . . . . . . . 556.2.2. GeneracionyRepresentaci ondesaltos . . . . . . . . . . . . . . . . 566.2.3. Accesoaelementosdematrices . . . . . . . . . . . . . . . . . . . . 566.2.4. Representaci ondestrings . . . . . . . . . . . . . . . . . . . . . . . 577. OptimizaciondeCodigo 597.1. Tecnicasdeoptimizacionencodigofuente . . . . . . . . . . . . . . . . . . 597.1.1. ReduccionsimpleoReducciondeoperaciones . . . . . . . . . . . . 597.1.2. ReacondicionamientooReordenamientodeinstrucciones . . . . . . 607.1.3. Eliminacionderedundancias. . . . . . . . . . . . . . . . . . . . . . 607.1.4. Reducciondepotencias. . . . . . . . . . . . . . . . . . . . . . . . . 607.1.5. Reordenaciondeexpresiones:AlgoritmodeNakata . . . . . . . . . 607.1.6. Extracciondeinvariantes . . . . . . . . . . . . . . . . . . . . . . . . 617.2. AnalisisGlobaldelFlujodeDatos . . . . . . . . . . . . . . . . . . . . . . . 617.2.1. Detecciondelazosenlosgrafosdeujo . . . . . . . . . . . . . . . . 617.3. AnalisisdeFlujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637.3.1. DenicionesdeAlcance . . . . . . . . . . . . . . . . . . . . . . . . . 637.3.2. NotacionVectorial . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.3.3. SolucionIterativaparalasecuacionesdeFlujodeDatos . . . . . . 677.3.4. AnalisisdeExpresionesDisponibles . . . . . . . . . . . . . . . . . . 677.3.5. AnalisisdeVariablesActivas . . . . . . . . . . . . . . . . . . . . . . 688. Errores 718.1. Tiposdeerrores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.2. Recuperaciondeerrores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718.2.1. Correcciondeerroresdecambio . . . . . . . . . . . . . . . . . . . . 728.2.2. Correcciondeerroresdeborrado . . . . . . . . . . . . . . . . . . . 728.2.3. Correcciondeerroresdeinclusion . . . . . . . . . . . . . . . . . . . 738.3. Modopanico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739. LaTabladeSmbolos 759.1. Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759.1.1. TDSlineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759.1.2. TDSordenada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759.1.3. TDSarbolbinario . . . . . . . . . . . . . . . . . . . . . . . . . . . 759.1.4. TDSconhashing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769.1.5. TDSenlazadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77INDICEGENERAL 510.Rep.deInformacionyGestiondeMemoria 7910.1. Representaci ondelaInformacion . . . . . . . . . . . . . . . . . . . . . . . 7910.1.1. Representaciondearraysymatrices . . . . . . . . . . . . . . . . . . 7910.1.2. Representaciondecadenasytirasdecaracteres . . . . . . . . . . . 8110.1.3. Representacionderegistros . . . . . . . . . . . . . . . . . . . . . . 8110.2. Gestiondememoriaproporcionadaporelcompilador . . . . . . . . . . . . 8110.2.1. Registrodeactivaci on . . . . . . . . . . . . . . . . . . . . . . . . . 8210.2.2. Secuenciadellamadayretorno . . . . . . . . . . . . . . . . . . . . 8210.2.3. Subprogramas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8310.2.4. EstructurasCOMMONyEQUIVALENCEenFORTRAN . . . . . . . . . . . 8410.3. MontadoresyCargadores . . . . . . . . . . . . . . . . . . . . . . . . . . . 8410.4. Ficherosobjeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8510.5. Interpretes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 856INDICEGENERALCaptulo1IntroduccionLa asignatura de Compiladores se divide en dos grandes bloques: analisisy snte-sis1,cadaunodeloscualesseestructuraendiferentespartes,queveremos:Figura1.1:Esquemadelastareasdeuncompilador.1Entre ambas tendra lugar un parcial.78 CAPITULO1. INTRODUCCIONCaptulo2Lenguajes,Gramaticas,AutomatasyTraductores2.1. LenguajesyGramaticas2.1.1. DenicionesSea / = a, b, c, d, eunalfabeto(conjuntodecaracteres).Llamamos:Tira de caracteres o palabra a cualquier concatenacion de caracteres del alfabeto: = abc.Distancia o longituddeunatira al n umero de elementos (caracteres) de la tira:|| = 3.Latiranulaeslatiradedistancia0ysuelerepresentarseporo.Potenciadeunatiraalatiraqueresultadeyuxtaponerunaconsigomismanveces:para = absetiene0= ,1= ab,2= abab,n= ab . . . ab. .nveces.Esdecir:An= An1 AconA0= .Lapotenciaderivadelproductocartesiano:AB= xy/x A y B.Cierretransitivoa:A+=_i>0AiCierrereexivoa:A=_i0AiDeloanteriorsededucequeA= A+ .demostracion:A=_i0Ai= A0__i>0Ai_= __i>0Ai_= A+ 910 CAPITULO2. CONCEPTOSBASICOS2.1.2. Gramaticas.TiposUnagramaticaesunaupla (= (^, T , T, o),dondeNconjuntodesmbolosnoterminalesTconjuntodesmbolosterminalesPconjuntodeproduccionesSaxiomadelagramaticaSeg un la forma de sus reglas de produccion, Chomsky clasico las gramaticas en cuatrotipos:GramaticasTipo0: conestructuradefrase, secaracterizanporqueloselementosdeTsondelaforma con (^ T )+y (^ T ). Sonlasgramaticasmas generales(admiten producciones de cualquier tipo) y se asocian con automatasbidireccionales.GramaticasTipo1osensiblesalcontexto: sus producciones son de la forma A con, (^ T ) ; A ^; (^ T )+. Enestasgramaticas, lasustitu-cion de un no terminal por una cadena depende de los smbolos que tenga alrededor(contexto).GramaticasTipo2odecontextolibre: loselementosde TsondelaformaA conA ^y (^ T ).Sonlasqueseusanparalenguajesdeprogramacion.GramaticasTipo3oregulares: sus producciones son siempre A B o A , conA, B ^y T .Seasocianconautomatasnitos.Lasmasimportantesparanosotrosseranlasgramaticasdetipo3ogramaticasregu-lares, yaquederivanconjuntosregularesquerepresentaremospormediodeautomatasnitos y nos ayudar an a construir analizadores lexicos (scanners). Las gramaticas de tipo2ogramaticas independientes del contextoharanlopropiocuandonos ocupemos delanalisissint actico(parsers).DenicionLlamamosderivacion alconjuntodeproduccionesquenosllevandea: = A= y A TTambiensepuedeusarlanotacion obien +paraindicarquehayalmenosunaderivaci on.2.1. LENGUAJESYGRAMATICAS 112.1.3. LenguajesDadaunagramatica (=(^, T , T, o), denimos el lenguaje generadopor (,L((),como:L(() = x/S x x TLlamamosformassentenciales,D((),a:D(() = x/S x x (^ T )Claramente,severicaqueL(() D(().demostracion:Seax L((), entonces se cumple quex T yS x. Equivalentemente,(S x) (x (T )) (S x) _x _T ^0__De aqu se deduce que(S x) (x (T ^)) (S x) (x (T ^)) (S x) (x (T ^))Por tanto,x D(() L(() D(().Larepresentaci ongracadelasdistintasderivacionesposiblesparagenerarunatirasedenominaarbolsintactico:Figura2.1:Ejemplodearbolsint actico.Una gramatica se dice ambigua si para alguna palabra del lenguaje que genera existemas de un arbol sintactico. No existe el concepto de lenguaje ambiguo, lo que es ambiguoeslagramatica.12 CAPITULO2. CONCEPTOSBASICOSFigura2.2:Ejemplodegramaticaambigua.En este ultimo caso, el compilador debera elegir uno de los dos arboles posibles.Estasera una situacion que debera evitarse, puesto que ello ralentizara la compilacion, ademasdeobligaraqueelcompiladorconozcalaprecedenciadelosoperadores.Laformadeso-lucionarloesdenirgramaticasmascomplejas(conmasrestricciones).Otrosproblemasdelasgramaticasdecontextolibrequeconducenasituacionessi-milaressonlarecursividadpor laizquierdaylaexistenciadereglasconfactoresrepetidosporlaizquierda.Cuandoconstruyamos uncompilador, buscaremos, pues, mecanismos deterministasydepococostecomputacional. Usaremos gramaticas decontextolibreyunaseriedealgoritmos que detectan las anomalas que pueden producir ambig uedad (es decir, que lastransformanengramaticasregulares):1. Generaciondellenguajevaco,L(() = .2. Smbolosin utiles(noaccesiblesonoterminables).3. Reglasunitarias.4. Reglaso.5. Ciclos.Acontinuaci onveremosunaseriedealgoritmosquerealizanestosobjetivos. Obten-dremosdeestemodogramaticaslimpias,estoes,sinreglas-ysinciclos,esdecir,sinreglasunitarias(oreglascadena)nismbolosin utiles.Suordendeaplicacionsobreunagramaticaesimportante,asquedeberespetarseelqueseguiremos.2.1. LENGUAJESYGRAMATICAS 13AlgoritmoquedetectaL(() = beginviejo=0nuevo={A / (A->t) e P, t e T*}vhile (nuevoviejo) do beginviejo=nuevonuevo=viejo U {B / (B->a) e P, a e (T U viejo)*}endif (S e nuevo) thenvacio=NOelsevacio=SIendAlgoritmoqueeliminasmbolosin utilesDadox, si S x t, t T, entoncesxnoesin util (esaccesible, puestoqueS x,yesterminable,yaquex t)./* PRIMERA FASE, ELIMINACION DE NO TERMINABLES */beginviejo=0nuevo={A / (A->t) e P, t e T*}while (nuevoviejo) do beginviejo=nuevonuevo=viejo U {B / (B->a), a e (T U viejo)*}endN=nuevoP={p e P / p:(A->b), b e (T* U N)}end/* SEGUNDA FASE, ELIMINACION DE NO DERIVABLES */beginviejo={S}nuevo=viejo U {x / (S->axb) e P}while (nuevoviejo) do beginviejo=nuevonuevo=viejo U {Y / (A->aYb) e P, A e viejo}endN=N V nuevoT=T V nuevoend14 CAPITULO2. CONCEPTOSBASICOSComo ya hemos dicho, el orden en que aplicamos estos algoritmos es importante. Veasesinoelsiguienteejemplo:Figura2.3: Relevancia en el orden de los algoritmos de simplicacion.AlgoritmoqueeliminareglasUnareglalambdaesaquellaqueesdel tipoA ; enesecasosedicetambienqueAesanulable.Intentaremosevitarlasgramaticasquecontenganreglasdeestetipo,eliminandosus-produccionessi lastienen, salvolametanocion(reglaS ), delaquenosepuedeprescindirporqueformapartedellenguaje.beginviejo=0nuevo={A / (A->l) e P}while (nuevoviejo) do beginviejo=nuevonuevo=viejo U {B / (B->a), a e viejo*}endN=N-nuevoP=Para cada prod. A->a0B0a1B1...anBn e P donde ai noanulable y Bi anulable, se a~nade a PA->a0X0a1X1...anXncon Xi=Bi o l sin a~nadir A->l. Si S es anulable se a~nadeS->S|l y se a~nade S a NendAlgoritmoqueeliminareglasunitariasUnareglaunitariaesdelaformaA BconA, B ^. Noaportannadayporellodebeneliminarse.2.1. LENGUAJESYGRAMATICAS 15beginviejo=0nuevo=A; /* debe hacerse para cada A de N */while (nuevoviejo) do beginviejo=nuevonuevo=viejo U {C / (B->C) e P, B e viejo}endNA=nuevoendP=Si (B->a) e P y no es regla unitaria, a~nadir (A->a) a Ppara todas las A para las que B no este en NAEliminaciondeciclosEnloscasosenlosquelaaplicaciondelosalgoritmosanterioresnohayasolucionadoesteproblema,seaplicanconversionesaformanormal(Chomsky,Greibach).RecursividadDadaunaregladeproduccionA A,hayvariostiposderecursividadposibles:PorlaizquierdaSedacuando=, A ^y (^ T ). Esel tipoderecursividadnodeseableyquequerremoseliminar1.PorladerechaSedacuando=,A ^y (^ T ).Estetipoderecursividadesusualynodaproblemas.AutoimbricadaSedacuando, ,= yA ^.Tampocodaproblemas.Paraeliminarlarecursividadporlaizquierdaloqueharemossera:Si tenemos A->Aa1|Aa2|...|Aap|b1|b2|...|bqpodemos escribirlo comoA->Aai 1 1_sisonasociativosporlaizquierda1< 22< 1_sisonasociativosporladerechaiii) Ademasdetodoello,secumplesiempreque:a) Losidenticadorestienenmayorprecedenciaquecualquieroperador.b) Losparentesistienenmayorprecedenciaquecualquierotrosmbolo.c) El smbolo$(indicadordeprincipio/ndecadena)tienemenor precedenciaquecualquierotrosmbolo.Mayorprecedencia E asociatividadporladerecha*/ asociatividadporlaizquierdaMenorprecedencia +- asociatividadporlaizquierdaCuadro4.2:Precedenciausualentrelosoperadoresmatematicos.4.3. AnalisissintacticoLL(K)4.3.1. AnalisisLL(1)Esunmetodopredictivo,norecursivo.Sueledarbuenosresultadosenaplicacio-nespeque nas(shells,compiladoresdepeque noslenguajes,etc)dondeprecedenciasimplenoresultasuciente.El metododefuncionamientoesindependientedel lenguaje. Al variarestesolova-riaralatabla. Comoyahemoscomentadoalgunavez, lascasillasenblancodelatablasuponenaccionessemanticas,errores.Veremosenseguidasuestructuraycomosecons-truye.4.3. ANALISISSINTACTICOLL(K) 33Figura4.3:EstructuradeunparserLL(1).FuncionamientoLospasosquesigueunanalizadorsint acticodeestetiposon:Seleelaentradaylacimadelapila.Puedeocurrir:1. SiX=a=$(dondeXeselelementodelacimadelapila,aelprimerelementodelbuerdeentraday$elcaracternulo),sellegaalfindelanalisis.2. Si X=a ,=$, el parser sacaXdelapilaymueveel apuntador deentradaalsiguienteelementodelbuer.3. SiXesnoterminal,elparserconsultalatabladeanalisis(quellamaremosM)enlaposicion(X, a).Haydosposibilidades:a) SiM (X, a) = ,entoncessehaproducidounerror.b) SiM (X, a) = (X uwz),secontin uaelanalisis.Elpseudocodigodelatabla4.3.1(pagina34)realizaloqueacabamosdeexplicar7.ConstrucciondelatabladeanalisisDeniremosantesdenadadosoperaciones:1. Primero(X), que calcula el primer terminal de una cadena de caracteres,delasiguientemanera:a) SiX T8,entoncesPrimero(X)=X.b) SiX ,entonces Primero(X).7Ver ejemplos en los ejercicios del tema.8Hablamos siempre reriendonos a la gramatica que acepta el parser, ( = (^, T , T, o).34 CAPITULO4. ANALISISSINTACTICO.PARSERSentrada: cadena w y tabla de analisis sintactico Msalida: si w pertenece al lenguaje que acepta el parser,una derivacion por la izquierda de w, si no error{apuntar al primer smbolo de w;do{sea X el simbolo de la cima de la pila ya el simbolo apuntado por ;if (X es terminal o $)if (X=a)extraer X de la pila y avanzar ;elsereturn (error);elseif (M[X,a]=X->Y1Y2...Yk){extraer X de la pila;meter Yk,Yk-1...Y1 en la pila;emitir la produccion X->Y1Y2...Yk;}elsereturn (error);} while (X no sea $); /* pila vacia */}Cuadro4.3:AlgoritmodeanalisisLL(1).4.4. ANALISISSINTACTICOLR(K) 35c) Si X ^yX Y1Y2. . . Yn, entoncesa Primero(X)y i/a Primero(Yi)y Primero(Yj) j< i.Lastresreglasseaplicansobrelacadenaencadacaso.2. Siguiente(A) conA ^, que calcula, dadounnoterminal A, elprimerterminalqueestaacontinuaci ondeA:a) Secumpleque$ Siguiente(S),dondeSeselsmboloinicial, lametanocion,elaxioma.b) SiA B,entonces Primero() Siguiente(B).c) Si A ByoA B, entonces Siguiente(A) Siguiente(B).Denuevo,esastresreglasnosonexcluyentes.UnavezquesehancalculadolosconjuntosPrimeroySiguiente, lasreglasparaconstruirlatablason:1. ParatodaproduccionA T,aplicarlosdospasossiguientes.2. a Primero(),M[A, a] = A .3. Si Primero(),entoncesM[A, b] = A b Siguiente(A).Comoyahasidocomentado, lascasillasenblancosupondranerroresydaranlugaratratamientossemanticos, mientrasquesi enunacasillaaparecemasdeunaregla, laconclusionesquelagramaticanoesLL(1)(noesdeterminista).ComprobaciondesiunagramaticaesLL(1)Dadaunagramaticalibredelcontexto (= ^, T , T, o,comopodemossabersiesunagramaticaLL(1)onosintenerqueconstruirlatabla?Lacuestionestansencillacomorealizarlassiguientescomprobaciones A [:1. primero()primero() = .2. Soloopuedenderivar(nuncaambos).3. Si ,debedarsequeprimero()siguiente(A) = .4.4. AnalisissintacticoLR(K)Enestaseccionanalizaremosunatecnicaecientedeanalisissintacticoascendentequesepuedeutilizarparaanalizarunaclasemasampliadegramaticasindependientesdelcontexto,denominadaanalisissintacticoLR(K).Estetipodeanalizadoresrecibeestenombreporlosiguiente:laLhacereferenciaaqeelexamendelaentradaserealizade izquierdaaderecha; la Rse debe a que la reconstrucciones en orden inverso nos llevanaderivacionesporladerechaylaK,comoyaimaginamos,esporeln umerodesmbolos36 CAPITULO4. ANALISISSINTACTICO.PARSERSdeanticipaci onquesenecesitanparaunacorrectatomadedecisiones.Despues de estudiar el modo de operar de un analizador sint actico LR, introduciremostrestecnicasparaconstruirlatabladeanalisissintacticoLRparaunagramaticadada:SLR(LRSencillo), el mas facil perotambienel menos potente (puede que noconsigaconstruirlatablaparaalgunasgramaticas).LALR(LRconexamenpor anticipado), unmetodointermedio, quefuncionaconlamayorade las gramaticas de los lenguajes de programacionyque usanherramientascomoyacc,queveremos.LR canonico, el mas poderoso y costoso de los tres. Veremos modos de simplicarloparaobteneralgunodelosdosanteriores.4.4.1. AnalisisLR(1)Figura4.4:Modelodeunanalizadorsint acticoLR(1).Este es el esquema de un analizador sintactico LR(1): se apoya en una tabla de analisissintactico con dos partes, accione ira. De un tipo de LR(1) a otro solo cambian las tablas.El programaanalizadorleecaracteresdel buerdeentradadeunoenuno, utilizaunapilaparaalmacenarunacadenadondeXisonsmbolosgramaticalesySisonestados.Cadasmbolodeestadoresumelainformacioncontenidadebajode elenlapila,yseusanlacombinaciondel smbolodeestadoenlacimadelapilayel smboloencursode laentradaparaindexar latablade analisis sint acticoydeterminar ladecisiondedesplazamientoareducciondelanalizador.La tabla de analisis sint actico, como decimos, consta de dos partes: la funcionaccion,queindicaunaacciondelanalizador(indicaquehacer),ylafuncionira,queindicalastransiciones entre estados. La primera se usa siempre, en cada uno de los pasos, mientrasquelasegundaseusasolositienelugarunareduccion.4.4. ANALISISSINTACTICOLR(K) 37Funcionamiento1. TomamosSmdelacimadelapilayaidelaentradaactual.2. Se consulta la entrada accion[Sm, ai] de la tabla de acciones del analizador, pudiendoobtenerseunodelossiguientesvalores:a) DesplazarSp,dondeSpesunestado.b) ReducirporunaproducciongramaticalA .Enestecasoseconsultatam-bienlaentradaira[Smr, A] (donde r es lalongitudde ) de latabladetransiciones para obtener un nuevo estado Sqque se a nade a la cima de la pila.c) Aceptar.d) Error.3. Repetirhastaterminarlatiradeentrada,aceptarlaollegaraunerror.Unaconguraciondeunanalizadorsint acticoLR(1)esunparcuyoprimercompo-nenteeselcontenidodelapilayelsegundolaentradaquea unestasinprocesar:(S0X1S1X2S2. . . XmSm, aiai+1. . . an$)El siguientemovimientodel analizadorsedeterminaleyendoai, el smbolodelaen-tradaencurso, ySm, el estadodel tope de lapila, yconsultadodespues laentradaaccion[Sm, ai] delatabladeaccionesdel analizador. Lasconguracionesobtenidasdes-puesdecadaunodeloscuatrotiposdemovimientosonlassiguientes:Si accion[Sm, ai] =desplazarSp, el analizadorejecutaunmovimientodedesplaza-mientoentrandoenlaconguracion(S0X1S1X2S2. . . XmSmaiSp, ai+1. . . an)(el analizador ha desplazado a la pila el smbolo de la entrada en curso y el siguienteestado,yai+1seconvierteenelsmbolodeentradaactual).Siaccion[Sm, ai] =reducirA ,entonceselanalizadorejecutaunmovimientodereduccion,entrandoenlaconguracion(S0X1S1X2S2. . . XmrSmrASq, aiai+1. . . an$)dondeSq=ira[Smr, A]yreslalongitudde,elladoderechodelaproduccion(el analizadorhaextrado2rsmbolosdelapila, rdeestadosyrdesmbolosdelagramatica,exponiendoelestadoSmr,luegohaintroducidoA,elladoizquierdodelaproduccion,ySq,laentradadeira[Smr, A],enlapila;nosehamodicadolaentradaencurso). Lasecuenciadesmbolosgramaticalesextradosdelapila,Xmr+1. . . Xm,concuerdasiemprecon,elladoderechodelaproduccionconqueseefect ualareduccion.Siaccion[Sm, ai] =aceptar,elanalisissint acticohaterminadocon exito.Siaccion[Sm, ai] =error,elanalizadorsintacticohadescubiertounerror.38 CAPITULO4. ANALISISSINTACTICO.PARSERSConstrucciondetablasdeanalisissintacticoSLRSellamaelementodeanalisis sintacticoLR(0)(o, simplemente, elemento) deunagramatica (aunaproducciondedichagramaticaquecontieneunpuntoenalgu-naposiciondel ladoderecho. Portanto, laproduccionA XY Zproduceloscuatroelementos:A .XY ZA X.Y ZA XY.ZA XY Z.LaproduccionA sologeneraelelementoA .Una serie de conjuntos de elementos LR(0) se denomina coleccioncanonicaLR(0)yproporcionalabaseparaconstruiranalizadoressint acticosSLR. Paraconstruirlaco-leccioncanonicaLR(0) paraunagramaticasedeneunagramaticaaumentada ydosfunciones,cerraduraeira:GramaticaaumentadaDadaunagramatica (,lagramaticaaumentada (

resultadea nadira (lareglaS

S,dondeSeselaxiomadelagramatica.CerraduraDadounsubconjuntoIdeelementosLR(0):TodoelementodeIestaencerradura(I). A B cerradura(I), si B T, entonces B . cerradura(I).Seaplicaloanteriorhastaquecerradura(I)novara.Intuitivamente,siA Bestaencerradura(I)indicaque,enalg unmomentodel procesodeanalisis sintactico, secreeposiblever acontinuacionunacadenaderivabledeBcomoentrada.Si B esunaproduccion,tambienseesperaverunasubcadenaderivabledeenestepunto.Porestarazon,seincluyeB encerradura(I).Sepuedecalcularlafuncioncerraduracomosemuestraenlatabla4.4.1.Observesequesi sea nadeunaproducciondeBalacerraduradeI conel puntoenelextremoizquierdo,entoncestodaslasproduccionesdeBsea nadir andema-nerasimilaralacerradura.Dehecho,sepuedendividirtodoslosconjuntosdeloselementosqueinteresanendosclases:1. Elementosnucleares,todosloselementoscuyospuntosnoestenenelextremoizquierdo,yelelementoinicialS

S.2. Elementosnonucleares,todosloselementoscuyospuntosestanenelextremoizquierdo.OperacioniraLa segunda funcion util es ira(I, X), donde Ies un conjunto de elemen-tos yXes unsmbolodela gramatica (X (^ T )).Se denecomolacerraduradelconjuntodetodosloselementosA XtalesqueA XesteenI.4.4. ANALISISSINTACTICOLR(K) 39funcion cerradura(I)beginJ=I;repeatfor cada elemento A->a.Bb en J y cada produccionB->l de G tal que B->.l no este en J doa~nadir B->.l a J;until no se puedan a~nadir mas elementos a J;return J;endCuadro4.4:Algoritmodecalculodecerradura.Denidosestosconceptos,podemosverelalgoritmoparalaobtenciondelaco-leccioncanonicaLR(0)deunconjuntodeelementosLR(0)paraunagramaticaau-mentada (

.Estacoleccionnospermitiraobtenerelautomataapartirdelagramatica.procedimiento elementos_LR0 (G)beginC={cerradura(S->.S)}; /* gramatica aumentada */repeatfor cada conjunto de elementos I en C y cada simbologramatical X de G tal que ir_a(I,X) no este vaco yno este en C doa~nadir ir_a(I,X) a C;until no se puedan a~nadir mas conjuntos de elementos a C;endCuadro4.5:ConstrucciondelacoleccioncanonicaLR(0).DiremosqueunelementoA 12esunelementovalidoparaunprejovariable1si existeunaderivacionS

A12. Engeneral, unelementoseravalidoparamuchosprejos.Vistosestosconceptos,lospasosdeconstrucciondelatablason:1. DadaunagramaticaG,seaumentaparaproducirG

.2. SeconstruyelacoleccioncanonicaLR(0):C= I0, I1, . . . , In3. LosestadosseobtienenapartirdelosIi(siendoIkelestadok).40 CAPITULO4. ANALISISSINTACTICO.PARSERS4. Lascasillasserellenan:a) SiA .a Ii,eIra(Ii, a) =Ij,entoncessehaceaccion[i, a] =desplazar j.b) Si A. Ii, entonces se hace accion[i, a] =reducir A a siguiente(A).c) SiS

S. Ii,entoncessehaceaccion[i, $] = aceptar.Silasaccionesanterioresgeneranaccionescontradictorias(aparecemasdeunaaccionenalgunacasilladealgunadelastablas)sedicequelagramaticanoesSLR.5. Si Ira(Ii, A) = Ij, siendo A un no terminal, entonces se hace Ira[i, A] =j.6. Todas las entradas no denidas por las reglas anteriores son consideradaserror.Aunquenoveremosloscriteriosdedecision,esimportantesaberqueelmetodoSLRnofuncionaparacualquiergramatica. El problemaesque, comohemosvisto, SLRnotiene en cuenta mas que aquella parte de la cadena de entrada que ya ha ledo para tomardecisiones,esdecir,noescapazdemirarunelementomasalla.Acontinuaci onveremoselmetodoLR-canonico,queslohace.ConstrucciondetablasdeanalisissintacticoLR-canonicoEl metodo LR-canonico es un metodo de construccion de tablas de analisis sint acti-co mas general, mas potente, pero tambien mas costoso desde el punto de vista del dise no.El LR-canonicoa nadeinformacionadicional al estadoredeniendoloselementosdeanalisisparaincluirunsmboloterminalcomosegundocomponente,deformaquepasanaserdelaforma[A ., a]enlugarde[A .]comoenSLR.Estenuevoelementoque se tiene en cuenta para la prediccion, recibe el nombre de smbolodeanticipaci on,y:notieneefectosi ,= si= ,elelemento[A ., a]pideunareduccionporA solosielsiguientesmbolodelaentradaesaDe este modo, podemos tener varios casos, varias reducciones con diferentes no termi-nalesa,algoqueproporcionasupotenciaalLR-canonico,frentealSLR.El metodoparaconstruir lacoleccionde conjuntos de elementos validos ahoraesfundamentalmenteel mismoquelaformaenqueseconstruyelacoleccioncanonicadeconjuntosdeelementosdelanalisissintacticoLR(0);solohayquemodicarlosdospro-cedimientosCerraduraeIra.4.4. ANALISISSINTACTICOLR(K) 41function cerradura(I)beginrepeatfor cada elemento [A->s.Bb, a] en I,cada produccion B->r en Gy cada terminal b de Primero(ba) tal que[B->.r,b] no esta en I, doa~nadir [B->.r, b] a I;until no se puedan a~nadir mas elementos a I;return (I);endCuadro4.6:AlgoritmodecalculodecerraduraparaLR-canonico.function Ir_a(I,X)beginJ=conjunto de los elementos [A->sX.b,a] tal que[A->s.Xb,a] esta en I;return (cerradura(J));endCuadro4.7:AlgoritmodecalculodeIraparaLR-canonico.procedure elementos(G) /* gramatica aumentada */beginC=cerradura([S->.S,$]);repeatfor cada conjunto de elementos I en Cy cada simbolo X tal que Ir_a(I,X) no sea vacioy no este en C, doa~nadir Ir_a(I,X) a C;until no se puedan a~nadir mas conjuntos de elementos a C;endCuadro4.8:ConstrucciondelconjuntodeloselementosdeanalisisLR-canonico.42 CAPITULO4. ANALISISSINTACTICO.PARSERSUnavezquetenemosel automatanito(sudiagramadetransiciondeestados), lospasosparalaconstrucciondelatabladeanalisissintacticoson:1. DadaunagramaticaG,seaumentaparaproducirG

.2. Se construye C= I0, I1, . . . , In, la coleccion de conjuntos de elementosLR(1)paraG

.3. ElestadoiseobtieneapartirdeIi.4. Lascasillasserellenan:a) Si [A .a, b] Ii e Ira(Ii, a) = Ij, entonces se hace accion[i, a] =desplazar j,paratodoterminala..b) Si[A ., a] Ii,entoncessehaceaccion[i, a] = reducir A (conA ,= S

).c) Si[S

S., $] Ii,entoncessehaceaccion[i, $] = aceptar.Si las reglas anteriores producen un conicto, se dice que la gramatica noesLR(1).5. SiIra(Ii, A) = Ij,entoncessehaceIra[i, A] = j.6. Todaslasentradasnodenidasporlasreglasanterioresseconsideranerror.ConstrucciondetablasdeanalisissintacticoLALRVeremos el metodoLALRcomounaconsecuenciadel LR-canonico, comounasimplicacion. Es decir, dada una gramatica, aplicado el metodo LR-canonico y obtenidalatabladeanalisissintactico(osimplementeelautomatanito),construiremosapartirdeellounLALRrealizandounacompresiondeestados.El LR-canonicoes unmetodode analisis muypotente, peroque produce muchosestados, deloscuales, engranmayoradeocasionespodemoshacerunacompresiondelasiguientemanera: analizandolosestadosdel automatageneradoporel metodoLR-canonico, comprobaremosqueel corazon(core, produccion)deloselementosLR(1)eselmismoenvariosestados,generalmentedos (aunquepuedensermas),quesolovaranenelelementodeanticipacion(lookahead).ElmetodoLALRlo unicoquehaceesreuniresospares(conjuntos)deestadosenunosolo,agrupandoloselementosdeanticipacionaladerecha.Evidentemente,lafusiondelosestadosdebeiracompa nadaporlacompatibilidaddetransicionesentrelosestadosquesefusionan,esdecir,parafusionardosestadosnosoloesnecesarioqueel corazondetodaslasreglasdeambosseaniguales(novaletampocoque uno sea subconjunto del otro), sino que ademas estados fusionados deben transicionaraestadosfusionados.Siellonoocurrieraas,diramosquelagramaticanoesLALR.La obtencion de la tabladeanalisissintacticoLALR a partir del nuevo automatasimplicado(comprimido)essencilla,consiste unicamenteentraducirlasmodicacionesa las celdas de la misma. Si la gramatica realmente es LALR, no debera haber problemaalguno.Captulo5AnalisisSemanticoTraducci ondirigidaporlasintaxisEnelpresentetemaveremosel ultimodelostiposdeanalisisquemencionamosenlaintroducciondelaasignatura(gura1.1,pagina7):elanalisissemantico.Ya hemos visto el analisis lexico (scanners, que detectaban las palabras y comprobabansiestabanbienformadas),elanalisissintactico(parsers,queestudiabanlacorreccionenla estructuras de las frases) y nos falta, por tanto, la parte del analisis que juzga el sentidodelasconstruccionesquehansidopreviamentevalidadasporscannersyparsers.Laencarnacionmassimpledeestatareaeslacomprobaciondetipos. Veremos,pues, comose a nadenreglas semanticas de este tipoalas estructuras que yahemosestudiado (sera,alnyalcabo,a nadir mas informacionalasreglasqueya manejamos).El mecanismo tpico es trasladar las comprobaciones pertinentes a los nodos del arbolsintactico que hemos aprendido a construir en el captulo anterior (asignando un conjuntoderutinasalosmismos,queseocuparan,entreotrascosas,delacomprobaciondetipos,gestiondememoria,generaciondecodigoobjeto. . . ).Alsituarenestepuntolaclavedelaacciontambienseramasfacil,comoveremos,lageneraciondecodigo.Ademas,latareasever asimplicadatambienporqueusaremoslamismasintaxisparalasemanticaqueparalageneraciondecodigo.En la gura 5.1 (pagina 44) se muestra un esquema que relaciona los temas principalesque veremos enbreve enelseno de latraducciondirigidaporlasintaxis.Esta partedeladisciplinadel analisissemanticoseapoyaenconceptosdegrafos, particularmentedegrafosacclicosdirigidos, yesunaalternativaal dise nomasformal deesquemasdetraduccion. Enanalisisdetipos haremosreferenciatantoalostiposbasicos(integer,real,char,. . . )comoalosconstructoresdetipos,operadoresque,trabajandocontiposbasicos, construyenotrostipos(records, arrays, pointers,. . . ). Encuantoalagene-raciondecodigo, veremoscomoladeniciondereglasenestecasoestara ntimamenterelacionado con la arquitectura subyacente y deniremos nuestra maquina teorica, paratrabajarsobreella.4344 CAPITULO5. ANALISISSEMANTICONotacionesEDTGrafosG.D.A.ReglasGramaticaNotacionesTipos basicosPolimorfismoSobrecargaSemanticoAnalisisTraduccion dirigidapor la sintaxisGeneracion decodigo intermedioArquitectura: tercetos cuartetos codigo 3direcciones RPNDefinicionde reglasMaquinateoricaImplementacion: estructuras de control expresiones asignaciones ...Analisis detiposSistemas detiposConstructoresde tiposConversionde tiposEquivalenciade tiposComprobacionde tipossintesis semanticaFigura5.1:Esquemadeanalisissemantico.5.1. NotacionParadescribiraccionessemanticasutilizaremosdoselementos:reglasatributosde tal maneraque, enlatraducciondirigidapor lasintaxis, dadaunaproduccionA tendremosunconjuntodereglassemanticasb = f(c1, c2, . . . , cn)dondecisonlosatributos.5.2. SISTEMASDETIPOS 45Cadanodode evaluacionenunarbol sint actico(nodos correspondientes apartesizquierdasdereglasdeproducciondelagramatica)tendraasociadaunaf (funciondeevaluaci on)queaplicarasobresuspropiosciysobrecjrelativosopertenecientesasushijos directos. Este proceso, que se da tpicamente en la evaluacion ascendente de izquierdaaderecha,sedenominaarrastredeinformacion.5.2. SistemasdeTipos5.2.1. TiposbasicosUnsistemadetiposesel conjuntodeexpresionesdetipos quetenemosadisposi-cionenel lenguaje. Asuvez, unaexpresiondetipoes, bienuntipobasico, obienelresultadodeaplicarunconstructordetiposauntipobasico.Nosotrosconsideraremos:Tiposbasicos lossiguientes:booleancharintegerrealcomoenlamayoradeloslenguajes,yademas:errortipovoidConstructoresdetipos lossiguientes:Matrices,querepresentaremosarray(I,T)dondeIeseltipodelosndicesyTeldelasvariablesquecontendr aelarray.Productos, que se denen: si T1 y T2 son expresiones de tipos, entoncesT1T2esotraexpresiondetipoysedenominaproducto.Registros, consecuenciadeladeniciondeproductos, pues nosonmasqueproductosconnombres.Apuntadores o punteros, que representaremos pointer(T) donde T eseltipoaqueapuntan.Funciones, que representaremos T1 T2 . . . TnTp, dondeT1T2. . .Tnes el dominio delafuncion(demodoquelosargumentosdeunafuncionsonunproducto)yTpeltipodelrango.Ademas,claroesta,puedenconstruirseconstructoresdeconstructores(punteros a punteros, punteros a funciones, arrays, de punteros,. . . ). Estodaralugaralosproblemasdeequivalenciaqueveremosmasadelante.46 CAPITULO5. ANALISISSEMANTICOExistendostiposdeatributos: heredados, cuyovalorsecalculaapartirdelosvaloresdelosatributosdelosher-manosydelpadredelnodoalquepertenecen sintetizados, cuyo valor se calcula a partir de los valores de los atributos de los hijosdelnodoalquepertenecenEntraducciondirigidapor lasintaxis usaremos unicamente atributos sintetizados,razonpor laqueenalgunabibliografapuedeencontrarseladenominaciontraduccion(denicion)dirigidaporlasintaxisconatributossintetizados.Enadelante,usaremoslasiguientegramaticacomoreferenciaenexplicaciones,ejem-plosyejercicios:P -> D;ED -> D;D | id:TT -> char | integer | array[num] of T | ^TE -> literal | numero | id | E mod E | E[E] | ^ES -> id:=ES -> if E then S1S -> while E do S1S -> S1;S2Cuadro5.1:Gramaticadereferencia.Veamosacontinuaci onalgunasreglassemanticas:Lacomprobaciondetiposmatriciales:E E1[E2]requeriracomprobarqueE2esdetipoentero1yasignaraltipodeE(noterminaldearrastredeinformacion)eltipodeloselementosdelarray:E.tipo = if (E2.tipo=integer) and(E1.tipo=array[S,T]) then Telseerror_tipo;1Supondremos que el lenguaje solo permite que los ndices de los arrays sean enteros.5.2. SISTEMASDETIPOS 47LacomprobaciondeoperacionesE E1modE2(dondemodjuegaelmismopapelquecualquierotraoperacion),E.tipo = if (E1.tipo=integer) and(E2.tipo=integer) then integerelseerror_tipo;LacomprobaciondetiposenproposicionesdellenguajecomoS if EthenS1S whileEdoS1estansencillacomoS.tipo = if (E.tipo=boolean) then S1.tipoelse error_tipo;Lacomprobaciondelaconcatenaciondeproposiciones,S S1; S2sehara:S.tipo = if (S1.tipo=void) and(S2.tipo=void) then voidelseerror_tipo;LacomprobaciondetiposasociadaalaasignacionS id = Eesdelasmassimples:S.tipo = if (id.tipo=E.tipo) then voidelse error_tipo;48 CAPITULO5. ANALISISSEMANTICOLacomprobaciondetiposenexpresionesovariablesensE literalE numeroE intE realE . . .notienening unsecreto,E.tipo = literal | numero | integer | real | ...Lacomprobaciondetiposrelativaafunciones,por ultimo,E E1(E2)seresuelveE.tipo = if (E2.tipo=S) and(E1.tipo=(fun S->T)) then Telseerror_tipo;5.2.2. EquivalenciadeexpresionesdetipoSeconsiderandostiposdeequivalenciaparalasexpresionesdetipo:Equivalenciaestructural Sedicequedosexpresionesdetipotienenequi-valencia estructural cuando son del mismo tipo basico o son resultado deaplicarlosmismosconstructoresenel mismoordenalosmismostiposbasicos(oinclusoexpresionesdetipo).EquivalenciapornombreSedicequedosexpresionesdetipotienenequi-valenciapornombrecuandosondel mismonombredetipo, esdecir,sonexpresionesdetipodeclaradoidentico.Unaformaderealizarlacomprobaciondeequivalenciadetiposesmediantelacodi-caciondeexpresionesdetipo, esto es, asignar un codigo binario a cada constructordetipoycadatipobasico,desuertequecadaexpresionpuedacodicarsemedianteunasecuenciadecerosyunosquerepresenteloscodigosdelosconstructoresytiposbasicosquesehanutilizadoparasucomposicion. Lacomprobaciondelaequivalenciadedosexpresionesdetipoestantrivialcomocompararbitabitsusrespectivascodicaciones.Estaestrategiatienelaventajadequeahorramemoria(nosenecesitatantoarrastrede informacion) y, puesto que la comparacion binaria puede realizarse en la propia ALU, esmas rapida. Sin embargo, podra suceder que dos tipos compuestos distintos tuviesen comorepresentacion la misma secuencia de bits (ya que no se reejan, por ejemplo, tama nos dematricesoargumentosdefunciones).5.2. SISTEMASDETIPOS 49function equivest(s,t):boolean;beginif (s y t son del mismo tipo basico) thenreturn trueelse if (s=array(s1,s2) and t=array(t1,t2)) thenreturn (equivest(s1,t1) and equivest(s2,t2))else if (s=s1xs2 and t=t1xt2) thenreturn (equivest(s1,t1) and equivest(s2,t2))else if (s=pointer(s1) and t=pointer(t1)) thenreturn equivest(s1,t1)else if ......elsereturn falseendCuadro5.2:Algoritmodecomprobaciondeequivalenciaestructural.5.2.3. ConversoresdetipoSupongaselasituacion:a = b cdonde a y c son reales mientras que b es un entero. Restringiendonos a lo que hemos vistohastaahora, estaclaroqueestofallara, mas nuestraexperiencianos dicequees algoperfectamenteviablecomoesposible,entonces?Medianteunaconversi ondetipo.Estaconversion, cuandoes implcita, hechaautomaticamentepor el compilador sedenomina coercion, mientras que cuando es explcitamente indicada por el programadoresloqueconocemoscomocast.5.2.4. SobrecargaSe dice que un operadoresta sobrecargado cuando en funcion de las variables con lasque trabaja tiene un signicado u otro. La sobrecarga puede afectar tambien a los smbo-los, encuyocasopuedecrearproblemasdeambig uedad(porejemplo, si sesobrecarganlosparentesisparareferenciarmatrices),motivoporelqueserecomiendaevitarlo.Asimismo,tambienpodemosenfrentarnosalasobrecargadefunciones,querecibeelnombredepolimorsmo.Enesecaso,anteunaconstruccionE E1(E2)50 CAPITULO5. ANALISISSEMANTICOProduccion ReglaSemanticaE numero E.tipo = integerE numeronumero E.tipo = realE id E.tipo = buscaTDS(id.entrada)E E1opE2E.tipo = if ((E1.tipo=integer) and(E2.tipo=integer)) then integerelse if ((E1.tipo=integer) and(E2.tipo=real)) then realelse if ((E1.tipo=real) and(E2.tipo=integer)) then realelse if ((E1.tipo=real) and(E2.tipo=real)) then realelse errortipoCuadro5.3:Comprobaciondetiposparacoerciondeenteroareal.seadmitequelaexpresiondetipoE2nosea unica.Setrabajaentoncesconunconjuntodeexpresionesdetipoposibles(E2pasaaserunconjunto)conlarepercusionymodi-cacionesqueellointroduceenlasreglassemanticasquehemosvisto:E.tipo = { t / existen s en E2.tipos, s->t en E1.tipos }Captulo6GeneraciondeCodigoIntermedioTrasel analisissemanticollegael momentodegenerarloquedenominamoscodigointermedio,queposteriormenteseraoptimizadoantesdedarlugaraldenitivocodigoobjeto.El motivoporel queserealizaestepasointermedio, larazonporlaquesegeneracodigointermedioesevitartenerqueconstruiruncompiladordesdeceroparatodasycadaunadelasdiferentesarquitecturas. Ademas, ellovaareportarotrosbenecios, yaque nos permitira optimizar mejor, ya que el proceso de optimizacion trabajara sobre estemismocodigointermedio.Por ultimo,tambienfavorecelareutilizacion.6.1. NotacionesNoexisteunlenguajeintermediouniversal.Losmasconocidosyusados,quevere-mos,son:NotacionPolacaInversa(RPN)CuartetosTercetos,TercetosindirectosLenguajesatresdireccionesP-codigoInteresatenercodigobasadoen3direcciones,delestiloa = bopc(dosoperandosyelresultado)yaquefacilitara lageneraciondecodigo objetoytambiensudepuracion.5152 CAPITULO6. CODIGOINTERMEDIO6.1.1. NotacionPolacaInversa(RPN)Eslaprimeranotaciondecodigointermedioqueseutilizo. Conunapilaesposibleconstruirungeneradordecodigomuysencillo,yesenloquesebasoestaidea.Lanotacionpolacainversa, tambienllamadapostjarepresentalasjerarquasenformadearboldemodoquecadanodoapareceinmediatamentedespuesdesushijos.Elformatopostjoesfacildetraducirypasaracodigomaquinaconayudadeunapila:secolocanlosoperandosydespueslosoperadores.OPERADORES + - / * mod divFUNCIONES sqrt sin cos tan abs ord charBLOQUES DE CODIGO bloque ... finbloqueENTRADA/SALIDA read writeMATRICES decl subASIGNACION :=BIFURCACIONESSALTO INCONDICIONAL bSALTO SI POSITIVO bpSALTO SI NEGATIVO bnSALTO SI CERO bcCuadro6.1:NotacionPolacaInversa(RPN).EnRPNlosparentesisseignoranylatraducciondeunaexpresionaestanotacionsiguelasdirectricesquesemuestranacontinuaci on:Produccion ReglasSemanticasS EE TE E +T P(i) =

+

i = i + 1E E T P(i) =

i = i 1E T P(i) = @ i = i + 1aT FT T F P(i) =

i = i 1T T/F P(i) =

/

i = i 1F id P(i) = buscarTDS(i) i = i 1F (E)aArrastre de informacion, @ es un smbolo de control.Cuadro6.2:Traducci onaRPN.6.1. NOTACIONES 53dondelasemanticaseasociaacadanodo.Hay dos formas de evaluar un arbol sint actico de una expresion: mediante esquemas detraduccion (no lo veremos) o mediante traduccion dirigida por la sintaxis (lo que estamosviendo). Sehacedeabajoaarribaydeizquierdaaderecha, demaneradeterminista,obteniendo, por diferentes tecnicas que veremos eneste tema, el resultadoencodigointermedio.6.1.2. CuartetosLa notacion de cuartetos (tambien llamados cuadruplosen alguna bibliografa, como[4])tienelasiguienteforma:(< operador >, < operando1 >, < operando2 >, < resultado >)esdecir, A/B, porejemplo, serarepresentadocomo(/, A, B, T1)dondeT1esunre-gistrotemporal.Lossmbolosusadosenestanotacionson:OPERACIONES ARITMETICAS + - * / ^mod abs sqrt sin cosASIGNACION X:=E (:=, E, , X)ENTRADA/SALIDA (read, , , X) (write, , , X)SALTO ABSOLUTO INCONDICIONAL (JP, n, , )n = posicion absoluta a saltarSALTO RELATIVO INCONDICIONAL (JR, n, , )n = posicion relativa actualSALTO INCONDICIONALSALTO SI IGUAL A CERO (JZ, n, E, )SALTO SI MAYOR QUE CERO (JGZ, n, E, )SALTO SI MENOR QUE CERO (JLZ, n, E, )SALTO SI IGUALES (JE, n, X1, X2)SALTO SI MAYOR (JG, n, X1, X2)SALTO SI MENOR (JL, n, X1, X2)Cuadro6.3:Notaciondecuartetos.6.1.3. TercetosLanotaciondetercetos(tambienllamadostriples enalgunabibliografa, como[4])sediferenciadeladecuartetosenqueelresultadoquedaimplcitoenelpropioterceto,siendosuformato:54 CAPITULO6. CODIGOINTERMEDIO(< operador >, < operando1 >, < operando2 >)demaneraqueparahacera + b + ctendramosenprimerlugarel terceto(+, a, b)etiquetadocomo[x]yseguidamenteelterceto(+, [x], c),referenciandoalanterior.Laventajadelostercetosesqueocupanmuchamenosmemoriaenvariablestempo-rales.Porotraparte,larecolocaciondelcodigoenoptimizacionesmascomplejaporquehayquemantenerlasreferenciascorrectamente.Paraenfrentaresteproblemasurgenlostercetosindirectos, quesontercetosjuntoconlosqueseguardaunvectorsecuen-ciaquemarcaelordendeejecuciontraslarecolocacion,demaneraquenoesnecesarioreescribir los tercetos -sus referencias- en caso de reordenamiento. Ademas, si los tercetosserepitensoloesnecesariorepetirlosenelvectorsecuenciaynofsicamente.Porsuestructura, lostercetoscarecendeinstruccionesJE, JGyJL, aunquepuedensersimuladas;elrestodelanotacionesgemelaaladecuartetos(tabla6.3).6.1.4. CodigoatresdireccionesEsta ultimanotacionqueveremos,llamadacodigoatresdirecciones,esenciertomodounageneralizaciondetodas las anteriores. Es unanotacionmas, querecibesunombreporrazonesobviasdebidasasuestructura,ti = tjoptky que, quizas por su mayor claridad (recuerda al pseudocodigo), se usa con mayor fre-cuenciaenloslenguajesintermediosytambien,comoharemosnosotros,enoptimizaciondecodigo.Lossmbolosqueutilizasonlosmismosqueencuartetosytercetos,conlasalvedaddequeparalossaltosseutilizalapalabrareservadagoto.6.2. MaquinaObjetoParaseguirconcretandoel el procesodegeneraciondecodigoobjeto, describiremosacontinuacionunamaquinasecuencial VonNeumann, queutilizaremos comobasedeaquenadelante.SupondremosunaCPUconunaseriedeoperaciones(instrucciones)yunaformademoverdatosentrelamemoriaylosregistros.Estamaquinaobjetotendra: nregistrosR0, R1, . . . Rn1 instruccionesdelaformaoperacionfuente, destinoconlaspalabrasreservadasclasicas6.2. MAQUINAOBJETO 55ADDSUBMULDIVCALL (llamada a funciones)GOTO (saltos)MOVE (accesos a memoria: cargas/almacenamientos)Los modos de direccionamientoque consideraremos seran los presentes en la tabla 6.4.Modo Forma Direccion Costeabsoluto M Ma1registro R Rb0indexado C(R) C+contenido(R)c1registroindirecto R contenido(R) 1indexadoindirecto C(R) contenido(C+contenido(R)) 2literal #C C 1aMes una posicion de memoria principal.bR es un registro de la CPU.cCes una constante.Cuadro6.4:Modosdedireccionamiento6.2.1. MetododelasCajasEsunamanerademodelizarlasoperacionesentredosoperandos. Si analizamosdemanerasencilla1lasposiblesinstruccionesquemanejamos, veremosquecasi todasellassonmuysimilares.Todassiguenelsiguienteesquema:MOV operandoA, registroIMOV operandoB, registroJOPERACION_X registroI, registroJMOV registroJ, temporalKDemaneraquesitomamosestaestructuracomoconstruccionbasealaquedeno-minamoscaja,elcodigoalnalesunconjuntodecajas2.1Sin tener en cuenta cuestiones como si los registros estan previamente ocupados, etc.2El paso de este ensamblador despues de encajonado a codigo maquina es trivial: la operacion secodica seg un un convenio, se buscan las constantes en la TDS,. . .56 CAPITULO6. CODIGOINTERMEDIOEl problema es que el codigo resultante de aplicar al pie de la letra estas traduccionesesuncodigomuymalo,entendiendoporbondaddelcodigounacombinaci onentresura-pidez y la memoria que ocupa y/o utiliza, puesto que es un codigo en absoluto optimizado.Elcodigoquegenerauncuarteto(< operacion >, < operando1 >, < operando2 >, < destino >)(y,porsupuesto,tambienunterceto)estambienunacaja:MOV operandoA, registroIMOV operandoB, registroJOPERACION_X registroI, registroJMOV registroJ, destinoLa generacion de codigo a tres direcciones tambien se hace por semantica. Los interpre-tesclasicos(puros)usabanRPNyaqueesmasintuitivo(yacontamosconunapila).Unaformasencilladeoptimizacionquesepuedehacerentiempodecompilacionesmantener unatablade localizaciondel almacenamientode los operandos, paraevitarlacargasucesivadel mismooperadorvariasveces, igual quelageneraciondevariablestemporaleslogicamenteinnecesarias.6.2.2. GeneracionyRepresentaci ondesaltosSi sabemos generar saltos, sabemos generar todas las instrucciones de control (if, for,do, while).Sonnecesariasdospasadasporelcodigoparahacereso:enlaprimerasegeneranetiquetasrelativas,quesesustituyenenlasegunda,unavezqueyaseconoceladireccionbase.6.2.3. AccesoaelementosdematricesSe puede acceder rapidamente a los elementos de una matriz si se guardan en un bloquedeposicionesconsecutivas. Si el anchodecadaelementodelamatrizesa, entonceseli-esimoelementodelamatrizAcomienzaenlaposicionbase + (i inf) adonde infes el lmite inferior de los subndices y base es la direccion relativa de la posiciondememoriaasignadaalamatriz(esdecir,esA[inf]).La expresion anterior se puede evaluar parcialmente durante la compilacion si se escribecomoi a + (base inf a)yaquelasubexpresionbase inf asepuedeevaluarcuandoapareceladeclaraciondelamatrizyserguardadaenentradadelaTDSdeA.6.2. MAQUINAOBJETO 57Esto se puede extender a los calculos de direcciones de elementos de matrices multidi-mensionales.Unamatrizbidimensionalsealmacenageneralmenteenunadedosformas,bienenformadelas(laala),bienenformadecolumnas(columnaacolumna).Enelcasodeunamatrizbidimensionalalmacenadaporlas,ladireccionrelativadeA[i, j]sepuedecalcularmediantebase + ((i infi) nj + j infj) adondeinfieinfjsonloslmitesinferioresdelosvaloresdeiyj, ynjesel n umerodevaloresquepuedetomarj. Esdecir, si supjfueseel lmitesuperiorparael valordej,entoncesnj= supj infj + 1.Suponiendo que i y json los unicos valores que no se conocen durante la compilacion,laexpresionanteriorsepuedereescribircomo((i nj) + j) a + (base (infinj) + infj) a)dondeel ultimoterminopuededeterminarsedurantelamisma.Generalizando,sitenemosunamatrizdendimensionesM[inf1. . . sup1, inf2. . . sup2, . . . , infn. . . supn]donde inf1, inf2, . . . , infn son los lmites inferiores de cada dimension, sup1, sup2, . . . , supnson los lmites superiores de cada dimension y n es el n umero de dimensiones de la matriz,dando por sentado que supi infi el n umero de elementos de cada dimension es de nuevoei= supiinfi+1 y el acceso a un elemento cualquiera M[j1, j2, . . . , jn] tendra la direccionbase + (j1i1) e2e3. . . en++ (j2i2) e3e4. . . en++ . . . ++ (jn1in1) en++ (jnin)Por ultimo, encasodetenerunamatriztriangular delaquesealmacenensololosele-mentos por debajo de la diagonal, el acceso a cada uno de ellos [i, j] serai + (j 1) j2.6.2.4. RepresentaciondestringsPeronosololarepresentaciondematricesesunproblema,sinoquetambienloesladelascadenasdecaracteres. Lassolucioneshistoricasquesehanadoptadoal respectoson:Denicionde untama nomaximoparacualquier stringyreservar unbancodememoriatroceadoalefecto.UnejemplodeusodeestaestrategiaesFortran.Mantenimiento de un registro con el par (nombre, longitud del string) y un punteroaladirecciondeinicio, todoelloalmacenadoenlaTDS. EstaestrategiasedebeaMcKeeman, HorningyWortman, datade1970yesusadaporlenguajescomoPascal.58 CAPITULO6. CODIGOINTERMEDIOCaptulo7OptimizaciondeCodigoTecnicasdegeneraciondecodigocomoel metododelascajas quehemosvistoson,como ya se comento en su momento, extremadamente inecientes. Por ello, la optimiza-ciondecodigopuedeverseinclusocomopartedelapropiageneracion.Lastecnicasdeoptimizacionseaplicana3niveles:1. Optimizacionencodigofuente,realizadanormalmenteporelpro-gramador, cadavez se usamenos debidoal grandesarrollohardwareactual.2. Optimizacionencodigointermedio, la mas importante de las tres,eslaquerealizanloscompiladoresgraciasalaaplicaciondetecnicasdeanalisisdeujodedatos.3. Optimizacionencodigoobjeto, muy orientada a la maquina y muydependientede esta,tieneproblemasdeportabilidad.7.1. Tecnicasdeoptimizacionencodigofuente7.1.1. ReduccionsimpleoReducciondeoperacionesConsisteenevitarincluirenel codigofuenteoperacionesquepuedenserrealizadaspreviamente,porejemplo,enlugardeponers = 2 * PIsepondras = 6.283185Estoesimportantesobretodosi expresionescomolaanteriorseincluyenenlazos,subrutinas, etc. Enocasiones, inclusoespreferiblegenerarpreviamentevariasvariablesqueseutilicenendiferentesiteracionesqueoperarencadainteracion.5960 CAPITULO7. OPTIMIZACIONDECODIGO7.1.2. ReacondicionamientooReordenamientodeinstruccionesConsisteenalterar el ordendesecuenciaciondelas instrucciones (sinquevaresusemantica, claroesta)andeconseguirtantolageneraciondemenosinstruccionesdecodigointermediocomodecodigoobjeto,comoelusodeunmenorn umeroderegistrosyvariablestemporales.7.1.3. EliminacionderedundanciasDebeevitarsesiemprelarealizaciondecalculosrepetitivos.Laoptimizacionsiemprecentra su especial atencion en cuerpos crticos como los lazos, donde es frecuente encontrarexpresionessimilaresa:M[i][j][k] = M[i x bi x di][j x bj x dj][k x bk x dk] + incrementodondetodalaprimeraparte1suponeunaredundanciaypodraextraerse.7.1.4. ReducciondepotenciasAnteunaoperacioncomos = a**2siempreespreferibleutilizars = a*aya que no hay ning un ensamblador que contenga instrucciones de potenciacion, mien-tras que todos incluyen el producto puesto que es una operacion que ya las propias ALUsrealizan.7.1.5. Reordenaciondeexpresiones:AlgoritmodeNakataEl algoritmodeNakatayAndersondatade1964ysuobjetivoesmarcarunapautaparalareordenaciondeexpresiones:PASO-1. Construir el arbol de la expresion a reordenar.PASO-2. Etiquetado del arbol:PASO-2.1. IF n es hoja THENIF n es hijo mas a la derecha de su padre THENetiqueta(n) = 1ELSE1En lenguajes que manejen las matrices como punteros, comoC y algunos bloques deFortran.7.2. ANALISISGLOBALDELFLUJODEDATOS 61etiqueta(n) = 0ELSE BEGINSEAN n1, n2,..., nk hijos ordenados/* por etiqueta */THENetiqueta(n) = max(etiqueta(ni) + i - 1)ENDPASO-3. Una vez etiquetado el arbol, para generar la expresionse parte de la raz y se desciende por la rama del subarbolcuya etiqueta contenga el valor maximo.En caso de igualdad, se opta por la subrama de la derecha,salvo si la operacion no es conmutativa.7.1.6. ExtracciondeinvariantesLlamamos expresiones invariantes de lazo a aquellas que pueden sacarse fuera de losbuclesyaquesuvalornosufrevariaciondurantelasiteraciones.As,enlugardei = 1..Na[i] = f(c1,c2,...,cn)otro isepersigueconstruirpreferiblementet = f(c1,c2,...,cn)i = 1..Na[i] = totro i7.2. AnalisisGlobaldelFlujodeDatos7.2.1. DetecciondelazosenlosgrafosdeujoDecimosqueunnododdominaaunnodonsitodocaminodesdeelnodoinicialanpasaobligatoriamentepord.As,porejemplo,seg unlagura7.1(pagina62):1 domina TODOS2 domina 23 domina TODOS - {1,2}4 domina TODOS - {1,2,3}62 CAPITULO7. OPTIMIZACIONDECODIGO10 9876 5413 2(a) Grafo de Flujo6 510 987413 2(b)Arbol de DominacionFigura7.1:GrafodeFlujoyArboldeDominacion.5 domina 56 domina 67 domina 7,8,9,108 domina 8,9,109 domina 910 domina 10Enelanalisisdecodigo,losnodosseidenticanconbloquesdeinstrucciones.PropiedadesdeloslazosLoslazostienenunaseriedepropiedadesquedebemosconsiderar:Unlazotendraunsolopuntodeentrada,quedominaatodoslosnodosdellazo.7.3. ANALISISDEFLUJO 63Debeexistir al menos unaformadeiterar, es decir, hayal menos uncaminohaciaelencabezamiento.Para localizar lazos el metodo es buscar aristas cuyas cabezas dominen alascolas.7.3. AnalisisdeFlujoElanalisisdeujoconsisteenrecopilarinformaciondevariables,expresiones,etc.,porejemplodondesedenen, hastadondellegan, dondesemodican,. . . atravesdelarboldeanalisissintactico.Paraelloseusanecuaciones,ylaecuacionbasees:sal[S] = gen[S] (ent[S] desact[S])dondeS esunbloquedecodigosal[S] representalasvariablesquesalenactivastraslaejecuciondeSgen[S] lasvariablesquetomanvalorenSent[S] lasvariablesquelleganactivasaSdesact[S] lasvariablesquesonredenidasenSClaro esta que, cuando hablamos de variables, tambien podemos hablar de expresionese incluso punteros y llamadas a funciones. Sin embargo, nos ce niremos a las primeras porsimplicidad.Eltipo deanalisis deujo que se realice (hay varias estrategiasdiferentes) marcansudiferenciaenladeniciondelcalculodelosconjuntossal, gen, entydesact.Enel analisisdebloquesdecodigo, seestablecenpuntos entresentenciasytambienentre cada par de bloques. Un camino de un punto p1a un punto pnes una secuencia depuntosp1, p2, p3, . . . , pndeformaquepieselpuntoqueprecedeaunaproposicionypi+1eselquelasigue,obienpieselnaldeunbloqueypi+1eselcomienzodelsiguiente.7.3.1. DenicionesdeAlcanceLlamamosdeniciondeunavariablexaunaproposicionqueasignaunvaloraxo que puede asignarlo. En el primer caso se concreta y se habla de denicionnoambigua.Llamamos alcancedeunadeniciondaunpuntopsi existeuncaminodesdeelsiguientepuntoadhastapsinqueladenicionsedesactive.Unadenicionsedesactivasiduranteelcaminoaotropuntosedenedenuevo.64 CAPITULO7. OPTIMIZACIONDECODIGOVeremos acontinuacionlos valores que puedentomar enunbloque de codigolosconjuntossal, gen, entydesact.Bloque unicoParaelcasomassencillo,eldeunbloque unicodecodigo,tenemosque:Punto entradaPunto salidaS d: a:=b+cgen[S] = ddesact[S] = Dadsal[S] = gen[S] (ent[S] desact[S])dondeDarepresentatodaslasdenicionesdelavariableadelprograma.SecuenciaDadaunasecuenciadebloquesdeinstrucciones:SS1S2gen[S] = gen[S2] (gen[S1] desact[S2])desact[S] = desact[S2] (desact[S1] gen[S2])ent[S1] = ent[S]ent[S2] = sal[S1]sal[S] = sal[S2]7.3. ANALISISDEFLUJO 65BifurcacionEl analisis de sentencias de control tipoif y algunos saltos es dependiente del tipo deanalisisqueseesterealizando.Nosotrosconsideraremosqueambasramasseactivan.S S2 S1gen[S] = gen[S1] gen[S2]desact[S] = desact[S1] desact[S2]ent[S1] = ent[S]ent[S2] = ent[S]sal[S] = sal[S1] sal[S2]BuclePor ultimo,elanalisisdebuclesolazos,noencierraning unsecreto:S1Sgen[S] = gen[S1]desact[S] = desact[S1]ent[S1] = ent[S] sal[S1] = ent[S] gen[S1]sal[S] = sal[S1]66 CAPITULO7. OPTIMIZACIONDECODIGODemostracion.-Partimosdeent[S1] = ent[S] sal[S1]sal[S1] = gen[S1] (ent[S1] desact[S1])queescribiremos,porcomodidad,E1= E X1X1= G1 (E1D1)dondeE,G1yD1sonconstantes.Procederemosporinduccion:Iteracion1E01= EX01= G1 (E D1)Iteracion2E11= E X01= E [G1 (E D1)] = E G1X11= G1 (E11 D1) = G1 [(E G1) D1] = G1 (E D1)(yas sucesivamente; nonecesitamosseguirporqueyahemosobtenidoE= E G1,queesloquepretendamos)Dadounarbolsintactico,surecorridohaciaarribaarrastrandoatributossintetizadospermiteobtenergenydesact,mientrasqueunposteriorrecorridoenprofundidadhaciaabajoteniendoencuentaatributosheredados(delpadrey/ohermanos)permiteobtenerentysal.7.3.2. NotacionVectorialEl analisis de ujo de datos, como ya hemos mencionado, suele acometerse por bloquespreferentementeaporinstrucciones.Sedenenentoncesvectoresquerepresentanloquesegenera/desactiva:V= (a1a2. . . an)conn=n umerodedeniciones del programa. Enel bloqueSi, lacomponenteai=1indica que se ha generado o desactivado (seg un el vector que se considere) la denicioni.Lasecuacionesqueseaplicannovaran, demodoquesimplementerecordemosque,entrevectoresbinarios:A B = VA VBA B = VA VBA B = VA VB7.3. ANALISISDEFLUJO 677.3.3. SolucionIterativaparalasecuacionesdeFlujodeDatosDenicionesdealcance(alcancededeniciones)Denimosunbloquecomounaproposiciondeasignacionounacascadadeproposi-cionesdeasignacion.Partimosdequesehacalculadogeneraydesactivadecadabloqueparatodoslosbloquesdelprograma,ydeque:ent[B] =

predecesoressal[P] P predecesoressal[B] = gen[B] (ent[B] desact[B])ybajoestascondicioneselalgoritmoes:Entrada: gen[B] y desact[B] para cada BSalida : ent[B] y sal[B] para cada Bent[Bi] := O;para cada Bi hacemossal[Bi] := gen[Bi];cambio := true;mientras (cambio) hacemoscambio := false;para cada Bi hacemosent[Bi] := Up sal[P]; /* P predecesores */salant := sal[Bi];sal[Bi] := gen[Bi] U (ent[Bi] - desact[Bi]);si (sal[Bi] salant) entoncescambio := true;fin-parafin-mientrasfin-para7.3.4. AnalisisdeExpresionesDisponiblesDecimosqueunaexpresionx + y2estadisponibleenunpuntoPsi todocamino,nonecesariamentesinlazos, desdeel nodoinicial hastaPeval uax + yydespuesdela ultimaevaluaci onantesdePnohayasignacionnidexnidey.Decimos que un bloque Bdesactiva una expresion x +ysi asigna un valor a x o a y.Decimos que un bloque Bgenera una expresion x+ysi eval ua x+yy no genera unaredeniciondexodey.2El signo + no signica aqu la operacion de suma, sino cualquier operacion en general.68 CAPITULO7. OPTIMIZACIONDECODIGOExpresaremos:egen[Bi] = expresionquegeneraelbloqueBiedesact[Bi] = expresionquedesactivaelbloqueBiU = universal = vacoYusaremoslasecuaciones:sal[Bi] = egen[Bi] (ent[Bi] edesact[Bi])ent[Bi] =

psal[Pi] Bi ,= Binicialent[Bi] = Bi= BinicialComo se puede observar, el analisis anterior daba todo el alcance posible, sin embargoahoraqueremossermuyconservadoresparapoderusarelvalor delaexpresion(enlugarde etiquetar las asignaciones, como antes, ahora se etiquetan las expresiones). El algoritmoes:Entrada: e_gen[Bi] y e_desact[Bi] para todo BiSalida : ent[Bi] y sal[Bi] para todo Bient[Bi] := O;sal[Bi] := e_gen[Bi];para todo BiB1 hacemossal[Bi] := U - desact[Bi];cambio := true;mientras (cambio) hacemoscambio := false;para cada BiB1 hacemosent[Bi] := ^p sal[P];salant := sal[Bi];sal[Bi] := e_gen[Bi] U (ent[Bi] - e_desact[Bi]);si (salant sal[Bi]) entoncescambio := true;fin-parafin-mientras7.3.5. AnalisisdeVariablesActivasUnavariableaesactivaenunpuntoPsi sepuedeutilizarel valordeaenalg uncaminoquecomienceenP.Este analisis pretende liberar memoria, de modo que estar activo signica que se puede(y de hecho, se hace) usar el valor; si no se vuelve a usar, entonces no se esta activo. Estalosofaobligaahacerelanalisisenelcodigoalreves,deabajohaciaarriba.7.3. ANALISISDEFLUJO 69Llamamos entrada al conjunto de variables activas al comienzo de un bloque. Llama-mos salida al conjunto de variables activas a la salida de un bloque. Llamamos denidasal conjunto de variables a las que se les asigna un valor en el bloque. Por ultimo, se llamausoalconjuntodevariablescuyosvaloresseutilizanantesdecualquierdeniciondelavariable.Lasecuacionesusadasenestetipodeanalisisson:ent[Bi] = uso[Bi] (sal[Bi] def[Bi])sal[Bi] =

sent[Si] Si sucesoresElalgoritmoeselsiguiente:Entrada: grafo de flujo G y def[Bi], uso[Bi] para todo BiSalida : sal[Bi] para todo Bipara todo Bi hacemossal[Bi] == O;para todo Bi hacemosent[Bi] := uso[Bi];mientras ocurren cambios en los conjuntos ent[Bi] hacemospara cada Bi hacemossal[Bi] := Us ent[S]; /* S sucesores */ent[Bi] := uso[Bi] U (sal[Bi] - def[Bi]);fin-parafin-mientras70 CAPITULO7. OPTIMIZACIONDECODIGOCaptulo8ErroresEnestebrevetemacomentaremosalgunasgeneralidadesacercadeloserroresenelambitoquenosocupa.8.1. TiposdeerroresConsideraremoslaexitenciadevariostiposdeerrores:Errores lexicos, son aquellos en los que donde se esperaba una palabra reservada dellenguajeapareceotra(porejemplo,ponerfarenlugardefor).Errores sintacticos, son aquellos que provocan que no se encuentre un arbol sint acti-coqueanaliceelprograma(porejemplo,cuandofaltaunparentesis).Erroressemanticos, aparecencuandollevamosacaboaccionesinadecuadassobreelementosincorrectos(porejemplo,hacerlarazcuadradadeunavariabledetipostring).Erroresdecompilacion,aparecenporlimitacionespropiasdelcompilador(algunosnopermitenmasde10buclesanidados,otrosnomasde30procedimientos,. . . ).Erroresdeejecucion, sedebenadescuidosdel programados(situacionescomoac-cesosamatricesfueraderango,acherosnoabiertos,. . . ).8.2. RecuperaciondeerroresSeg un el tipo de error ante el que nos encontremos, seran susceptibles de ser realizadasdiferentes medidas de correcion. En particular, en compiladores puede ser interesante paranosotrosintentarsubsanarerroreslexicogracos, tantoaquellosquesuponenlasustitu-cion de unos elementos por otros, como la inclusion de elementos extra nos entre elementoscorrectos,oladesapariciondealg unelemento.Afrontaremos,pues,lacorrecciondeerroreslexicogracosdesdeestasperspectivas.7172 CAPITULO8. ERRORES8.2.1. CorrecciondeerroresdecambioSuponeadmitirpalabrasdel lenguajeconunoomaserrores. Sedeneel operadordecambio1:C(a) = T adetalmodoqueC1(x) = y/y T yresultadode1cambioenxC2(x) = y/y T yresultadode2cambiosenx. . .Cn(x) = y/y T yresultadodencambiosenxAdemas,porconvenio,si [x[ < n,entoncesCn(x) = .Demodoqueparacorregirerrores, esdecir, paraadmitirpalabrasconalg unerrordurante el proceso de compilacion, si tenemos una gramatica G = (N, T, P, S), crearemosunagramaticaG

= (N, T, P

, S)enlaquelasreglasseranP

= P reglasdelasoperacionesdecambiodetalformaqueelnuevolenguajeaceptadopuedeexpresarsecomoL(G

) = y/y T y Cn(x) x L(G), n 0La correccion de errores se implementa mediante un esquemadetraduccion, dado porEDT(N, Te, Ts, P, S),denidoseg unlaestructura:A i, i(noexistenerrores)A , i(con = C1(i))A , i(con= C2(i)). . .A , i(con= Cn(i))8.2.2. CorrecciondeerroresdeborradoDelmismomodo,sedeneeloperadordeborrado:B(a) = o a TdetalformaqueBn(x) = si [x[ < n= y/y T yresultadodeeliminarncaracteresenxEl errordeborradoesmuyfacildedetectarenlenguajesdondesedenantodaslaspalabrasdelamismalongitud.1Que solo act ua sobre elementos terminales.8.3. MODOPANICO 738.2.3. CorrecciondeerroresdeinclusionEloperadordeinclusionsedene:I(a) = xa + ax a T x TdetalformaquesiT= a1, a2, . . . , an,entoncesI(a) = aa1 + aa2 + . . . + aan + a1a + a2a + . . . ana8.3. ModopanicoAlgunos compiladores, cuandoencuentranunerror, detienenel analisis. Otros, encambio,buscanelprincipioynaldeseccionobloqueentrelosqueseencuentraelerror, lo ignoran, y siguen analizando el resto del codigo. Este modo de comportarse es loqueseconocecomomodopanico.74 CAPITULO8. ERRORESCaptulo9LaTabladeSmbolosYahemos habladoenalgunaocasionde las tablas de smbolos. Independiente-mentedel mododealmacenamiento, latabladesmbolosoTDSesunaestructurautilizada por los compiladores para almacenar informacion sobre variables (nombre, tipo,ambito,. . . )yprocedimientos(nombre, parametrosdeentradaysalida, caracterdelosparametrosdeentradaporvaloroporreferencia,. . . ).Lamayorade los compiladores mantiene unaTDSpor tipode objeto(unaparavariables,otraparaprocedimientos,. . . ),ysuelenserdecaracterestatico.Suutilidadespatentealprincipiodelprocesodecompilacion,puesenelpasoacodigoobjetoyadejandesernecesarias.Veremosacontinuaci onunaseriedeformasdeimplementarlasTDS.9.1. Tipos9.1.1. TDSlinealConsisteeniralmacenandolainformacionsobrelosobjetosseg unsevaobteniendo,linealmente.Lab usquedaserealiza,portanto,demanerasecuencial.9.1.2. TDSordenadaSedeterminaunordenamiento, por ejemplo, el ordenalfabetidodeidenticadores.Unavezdenido,lainsercionserealizaenellugaradecuado,reestructurandolaTDSencasonecesario,ylab usquedasueleserdicotomica,rapidayfacildeimplementar.9.1.3. TDSarbolbinarioLaTDSarbolbinarioguardaunaestructuraenformadearbol,talcomosunombreindicaysepuedeobservar enlagura9.1(pagina76). Peseaquesedesperdiciaunpocomasdeespacioadicional enlospunteros, esunodelostiposmasutilizados, puessuimplementaci onnoes complejaytantoinsercioncomob usquedatienenlamismacomplejidad.7576 CAPITULO9. LATABLADESIMBOLOSABAA BCBA BDFigura9.1:TDSenformadearbolbinario.9.1.4. TDSconhashingDado un identicador Ccon n caracteres, C= c1c2. . . cn, la funcion de hashtpica es:Hashing(C) = (0 +n

i=0ici)moduloTdonde0esladireccionoposicioninicial,dondeempiezaenmemorialaTDSieselvalornumericoasignadoaciT eseltama nodelaTDSPara otro tipo de claves (identicadores) no solo compuestos por caracteres (como porejemploi2),podraadoptarse:Hashing(C) = (ord(id[i] 10) + ord(id[2]))moduloTHashingabiertoCon la mayora de las funciones de hash existe la posibilidad de colisiones. La tecnicadehashingabiertoestablecequeencasodeconictoel valorseintroduceenlasiguien-te posicionlibre, realizandolaexploracionlinealmente apartir del lugar original. Enb usqueda, si el valorquesepretendeencontrarnosehallaenlaposicionquelecorres-ponde, sesiguebuscandosecuencialmenteapartir delamisma. Enlamayoradelasocasionessemantienenpunterosdeenlaceporcomodidadyrapidez.9.1. TIPOS 77HashingconoverowEl hashingconoverowesotravariantequepretendesolucionarel problemadelascolisiones. Enestecaso, losvaloresconictivosvanapararaunasegundatabla, dondesealmacenanlinealmenteenlazados.HashingconencadenamientoElhashingconencadenamientoperfecionalatecnicadelhashingconoverowyesta-blecequelaprimeraTDScontengasolopunteroslaTDSdesegundonivel.9.1.5. TDSenlazadasComo hemos mencionadoalprincipio,enla tablade smbolossuelenalmacenarse da-tosrelativosavariablesyprocedimientos. Porloquerespectaalasvariables, habamoscomentado que puede incluirse el nombre, tipo,. . . y tambien el alcance (bloques del pro-grama en los que la variable esta activa). El metodo de las TDS enlazadas evita la inclusiondeestedatoenlaTDSdeniendounatablaporbloquedelprogramayrelacionandolasentres.Seg unestemetodo, podemosdenirunidenticador(variable)enrelacionasuam-plitud:Unidenticadorsedeclaraalprincipiodeunbloque1ysepuedeusardentrode el.Unidenticador declaradoenunbloque puede ser udasodentrode los bloquesinterioresaladenicion,exceptocuandosehaceotradeniciondevariableconelmismobloque(endichobloqueinterior).Este es el metodo que se usa en la mayora de los compiladores actuales. La estrategiade b usqueda consiste en comprobar si el identicador esta en la tabla del bloque en que seencuentra la referencia, y si no es as, seguir el puntero a la tabla del bloque que contieneal bloque actual y buscar all. Se procede recursivamente hasta que se encuentra o se llegaalbloqueprincipal.1En algunos lenguajes esto no es necesario que se cumpla estrictamente.78 CAPITULO9. LATABLADESIMBOLOSCaptulo10RepresentaciondelaInformacionyGestiondeMemoria10.1. RepresentaciondelaInformacionAunque ya hemos dado pinceladas al respecto en temas anteriores, volveremos ahora ahablar con un poco mas de detalle de la representacion de las estructuras de informacion.10.1.1. RepresentaciondearraysymatricesLa representaci on de un array es simple, pues no es mas que una coleccion de n objetosigualesqueseubicancontiguosenmemoria.Enelcasodelasmatrices(arraysbidimensionales)M[b1. . . a1, b2. . . a2],tenemosdosfuncionesdeaccesoseg unsualmacenamiento:Almacenamientoporlas:Dir(Mij) = M+ k[(i b1) C + (j b2)]donde Mes la direccion base, k es el n umero de bytes por elemento y Ces el n umerodeelementosporlao,loqueeslomismo,eln umerodecolumnas.Almacenamientoporcolumnas:Dir(Mij) = M+ k[(i b2) F+ (i b1)]donde Mes la direccion base, k es el n umero de bytes por elemento y Fes el n umerodeelementosporcolumnao,loqueeslomismo,eln umerodelas.RepresentacionconvectoresenlazadosOtra forma de representar matrices es mediante vectores: se tiene un vector de punteros(unoporla)queapuntanasuvezalosvectores-laqueformanelarraybidimensional.Estarepresentacionocupaunpocomasdeespacio(elvectordepunteros),perorequierebastantesmenoscalculosparaacceder:7980 CAPITULO10. REP.DEINFORMACIONYGESTIONDEMEMORIADir(Mij) = (vector + i 1) + j 1donde(vector +i 1)eselvalordelpunterocorrespondiente(ladireccion).Comosepuedever,simplementehayquehacersumasyrestas.RepresentaciondematricesdendimensionesDadaunamatriz:M[i1. . . s1, i2. . . s2, . . . , in. . . sn]dondeii= lmitesinferioressi= lmitessuperioresn = n umerodedimensionesy,obviamenteii si.Sillamamose1= s1i1 + 1e2= s2i2 + 1. . .en= snin + 1entoncesparaaccederaM[j1, j2, . . . , jn]debemoshacerM + (j1i1) e2 e3 . . . en++ (j2i2) e3 . . . en++ . . . ++ (jn1 + in1) en++ (jn + in)VectorDopeoVectordeInformacionPararepresentarestetipodeestructura,veremospor ultimounmetodoqueconsisteenalmacenarunvectordeinformacionconlasiguienteforma:i1s1e1i2s2e2 ...insnenNumero de dimensionesTermino constanteDireccion de comienzo10.2. GESTIONDEMEMORIAPROPORCIONADAPORELCOMPILADOR 81La utilidad de esta estrategia reside en la recopilacion de la maxima informacion posiblesobre las matrices, a n de que no conlleve mas calculos el acceso que la propia operacionquesepretendarealizarsobreellas.Ademas,estaestructurapermitelaimplementaciondeldinamismoconarraysbidimensionalesdemanerasencilla.10.1.2. RepresentaciondecadenasytirasdecaracteresLas cadenas suelen almacenarse contiguas en memoria, determinando un caracter quese nalaelndelasmismas.Losmayoresproblemaslospresentanlasoperacionesdema-nejodetirasdecaracteres(copia,concatenacion),yaquelasubicacionesdelascadenasoriginalesenmemoriapuedenserdistantesycrearunanuevacadenaencadaoperacionsupone demasiado moviento de datos y reserva de espacio en el data block. Lo que se suelehaceresasociarlascadenasmediantepunteros,evitandodeestamaneraelmencionadotraco de operacones en memoria. Claro que esto puede derivar en una situacion donde laproliferacion de cadenas segmentadas y punteros sea demasiado costosa; en ese caso, algu-noscompiladoresincluyenrutinasdereagrupamientoquesedisparanautomaticamente.10.1.3. RepresentacionderegistrosLosregistros(tambienconocidoscomorecords)suelenalmacenarsecontiguosenme-moria. EnlaTDSseguardainformacionacercadel n umeroytipodesuscampos, demodoqueelaccesoaundeterminadodatosiempreesfacilmentecalculable.10.2. GestiondememoriaproporcionadaporelcompiladorLos compiladores suelenproporcinar unaserie de rutinas que sonincorporadas alcodigo del usuario y que se encargan de gestionar la deteccion de errores de ejecucion (porejemplo,divisionesporcero),delagestiondevariableslocalesyglobales,delcontroldeltama noysituaciondelosobjetosenlamemoria,etc.Zona programasS.O.DispositivosCod. IRQPantalla(a) M. principal.Datos estaticosCodigoPilaMonticulo(b) M. proceso.82 CAPITULO10. REP.DEINFORMACIONYGESTIONDEMEMORIALasvariableslocalesdelosprocedimientossecolocanenlapila,deformaquemeca-nismos como la recursion puedan funcionar adecuadamente. De aqu surge el concepto deregistrodeactivacion,queveremos.Algunoslenguajessolotienengestionestaticadememoria(porejemplo,enF66nadapuedecrecerentiempodeejecucionynoexistelarecursividad), mientrasquelagranmayoratieneasignaciondinamica.10.2.1. Registrodeactivaci onLosregistrosdeactivacionsonlaunidadestructuraldelapilayalmacenan:DatoslocalesdelprocedimientoPar ametrosqueselepasanDatostemporalesintroducidosporelcompiladorDatos sobre el estado de la maquina antes de la ejecucion del procedimiento (estadodelaCPU:registros,ags,. . . )PunteroalregistrodeactivacionanteriorAllama aBA Bllamador llamadoABpilaUnprocedimientoesrecursivosisepuedeactivarantesdelanalizaciondelaacti-vaci onanterior.Los registros de activacionse pueden organizar en forma de arbol, que recibe el nombrede arboldeactivaci on. En este arbol, se dice que un nodo A es padre de un nodo Bsiel control uye de A hacia B. Del mismo modo, se dice que un nodo A esta a la izquierdadeunnodoBsiseejecutaAantesqueB.10.2.2. SecuenciadellamadayretornoLasecuenciadellamadaconsisteenguardarenelregistrodeactivaci onelestadode lamaquina, asignar los valores alas variables locales ycomenzar laejecuciondelprocedimiento.Por suparte, lasecuenciade retornorecuperalos datos del campoestadodelregistrodeactivaci onpararestaurarlasituacionanterioryborraelmencionadoregistroparacontinuarlaejecucion.Existendostiposdepunterosimplementadosenlaestructuraderegistrosdeactiva-cion: estaticosy dinamicos. Los estaticos permiten buscar variables a las que tiene acceso10.2. GESTIONDEMEMORIAPROPORCIONADAPORELCOMPILADOR 83procedimientollamadoprocedimientollamadorvalor devuelto y parametrosenlace de controlestadodatos temporales y localesel procedimiento pero que no son locales y los dinamicos son referencias al procedimientollamador(sonlosquerealmentepermitenimplementarlapila).Las variables globales del programa se ubican en la parte de datos estaticos del proceso,de forma que se ahorra el tener que colocarlos repetidamente en los registros de activaci onyseconsiguequeestenaccesiblesparatodoslossubprocesos.10.2.3. SubprogramasLosargumentosconquesellamaaunsubprogramapuedenser:Parametroso Parametroscticios, variables o identicadores que solamente apare-cenenelsubprogramaqueesllamado.Argumentoso Parametrosefectivos, variables o expresiones que aparecen en el pro-cedimientollamador.Ademas,lallamadapuedeclasicarse:Sololectura:alllamaraunafuncionf(a),enfsetrabajaconunacopiadea.Solo escritura: al llamar a f(a), en fse trabaja con una copia de a cuyo valor inicialno esta determinado (puede ser un valor por defecto) y al nalizar se copia su valoralverdaderoa,queact ua,portanto,comounparametrodedevolucion.LecturayescrituraPorvalororesultado: al llamaraf(a), enf seleedeayseescribeenunacopiadea,volcandosesuvalorenelverdaderoaalnaldelprocedimiento.84 CAPITULO10. REP.DEINFORMACIONYGESTIONDEMEMORIAPor direccion: al llamar a f(a), en fse trabaja directamente con a, tanto paralecturacomoparaescritura(setieneladireccion).Por nombre: el procedimientoal quesellamanorecibeunadireccionouncontenido,sinounliteral,deformaque,seg unsucontexto,ledaraelvalorcorrespondiente.10.2.4. EstructurasCOMMONyEQUIVALENCEenFORTRANEnFORTRANsepuedenestablecerrelacionesdeequivalenciaentrevariablesconres-pectoalaposicionfsicaque ocupanenunbloque com un(bloque que puede crecerdinamicamente).Estosehaceconsentenciasdeltipo:EQUIVALENCE A, B+100EQUIVALENCE C, D-40EQUIVALENCE A, C+30EQUIVALENCE E, FCadabloquetieneunlder,queseutilizacomorazparaconstruirelarboldeequiva-lencia.D 0B 110 C 40A 100Estaestructuravienedelensamblador,yloscompiladoresolenguajesquelautilizan(comoFORTRAN)empleanenrealidadunavarianteenlaque,enelarboldeequivalencia,ellderestaunidomedianteenlacesdirectosalahojamasalaizquierdayalahojamasa la derecha, que son respectivamente los extremos inferior y superior del bloqueCOMMON.10.3. MontadoresyCargadoresLosmontadores(linker)resuelvenlasreferenciasexternasqueexistenenlosob-jetosamontar, paraloqueutilizanunatabla. Duranteel proceso, sedetectanerrores(Unresolved external) y si no aparecen enlazan todos los objetos en un unico objetoentendibleporelcargador.Loscargadores(loader)carganenmemoriaunobjeto,resolviendoelproblemadela reubicacion. En los programas, existen partes reubicablesy partes no reubicables(comoel codigodelasinterrupciones, porejemplo). Trascargarloenmemoria, el cargador daelcontrolalprograma,trasestablecerpunterosconvaloradecuado(punterodeiniciodeprograma. . . ),valoresdelosregistrosdelaCPU,ags,etc.10.4. FICHEROSOBJETO 8510.4. FicherosobjetoContienenunaseriederegistrosdelaforma:

donde lacabecera contiene, a su vez, y donde elchecksum repre-sentalacomprobaciondeparidadparaelcontroldeerrores.Entrelostiposderegistrosquepuedeconteneruncheroobjetopodemosencontrar:Dedeniciondebloques Contienen:

donde = = dondeeltipodelbloquesereereasiesreubicableono,porejemplo.Dereferenciasexternas Contienen:

donde = DetextoconiteracionSe usanpara rellenar zonas de memoria conundato:

donde = dondeserepetiracontenido contadorveces.Otros Comoregistrosdeprincipiodebloque,nal debloque,. . .10.5. InterpretesFueron muy usados en un principio debido a que los equipos tenan poca memoria y erapreferible tener cargado siempre el interpretey el codigo fuente a tener un compilador y elcodigoobjeto;conelavancedelatecnologa,noobstante,fuedecayendoposteriormentecasi porcompletosuutilizacion, frentealadeloscompiladores. Actualmente, desdelaapariciondeVBASICysobretododejava,estanvolviendoaresurgir.86 CAPITULO10. REP.DEINFORMACIONYGESTIONDEMEMORIADistinguimosdostiposdeinterpretes:Clasicos Son interpretes que van ejecutando el codigo fuente lnea a lnea talycomoestatecleado.Modernos Soninterpretesquerealmentegeneranuncodigointermediosinerrores,queeselqueesinterpretadolneaalnea.ProgramafuenteAnalizadorlexicoAnalizadorsintacticoRPNTDSInterpreteEtapa analisis Ejecucion/interpretaciondatos entradadatos salidaFigura10.1:Estructurayfuncionamientodeuninterpretemoderno.Unejemplo:/* CODIGO FUENTE */A := 9;B := 8;B := B+A;WRITE B;GOTO X;/* CODIGO RPN */A 9 := ;;B 8 := ;;B B A + := ;;B WRITE ;;X GOTO ;;/* INTERPRETE */case v[pos] ofident, entero : apilar(v[op]); p:=p+1;+ : sumar PCP + PCP - 1 e introducir el resto en la pilawrite : representar en pantalla rep:= : evaluar elemento PCP y ponerlo en direccion PCP - 1endIndicealfabeticoarboldederivacion,27sintactico,11core,42lookahead,42accionessemanticas,44alfabeto,9deentrada,16depila,17desalida,18algoritmodeThompson,23deWarshall,31deteccionlenguajevaco,13eliminacionrecursividadporlaizquierda,15reglaslambda,14reglasunitarias,14smbolosin utiles,13analisisporprecedencia,29metododelarbol,30metododerivativo,30metodomatricial,30operador,31simple,29semantico,43sintactico,27LL(1),32LL(K),32LR(1),36LR(K),35analisisdeujo,63analizadorlexico,21atributosheredados,46sintetizados,46automataconpila,17conguracion,16nal,16inicial,16objetivo,16nito,16determinista,16nodeterminista,16lenguajegenerado,17reconocedor por agotamiento de pila,18representaciongraca,17transicion,17axioma,10codigoa3direcciones,54generacion,43intermedio,51objeto,51optimizacion,59encodigofuente,59cierrereexivo,9transitivo,9conjuntodetraduccion,19cuartetos,53denicionesdealcance,63derivaci on,10representaciongraca,11erroresrecuperacion,71tipos,718788INDICEALFABETICOesquemasdetraduccion,20estado,16cerradura,23nal,16inicial,16expresionregularpropiedades,23formadetraduccion,20formanormal,15deChomsky,15deGreibach,15formassentenciales,11funciondetransicion,16gramatica,10ambigua,11decontextolibre,10independientedelcontexto,10limpia,12regular,10sensiblealcontexto,10tipos,10lenguaje,11metanocion,14notacionpolacainversa,52palabra,9parsingascendente,28descendente,28producciones,10reexividad,30reglascadena,12deproduccion,10detraduccion,20lambda,14recursivas,15autoimbricadas,15porladerecha,15porlaizquierda,15semanticas,46unitarias,14relacionbinaria,30complementaria,30deequivalencia,30traspuesta,30universal,30RPN,52smboloaccesible,13anulable,14in util,13noterminal,10terminable,13terminal,10scanner,21construccion,21simetra,30tabladesmbolos,75tercetos,53indirectos,54tiposbasicos,43,45coercion,49comprobacion,43constructores,43,45conversi on,49equivalencia,48polimorsmo,49sobrecarga,49tiradecaracteres,9longitud,9nula,9potencia,9traducciondirigidaporlasintaxis,43,44traductorconpila,19nito,18transitividad,30variantesINDICEALFABETICO 89LR(1)LALR,36,42LRcanonico,36,40SLR,36,3890INDICEALFABETICOIndicedeguras1.1. Esquemadelastareasdeuncompilador. . . . . . . . . . . . . . . . . . . . 72.1. Ejemplodearbolsintactico. . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2. Ejemplodegramaticaambigua. . . . . . . . . . . . . . . . . . . . . . . . . 122.3. Relevancia en el orden de los algoritmos de simplicacion. . . . . . . . . . . . . 142.4. Representacionesdeunautomata. . . . . . . . . . . . . . . . . . . . . . . . 173.1. Objetivodeunscanner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.2. Manerasdeconstruirunscanner. . . . . . . . . . . . . . . . . . . . . . . . 223.3. ComponentesbasicosdelmetododeThompson. . . . . . . . . . . . . . . . 244.1. Tiposdeparsing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274.2. Tiposdeparsing,otraclasicacion. . . . . . . . . . . . . . . . . . . . . . . 284.3. EstructuradeunparserLL(1). . . . . . . . . . . . . . . . . . . . . . . . . 334.4. ModelodeunanalizadorsintacticoLR(1). . . . . . . . . . . . . . . . . . . 365.1. Esquemadeanalisissemantico. . . . . . . . . . . . . . . . . . . . . . . . . 447.1. GrafodeFlujoyArboldeDominacion. . . . . . . . . . . . . . . . . . . . . 629.1. TDSenformadearbolbinario. . . . . . . . . . . . . . . . . . . . . . . . . 7610.1. Estructurayfuncionamientodeuninterpretemoderno. . . . . . . . . . . . 869192INDICEDEFIGURASIndicedecuadros2.1. Correspondenciagramaticas-aut omatas. . . . . . . . . . . . . . . . . . . . 164.1. AlgoritmodeWarshall. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314.2. Precedenciausualentrelosoperadoresmatematicos. . . . . . . . . . . . . . 324.3. AlgoritmodeanalisisLL(1). . . . . . . . . . . . . . . . . . . . . . . . . . . 344.4. Algoritmodecalculodecerradura. . . . . . . . . . . . . . . . . . . . . . . 394.5. ConstrucciondelacoleccioncanonicaLR(0).. . . . . . . . . . . . . . . . . 394.6. AlgoritmodecalculodecerraduraparaLR-canonico. . . . . . . . . . . . . 414.7. AlgoritmodecalculodeIraparaLR-canonico. . . . . . . . . . . . . . . . 414.8. ConstrucciondelconjuntodeloselementosdeanalisisLR-canonico. . . . . 415.1. Gramaticadereferencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.2. Algoritmodecomprobaciondeequivalenciaestructural. . . . . . . . . . . . 495.3. Comprobaciondetiposparacoerciondeenteroareal. . . . . . . . . . . . . 506.1. NotacionPolacaInversa(RPN). . . . . . . . . . . . . . . . . . . . . . . . . 526.2. TraduccionaRPN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.3. Notaciondecuartetos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536.4. Modosdedireccionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . 559394INDICEDECUADROSBibliografa[1] Bennett,J.P.IntroductiontoCompilingTechniques.Mc-GrawHillInternational,1996.2aedicion,SeriesinSoftwareEngineering.[2] GalanPascual,C.SanchsLlorca,F.J.Compiladores.Teorayconstruccion.ParaninfoS.A.,1988.Madrid.[3] Mason,TonyyLevine,JohnyBrown,Dough.Lex&Yacc.OReilly,1992.2aedicion.[4] Aho,AlfredV.ySethi,RaviyUllman,JereyD.Compiladores.Principios,tecnicasyherramientas.AddisonWesleyLongman,1998.1areimpresion.95