Teoria de Automatas

download Teoria de Automatas

of 133

Transcript of Teoria de Automatas

IsabelNavarreteSanchezMaraAntoniaCardenasViedmaDanielSanchezAlvarezJuanAntonioBotaBlayaRoqueMarnMoralesRodrigoMartnezBejarDepartamentodeIngenieradelaInformacionylasComunicacionesUniversidaddeMurciaTEORIA DE AUTOMATASYLENGUAJES FORMALESSeptiembre,2008IntroduccionAunque no debemos hacer una distincion tajante entre los aspectos practicos y teoricos de laInformatica, es cierto que existen materias que tienen un alto contenido formal, con desarrollosde tipo matematico, al contrario que otros temas mas cercanos a la resolucion de problemas detipo practico. La asignatura de Teora de Automatas y Lenguajes Formalessin duda trata conlas materias del primer tipo y los contenidos que se imparten constituyen el eje fundamental dediversas areas de conocimiento encuadradas dentro de lo que podramos denominar InformaticaTeorica. A veces estas disciplinas resultan para el alumno materias aridas y distanciadas delo que ellos entienden que deberan estudiar en una carrera de Ingeniera Informatica. Pero laInformatica, comocualquierotracienciaoingeniera, tieneunosfundamentosteoricossobrelosqueapoyarseyquecualquieringenieroenInformaticadebeconocer. As loentiendendi-versos organismos internacionales comoACMeIEEEque recomiendan al menos un curso deAutomatas y Lenguajes Formales en los curricula de las carreras relacionadas con la Informati-ca. Una motivacion para el estudio de estas materias formales la expusoMillner en un discursoque dio en 1993 al recoger el prestigioso premio Turingque se otorga a distinguidos cientcosque trabajan en el area de las Ciencias de la Computacion:Estas [las aplicaciones] son altamente necesarias, pero no queremos que esto ocurraen detrimento del trabajo teorico...Las Ciencias de la Computacion son tan ampliasque si no tienen una teora basica, estaremos perdidos. Tantas cosas estan avanzan-do...Como podra ocurrir esto sin una teora? Esta tiene que ir cogida de la manode la practica.1. EvolucionhistoricadelaTeoradelaComputacionLa Teora de la Computacion trata con modelos de calculo abstractos que describen con distintosgradosdeprecisionlasdiferentespartesytiposdecomputadores. Peroestosmodelosnoseusan para describir detalles practicos del hardware de un determinado ordenador, sino que masbien se ocupan de cuestiones abstractas sobre la capacidad de los ordenadores, en general. As,en los curriculade Ciencias de la Computacion existen cursos separados para tratar materiascomo Arquitectura de Computadores, Teora de Circuitos, Algoritmos y Estructuras de Datos,SistemasOperativos, etc. Todasestasareastienenunacomponenteteorica, perodierendelestudio de la Teora de la Computacion fundamentalmente en dos aspectos:Las primerastratancon computadoresque existenrealmente, mientras quelosmodelosabstractos de calculo abarcan todo tipo de computadores que existen, que puedan llegara existir o simplemente que uno pueda imaginar.EnTeoradelaComputacion, adiferenciadelasotrasmaterias, loimportantenoesbuscarlamejormaneradehacerlascosas(optimalidad)sinoestudiarquepuedeonopuede hacerse con un ordenador (computabilidad).2La historia de la Teora de la Computacion es bastante interesante. Se ha desarrollado graciasa conuencia, por afortunadas coincidencias, de distintos campos de conocimiento y descubri-mientos (fundamentalmente matematicos) realizados a principios del siglo XX. Bajo el nombreTeoradelaComputacion se recogen una serie de materias que constituyen hoy en da los fun-damentos teoricos de la Informatica: TeoradeAutomatas, TeoradelosLenguajesFormales,Computabilidad y Complejidad Algortmica.ComputabilidadEl primertemaquecaeclaramentedentrodel campodelaTeoradelaComputacioneselde Computabilidad. Iniciadapor Godel, Church, Post, Turingy Kleene, tienesusracesenlaLogica Matematica. Al iniciar el siglo XX, los matematicos estaban a punto de efectuar grandesdescubrimientos. Los logros de los siguientes 40 a nos estaban destinados a sacudir las bases delasmatematicasytuvieronconsecuenciasqueseextendieronal campodelasCienciasdelaComputacion, a un por nacer.A principios de siglo XX se empezo a fraguar un dilema. Georg Cantor (1845-1918), haba inven-tado por entonces la TeoradeConjuntos, pero al mismo tiempo descubrio algunas paradojasinquietantes. Algunos de sus planteamientos podan ser comprensibles (como que hay innitosde distinto tama no), pero otros no (por ejemplo, que alg un conjunto sea mayor que el conjuntouniversal). Esto dejo una nube de duda a los matematicos que ellos necesitaban disipar. El pun-to de partida de fueron las cuestiones fundamentales queDavidHilbert (1845-1918) formulo en1928, durante el transcurso de un congreso internacional:1. Son completas las Matematicas, en el sentido de que pueda probarse o no cada aseveracionmatematica?2. SonlasMatematicasconsistentes,enelsentidodequenopuedaprobarsesimultanea-mente una aseveracion y su negacion?3. SonlasMatematicasdecidibles,enelsentidodequeexistaunmetododenidoquesepueda aplicar a cualquier aseveracion matematica y que determine si dicha aseveracion escierta o falsa?La meta de Hilbert era crear un sistema axiomatico logico-matematico completo y consistente,del cual podran deducirse todas las Matematicas, esto es, cualquier teorema matematico podraderivarse de los axiomas aplicando una serie nita de reglas, es decir, mediante un procesoal-gortmicoocomputacional. Suideaeraencontrarunalgoritmoquedeterminaralaverdadofalsedad de cualquier teorema en el sistema formal. A este problema le llamo el Entscheidungs-problem.Por desgracia para Hilbert, en la decada de 1930 se produjeron una serie de investigaciones quemostraronqueestonoeraposible. Lasprimerasnoticiasencontrasurgenen1931conKurtGodel (1906-1978) y su TeoremadeIncompletitud: Todo sistema de primer orden consistentequecontengalosteoremasdelaaritmeticaycuyoconjuntodeaxiomassearecursivonoescompleto. Como consecuencia no sera posible encontrar el sistema formal deseado por Hilberten el marco de la logica de primer orden. Una version posterior y mas general del teorema deGodel elimina la posibilidad de considerar sistemas deductivos mas potentes que los sistemas deprimer orden, demostrando que no pueden ser consistentes y completos a la vez. Los resultadosde Godel prueban que no solo no existe un algoritmo que pueda demostrar todos los teoremasenmatematicas, sinoqueademas, notodoslosresultadossondemostrables. Entoncescabeplantearse las siguientes preguntas:Que pueden hacer los ordenadores (sin restricciones de ning un tipo)?Cuales son las limitaciones inherentes a los metodos automaticos de calculo?3AestascuestionespretenderesponderlaTeoradelaComputabilidad. El primerpasoenlab usqueda de las respuestas a estas preguntas esta en el estudio de los modelos de computacion.Los Modelos Abstractos de Calculotienensuorigenenlos a nos 30, antes dequeexistieranlosordenadores(el primercomputadorelectronicodepropositogeneral fueel ENIACquesedesarrolloapartirdela no1943),eneltrabajodeloslogicosChurch,Godel,Kleene,Post,yTuring. Estosprimerostrabajoshantenidounaprofundainuencianosoloenel desarrolloteoricodelas Ciencias delaComputacion, sinoquemuchos aspectos delapracticos delaInformatica fueron presagiados por ellos: incluyendo la existencia de ordenadores de propositogeneral, laposibilidaddeinterpretarprogramas, ladualidadentresoftwareyhardwareylarepresentacion de lenguajes por estructuras formales basados en reglas de produccion.AlonzoChurch propuso la nocion de funcion-denible como funcion efectivamente calculable.Lademostraciondeteoremasseconvierteenunatransformaciondeunacadenadesmbolosen otra, seg un un conjunto de reglas formales, que se conocen como lambdacalculo. En 1936,Church hace un esquema de la demostracion de la equivalencia entre las funciones-deniblesylasfuncionesrecursivasdeHerbrand-Godel (estaequivalenciatambienhabasidoprobadapor Kleene ) y conjetura que estas iban a ser las unicas funciones calculables por medio de unalgoritmo a traves de la tesis que lleva su nombre (TesisdeChurch) y utilizando la nociondefuncion-denible, dioejemplosdeproblemasdedecisionirresolublesydemostroqueelEntscheidungsproblem era uno de esos problemas.Por otra parteKleene, pocos meses despues, demuestra de forma independiente la equivalenciaentre funciones-denibles y funciones recursivas de Herbrand-Godel, a traves del concepto defuncion recursiva y da ejemplos de problemas irresolubles.La tercera nocion de funcion calculable proviene del matematico ingles Alan Turing (1912-1954).Turing se nalo que haba tenido exito en caracterizar de un modo matematicamente preciso, pormedio de sus maquinas, la clase de las funciones calculables mediante un algoritmo (funcionesTuring-computables), lo que se conoce hoy como Tesis de Turing (1936). Aunque no se puededar ninguna prueba formal de que una maquina de Turing pueda tener esa propiedad, Turing dioun elevado n umero de argumentos a su favor, en base a lo cual presento la tesis como un teoremademostrado. Ademas, utilizo su concepto de maquina para demostrar que existen problemas queno son calculables por un metodo denido y en particular, que el Entscheidungsproblem era unode esos problemas. Cuando Turing conocio los trabajos de Church y Kleene, demostro que losconceptosdefuncion-denibleyfuncioncalculablepormediodeunamaquinadeTuringcoinciden. NaturalmentealaluzdeestolaTesisdeTuringresultaser equivalentealadeChurch.Posteriormente, se demostro la equivalencia entre lo que se poda calcular mediante una maquinadeTuringyloquesepodacalcularmedianteunsistemaformal engeneral. Alavistadeestos resultados, la TesisdeChurch-Turing es aceptada como un axioma en la Teora de laComputacion y ha servido como punto de partida en la investigacion de los problemas que sepueden resolver mediante un algoritmo.Una de las cuestiones mas estudiadas en la Teora de la Computabilidad ha sido la posibilidadde construir programas que decidan si un determinado algoritmo posee o no una determinadapropiedad. Sera interesante responder de forma automatica a cuestiones como:Calculan los algoritmos A y B la misma funcion? (Problema de la equivalencia)Parara el algoritmo A para una de sus entradas? (Problema de la parada)Parara el algoritmo A para todas sus entradas? (Problema de la totalidad)Calcula el algoritmo A la funcionf? (Problema de la vericacion)Conforme se fueron obteniendo demostraciones individuales de la no computabilidad de cada unade estas cuestiones, fue creciendo la sensacion de que casi cualquier pregunta interesante acerca4dealgoritmoseranocomputable. El TeoremadeRice, conrmaestasensacion: Consideresecualquier propiedad que no sea trivial acerca de la funcion calculada por un algoritmo, entoncesla cuestion de si la funcion calculada por un algoritmo arbitrario verica dicha propiedad es nocomputable.ComplejidadAlgortmicaDespuesdequelaTeoradelaComputabilidadfueradesarrollada, eranatural preguntarseacercadeladicultadcomputacional delasfuncionescomputables. Esteesel objetivodelaparte de las Ciencias de la Computacion que se conoce como Complejidad Algortmica. Rabin fueuno de los primeros en plantear esta cuestion general explcitamente: Que quiere decir que unafuncionfseamasdifcildecomputarqueotrafunciong ?Rabinsugiriounaaxiomaticaquefue la base para el desarrollo del estudio de medidas de complejidad abstracta deBlum y otros(1967).Unasegundaaportacionquetuvounainuenciarelevanteenel desarrolloposteriordeestamateria fue el artculo deJ.Hartmanis yR.Stearns en 1965, cuyo ttulo On the ComplexityofAlgorithms dio nombre a este cuerpo de conocimiento. En el se introduce la nocion fundamentalde medida de complejidad denida como el tiempo de computacion sobre una maquina de Turingmulticinta y se demuestran los teoremas de jerarqua.Untercerhitoenloscomienzosdel temafueel trabajodeCobhamtitulado, TheIntrinsicComputational Diculty of Functions (1964). Cobham enfatizo el termino intrnseco, es de-cir, el estaba interesado en una teora independiente de las maquinas. Esto nos conduce al unconcepto importante desarrollado en 1965: la identicacion de la clase de problemas que se pue-den resolver en tiempo acotado por un polinomio sobre la longitud de la entrada. La distincionentre algoritmos de tiempo polinomial y algoritmos de tiempo exponencial fue hecha por primeravez en 1953 porVonNeumann. La notacion dePpara la clase de los problemas resolubles entiempo polinomial fue introducida posteriormente porKarp (1972).La teora de la NP-completitud es seguramente el desarrollo mas importante de la ComplejidadAlgortmica.LaclaseNPconstadetodoslosproblemasdecidiblesentiempopolinomialporunamaquinadeTuringnodeterminista.Cooken1971introducelanociondeproblemaNP-completo y demuestra que el problema de la satisfacibilidad booleana es NP-completo. La claseNPincluye una gran cantidad de problemas practicos que aparecen en la actividad empresariale industrial. Demostrar que un problema es NP-completo equivale a demostrar que no tiene unasolucion determinista en tiempo polinomial, salvo que todos los problemas deNPesten enP,cuestion que a un no esta demostrada.Otro area que actualmente esta teniendo cada vez mas importancia es la Criptografa, rela-cionada con la seguridad de los sistemas informaticos y donde se ha aplicado especialmente lateora de la complejidad algortmica. Mediante la criptografa podemos conseguir el manejo deinformacion condencial en el ordenador de forma mas o menos segura.MaquinasSecuencialesyAutomatasFinitosLaTeoradeAutomatas, queenglobatambienal estudiodelasMaquinassecuenciales, tienesu origen en el campo de la Ingeniera Electrica. El matematico norteameriacanoShanon (queluegoseharafamosoporsuTeoradelaInformacion)vinoaestablecerlasbasesparalaaplicaciondelaLogicaMatematicaaloscircuitoscombinatoriosyposteriormenteHumanen 1954 los amplio a circuitos secuenciales y utiliza conceptos como estado de un automata ytabladetransicion.Alolargodelasdecadassiguientes,lasideasdeShanonsedesarrollaronconsiderablemente, dando lugar a la formalizacion de una Teora de las Maquinas Secuencialesy de los Automatas Finitos (1956). Otros trabajos importantes sobre maquinas secuenciales sondebidos aMealy (1955) yMoore.5Desdeunfrentetotalmentedistinto, el conceptodeautomatanitoapareceen1943conelartculo de deMcCullochyPitts titulado ALogicalCalculusoftheIdeasImmanetinNervousActivity, donde describen los calculos logicos inmersos en un dispositivo (neurona articial) quehabanideadoparasimularlaactividaddeunaneuronabiologica. Apartirdeentonces, sehan desarrollado asociaciones de neuronas para constituir redes. Podemos considerar una RNA(Red Neural Articial ) como una coleccion de procesadores elementales (neuronas), conectadasaotrasneuronasoentradasexternas, yconunasalidaquepermitepropagarlasse nalesporm ultiples caminos. Cada procesador pondera las entradas que recibe y estos pesos pueden sermodicados en aras de conseguir el objetivo previsto. Es lo que llamaremos funcion de apren-dizaje. Es decir, una RNA puede aprender de sus propios errores, por un proceso inductivoapartirdeunconjuntodeejemplosdeloquequeremosaprender, frenteal procesodeduc-tivo, propiodelosSistemasExpertos. LascaractersticasquehaceninteresantesalasRNAssonsucapacidadparaaprender(reproducirunsistemaofuncionapartirdeejemplos), me-morizar (almacenar un conjunto de patrones o ejemplos), generalizar y abstraer (que permitarecuperacionesapartirdeentradasdefectuosasoincompletas). Lasredesneuronales, dentrodelperldeTeoradelaComputacion,aportanparadigmasinteresantescomosonelcalculoparalelo, el aprendizaje inductivo y su capacidad para realizar calculos aproximados por mediode interpolacion.Enelveranode1951KleenefueinvitadoporlaRANDCorporationpararealizaruninformesobre los trabajos de McCulloch-Pitts. En este informe Kleene demuestra la equivalencia entre loque el llama dos formas de denir una misma cosa: los conjuntos regulares, los cuales puedenser descritos a partir de sucesos bases y los operadores union, concatenacion y clausura, es decir,mediante expresiones regulares y los lenguajes reconocidos por un automata nito.Losautomatasnitossoncapacesdereconocersolamenteundeterminadotipodelenguajes,llamados lenguajes regulares, que tambien se caracterizan mediante un tipo de gramaticas llama-das as mismo regulares. Una forma adicional de caracterizar este tipo de lenguajes es mediantelas citadas expresiones regulares, construidas mediante operadores sobre el alfabeto del lenguajey otras expresiones regulares, incluyendo el lenguaje vaco. Es facilmente comprobable que, paraun alfabeto concreto, no todos los lenguajes que se pueden construir son regulares. Ni siquieratodoslosinteresantesdesdeel puntodevistadelaconstrucciondealgoritmospararesolverproblemas. Hayentoncesmuchosproblemasquenosoncalculablesconestoslenguajes. Estopone de maniesto las limitaciones de los automatas nitos y las gramaticas regulares, y pro-picia eldesarrollodemaquinas reconocedorasdeotrostiposdelenguajesydelasgramaticascorrespondientes asociadas a los mismos, como veremos en el siguiente apartado.Desde su nacimiento, la Teora de Automatas ha encontrado aplicacion en campos muy diver-sos. Que tienen en com un? A primera vista no parece sencillo deducirlo. Sin embargo, podemosvislumbrar la solucion si nos damos cuenta de que en todos ellos se manejan conceptos como elcontrol, la accion, la memoria y ademas, los objetos controlados o recordados son smbolos,palabras o frases de alg un tipo. Algunos de los campos donde ha encontrado aplicacion la Teorade Automatas son:Teora de la Comunicacion.Teora de Control.Logica de Circuitos Secuenciales.Reconocimiento de Patrones.Fisiologa del Sistema Nervioso.Estructura y Analisis de los Lenguajes de Programacion.Traduccion Automatica de Lenguajes.6Teora Algebraica de Lenguajes.Cuando un automata se usa para modelar la construccion de hardware (ej. circuitos secuenciales)osoftware(ej.analizadoreslexicos)esmuyimportanteexaminarelproblemadeencontrarelautomatamnimoequivalenteaunodado. TantoHumancomoMooreseocuparondeesteproblemayencontraronalgoritmospracticosparaminimizarunautomatadeestadosnitos.Paraunautomatadenestadosestosalgoritmosrequerann2pasos. Bastantemastarde, en1971 Hopcroft encontro un metodo que lo haca en O(nlog(n)) pasos. Existe un punto de vistaalgebraicosobrelaminimizacionycaracterizaciondeautomatasnitos,debidaaJohnMyhillyAnil Nerode.Kleene,ensuintentodeentenderlostrabajosdeMcCullockyPitts,abstrajoel conceptodeautomatanitoapartirdelasredesdeneuronasyel conceptodeexpresionregular a partir del calculo logico del modelo de McCullock y Pitts. De la misma forma, Myhillapartirdelosconceptosdeautomatas nitosdeKleeneobtuvo elde diagramadetransici on(deterministas)yaloseventoslosredujoalauniondeclasesdeequivalencia.Siguiendoestalnea de trabajo, se ha elaborado en las ultimas decadas una teora abstracta de automatas conuna fuerte base matematica que, seg un dijo Arbib en 1969, constituye la matematica pura dela Informatica.GramaticasyLenguajesFormalesEl desarrollo de los ordenadores en la decada de los 40, con la introduccion de los programas enla memoria principal y posteriormente con los lenguajes de programacion de alto nivel, propicianladistincionentrelenguajesformales,conreglassintacticasysemanticasrgidas,concretasybiendenidas, deloslenguajesnaturalescomoel ingles, dondelasintaxisylasemanticanosepuedencontrolarfacilmente. Losintentosdeformalizarloslenguajesnaturalesllevanalaconstrucciondegramaticascomounaformadedescribirestoslenguajes, utilizandoparaelloreglas de produccion para construir las frases del lenguaje. Se puede entonces caracterizar unlenguaje mediante las reglas de una gramatica adecuada.NoamChomsky propone en 1956 tres modelos para la descripcion de lenguajes, que son la basede su futura jerarqua de los tipos de lenguajes (1959), que ayudo tambien en el desarrollo delos lenguajes de programacion. Chomsky establecio una clasicacion de gramaticas de acuerdoconel formatodesusproduccionesydistinguiocuatroclasesfundamentalesdelenguajesyrelaciones de inclusion entre ellas.LaTeoradelos Lenguajes FormalesresultotenerunarelacionsorprendenteconlaTeoradeAutomatas y la Computabilidad. Paralelamente a la jerarqua de lenguajes existe otra equiva-lente de maquinas abstractas, de tal forma que a cada una de las clases de lenguajes denidasen la jerarqua de Chomsky a partir de restricciones impuestas a las gramaticas, le correspondeun tipo de maquina abstracta, que no es otra cosa que un metodo reconocedor para la descrip-cion de lenguajes. La relacion la podemos observar en la gura 1. Cada uno de estos tipos demaquinas es capaz de resolver problemas cada vez mas complejos, desde los automatas nitos(quesonlosmassimples)hastalasmaquinasdeTuringquedeterminanellmitedelospro-cesoscomputables.Sepuedellegaras,deunaformacasinatural,aconsiderarlasmaquinasdeTuring,establecidascasi20a nosantes,comomaquinasreconocedorasdeloslenguajeses-tructuradosporfrases(tipo0)einclusoainterpretarlaTesisdeTuringenterminosdequeun sistema computacional nunca podra efectuar un analisis sintactico de aquellos lenguajes queestan por encima de los lenguajes estructurados por frases en la jerarqua de Chomsky.2. FundamentosMatematicosA continuacion haremos un repaso breve sobre varias ideas matematicas que seran utilizadas enlos proximos captulos. Estos conceptos incluyen conjuntos, relaciones, funciones y tecnicas de7LENGUAJESTIPO0LENGUAJESTIPO1TIPO2LENGUAJESTIPO3LENGUAJESMAQUINASDETURINGAUTOMATASLINEALMENTEACOTADOSAUTOMATASAUTOMATASFINITOSCONPILANOENUMERABLESLENGUAJESFigura 1:RelacionLenguajes-MaquinasAbstractasdemostracion matematicas.ConjuntosUn conjunto es una coleccion de objetos. Por ejemplo, la coleccion de las letras vocales forman unconjunto que podemos notar como V= a, e, i, o, u. Los objetos que forman parte del conjuntosellamanelementos.Porejemplo, aesunelementodeV yseescribea V ;porotrapartepodemos decir que z/ V . Dos conjuntos son iguales si y solo si tienen los mismos elementos. Nose tienen en cuenta las repeticiones de elementos ni tampoco el orden de estos. Hay un conjuntoquenotienening unelementollamadoconjuntovacoylonotaremospor .Unconjuntosepuede especicar enumerando sus elementos entre llaves y separados por comas y esto es lo quese llama denicion por extension. Pero a veces esto no es posible hacerlo porque el conjunto esinnito y entonces se usa una denicion por comprension, es decir, haciendo referencia a otrosconjuntos (conjuntos referenciales) y a propiedades que los elementos puedan tener. De formageneral se denen:B = x A [ x cumple la propiedad PUnconjuntoAesunsubconjuntodeotroconjuntoB, A B, si cadaelementodeAesunelmentodeB. TambienpodemosdecirqueAestaincluidoenB. Cualquierconjuntoesunsubconjunto de s mismo. SiA es un subconjunto deB peroA no es igual aB se dice queA esun subconjunto propio de B y se nota como A B. Es obvio que A para cualquier conjuntoA. Para probar que dos conjuntos A y B son iguales debemos probar que A B y B A: cadaelemento deA debe ser un elemento deBy viceversa.Dos conjuntos se pueden combinar para formar un tercero mediante una serie de operacionessobreconjuntos:union A B = x [ (x A) (x B)interseccion A B = x [ (x A) (x B)diferencia AB = x [ (x A) (x/ B)8Algunaspropiedadesdelasoperacionesanterioressepuedendeducirfacilmenteapartirdesus deniciones:1. Idempotencia: A A = A ; A A = A2. Conmutatividad: A B = B A ; A B = B A3. Asociatividad:(A B) C = A (B C)(A B) C = A (B C)4. Distributividad:A (B C) = (A B) (A C)A (B C) = (A B) (A C)5. Absorcion: A (A B) = A ; A (A B) = A6. LeyesdeDeMorgan:A B = A BA B = A BDos conjuntos sondisjuntos si notienenelementos encom un, oloquees lomismo, si suinterseccionesel conjuntovaco. Esposibleformarinterseccionesyunionesdemasdedosconjuntos.La coleccion de todos los subconjuntos de A es a su vez un conjunto llamado conjunto potenciade A y lo notamos como 2A. Al conjunto potencia de A tambien se le suele llamar conjunto delas partes deA y se nota como {(A).Ejemplo0.1SeaA = c, d. Entonces 2A= , c , d , c, dUna particion de un conjunto no vacoA es un subconjunto, , de 2Atal que:1. cada elemento de es no vacio;2. los elementos de son disjuntos;3. = AEjemplo0.2 a, b , c , d es una particion de a, b, c, d pero a, b, c , c, d no lo es.Los conjuntos de n umeros pares e impares forman una particion de N.RelacionesyfuncionesDeformageneral podemosdenirunarelacioncomounconjuntodeelementos, quesonenesenciacombinacionesdeobjetosdeundeterminadotipoqueestanrelacionadosdealgunaforma.Llamamosparordenadoaunaparejadeobjetosescritosentreparentesisyseparadospor comas. Por ejemplo, (a, b) es un par ordenado y a, b son los componentesdel par ordenado.No es lo mismo (a, b) que a, b por varios motivos:el orden inuye: no es lo mismo (a, b) que (b, a), sin embargo a, b = b, alos dos componentes de un par ordenado no tienen porque ser distintos; por ejemplo, (2, 2)es un par valido.El producto cartesiano de dos conjuntos A y B, que notamos AB, es el conjunto de todoslos pares ordenados (a, b) dondea A yb B.Ejemplo0.3Dados los conjuntos 1, 3, 9 y b, c, d , el producto cartesiano es,1, 3, 9 b, c, d = (1, b), (1, c), (1, d), (3, b), (3, c), (3, d), (9, b), (9, c), (9, d)9Una relacionbinaria entre dos conjuntosA yBes un subconjunto deAB.Ejemplo0.4 (9, b), (1, c), (3, d) es una relacion binaria entre los conjuntos 1, 3, 9 y b, c, d .La relacion menor que entre los n umeros naturales es una relacion binaria, 0SeanA yBsubconjuntos del monoide (M, , e). La operacion induce de forma natural unaoperacion binaria sobre 2M, el conjunto de todos los subconjuntos deM. Esta operacion sedene por: A, B 2M: A B = x y [ (x A) (y B)11Denicion0.1Sea(M, , e)unmonoide. Entonces

2M, , e

, donde eslaoperacionin-ducida,estambienunmonoidequellamaremosmonoideinducidopor (M, , e)sobre 2M.Denici on0.2SiAesunsubconjuntodelmonoide (M, , e).Entonces:Aescerradopositivosii x, y A : x y A.Aescerradosiiescerradopositivoyademascontienealaidentidad e.Denici on0.3Sea A un subconjunto cerrado de un monoide. Entonces (A, , e) donde es larestriccion de la operacion de M para los elementos de A es tambien un monoide. A tal monoideseledenominasubmonoidede (M, , e).Denici on0.4Sea Acualquiersubconjuntodeunmonoide (M, , e).ElcierrepositivodeA,representadoporA+,sedenepor:A+=n=1AnElcierredeA,quenotaremoscomoA,sedenecomo:A =n=0AndondeAnrepresentalan-esimapotenciadeAenelmonoideinducido

2M, , e

.UnsubconjuntoBdeunmonoideMsedicequegeneraMsii B=M. Al conjuntoBselellamabase(ogenerador)deM. Si BgeneraMentonces, pordenicion, cualquierx M(distinto de e) se puede representar comox =x1 . . . xn, dondex1, . . . , xn Byn> 0. Sedice que Bgenera libremente a Msi la representacion anterior es unica (salvo el orden, si laoperacion es conmutativa). Mse dice que es un monoidelibre si contiene un subconjuntoBque lo genera libremente.ConjuntosnitoseinnitosUnapropiedadbasicadelosconjuntosnitosessutama noocardinalidad.Algunosaspectossobreeltama nodelosconjuntosnitossonobvios,comoporejemplo,si A Bentonceselcardinal deA es menor o igual que el cardinal deB; siA es subconjunto propio deBsera demenor tama no queB. Sin embargo esto no es tan simple cuando tenemos conjuntos innitos.Por ejemplo, hay mas n umeros naturales que n umeros pares? Aunque la intuicion nos dice ques, formalmente no podemos armarlo.Se dice que dos conjuntos A y B son equinumerables o equipotentes si podemos encontrar unafuncion f: A B donde f es biyectiva. Decimos que un conjunto es nito si es equinumerablecon 1, 2, . . . , n, para alg unn N, y diremos que el cardinal deA esn, esto es, [A[ = n.Un conjuntoA es innito si puede establecerse una aplicacion biyectiva entreA y un subcon-junto propio deA. No todos los conjuntos innitos son equinumerables, por ejemplo N y R notienen la misma cardinalidad. Un conjunto se dice que es innito numerable si es equinume-rable con N y se dice que es numerable si es nito o innito numerable. En caso contrario sedice que es nonumerable, como por ejemplo el conjunto de los numeros reales R.Teorema 0.1Si Aes unconjuntocualquiera(inclusoinnito) entonces [A[ < [{ (A)[ .Ademassi /esinnitonumerableentonces {(A)esnonumerable.Teorema 0.2Lacardinalidaddelconjuntodelosn umerosnaturalesesmenoroigualquelacardinalidaddecualquierconjuntoinnito.12PrincipiodeinduccionEl principio de induccion matematicaarma lo siguiente,Si A es un subconjunto de numeros naturales,A N , y satisface las condiciones:1. 0 A2. sik A entoncesk + 1 Aentonces debe serA = N.En la practica, el principio de induccion es usado para probar armaciones del tipo para todon umero natural kla propiedad Pse cumple. Esto es lo mismo que probar que el conjuntoA = k N [ P (k) se cumplecoincide con el conjunto de n umeros naturales, esto es, debemos probar queA = N. Esto es loque se llama demostracion por inducciony el procedimiento a seguir es el siguiente:etapabase Probar que la propiedad Pse cumple para 0.etapa deinducci on Suponer que la propiedad se sumple para k (hipotesis de induccion)y probar que esto implica que se cumple parak + 1.conclusi onPuestoquehemosprobadoenlaetapabaseque0 Ayenlaetapadeinduccionquesi k Aentoncestambienk + 1 A, resultaque, porel principiodeinduccion, podemos deducir queA = N, como queramos demostrar.Aveces, interesademostrarqueciertapropiedadsecumpleparatodok m. Enestecasodebemos demostrar que el conjunto,A = n N [ P (n +m) se cumplecoincide con el conjunto N. Para ello seguimos el siguiente razonamiento:etapabase (n = 0) Probar queP (m) se cumple.etapadeinducci on (n > 0) Suponer queP (k) se cumple, siendok m y probar queP (k + 1) se cumple.conclusi on Por las etapas anteriores y el principio de induccion tenemos queA = N ypor tanto Pse cumple para todok m.El principio de induccion tambien se usa para denir conjuntos de objetos donde denimos elprimerobjetoyel objetoksedeneenterminosdel (k 1)-esimoobjeto. Estoesloquesellama denicion inductiva.Ejemplo0.7El factorial de un n umero natural puede ser denido inductivamente como,1. 0! = 12. k! = k(k 1)! parak > 0.1314CAPITULO 1:LENGUAJESYGRAMATICASFORMALESContenidosTeoricos1. Alfabetos y palabras1.1 Concatenacion de palabras1.2 Potencia de una palabra1.3 Inversion de palabras2. Lenguajes formales2.1 Operaciones del algebra de conjuntos2.2 Concatenacion, potencia e inversion de lenguajes2.3 Clausura de un lenguaje3. Gramaticas formales3.1 Deniciones basicas3.2 Notacion BNF3.3 Clasicacion de gramaticas3.4 Teorema de la jerarqua de Chomsky (enunciado)4. Nociones basicas sobre traductores1. AlfabetosypalabrasUn alfabeto es un conjunto nito y no vaco de elementos llamados smbolos o letras. Una palabrao cadena sobre un alfabeto Ves una cadena nita de smbolos del alfabeto. La longitudde unacadenaw, que notaremos como [w[, es el n umero de letras que aparecen en w. A la cadena queno tiene smbolos, o lo que es lo mismo, que tiene longitud 0, la llamaremos palabra vacay senota por (o tambien, seg un los autores).Si V es un alfabeto, llamaremosVnal conjunto de todas las palabras de longitudn sobreV .Un elemento deVnsera una cadena del tipoa1a2. . . an donde cadaai V . LlamaremosV0alconjunto cuyo unico elemento es la palabra vaca, es decir,V0= . El conjunto de todas lascadenas de cualquier longitud sobre Ves:V =n=0VnLlamamos V+al conjunto de todas las cadenas sobre el alfabeto Vexcepto la vaca. Por tanto,V+= V .151.1. ConcatenaciondePalabrasLa operacion de concatenacion, que notaremos , es una operacion binaria entre palabras sobreun alfabeto V, esto es: : V V Vde forma que si tenemos dos palabras x, y V donde x = a1a2. . . an, y = b1b2. . . bm entonces,x concatenadocony sera una palabraw V con [w[ = [x[ +[y[, de forma que:w = xy = a1a2. . . anb1b2. . . bmNota A veces se suele suprimir el y se puede escribir directamentew = xyAlgunaspropiedades de la concatenacion son:operacion cerradax, y V : xy Vpropiedad asociativax, y, z V : x(yz) = (xy)zelementoneutro x V : x = x = xPor tener estas propiedades (V, , ) es un monoide. Ademas cada palabra de V se representade forma unicacomo concatenacion de smbolos deV , por eso es ademas un monoide libre.Todo monoide libre cumple la ley de cancelacion izquierda y derecha, en este caso, x, y, z Vse cumple que:(xy = xz) (y = z) | (yx = zx) (y = z)Decimos que una cadenazes subcadenade otra cadenaw si existen cadenasx, y Vtal quew = xzy. Vamos a ver dos conjuntos especiales de subcadenas:Prejo(w) = x V [ z V : w = xz| Sujo(w) = x V [ z V : w = zxDiremos quex es un prejodewsix Prejo(w) y sera un prejopropiosix =w. Por otraparte, diremos que xes un sujodew six Sujo(w) y sera un sujo propiosix = w.Ejemplo1.1Si w=ababesunapalabrasobreel alfabeto a, b,oloqueeslomismo, w a, b, tenemos que:ab es un prejo propio dewabab es un prejo dew, pero no es propiob es un sujo dew1.2. PotenciadeunapalabraLlamamos potencia n-esima de una palabra, a la operacion que consiste en concatenar la palabraconsigo misma n veces. Dada una palabra w V, se dene inductivamente la potencia n-esimadew, que notaremoswn, como:1. w0= 2. wn= wwn1paran > 0Ejemplo1.2Siw = aba es una palabra sobre el alfabeto a, b entonces:w0= w1= abaw2= abaaba161.3. InversiondepalabrasSiw =a1a2. . . anes una palabra sobre un alfabetoVentonces la palabrainversao reejadew se dene como: wR= anan1. . . a1Ejemplo1.3Siw = aaba es una palabra sobre el alfabeto a, b, entonceswR= abaa.2. LenguajesformalesLlamamos lenguajesobreelalfabeto Va cualquier subconjunto de V. As tenemos que,V, , yVpueden considerarse como lenguajes. Puesto que un lenguaje es tan solo una claseespecial de conjunto, podemos especicar un lenguaje nitopor extension enumerando sus ele-mentos entre llaves. Por ejemplo, aba, czr, d, f es un lenguaje sobre el alfabeto a, b, c, ..., z.Sin embargo, la mayora de los lenguajes de interes son innitos. En este caso podemos especi-car un lenguaje por comprension de la siguiente forma:L = w V [ w cumple la propiedadPEn la denicion anterior vemos queV es el conjunto referencial, que podemos llamar tambienlenguaje universal sobreV .Ejemplo1.4L = w 0, 1 [ ceros(w) = unos(w),palabrasquetienenel mismon umerode ceros que de unos.2.1. OperacionesdelalgebradeconjuntosSeanL1yL2dos lenguajes denidos sobreel alfabetoV . Sedenelauniondeestos doslenguajes como el lenguajeL sobreVque se especica como:L = L1 L2 = w V [ (w L1) (w L2)Launiondelenguajessobreelmismoalfabetoesunoperacioncerradayademascumplelaspropiedadesasociativa, conmutativa, yexisteunelementoneutroqueesel lenguajevaco(noes lomismoqueel lenguajequecontienelapalabravaca ). El conjunto {(V)(estoes, el conjuntodelaspartesdeV, tambienllamado2V), estaformadoportodosloslenguajes posibles que se pueden denir sobre el alfabeto V . Entonces, por cumplir la union laspropiedades anteriores tenemos que ({(V), , ) es un monoide abeliano.De forma analoga a la union se pueden denir otras operaciones del algebra de conjuntos comola interseccion, diferencia, y complementacion de lenguajes. Por ejemplo, el complementario dellenguajeL sobre el alfabetoVsera: L = V L.2.2. Concatenacion,potenciaeinversiondelenguajesSean L1 y L2 dos lenguajes denidos sobre el alfabeto V , la concatenacion de estos dos lenguajeses otro lenguajeL denido como:L1L2 = xy V [ (x L1) (y L2)Ladenicionanterior soloes validasi L1yL2contienenal menos unelemento. Podemosextender la operacion de concatenacion al lenguaje vaco de la siguiente manera: L = L = 17La concatenacion de lenguajes sobre un alfabeto es una operacion cerrada, y ademas cumple lapropiedad asociativay tiene un elementoneutroque es el lenguaje . Con lo cual, tenemosque ({ (V) , , ) es el monoideinducidopor el monoide (V, , ) sobre { (V). Esto es, laoperaciondeconcatenaciondepalabrasinducelaoperaciondeconcatenaciondelenguajesyesta conserva las propiedades de la primera.Teorema 1.1Dados los lenguajes A, B, Csobre un alfabeto V , la concatenacion de lengua-jesesdistributivaconrespectoalaunion,estoes,secumpleque:1. A (B C) = (A B) (A C)2. (B C)A = (BA) (CA)Dem.- La demostracion se deja como ejercicio. En el primer caso se debe probar que:A (B C) (A B) (A C) y (A B) (A C) A (B C)para demostrar la igualdad y el segundo caso se demuestra de forma analoga. Unavezdenidalaconcatenaciondelenguajes, podemosdenirlapotencian-esimadeunlenguaje como la operacion que consiste en concatenar el lenguaje consigo mismon veces. Ladenicion inductiva es:1. L0= 2. Ln= LLn1, n > 0Ejemplo1.5SiL = ab, c es un lenguaje sobre el alfabeto a, b, c entonces,L0= L1= L = ab, cL2= LL1= abab, abc, cab, ccL3= LL2= ababab, ababc, abcab, abcc, cabab, cabc, ccab, cccLas deniciones de prejo y sujo de una palabra podemos extenderlas a lenguajes de la siguienteforma:Prejo(L) =wLPrejo(w) | Sujo(L) =wLSujo(w)Tambien podemos denir el lenguaje inversoo reejo deL como:LR= wR[ w L2.3. ClausuradeunlenguajeDado un lenguajeL sobre un alfabetoVse dene la clausura positiva(o cierre positivo) deL,denotadoL+, como:L+=n=1LnDenimosL como la clausura(o cierre) deL, como:L =n=0Ln18Enamboscasos, Lnsereerealapotencian-esimadel lenguajeLenel monoideinducido({ (V) , , ). El cierre o clausura de un lenguaje, por denicion, contiene cualquier palabraque se obtenga por concatenacion de palabras deL y ademas la palabra vaca.3. GramaticasformalesHasta ahora hemos descrito los lenguajes formales como se describen los conjuntos: por extension(sisonnitos)oporcomprension.Aquvamosaintroducirotraformageneralyrigurosadedescribirunlenguajeformal:medianteelusodegramaticas.Lasgramaticassonmecanismosgeneradoresde lenguajes, es decir, nos dicen como podemos obtener o construir palabras de undeterminado lenguaje.3.1. DenicionesbasicasDenicion1.1Unagram aticaesunacuadrupla G = (VN, VT, S, P)donde:VTeselalfabetode smbolos terminalesVNes el alfabeto de smbolos no terminales o variables, de forma que debe ser VNVT= ydenotamosconV alalfabetototaldelagramatica,estoes,V= VN VT.Sesel smbolo inicialysecumplequeS VNPesunconjuntonitode reglas de produccionDenicion1.2Unaregladeproducci onesunparordenado(, ) deformaque:(, ) (VVNV) VEsdecir, =1A2donde1, 2 (VN VT), A VNy (VN VT). Unaproduccion(, ) Psesueleescribirdeforma injacomo .Porconveniousaremosletrasmay usculasparalossmbolosnoterminales; dgitosylaspri-meras letras min usculas del alfabeto para los smbolos terminales; las ultimas letras min usculasdel alfabetoparapalabrasquepertenezcanaVTyletrasgriegasparacualquierpalabraquepertenezcaaV.Usandoesteconvenio,avecessesueledescribirunagramaticaenumerando unicamente sus reglas de produccion y cuando varias reglas tienen la misma parte izquierda, sesuelen agrupar separandolas con [.Ejemplo1.6Sea la gramaticaG cuyas producciones son:S aSa [ bSb [ a [ b [ EstagramaticatieneunasolavariableSqueademasesel smboloinicial. VT= a, byPcontiene 5 reglas de produccion.Denicion1.3SeaGunagramaticayseanlas cadenas , V. Decimos quederivadirectamenteen, quenotamoscomo (derivaci ondirecta), si ysolosi existeunaproduccion Ptalque = 12, = 12con1, 2 V.Esto quiere decir que deriva directamente en , si puede obtenerse a partir de sustituyendouna ocurrencia de la parte izquierda de una produccion que aparezca en por la parte derechade la regla de produccion.19Nota Si esunaregladeproducciondeG, entoncessecumplesiempreque .Cuandoseanecesariodistinguirentrevariasgramaticas,escribiremos G, para referirnos a un derivacion directa enG.Por la denicion anterior se deduce que es una relacion binaria en el conjunto de cadenas dela gramatica, esto es: V V. Aqu usamos una notacion inja para indicar que en lugar de (, ) .Denicion1.4Decimos que deriva en , o bien que, es derivable de , y lo notamos como (derivaci on)siysolosisevericaunadelasdoscondicionessiguientes:1. = ,(sonlamismacadena),obien,2. 0, 1, . . . , n Vtalque0 = , n = y 0 i < nsecumplequei i+1A la secuencia 0 2 . . . n la llamaremos secuencia de derivaciones directas de longitudn,osimplementederivaciondelongitudn.Nota Por la denicion anterior esta claro que es tambien una relacion binariaenVyademaseslaclausurareexivaytransitivadelarelaciondederivaciondirecta . Esto quiere decir que es la menor relacionque cumple lo siguiente:Si entonces . Esto es, si dos cadenas estan relacionadas mediante entonces tambien lo estan mediante la relacion es reexiva, ya que V se cumple que es transitiva. En efecto, si y , entonces Denici on1.5SeaunagramaticaG=(VN, VT, S, P). Unapalabra (VN VT)sede-nominaformasentencialdelagramatica, si ysolosi secumpleque: S. Unaformasentencialwtalquew VTsedicequeesunasentencia.Ejemplo1.7Sea la gramatica S aSa [ bSb [ a [ b [ , podemos armar lo siguiente:aaSb aabSbb, aunque niaaSb niaabSbb son formas sentenciales deGaabb aabb, aunqueaabb no es una sentencia deGS, aSa, abSba, son formas sentenciales deG y ademas es una sentenciaaabaaes unasentenciade G, yaqueexisteunaderivaciondelongitud3por laqueS aabaa. En efecto:S aSa aaSaa aabaaDenici on1.6SeaunagramaticaG = (VN, VT, S, P) .SellamalenguajegeneradoporlagramaticaGal lenguajeL(G)formadoportodaslascadenasdesmbolosterminalesquesonderivablesdelsmboloinicialdelagramatica(sentencias):L(G) =

w VT [ S wEjemplo1.8Sea L = w a, b [ w = wR. Este lenguaje esta formado por todos los palndro-mossobreelalfabeto a, b.PuedeprobarsequelagramaticaS aSa [bSb [a [b [generael lenguajeL. Engeneral noexisteunmetodoexactoparaprobarqueunagram aticageneraundeterminadolenguaje.ParaestecasotansencillopodemosprobarlodemanerainformalhaciendounaseriedederivacioneshastadarnoscuentadequeSwsiysolosi w=wR.Luego veremos una demostracion formal por induccion en la seccion de aplicaciones.20Denicion1.7DosgramaticasGyG

sonequivalentessi ysolosi generanel mismolen-guaje,esdecir,siiL(G) = L(G

).3.2. NotacionBNFAveces seutilizaunanotacionespecial paradescribir gramaticas llamadanotacionBNF(Backus-Naus-Form). EnlanotacionBNFlossmbolosnoterminalesovariablessonence-rradosentreangulosyutilizaremoselsmbolo::=paralasproducciones,enlugarde .Porejemplo, la produccion S aSa se representa en BNFcomo 'S` ::= a 'S` a. Tenemos tambienlanotacionBNF-extendidaqueincluyeademaslossmbolos[ ] y paraindicarelementosopcionales y repeticiones, respectivamente.Ejemplo1.9Supongamos que tenemos un lenguaje de programacion cuyas dos primeras reglasde produccion para denir su sintaxis son:'programa` ::= ['cabecera`] begin 'sentencias` end'sentencias` ::= 'sentencia` 'sentencia`Esto viene a decir que un programa se compone de una cabecera opcional, seguido de la palabraclavebegin, acontinuacionunalistadesentencias(debehaberal menosunasentencia)ynaliza con la palabra clave end. Podemos transformar las producciones anteriores para espe-cicarlas, seg un la notacion que nosotros hemos introducido (estandar), de la siguiente forma:P C begin Aend [ beginAendA BA [ BdondePes el smbolo inicial de la gramatica y corresponde a la variable 'programa`,Ccorres-ponde a 'cabecera`,A se reere a la variable 'sentencias` yBa 'sentencia`.La simbologa utilizada para describir las gramaticas en notacion estandar y en notacion BNFnos proporcionan un herramienta para describir los lenguajes y la estructura de las sentenciasdel lenguaje. Puede considerarse a esta simbologa como un metalenguaje, es decir un lenguajeque sirve para describir otros lenguajes.3.3. JerarquadeChomskyEn 1959 Chomskyclasico las gramaticas en cuatro familias, que dieren unas de otras en laforma que pueden tener sus reglas de produccion. Si tenemos una gramatica G = (VN, VT, S, P)clasicaremos las gramaticas y los lenguajes generados por ellas, de la siguiente forma:Tipo3 (Gramaticas regulares). Pueden ser, a su vez, de dos tipos:Lineales por la derecha. Todas sus producciones son de la forma:A bCA bA dondeA, C VNyb VT.21Lineales por la izquierda. Con producciones del tipo:A CbA bA Los lenguajes generados por estas gramaticas se llaman lenguajesregulares y elconjunto de todos estos lenguajes es la clase L3.Tipo2 (Gram aticas libres del contexto). Las producciones son de la forma:A dondeA VNy (VN VT). Los lenguajes generados por este tipo de gramaticas sellamanlenguajeslibresdelcontexto y la clase es L2.Tipo1 (Gram aticas sensibles al contexto). Las producciones son de la forma:A donde, V y V+Se permite ademas la produccionS siempre y cuandoSno aparezca en la parte derecha de ninguna regla de produccion.El sentido de estas reglas de produccion es el de especicar que una variableA puede serreemplazadaporenunaderivaciondirectasolocuandoAaparezcaenel contextode y, deah el nombresensiblesal contexto. Ademas, lasproduccionesdeesaforma cumplen siempre que la parte izquierda tiene longitud menor o igual que la partederecha, pero nunca mayor (excepto paraS ). Esto quiere decir que la gramatica esno contractil.Los lenguajes generados por las gramaticas de tipo 1 se llaman lenguajessensiblesalcontexto y su clase es L1.Tipo0 (Gramaticasconestructuradefrase) Son las gramaticas mas generales, que porello tambien se llaman gramaticas sin restricciones. Esto quiere decir que las produccionespueden ser de cualquier tipo permitido, es decir, de la forma con (VVNV)y V.Los lenguajes generados por estas gramaticas son loslenguajesconestructuradefrase, que se agrupan en la clase L0. Estos lenguajes tambien se conocen en el campo delaTeoradelaComputabilidad como lenguajes recursivamente enumerables.Teorema 1.2(JerarquadeChomsky) Dado un alfabeto V , el conjunto de los lenguajesregularessobreV estaincluidopropiamenteenelconjuntodeloslenguajeslibresdecontextoyesteasuvezestaincluidopropiamenteenelconjuntodeloslenguajessensiblesalcontexto,quenalmenteestaincluidopropiamenteenel conjuntodelenguajesconestructuradefrase.Estoes:L3 L2 L1 L0La demostracion de este teorema la iremos viendo a lo largo del curso.Nota Enestetemahemoshechoreferenciaalterminolenguajeformal paradi-ferenciarlodelenguajenatural. Engeneral, unlenguajenatural esaquel quehaevolucionadoconel pasodel tiempoparanesdelacomunicacionhumana, por22ejemploelespa noloelingles.Estoslenguajesevolucionansintenerencuentare-glasgramaticalesformales.Lasreglassurgendespuesconobjetodeexplicar,masquedeterminarlaestructuradeunlenguaje,ylasintaxisesdifcildedeterminarcon precision. Los lenguajes formales, por el contrario, estan denidos por reglas deproduccion preestablecidas y se ajustan con todo rigor o formalidad a ellas. Comoejemplo tenemos los lenguajes de programacion y los lenguajes logicos y matemati-cos.Noesdeextra nar,portanto,quesepuedanconstruircompiladoresecientespara los lenguajes de programacion y que por contra la construccion de traductorespara lenguaje natural sea una tarea compleja e ineciente, en general. Veremos quelasgramaticasregularesylibresdecontexto, juntoconsusmaquinasabstractasasociadas tienen especial interes en la construccion de traductores para lenguajes deprogramacion.4. NocionesbasicassobretraductoresHace apenas unas cuantas decadas, se utilizaban los llamados lenguajes de primera generaci onpara hacer que los computadores resolvieran problemas. Estos lenguajes operan a nivel de codigobinariodelamaquina,queconsisteenunasecuenciadecerosyunosconlosqueseinstruyeal ordenador para que realice acciones. La programacion, por tanto, era difcil y problematica,aunque pronto se dio un peque no paso con el uso de codigo octal o hexadecimal.El codigodemaquinafuereemplazadoporloslenguajesdesegundageneracion, olenguajesensambladores. Estos lenguajes permiten usar abreviaturas nemonicas como nombres simbolicos,y la abstraccion cambia del nivel de ip-op al nivel de registro. Se observan ya los primeros pasoshacia la estructuracion de programas, aunqueno puedeutilizarse el termino de programacionestructurada al hablar de programas en ensamblador. Las desventajas principales del uso de loslenguajes ensambladores son, por un lado, la dependencia de la maquina y, por otro, que sonpoco legibles.Parasustituirloslenguajesensambladores, secrearonloslenguajesdetercerageneracionolenguajes dealtonivel. Conellossepuedenusarestructurasdecontrol basadasenobjetosdedatoslogicos:variablesdeuntipoespecco.Ofrecenunniveldeabstraccionquepermitelaespecicaciondelosdatos,funcionesoprocesosysucontrolenformaindependientedelamaquina. El dise nodeprogramaspararesolverproblemascomplejosesmuchomassencilloutilizando este tipo de lenguajes, ya que se requieren menos conocimientos sobre la estructurainterna del computador, aunque es obvio que el ordenador unicamente entiende codigo maquina.Porlotanto, paraqueuncomputadorpuedaejecutarprogramasenlenguajesdealtonivel,estosdebensertraducidosacodigomaquina. Aesteprocesoseledenominacompilacion, ylaherramientacorrespondientesellamacompilador. Nosotros vamos aentender el terminocompilador como un programa que lee otro, escrito en lenguaje fuente, y lo traduce a lenguajeobjeto, informando, durante el proceso de traduccion, de la presencia de errores en el programafuente. Esto se reeja en la gura 1.1.En la decada de 1950, se considero a los compiladores como programas notablemente difciles deescribir. El primer compilador de FORTRAN, por ejemplo, necesito para su implementacion, 18a nos de trabajo en grupo. Desde entonces, se han descubierto tecnicas sistematicas para manejarmuchasdelasimportantestareasquesurgenenlacompilacion.Tambiensehandesarrolladobuenoslenguajesdeimplementacion, entornosdeprogramacionyherramientasdesoftware.Conestos avances, puedeconstruirseuncompiladorrealinclusocomoproyecto deestudioenuna asignatura sobre dise no de compiladores.23COMPILADORProgramaObjetoProgramaFuenteMensajes de errorFigura 1.1: Denicion de un compilador4.1. TraductoresycompiladoresUn traductor es un programa que acepta cualquier texto expresado en un lenguaje (el lenguajefuente del traductor) y genera un texto semanticamente equivalente expresado en otro lenguaje(su lenguajedestino).Un ensamblador traduce un lenguaje ensamblador en su correspondiente codigo maquina. Ge-neralmente, un ensamblador genera una instruccion de la maquina por cada instruccion fuente.Un compilador traduce desde un lenguaje de alto nivel a otro lenguaje de bajo nivel. General-mente, un compilador genera varias instrucciones de la maquina por cada comando fuente.Los ensambladores y compiladores son las clases mas importantes de traductores de lenguajes deprogramacion, pero no son las unicas clases. A veces se utilizan los traductores de alto nivel cuyafuente y destino son lenguajes de alto nivel. Un desensamblador traduce un codigo maquina ensu correspondiente lenguaje ensamblador. Un descompilador traduce un lenguaje de bajo nivelen un lenguaje de alto nivel.Nosotros estamos interesados en la traduccion de textos que son programas. Antes de realizarcualquier traduccion, un compilador comprueba que el texto fuente sea un programa correctodel lenguaje fuente. (En caso contrario genera un informe con los errores). Estas comprobacionestienen en cuenta la sintaxis y las restricciones contextuales del lenguaje fuente. Suponiendo queel programa fuente es correcto, el compilador genera un programa objeto que es semanticamenteequivalentealprogramafuente,esdecir,quetienelosefectosdeseadoscuandoseejecuta.Lageneracion del programa objeto tiene en cuenta tanto la semantica del lenguaje fuente como lasemantica del lenguaje destino.Los traductores, y otros procesadores de lenguajes, son programas que manipulan programas.Varios lenguajes se ven implicados: no solo el lenguaje fuente y el lenguaje destino, sino tam-bienel lenguajeenel cual el traductorsehaescrito. Este ultimoesel llamadolenguajedeimplementacion.4.2. InterpretesUncompiladornospermiteprepararunprogramaparaqueseaejecutadoenunamaquina,traduciendo el programa a codigo maquina. El programa entonces se ejecuta a la velocidad delamaquina. Estemetododetrabajonoestalibredeinconvenientes: todoel programadebesertraducidoantesquepuedaejecutarseyproducirresultados.Enunentornointeractivo,lainterpretacion es un metodo de trabajo mas atractivo.Uninterpreteesunprogramaqueaceptaotroprograma(el programafuente)escritoenundeterminado lenguaje (el lenguaje fuente), y ejecuta el programa inmediatamente. Un interpretetrabaja cargando, analizando y ejecutando una a una las instrucciones del programa fuente. Elprograma fuente comienza a ejecutarse y produce resultados desde el momento en que la primerainstruccion ha sido analizada. El interprete no traduce el programa fuente en un codigo objeto.24La interpretacion es un buen metodo cuando se dan las siguientes circunstancias:Elprogramadorestatrabajandoenformainteractiva,yquiereverelresultadodecadainstruccion antes de entrar la siguiente instruccion.El programasevaautilizarsolounavez, yportantolavelocidaddeejecucionnoesimportante.Se espera que cada instruccion se ejecute una sola vez.Lasinstruccionestieneunformatosimple, yportantopuedenseranalizadasdeformafacil y eciente.La interpretacion es muy lenta. La interpretacion de un programa fuente, escrito en un lenguajede alto nivel, puede ser 100 veces mas lenta que la ejecucion del programa equivalente escritoen codigo maquina. Por tanto la interpretacion no es interesante cuando:El programa se va a ejecutar en modo de produccion, y por tanto la velocidad es impor-tante.Se espera que las instrucciones se ejecuten frecuentemente.Las instrucciones tienen formatos complicados, y por tanto su analisis es costoso en tiempo.Algunos interpretes mas o menos conocidos son:(a) Un interprete Caml: Caml es un lenguaje funcional. El interprete lee cada cada lnea hastael smbolo ;; y la ejecuta produciendo una salida, por lo que el usuario ve el resultado dela misma antes de entrar la siguiente. Existen versiones tanto para Windows como paradistintas versiones de Linux. Existen tambien varios compiladores para distintos sistemasoperativos.(b) Un interprete Lisp: Lisp es un lenguaje en el que existe una estructura de datos (arbol)tanto para el codigo como para los datos.(c) El interprete de comandos de Unix (shell): Una instruccion para el sistema operativo delusuario de Unix se introduce dando el comando de forma textual. El programa shell leecada comando, lo analiza y extrae un nombre de comando junto con algunos argumentos yejecuta el comando por medio de un sistema de llamadas. El usuario puede ver el resultadodeuncomandoantesdeentrarel siguiente. Loscomandosconstituyenunlenguajedecomandos, y el shell es un interprete para tal lenguaje.(d) Un interprete SQL: SQL es un lenguaje de preguntas (query language) a una base de datos.El usuario extrae informacion de la base de datos introduciendo una pregunta SQL, quees analizada y ejecutada inmediatamente. Esto es realizado por el interprete SQL que seencuentra dentro del sistema de administracion de la base de datos.4.3. CompiladoresinterpretadosUn compilador puede tardar mucho en traducir un programa fuente a codigo maquina, pero unavez hecho esto, el programa puede correr a la velocidad de la maquina. Un interprete permiteque el programa comience a ejecutarse inmediatamente, pero corre muy lento (unas 100 vecesmas lento que el programa en codigo maquina).Un compilador interpretado es una combinacion de compilador e interprete, reuniendo algunasdelasventajasdecadaunodeellos. Laideaprincipal estraducirel programafuenteenunlenguaje intermedio, dise nado para cumplir los siguiente requisitos:25tiene un nivel intermedio entre el lenguaje fuente y el codigo maquinasus instrucciones tienen formato simple, y por tanto pueden ser analizadas facil y rapida-mente.la traduccion desde el lenguaje fuente al lenguaje intermedio es facil y rapida.Por tanto un compilador interpretado combina la rapidez de la compilacion con una velocidadtolerable en la ejecucion.El codigo de la Maquina Virtual de Java (el JVM-code) es un lenguaje intermedio orientado aJava. Nos provee de potentes instrucciones que corresponden directamente a las operaciones deJava tales como la creacion de objetos, llamadas de metodos e indexacion de matrices. Por ellola traduccion desde Java a JVM-code es facil y rapida. Ademas de ser potente, las instruccionesdel JVM-codetienenunformatotansencillocomolasinstruccionesdel codigomaquinaconcamposdeoperacionycamposdeoperandos, yportantosonfacilesdeanalizar. PorellolainterpretaciondelJVM-codeesrelativamenterapida:alrededordesolodiezvecesmaslentaque el codigo maquina. JDK consiste en un traductor de Java a JVM-code y un interprete deJVM-code, los cuales se ejecutan sobre alguna maquina M.4.4. ContextodeuncompiladorEn el proceso de construccion de un programa escrito en codigo maquina a partir del programafuente, suelen intervenir, aparte del compilador, otros programas:Preprocesador: Esuntraductorcuyolenguajefuenteesunaformaextendidadealg unlenguajedealtonivel,ycuyolenguajeobjetoeslaformaestandardelmismolenguaje.Realiza la tarea de reunir el programa fuente, que a menudo se divide en modulos alma-cenadosenarchivosdiferentes.Tambienpuedeexpandirabreviaturas,llamadasmacros,a proposiciones del lenguaje fuente. El programa objeto producido por un preprocesadorpuede , entonces, ser traducido y ejecutado por el procesador usual del lenguaje estandar.Ensamblador: Traduce el programa en lenguaje ensamblador, creado por el compilador, acodigo maquina.Cargador y linkador: Un cargador es un traductor cuyo lenguaje objeto es el codigo de lamaquina real y cuyo lenguaje fuente es casi identico. Este consiste usualmente en progra-mas de lenguaje maquina en forma reubicable, junto con tablas de datos que especicanlospuntosendondeel codigoreubicabledebemodicarseparaconvertirseenverdade-ramente ejecutable. Por otro lado, un linkador es un traductor con los mismos lenguajesfuente y objeto que el cargador. Toma como entrada programas en forma reubicable quese han compilado separadamente, incluyendo subprogramas almacenados en libreras. Losune en una sola unidad de codigo maquina lista para ejecutarse. En general, un editor decargayenlaceuneel codigomaquinaarutinasdelibreraparaproducirel codigoquerealmente se ejecuta en la maquina.En la gura 1.2 aparece resumido el contexto en el que un compilador puede trabajar, aunquees necesario tener en cuenta que no han de cumplirse estos pasos estrictamente. En cualquiercaso, dependera del lenguaje que se este traduciendo y el entorno en el que se trabaje.4.5. FasesyestructuradeuncompiladorPodemos distinguir, en el proceso de compilacion, dos tareas bien diferenciadas:26COMPILADORen lenguaje ensambladorPrograma objetoEDITOR DE CARGA Y ENLACE de archivosobjeto relocalizablesBibliotecaEstrctura del programa fuentePrograma fuenteCodigo maquina relocalizableCodigo Maquina absolutoENSAMBLADORPREPROCESADORFigura 1.2: Contexto de un compiladorAn alisis: Se determina la estructura y el signicado de un codigo fuente. Esta parte delprocesodecompilaciondividealprogramafuenteensuselementoscomponentesycreauna representacion intermedia de el, llamada arbol sintactico.Sntesis: Se traduce el codigo fuente a un codigo de maquina equivalente, a partir de esarepresentacion intermedia. Aqu, es necesario usar tecnicas mas especializadas que duranteel analisis.Conceptualmente, uncompilador opera en estasdos etapas,que a suvez puedendividirse envarias fases. Estas pueden verse en la gura 1.3, donde se muestra la descomposicion tpica deuncompilador. Enlapractica, sinembargo, sepuedenagruparalgunasdeestasfases, ylasrepresentaciones intermedias entre ellas pueden no ser construidas explcitamente.27analizadorlexicoanalizadorsintacticoanalizadorsemanticogenerador codigointermediooptimizador decodigogeneradorde codigomanejo detabla de simbolosmanejo deerroresprograma fuenteprograma objetoFigura 1.3: Fases de un compiladorLas tres primeras fases de la gura 1.3 conforman la mayor parte de la tarea de analisis en uncompilador, mientras que las tres ultimas pueden considerarse como constituyentes de la partede sntesis del mismo.Durante el analisis lexico, la cadena de caracteres que constituye el programa fuente, se lee deizquierda a derecha, y se agrupa en componentes lexicos, que son secuencias de caracteres conun signicado colectivo.Enel analisissintactico, loscomponenteslexicosseagrupanjerarquicamenteencoleccionesanidadas con un signicado com un.En la fase de analisis semantico se realizan ciertas revisiones para asegurar que los componentesde un programa se ajustan de un modo signicativo.Las tres ultimas fases suelen variar de un compilador a otro. Existen, por ejemplo, compiladoresque no generan codigo intermedio, o no lo optimizan y pasan directamente del analisis semanticoa la generacion de codigo.De manera informal, tambien se consideran fases al administrador de la tabla de smbolos y almanejador de errores, que estan en interaccion con todas las demas:Administraci on de la tabla de smbolos: Una funcion esencial de un compilador es registrarlos identicadores utilizados en el programa fuente y reunir informacion sobre los distintosatributos de cada identicador. Estos atributos pueden proporcionar informacion sobre lamemoriaasignadaaunidenticador, sutipo, suambito(lapartedel programadonde28tienevalidez), y, enel casodelosprocedimientos, cosascomoel n umeroytipodesusargumentos, el metodo por que que cada argumento es pasado (valor, referencia,...) y eltipo que devuelve, si lo hay.Una tabla de smbolos es una estructura de datos que contiene un registro por cada iden-ticador, concamposparalosatributosdel identicador. Laestructuradedatosdebepermitir encontrar rapidamente datos de ese registro.Cuando el analizador lexico detecta un identicador en el programa fuente, este identi-cador se introduce en la tabla de smbolos. Sin embargo, normalmente los atributos de unidenticadornosepuedendeterminarduranteelanalisislexico.Porejemplo,cuandoelanalizador lexico reconoce los componentes lexicos de la declaracion de PASCALvar x, y, z : real;no relaciona unos componentes con otros, y, por tanto, no puede establecer el signicadode la frase (x,y yz son variables reales).Las fases restantes introducen informacion sobre los identicadores en la tabla de smbo-los, y despues la utilizan de varias formas. Por ejemplo, cuando se esta haciendo el analisissemantico y la generacion de codigo intermedio, se necesita conocer los tipos de los identi-cadores, para poder comprobar si el programa fuente los usa de una forma valida, y, as,poder generar las operaciones apropiadas con ellos. El generador de codigo, por lo general,introduce y utiliza informacion detallada sobre la memoria asignada a los identicadores.Deteccioneinformaciondeerrores:Cadafasedentrodeprocesodecompilacion,puedeencontrarerrores. Sinembargo, despuesdedetectarunerror, cadafasedebetratardealguna forma ese error, para poder continuar la compilacion, permitiendo la deteccion denuevos errores en el programa fuente. Un compilador que se detiene cuando encuentra elprimer error, no resulta tan util como debiera. Las fases de analisis sintactico y semantico,por lo general, manejan una gran porcion de errores detectables por el compilador.La fase de analisis lexico puede detectar errores donde los caracteres restantes de la entradano forman ning un componente lexico del lenguaje.Los errores donde la cadena de componentes lexicos viola las reglas de la estructura dellenguaje (sintaxis) son determinados por la fase de analisis sintactico.Durante la fase de analisis semantico, el compilador intenta detectar construcciones quetengan la estructura sintactica correcta, pero que no tengan signicado para la operacionimplicada. Por ejemplo, se cometera un error semantico si se intentaran sumar dos iden-ticadores,unodeloscualesfueraelnombredeunamatriz,yelotroelnombredeunprocedimiento.4.5.1. Analisislexico(olineal)Es la primera fase de la que consta un compilador. La parte del compilador que realiza el analisislexico se llama analizador lexico (AL), scanner o explorador. La tarea basica que realiza el ALes transformar un ujo de caracteres de entrada en una serie de componentes lexicos o tokens.Seencargara,portanto,dereconoceridenticadores,palabrasclave,constantes,operadores,etc.Lasecuenciadecaracteresqueformael tokensedenominalexema. Nohayqueconfundirelconcepto de token con el de lexema. A un mismo token le pueden corresponder varios lexemas.Por ejemplo, se pueden reconocer como tokens de tipo ID a todos los identicadores. Aunquepara analizar sintacticamente una expresion, solo nos hara falta el codigo de token, el lexema29debe ser recordado, para usarlo en fases posteriores dentro del proceso de compilacion. El ALesel unicocomponentedel compiladorquetendraaccesoal codigofuente. Portanto, debedeencargarsedealmacenarloslexemasparaquepuedanserusadosposteriormente. Estosehaceenlatabladesmbolos. Porotrolado, debeenviaral analizadorsintactico, apartedelcodigo de token reconocido, la informacion del lugar donde se encuentra almacenado ese lexema(por ejemplo, mediante un apuntador a la posicion que ocupa dentro de la tabla de smbolos).Posteriormente, enotrasfasesdel compilador, seiracompletandolainformacionsobrecadaitem de la tabla de smbolos.Por ejemplo, ante la sentencia de entradacoste = precio * 098el AL podra devolver una secuencia de parejas, como la siguiente:[ID,1] [=,] [ID,2] [*,] [CONS,3]donde ID, =, * y CONS corresponderan a codigos de tokens y los n umeros a la derecha de cadapareja sera ndices de la tabla de smbolos.Si durante la fase de analisis lexico, el AL se encuentra con uno o mas lexemas que no corres-ponden a ning un token valido, debe dar un mensaje de error lexico e intentar recuperarse.Finalmente,puestoqueel ALesel unicocomponentedel compiladorquetienecontactoconel codigo fuente, debe encargarse de eliminar los smbolos no signicativos del programa, comoespacios en blanco, tabuladores, comentarios, etc.Esconvenientesiempresepararestafasedelasiguiente(analisissintactico), porrazonesdeeciencia. Ademas, esto permite el uso de representaciones diferentes del programa fuente, sintener que modicar el compilador completo.4.5.2. Analisissintactico(ojerarquico)Esta es la segunda fase de la que consta un compilador. La parte del compilador que realiza elanalisis sintactico se llama analizador sintactico o parser. Su funcion es revisar si los tokens delcodigo fuente que le proporciona el analizador lexico aparecen en el orden correcto (impuestopor la gramatica), y los combina para formar unidades gramaticales , dandonos como salida elarbol de derivacion o arbol sintactico correspondiente a ese codigo fuente.De la forma de construir este arbol sintactico se desprenden los dos tipos de analizadores sintacti-cos existentes:Cuandosepartedelaxiomadelagramatica yseva descendiendo,utilizandoderivacio-nesmasalaizquierda, hastaconseguirlacadenadeentrada, sedicequeelanalisisesdescendentePor el contrario, cuando se parte de la cadena de entrada y se va generando el arbol haciaarribamediantereduccionesmasalaizquierda(derivacionesmasaladerecha), hastaconseguir la raz o axioma, se dice que el analisis es ascendente.Si el programa no tiene una estructura sintactica correcta, el analizador sintactico no podra en-contrar el arbol de derivacion correspondiente y debera dar mensaje de error sintactico.La division entre analisis lexico y sintactico es algo arbitraria. Generalmente se elige una divi-sion que simplique la tarea completa del analisis. Un factor para determinar como realizarlaescomprobarsi unaconstrucciondel lenguajefuenteesinherentementerecursivaono. Lasconstrucciones lexicas no requieren recursion, mientras que las sintacticas suelen requerirla.30Las gramaticas libres de contexto (GLC) formalizan la mayora de las reglas recursivas que pue-den usarse para guiar el analisis sintactico. Es importante destacar, sin embargo, que la mayorparte de los lenguajes de programacion pertenecen realmente al grupo de lenguajes dependientesdel contexto.4.5.3. AnalisissemanticoPara que la denicion de un lenguaje de programacion sea completa, aparte de las especica-ciones de su sintaxis (estructura o forma en que se escribe un programa), necesitamos tambienespecicar su semantica (signicado o denicion de lo que realmente hace un programa).La sintaxis de un lenguaje de programacion se suele dividir en componentes libres de contex-toysensiblesal contexto. Lasintaxislibredecontextodenesecuenciaslegalesdesmbolos,independientementedecualquiernocionsobreel contextoocircunstanciaparticularenqueaparecen dichos smbolos. Por ejemplo, una sintaxis libre de contexto puede informarnos de queA := B +Ces una sentencia legal, mientras queA := B no lo es.Sin embargo, no todos los aspectos de un lenguaje de programacion pueden ser descritos me-diante este tipo de sintaxis. Este es el caso, por ejemplo, de las reglas de alcance para variables,delacompatibilidaddetipos,etc.Estossoncomponentessensiblesal contextodelasintaxisquedeneal lenguajedeprogramacion. Porejemplo, A:=B + Cpodranoserlegal si lasvariables no estan declaradas, o son de tipos incompatibles.Puestoqueenlamayoradeloscasos,comoyaapuntamosenlaseccionanterior,seutilizanpor simplicidad GLC para especicar la sintaxis de los lenguajes de programacion, tenemos quehacer un tratamiento especial con las restricciones sensibles al contexto. Estas pasaran a formarparte de la semantica del lenguaje de programacion.La fase de analisis semantico revisa el programa fuente para tratar de encontrar errores semanti-cos, y re une la informacion sobre los tipos para la fase posterior de generacion de codigo. Paraestoseutilizalaestructurajerarquica queseconstruye enlafasedeanalisis sintactico, para,por ejemplo, identicar operadores y operandos de expresiones y proposiciones. Ademas, accede,completa y actualiza con frecuencia la tabla de smbolos.Unatareaimportantearealizarenestafaseeslavericaciondetipos. Aqu, el compiladorcomprueba si cada operador tiene operandos permitidos por la especicacion del lenguaje fuente.Muyfrecuentemente, estaespecicacionpuedepermitir ciertasconversiones detiposenlosoperandos, por ejemplo, cuando un operador aritmetico binario se aplica a un n umero entero ya otro real. En este caso, el compilador puede requerir la conversion del n umero entero a real,por ejemplo.Resumiendo, algunas de las comprobaciones que puede realizar, son:Chequeo y conversion de tipos.Comprobaciondequeel tipoyn umerodeparametrosenladeclaraciondefuncionescoincide con los de las llamadas a esa funcion.Comprobacion del rango para ndices de arrays.Comprobacion de la declaracion de variables.Comprobacion de las reglas de alcance de variables.4.5.4. GeneraciondecodigoLa generacion de codigo constituye la ultima fase dentro del proceso de compilacion. Despues deexaminar el codigo fuente y comprobar que es correcto desde el punto de vista lexico, sintactico31y semantico, se debe llevar a cabo la traduccion del programa fuente al programaobjeto. Esteconsiste,normalmente,enunprogramaequivalenteescritoenunlenguajemaquinaoensam-blador. Por equivalente queremos decir que tiene el mismo signicado, es decir, que produce losmismos resultados que nuestro programa fuente original.El arbol de derivacion obtenido como resultado del analisis sintactico, junto con la informacioncontenida en la tabla de smbolos, se usa para la construccion del codigo objeto. Existen variosmetodosparaconseguiresto. Unodeellos, queesparticularmenteefectivoyelegante, eselque se conoce como traduccion dirigida por la sintaxis. Esta consiste basicamente en asociar acada nodo del arbol de derivacion una cadena de codigo objeto. El codigo correspondiente a unnodo se construye a partir del codigo de sus descendientes y del codigo que representa accionespropiasdeesenodo.Portanto,sepuededecirqueestemetodoesascendente,puespartedelashojasdelarboldederivacionyvagenerandocodigohaciaarriba,hastaquellegamosalarazdelarbol.Estarepresentaelsmboloinicialdelagramaticaysucodigoasociadoseraelprograma objeto deseado.A veces, el proceso de generacion de codigo se puede dividir en las siguientes fases:GeneraciondecodigointermedioAlgunos compiladores generan una representacion intermedia explcita del programa fuen-te tras la etapa de analisis. Esta representacion intermedia se puede considerar como unprograma para una maquina abstracta, y debe cumplir dos propiedades:Debe ser facil de producir.Debe ser facil de traducir a codigo objeto.En general, las representaciones intermedias deben hacer algo mas que calcular expresio-nes; tambien deben manejar construcciones de ujo de control y llamadas a procedimien-tos. El codigo generado a partir del intermedio suele ser, por lo general, menos ecienteque el codigo maquina generado directamente, debido al nivel de traduccion adicional.OptimizaciondelcodigoLa fase de optimizacion de codigo trata de mejorar el codigo intermedio, de modo que -nalmente se obtenga un codigo maquina mas eciente en tiempo de ejecucion. Hay muchavariacion en la cantidad de optimizacion de codigo que ejecutan los distintos compiladores.En los que realizan muchas operaciones de optimizacion, denominados compiladores opti-mizadores, una parte signicativa del tiempo del compilador se ocupa en esta tarea. Sinembargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecuciondel programa objeto, sin necesidad de retardar demasiado la compilacion.A veces, a causa del tiempo requerido en esta fase, hay compiladores que no la llevan acabo y pasan directamente a la generacion de codigo objeto. De hecho, en muchos casos,tambiensesuelesuprimirlafasedegeneraciondecodigointermedio,aunque estatieneotrasutilidades. Sueleserusual queel compiladorofrezcaal usuariolaposibilidaddedesactivar la opcion de optimizacion del generador de codigo durante la fase de desarrolloo depuracion de programas.LageneraciondecodigooptimoesunproblemaNP-completo, y, portanto, inclusoloscompiladores optimizadores no tienen por que producir codigo optimo. Es decir, no debe-mos malinterpretar el termino optimizacion, pues al tratarse de un problema NP-completo,solo supone, en general, la obtencion de codigo mejorado, pero esto no signica que sea elmejor codigo posible.Generaciondecodigoobjeto32La fase nal del compilador es la generacion de codigo objeto, que, por lo general, consisteencodigodemaquinareubicableocodigoensamblador.Paracadaunadelasvariablesusadas por el programa se seleccionan posiciones de memoria. Despues, cada una de lasinstrucciones intermedias se traduce a una secuencia de instrucciones maquina que ejecu-taran la misma tarea. Una aspecto muy importante a tener en cuenta es la asignacion devariables a registros.Si durante el proceso de compilacion se ha generado codigo intermedio, y se ha pasado porla fase de optimizacion, solo quedara general el codigo objeto correspondiente al codigointermedio optimizado. En otro caso, podra generarse directamente codigo objeto despuesdel analisis semantico. Incluso puede realizarse al mismo tiempo que el analisis sintacticoy semantico (compiladores de una pasada).Encualquiercaso,existenvariasposibilidadesencuantoalformatoquepuedetenerelcodigo objeto:Generardirectamentecodigomaquina,queestara,portanto,listoparaejecutarseen la maquina correspondiente. En este caso, debe resolverse, entre otras cuestiones,la de reservar memoria para los identicadores que aparezcan en el programa. Estohacenecesarioconstruirunmapadedireccionesqueasocieacadaidenticadorsucorrespondiente direccion en memoria.Generar codigoenlenguajeensamblador delamaquinadestino. Posteriormente,habraquetraducirlo,medianteunensamblador,acodigoobjetoreubicable.Este,haciendo uso del cargador-linkador, se transformara en codigo ejecutable. Esta formade generar codigo es mas sencilla, y permite poder compilar por separado distintosprogramas que pueden interactuar entre s, usando libreras de rutinas, etc. De hecho,esta tecnica es muy com un en compiladores que trabajan bajo entorno UNIX, aunqueen otros casos se evita, por hacer mas ineciente el proceso de compilacion.En cualquier caso, la generacion de codigo es una tarea complicada, que requiere profundosconocimientos del hardware de la maquina destino, con objeto de aprovechar al maximolos recursos de la misma para que el programa ejecutable resulte lo mas eciente posible.4.5.5. UnejemplosencilloEn la gura 1.4 se esquematiza un ejemplo de traduccion de la proposicion:posicion := inicial + velocidad * 60siguiendocadaunadelasfasesdel procesodecompilacion, desdeel analisislexicohastalageneracion de codigo en lenguaje ensamblador. Se supone que las constantes no se almacenanen la tabla de smbolos. Por otro lado, se realiza una conversion de tipos (la constante entera60 se convierte a real), dentro del analisis semantico. Asimismo, se genera codigo intermedio detres direcciones, que es optimizado antes de generar el codigo en lenguaje ensamblador.33:=id1id2id3 60+*+*:=id1id2id3 inttoreal60temp1 := inttoreal(60)temp2 := id3 * temp1temp3 := id2 + temp2optimizador de codigoid1 := id2 + temp1generador de codigoMOVF id3, R2MULF #60,0, R2MOVF id2, R1ADDF R2, R1MOVF R1, id1analizador semanticoanalizador sintacticoid1 := Id2 + id3 * 60analizador de lexicoposicion := inicial + velocidad * 60generador codigo intermediotemp1 := id3 * 60.0id1 := temp3Tabla de Simbolosposicioninicialvelocidad. . . . . . Figura 1.4: Traduccion de una sentenciaEJERCICIOSRESUELTOS1. SeaL = , a. ObtenerLnparan = 0, 1, 2, 3. Cuantos elementos tieneLn, en general?Describir por comprensionL+.L0= L1= L L0= , a = , aL2= L L1= , a, a = , a, aa L3= L L2= , a, a, aa = , a, aa, aaa34Paratodon 0setieneque [Ln[ =n + 1. PodemosdenirlaclausurapositivadeLcomo:L+=n=1Ln= am[ m 02. Sean los lenguajesA = a yB = b. Describir (AB) y (AB)+.(AB) = (ab)n[ n 0 = , ab, abab, ababab, . . .(AB)+= (ab)n[ n > 0 = ab, abab, ababab, . . .3. Demostrar que la concatenacion de lenguajes no es distributiva respecto de la interseccion.No se cumple que para tres lenguajes cualesquiera A (BC) = (A B)(A C). Lo vamosademostrarconuncontraejemplo.SeanloslenguajesA = a, , B= , C= a.Tenemos que:A (B C) = a, ( a) = (A B) (A C) = a, aa, a = aComo vemos, se obtienen resultados diferentes. Luego la concatenacion no es distributivarespecto de la interseccion.4. Dadas dos cadenasx ey sobreV , demostrar que [xy[ = [x[ +[y[ (*).Primero denimos por induccion la longitud de una cadena, de forma que:1) [[ = 0, [a[ = 1, a V2) [wa[ = [w[ + 1Ahora demostramos (*) por induccion. Para el caso base cuandoytienen longitud ceroo uno, se cumple (*) por la denicion inductiva. Por hipotesis de induccion suponemosque(*)secumpleparatodapalabraxdecualquierlongitudyparatodapalabraydelongitud0 [y[ n.Ahoraconsideramosunapalabracualquieraydelongitudn + 1.Entonces y tendra al menos un smbolo, de forma que y = wa y por la denicion inductivatenemos que [y[ = [w[ + 1. Tambien por denicion se tiene que [xy[ = [xwa[ = [xw[ + 1.Pero [xw[= [x[ + [w[ puestoquesecumplelahipotesisdeinduccionparawportenerlongitudn. En denitiva tenemos que:[xy[ = [xwa[ = [xw[ + 1 = [x[ +[w[ + 1 = [x[ +[y[, c.q.d.5. Sea el alfabetoV= 0, 1 y los lenguajes:L1 = w 0, 1 [ ceros(w) es parL2 = w 0, 1 [ w = 01n, n 0Demostrar que la concatenacion L1L2 es el lenguaje: L = w 0, 1 [ ceros(w) es imparTenemos que demostrar queL1L2 L y queL L1L2L1L2 L SecumpleyaquelaconcatenaciondeunapalabradeL1conotradeL2nos da una palabra con un n umero impar de 0s. En efecto, una palabra deL1tiene unn umero par de ceros y una palabra deL2solo tiene un cero al principio y va seguida de35cualquier n umero de unos. Por tanto al concatenar las dos palabras, la palabra resultantetendra un n umero impar de ceros.L L1L2Se cumple que cada palabra w con un n umero impar de 0s puede obtenersecomoconcatenaciondeunapalabradeL1seguidadeunapalabradeL2.Haremosunademostracion por casos revisando todas las posibles formas de la palabra: que termineen 0 o que termine en 1.a) Supongamos quew = x0. Entoncesx debe tener un n umero par de ceros, por tanto:w = x....L1 0....L2b) Supongamos quew = x1. Nos jamos en el ultimo cero dex (tiene que haberlo a lafuerza) ypartimoslacadenaxdeformax =z1z2dondez1llegahastael ultimocero dex (no incluido) y por tantoz2empezara con un cero e ira seguida de cero omas unos. Por tanto:w = x1 = z1....L1 z21. .. .L26. SeaG una g.l.c. conVN= S , VT= a, b , P= S aSb [ . Demostrar formalmentequeL(G) es el lenguajeL denido como:L = anbn[ n 0ParaprobarqueL(G)esrealmenteel lenguajequeseindica, tenemosqueprobardoscosas:L L(G) Hayquedemostrarque n 0lacadenaw=anbnL(G)ylovamosahacer por induccion sobren. Base: (n = 0), la cadenaa0b0= L(G), ya queS (aplicando la regla S ). Induccion: suponemos que anbn L(G) y vamos a demostrarquean+1bn+1 L(G). En efecto, tenemos que (1)S aSb (aplicando la reglaS aSb)y (2)S anbnpor hipotesis. Luego de (1) y (2) se deduce queS aSb aanbnbY por la propiedad transitiva de la relacion de derivacion se tiene queS an+1bn+1. Esdeciran+1bn+1 L(G), c.q.d.L(G) L Todas las formas sentenciales que no son sentencias, son de la formaanSbn,poraplicaciondelareglaS aSbnveces. Yla unicaformadellegaraobtenerunasentencia es aplicando en el ultimo paso de derivacion, la regla S a la forma sentencialanSbn, obteniendoseas lasentenciaanbn. Luegotodaslassentenciassiguenel patronanbn, n 0, y esto signica queL(G) L, c.q.d.7. Sea el lenguajeL = anbncn[n 0. Encontrar una gramatica que genereL y decir deque tipo es.Estelenguajenoeslibredel contextoysedemostraraenel captulo8. Unagramaticaque genere este lenguaje puede ser la gramaticaG siguiente:S abDSc [ bDa abDbDb bbDbDc bc36L L(G) Vamosaverqueparacualquiern 0, lapalabraanbncnesderivabledeS. Paran=0estaclaropues S. Paran>0, aplicandonveceslareglaSabDSctenemosqueS(abD)nScnyaplicandoahoralareglaS seobtienelaforma sentencial (abD)ncn, que tiene n as, n bs y n cs, pero estan descolocadas. Paraconseguir generar la sentencia anbncntenemos que aplicar el resto de reglas empezando asustituir por laD mas a la derecha. Por ejemplo, paran = 2 tendramos:S abDabDcc abDabcc aabDbcc aabbDcc aabbccSiguiendo este proceso se puede generar cualquier palabra del tipoanbncn.L(G) L Como hemos visto, la unica forma de a nadir terminales a una forma sentenciales aplicando la regla S abDSc repetidas veces. El resto de reglas hacen desaparecer unavariable de la forma sentencial (como es el caso deS o la reglabDc bc), o bien,cambian los terminales de posicion en la forma sentencial. Una vez que se aplica la reglaS aunaformasentencial, dichaformasentencial tendranas, nbsyncsylas unicas sentencias que se pueden generar, si aplicamos una secuencia correcta de reglas deproduccion en las que intervenga la variable D, son palabras que siguen el patron anbncn.La gramaticaG de este ejemplo es una gramatica con estructura de frase (tipo 0).G noes sensible al contexto aunqueL(G) s es sensible al contexto. Esto quiere decir que debeexistir una gramaticaG

equivalente aG que es sensible al contexto.EJERCICIOSPROPUESTOSSe proponen los siguientes ejercicios para resolver en pizarra.1. Encontrar una gramatica libre del contexto y otra equivalente regular para cada uno delos dos lenguajes siguientes:L1 = abna [ n 0 | L2 = 0n1 [ n 02. LoslenguajesL3yL4siguientessonlibresdel contexto. Encontrargramaticasquelosgeneren.L3 = 0m1n[ m n 0 | L4 = 0k1m2n[ n = k +m3. Dado el lenguaje L5 = z a, b [ z = ww. Describir una gramatica (no puede ser libredel contexto) que lo genere y justicar la respuesta.4. Clasicar las siguientes gramaticas (dadas por sus reglas de produccion) y los lenguajesgenerados por ellas, haciendo una descripcion por comprension de los mismos.a) S [ A, A AA [ cb) S [ A, A Ad [ cA [ c [ dc) S c [ ScSd) S AcA, A 0, Ac AAcA [ ABc [ AcB, B A [ AB5. Dada la gramatica cuyas producciones son:S 0B [ 1AA 0 [ 0S [ 1AAB 1 [ 1S [ 0BBDemostrar queL(G) = w 0, 1 [ ceros(w) = unos(w) [w[ > 0.376. Probar que siL = w 0, 1 [ ceros(w) = unos(w) entonces se cumple queL = 0, 17. Dada la siguiente denicion inductiva del lenguajeL sobre el alfabeto a, b:1) L2) Si w Lentonces a wb Ly b wa L3) Si x, y Lentonces xy LDescribir el lenguajeL por comprension y comprobar que el lenguaje descrito se ajusta ala denicion inductiva.CUESTIONESBREVES1. Secumplelapropiedaddistributivadelaconcatenacionrespectodeladiferenciadelenguajes?2. DadalagramaticacuyasproduccionessonS [ aSa [ bSb, generalagramaticaellenguaje de los palndromos sobre el alfabeto a, b ?3. Si una gramaticaG no tiene ninguna produccion de la formaA a, podemos armarqueG no es regular?4. Dados dos lenguajesA, Bsobre cierto alfabetoV , es cierto que (A B)R= BR AR?5. Dar una denicion inductiva dewR.NOTASBIBLIOGRAFICASLa parte de alfabetos y lenguajes puede consultarse en el libro de [Kel95] (captulo 1).La parte de gramaticas formales puede consultarse en [Alf97] (captulo 3), aunque utilizauna notacion ligeramente diferente a la nuestra. Otro libro que sigue nuestra notacion esel [Lin97] (captulo 1).En este captulo hemos seguido la clasicacion original de Chomsky de gramaticas y lenguajes.En otros libros se da una denicion diferente (aunque equivalente) de las gramaticas regularesy sensibles al contexto.38CAPITULO 2:EXPRESIONESREGULARESContenidosTeoricos1. Denicion de expresion regular (ER)2. Lenguaje descrito por una expresion regular3. Propiedades de las expresiones regulares4. Derivada de una expresion regular5. Ecuaciones de expresiones regulares6. Expresiones regulares y gramaticas regulares1. DeniciondeexpresionregularDadounalfabetoV , los smbolos, ylos operadores +(union),(concatenacion) y (clausura), denimos (de forma recursiva) unaexpresi onregular (ER) sobre el alfabetoVcomo:1. el smbolo es una expresion regular2. el smbolo es unaER3. cualquier smboloa Ves unaER4. si ysonER entonces tambien lo es +5. si ysonER entonces tambien lo es6. si es unaER entonces tambien lo esNota El orden de prioridad de los operadores es, de mayor a menor: , , +. Esteorden puede alterarse mediante parentesis, de forma analoga a como se hace con lasexpresiones aritmeticas.Ejemplo2.1aa+ba es una e.r sobre el alfabeto a, b (por simplicidad omitimos el operador)yestaEResdistintaalaER(aa +b) a.Porotraparte,lacadena(+ba)noesunaERsobre a, b.2. LenguajedescritoporunaexpresionregularCadaexpresionregularsobreunalfabetoV describeorepresentaunlenguajeL() V.Este lenguaje se dene de forma recursiva como:391. si = entoncesL() = 2. si = entoncesL() = 3. si = a ya VentoncesL() = a4. si ysonER entoncesL( +) = L() L()5. si ysonER entoncesL() = L()L()6. si es unaER entoncesL() = (L())Ejemplo2.2DadoV= 0, 1 y laER = 010, tenemos que:L(010) = L(0)L(1)L(0) = (L(0)) L(1)(L(0)) = 0 1 0 = 0n10m[ n, m 03. PropiedadesdelasexpresionesregularesDecimosquedosexpresionesregularesysonequivalentes, ylonotamoscomo=, sidescriben el mismo lenguaje, es decir, siL() = L().Acontinuacionenumeramosunaseriedepropiedadesquecumplenlasexpresionesregulares,derivadas de las propiedades de las operaciones con lenguajes:1. + ( +) = ( +) + 9. = 2. + = + 10. = 3. + = 11. = 4. + = 12. = = ()5. = 13. = +6. = 14. ( +) = ( +)7. () = () 15. ( +) = () = ()8. ( +) = +, ( +) = + 16. () = ()Nota Si tenemosdosexpresionesregularestalesqueL() L()entoncessecumple que + = .Estas propiedades muestran ciertas equivalencias que se cumple entre expresiones regulares. Portanto, la demostracion de cada propiedad se hara demostrando que se cumple la igualdad delos lenguajes descritos por las expresiones regulares equivalentes.Ejemplo2.3Para demostrar la propiedad = basta probar queL() = L(). En efecto,teniendo en cuenta la denicion de lenguaje descrito por unaER tenemos que:L() = (L()) =n=0n= 0= = L() , c.q.d.Laspropiedadesdelasexpresionesregularesson utilesporqueenalgunoscasosnospermitensimplicar unaER (ver ejercicio 2 en la seccion de aplicaciones).404. DerivadadeunaexpresionregularSea unaER sobre cierto alfabeto V y seaa V . La derivada de respecto del smbolo a, ylo notamos comoDa (), es una expresion regular que describe el siguiente lenguaje:L(Da ()) = w V [ aw L()Enrealidad, loqueestamoshaciendoal derivar respectodeunsmboloa, esdescribirellenguajequeresultadeeliminarelprejoadetodaslaspalabrasdeL().Teniendoestoencuenta, paracalcularladerivadadeunaexpresionregularaplicamosdeformarecursivalassiguientes reglas de derivacion:1. Da () = 2. Da () = 3. Da (a) = , Da (b) = , b Vb = a4. Da ( +) = Da () +Da ()5. Da () = Da () + ()Da () donde () =

si/ L() si L()6. Da () = Da ()Ejemplo2.4Sea la expresion regular = aab. Vamos a derivar respecto dea y deb:Da () = Da (a)ab+ (a)Da (ab) = Da (a) aab+(Da (a) b + (a) Da (b)) = aab+b =(aa +)....(13)b = abDb () = Db (a) aab +(Db (a) b + (a) Db (b)) = Nota Tambien podemos derivar una expresion regular respecto de una cadenax de smbolos del alfabeto, teniendo en cuenta que:L(Dx ()) = w V [ xw L()5. EcuacionesdeexpresionesregularesDenicion2.1Llamamosecuaci ondeexpresionesregulares(enformaestandar)conincognitasovariablesx1, x2, . . . , xnaunaecuaciondeltipo:xi = i0 +i1x1 +. . . +inxndondecadacoecienteijesunaexpresionregular.Puede ser que alguno de los coecientes seaij= , en cuyo caso el termino para la incognitaxjnoapareceenlaecuacionyi0eselterminoindependiente.Unasolucionparaxiesunaexpresion regular.Denicion2.2Aunaecuaciondelaforma x = x + dondeysonexpresionesregu-lares,lallamaremosecuaci onfundamentaldeexpresionesregulares.41Lema2.1(deArden) Sepuedeprobarque x = esunasolucionparalaecuacionfun-damental y esta solucion es unica si / L(). En otro caso la ecuacion tiene innitas solucionesdelaforma x = ( +) dondeescualquierERNota Aunque la ecuacion fundamental tenga innitas soluciones, se tiene que eslamenorsolucionomenorpuntojodelaecuacion. Estoquieredecirquenoexiste otra expresion regularr que sea solucion y cumpla queL(r) sea subconjuntopropio deL().Enlagura2.1mostramosunalgoritmoresuelvesistemas deecuacionesdeexpresionesregulares. El algoritmo toma como entradan ecuaciones deER conn incognitasx1, x2, . . . , xny proporciona como salida una solucion para cada variable. El metodo es similar al de eliminaciongaussiana: primero diagonalizamos el sistema para dejarlo triangular inferior, de forma que laprimera ecuacion sea fundamental y luego se realiza una sustitucion progresiva de las solucionesobtenidas para la primera variable en adelante.Entrada:n ecuaciones deER conn incognitasx1, x2, . . . , xnSalida: una solucion para cada incognitaxi1. i n; comenzamos a tratar la ultima ecuacion2. whilei 2 bucle de diagonalizacion3. expresar ecuacion paraxi comoxi = xi +R R es la suma del resto de terminos4. obtenerxi R;5. desdej = i 1 hasta 1 sustituir en ecuacion paraxjla variablexi porR;6. i i 1;7. end-wh