Вы находитесь на странице: 1из 29

TEMA 1 LENGUAJES DE PROGRAMACIN

Lenguaje Un lenguaje es un instrumento de comunicacin. Para que exista una comunicacin debe existir comprensin mutua Lenguaje de programacin Un lenguaje de programacin tiene como fin la comunicacin entre el programador y la mquina, comunicacin, que resulta difcil por ser elementos de diferente naturaleza. Para superar sta dificultad se crearon los procesadores de lenguajes, que deben unir el salto semntico entre los distintos lenguajes, el lenguaje del programador y el de la mquina Definicin de un lenguaje de programacin (desde el punto de vista del usuario) Un lenguaje de programacin es una notacin que sirve para escribir algoritmos que puedan ser ejecutados en una mquina; una notacin precisa, rigurosa y con la pretensin de ausencia de ambigedades. La anterior definicin aporta poca informacin para su anlisis. Ejemplo: Program saludo ; begin writeln (Bienvenidos a la asignatura de TLP) end. Definicin de un lenguaje de programacin (desde el punto de vista del anlisis) Un lenguaje de programacin es aqul que tiene: un lxico, una sintaxis y una semntica. La anterior definicin aporta cierta informacin para conocer su anlisis, que veremos seguidamente. Program ejemplo; var a: integer; x: real; begin read ( a); x:= a*2 ; write (x) end . Un lenguaje tiene un conjunto de componentes elementales e indivisibles: variables, literales, palabras reservadas, smbolos separadores, smbolos aritmticos,..etc que pueden formar parte de un programa fuente escrito en ese lenguaje. Al conjunto de componentes bsicos e indivisibles que se pueden usar en el lenguaje, se le llama lxico de ese lenguaje,{ Program, id, ;,}. Los componentes lxicos que forman el lxico de un lenguaje, se pueden asociar para formar estructuras: una asignacin, una expresin,etc. estructuras que pueden formar parte de un programa fuente escrito en ese lenguaje. Ejemplo correcto de una estructura en Pascal: Program ejemplo; var a: integer; x: real; begin read ( a); x:= a*2 ; write (x) end . Al conjunto de estructuras que permite el lenguaje, se denomina sintaxis del lenguaje .Para definir la sintaxis de un lenguaje se utilizan las gramticas. Una gramticas es un conjunto finito de reglas a travs de las cuales se pueden generar el conjunto(por lo general infinito) de estructuras que forman la sintaxis de un lenguaje. El conjunto de estructuras que se pueden utilizar en un lenguaje deben de cumplir una serie de restricciones y condiciones entre los elementos del lenguaje que la componen: la compatibilidad de tipos en la estructuras de asignacin, expresiones,. El conjunto de condiciones o restricciones que deben cumplir las estructuras se llama semntica esttica Program ejemplo; var a: integer; x: real; begin read ( a); x:= a*2 ; write (x) end . En Pascal- una variable debe estar definida antes de usarse, debe existir una compatibilidad de tipos entre los objetos que intervienen en una estructura ( es un lenguaje fuertemente tipado),. El conjunto de estructuras que se pueden utilizar en un lenguaje, determinan una serie de acciones a realizar, en una asignacin: evaluar el valor la parte derecha del operador de la igualdad y asignrselo a la memoria definida por la variable de la parte izquierda, etc. Las acciones que debe realizar la mquina para acometer el significado de las distintas estructuras se llama semntica dinmica.

- Ejemplo anterior: obtener un valor entero de la entrada y ponerlo en la variable a, - El valor que tiene la variable a multiplicado por la constante 2, y el resultado se deja en la variable x - Escribir el contenido de la variable x Cuanto mayor sea la potencia (significacin) de las estructuras del lenguaje, mayor ser la diferencia de la semntica del lenguaje de programacin y el lenguaje de la mquina donde se quiere ejecutar. La forma de representar una sentencia switch del lenguaje C++, es bastante diferente y ms simple que la representacin en lenguaje mquina. Nivel de un lenguaje El nivel (semntico) de los lenguajes es una medida indicativa de la complejidad del significado de los programas que pueden escribirse con ellos: se refiere al nivel de complejidad de las estructuras (construcciones) del lenguaje; suelen considerarse dos categoras ms o menos genricas: - lenguajes de alto nivel: C++, Java, Ada, Pascal - lenguajes de bajo nivel: lenguajes ensambladores y mquinas de diferentes mquinas Lenguaje mquina conjunto de instrucciones de una mquina particular que son interpretadas por el hardware o microprogramas de la propia mquina. El conjunto de instrucciones estn escritos en notacin binaria. Los lenguajes mquina, son los lenguajes de menor nivel semntico. Lenguaje ensamblador- es una versin simblica del lenguaje mquina. En donde las operaciones, direcciones de memorias, registros.. se dan de forma simblicas, con ciertas ayudas a la depuracin. Lenguajes de alto nivel Lenguajes que estn por cima de mquina y en principio son independientes de la mquina sobre la que se van a ejecutar los programas escritos en la misma. La separacin semntica Separacin semntica es la diferencia de nivel semntico que se da entre un algoritmo escrito en un lenguaje de programacin (de un cierto nivel) y las instrucciones mquina mediante las que ese algoritmo se ejecuta en una mquina (el nivel semntico mnimo para esa mquina). Para que un algoritmo escrito en un lenguaje (de determinado nivel) sea ejecutable en una mquina hay que resolver la separacin semntica relativa a dicho lenguaje. Un ejemplo puede ilustrar fcilmente la diferencia: la semntica (el significado) de la sentencia cclica for de Java es mucho ms compleja (de significado ms complicado, de mayor semntica, ms costosa de ejecutar, ms difcil de explicar) que la instruccin mquina que permite almacenar un valor constante en un registro de uso general de la unidad central de proceso. Tambin puede hablarse de lenguajes de nivel intermedio. Hay lenguajes que tienen, a la vez, unas caractersticas que pueden considerarse de alto nivel y otras de nivel bajo o intermedio. lenguaje fuente (de cierto nivel) sentencias del lenguaje separacin semntica algoritmo [ significado comn ] nivel de la mquina (fsica) instrucciones ejecutables en la mquina Procesador de lenguajes Se puede definir un procesador de un lenguaje de programacin (ya comentado anteriormente) como un sistema que resuelve la separacin semntica de los programas escritos en ese lenguaje; un procesador est formado por uno o ms programas interrelacionados que hacen posible que un algoritmo (programa) codificado (escrito) en el lenguaje pueda llegar a ejecutarse en una mquina (fsica). Tipos de procesadores de lenguajes Traductores, Intrpretes.

Traductor Un traductor entre dos lenguajes de programacin, es un programa que realiza una transformacin (una traduccin) entre ellos: el lenguaje de entrada al traductor (lenguaje fuente) y el de salida del traductor (lenguaje destino); el traductor acepta un texto escrito en el lenguaje fuente (representativo de un determinado algoritmo/programa) y emite como salida una representacin de ese mismo algoritmo/programa codificada en el lenguaje destino. El traductor est escrito en un lenguaje de implementacin Li , o tambin llamado host. El proceso de traduccin no altera el significado del programa traducido. El traductor analiza el programa de entrada verificando que est correctamente codificado segn la definicin del lenguaje fuente; si el programa analizado no tiene errores se puede traducir; en caso contrario, el traductor avisa de los errores detectados. La entrada al traductor se denomina programa fuente y la salida programa destino (o tambin cdigo generado por el traductor). -- Traductor entre los lenguajes L y L P/L M P programa escrito en L (lenguaje fuente) P' programa escrito en L (lenguaje destino) E errores (si existen y son detectados) M mquina donde se ejecuta el traductor Li lenguaje de implementacin de T [ P y P' representan idntico algoritmo ] Lo ms frecuente y razonable es que un proceso de traduccin disminuya el nivel semntico: el nivel de lenguaje destino es menor que el nivel del lenguaje fuente. Tipos de traductores Compiladores, ensambladores, conversores,.. Compilador Un compilador, traduce un programa escrito en un lenguaje fuente de alto nivel a otro semnticamente equivalente escrito en un lenguaje objeto, lenguaje que puede ser mquina o de bajo nivel El resultado de la compilacin es un programa ejecutable en una determinada mquina Puede afirmarse que la compilacin directa a cdigo mquina directamente ejecutable, no suele darse con frecuencia debido a que tras de una compilacin suelen aparecer acciones (enlazador, cargador,..) para obtener el cdigo ejecutable. La ejecucin del programa compilado puede considerarse como un proceso de interpretacin del procesador. La ejecucin, es un proceso posterior en el que se ejecuta el programa objeto, teniendo un conjunto de datos de entrada y produciendo unos resultados como salida El siguiente esquema ilustra el proceso de ejecucin de un programa compilado, con sus dos partes bien diferenciadas: la compilacin del programa fuente (ejecucin del compilador) y la ejecucin del programa resultado de la compilacin. -- compilador del lenguaje T [Li] E P/L

C M P[L]

P[O] M'

P[O]

D R

C compilador del lenguaje L, para la mquina M P [ L ] programa (fuente) escrito en L P [ O ] programa (cdigo) objeto resultante de la traduccin (compilacin)

D datos para una ejecucin del programa P R resultados de una ejecucin del programa P Mquina anfitriona - mquina donde se ejecuta el compilador ( M ) Mquina destino- mquina para la que genera cdigo el compilador ( M' ) El tiempo que se tarda en traducir un texto de un lenguaje se llama tiempo de compilacin. El tiempo que tarda en ejecutarse el texto de un lenguaje se llama tiempo de ejecucin. Un compilador es un programa que traduce un nico lenguaje fuente, produciendo cdigo para una nica mquina destino. Fases de un compilador. Representaciones intermedias. La tarea realizada por un compilador es muy compleja y por ello conviene considerarla descompuesta en diferentes partes. Un enfoque tradicional (y bastante provechoso) en el anlisis del problema de compilar un programa escrito en un lenguaje de alto nivel es el denominado modelo analtico-sinttico. Se considera una descomposicin funcional del compilador en diferentes fases. En una primera aproximacin se diferencian dos fases: anlisis y sntesis; en la fase de anlisis se comprueba que el programa est bien codificado de acuerdo con la definicin del lenguaje fuente y se extrae el significado del texto analizado; en la fase de sntesis se transcribe ese significado empleando la notacin del lenguaje destino, generando el cdigo mquina que representa el mismo algoritmo que el programa fuente. Para separar claramente estas dos fases conviene desde un punto de vista conceptual considerar que, como resultado de la fase de anlisis se obtiene una representacin intermedia del programa analizado que refleja las operaciones que el programa ha de realizar y el orden en que deben de llevarse a cabo; la naturaleza de esta representacin intermedia depende del mtodo empleado para la implementacin del compilador Fase de anlisis Representacin intermedia P[I] Fase de Sntesis

P[F]

P[O]

P[ F ] programa P escrito en el lenguaje fuente P[ O ] programa P escrito en el lenguaje destino P[ I ] representacin intermedia del programa P La representacin de lenguaje intermedio es el lenguaje de una mquina abstracta ( comentada mas adelante )usado como interfaz entre el anlisis y la generacin de cdigo. La representacin intermedia no es obligatoria en las fases de un compilador, puesto que un compilador puede generar cdigo objeto directamente (compilador puro). Anlisis: la fase de anlisis debera ser independiente de la mquina, mientras que la de sntesis depende de la mquina en la que se ejecutar. Sntesis: A partir del cdigo intermedio generado en la fase de anlisis, generan y optimizan el cdigo, dependiendo ahora de la mquina en la que se ejecutar En una segunda aproximacin, la fase de anlisis se considera, a su vez, descompuesta en tres fases cada una de ellas encargada de examinar las diferentes caractersticas del programa analizado: - el anlisis lexicogrfico encargado de comprobar las caractersticas lexicogrficas (la forma en que estn codificados los componentes elementales del texto), - el anlisis sintctico dedicado a verificar la estructura sintctica de la secuencia de componentes lxicos que les pasa el anlisis anterior, y que constituyen el programa, - el anlisis semntico que realiza las comprobaciones de las restricciones de semntica esttica que han de cumplirse para que el programa analizado tenga un significado correcto. En cualquiera de la fases de anlisis pueden encontrarse errores: lexicogrficos, sintcticos, semnticos; en el momento en que se encuentra un error se decide que ya no es necesaria la generacin de cdigo: el programa analizado es incorrecto.

Durante el anlisis de un programa, el compilador recopila una gran cantidad de informacin que es necesario tener organizada y fcilmente accesible (para hacer las comprobaciones semnticas y para generar el cdigo); la principal estructura de datos donde el compilador almacena la informacin que obtiene del programa analizado se denomina tabla de smbolos. En la fase de sntesis se realiza la tarea de generar el cdigo destino; esta tarea puede hacerse directamente en un nico paso o bien considerar que primero se obtiene el programa escrito en un lenguaje intermedio y despus se transforma el lenguaje intermedio al cdigo mquina. Para generar cdigo se tiene en cuenta la semntica dinmica del lenguaje que es la que establece lo que la mquina ha de realizar para ejecutar lo indicado por el programa fuente. Fase de Anlisis Cdigo fuente Anlisis lxico Componentes lxicos Anlisis sintctico rbol sintctico Anlisis semntico rbol anotado Fase de Sntesis Generacin de cd. intermedio Cdigo intermedio Optimizacin de cd. intermedio Cdigo intermedio Generacin de cdigo Cdigo objeto Optimizacin de cdigo Cdigo objeto

A veces tambin se considera como una fase dentro de la sntesis la tarea de optimizacin; un compilador puede efectuar intentos de mejora (optimizacin) en el cdigo generado para que ocupe menos espacio o para que se ejecute con mayor rapidez; estas optimizaciones pueden hacerse en diferentes momentos: sobre la representacin intermedia, sobre el cdigo destino o sobre el lenguaje intermedio (si se ha producido la generacin en dos etapas); precisamente uno de los motivos que justifica la generacin del cdigo en dos o ms etapas es la posibilidad de hacer diferentes optimizaciones. Tipos de compiladores Compilador cruzado Se genera cdigo en lenguaje objeto para una mquina diferente a la que se est utilizando para compilar. Uno de los problemas que se encuentra en un nueva mquina es que alguien tiene que escribir el primer compilador. La tarea ser ms cmoda de hacer en la mquina que se dispongan herramientas software, para despus trasladarla a otra. Autocompilador Es un compilador escrito en el mismo lenguaje que compila. Cuando se extiende entre muchas mquinas diferentes el uso de un compilador, y ste se desea mejorar, el nuevo compilador se escribe con el antiguo, de manera que pueda ser compilado por todas esas mquinas diferentes, y d como resultado un compilador ms potente de ese mismo lenguaje. Metacompilador Es sinnimo de compilador de compiladores. Se refiere a un programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje Decompiladores Realizan la tarea inversa a la de los compiladores. Traduce un programa fuente en un lenguaje de bajo nivel a otro objeto de nivel superior. En la mayora de los casos traducen un lenguaje mquina a un lenguaje ensamblador, tambin llamados desensambladores

Compilador incremental Es aquel que compila un programa en el que si despus se descubren errores, en vez de corregir el programa fuente y compilarlo por completo, se compilan solo las modificaciones. Lo ideal es que solo se recompilen aquellas partes que contenan los errores, y que el cdigo generado se reinserte con cuidado en el lenguaje objeto generado cuando se encontraron los errores. Sin embargo esto es muy difcil. Compilador con montador y cargador Compilador de distintos mdulos de forma independiente y despus los enlaza. Una de las caractersticas que diferencian a unos compiladores de otros es si tienen o no la posibilidad de traducir una parte de un programa de manera independiente y separada de la traduccin de las otras partes que conforman el programa completo. En el siguiente esquema se muestra un programa completo que est dividido en n partes y cada una de ellas ha sido compilada en un proceso separado de compilacin; de esta forma se han obtenido n trozos de programa traducido que no son todava programas ejecutables; para formar un nico programa ejecutable hay que unir las n partes obtenidas en los procesos de compilacin. Sobre los trozos de programa resultantes de las compilaciones hay dos tareas pendientes de realizar: - la resolucin de las referencias: es posible que en alguna de las partes separadas del programa se haga referencia (se use) una entidad que ha sido definida (declarada) en otra parte distinta, - la obtencin de las direcciones definitivas para los componentes del programa considerado como un todo, una vez que se hayan juntado las distintas partes traducidas por separado. C P O [1] Montador (Cargador)

P F [1]

P O[reu] Prog ecutable en memoria P O[eje]

C P F [2] P F [n] C compilador

P O [2]

P O [n] montaje ejecucin

Estas tareas las resuelve un programa auxiliar que se denomina montador o montador-cargador tal y como se ilustra en el anterior esquema. A la salida del montador se obtiene un programa completo que ya est preparado para su ejecucin. Hay lenguajes para los que se dispone de una serie de libreras (trozos de programa) que realizan determinadas tareas (ms o menos especializadas); en este caso el montador puede incorporar el cdigo de esas libreras para formar un todo con el programa previamente compilado en el que se ha hecho uso de ellas. Pasadas de un compilador La descomposicin en fases de un compilador se refiere al anlisis del problema que se plantea al desarrollar un compilador para un lenguaje. Una vez analizado el problema y descompuesto en tareas ms sencillas, hay que disear una manera de hacer la implementacin. Desde el punto de vista de la implementacin se fija la cantidad de pasadas que el compilador hace sobre el programa analizado; en cada pasada se hace un tratamiento del programa completo y se realiza sobre l alguna parte del trabajo de la compilacin; el resultado de cada pasada es el punto de partida para la pasada siguiente, esto es, cada pasada se acerca ms al resultado pretendido por el compilador. Pasadas son el nmero de veces que se procesa una representacin del programa fuente. Cada pasada requiere: lectura del cdigo fuente, procesamiento y almacenamiento de la informacin obtenida.

Si todas las fases de la compilacin se realizan examinando una nica vez el texto de entrada, entonces se trata de un compilador de una nica pasada. Si el lenguaje tiene una semntica compleja puede requerir que cualquier implementacin de un compilador requiera ms de una pasada. El mtodo empleado para implementar el compilador tambin influye en el nmero de pasadas requeridas. Por ejemplo, los lenguajes que permiten que el uso de una entidad (variable, subprograma, mtodo) pueda preceder a su declaracin (como ocurre en Java) requieren compiladores diseados con ms de una pasada. Las pasadas suelen agruparse: 1 pasada A lxico, A sintctico, A. semntico y generacin de cdigo intermedio 2 Generacin y optimizacin de cdigo Un compilador con un nmero grande de pasadas hace que se necesite menos memoria para la ejecucin, pero aumenta el tiempo de ejecucin al realizar ms operaciones de entrada salida, se facilita la deteccin de errores Compilador de una o varias pasadas Nmero de veces que hay que analizar el cdigo fuente. Tpicamente una pasada para realizar el anlisis lxico y sintctico, otra pasada para el anlisis semntico y optimizacin dependiendo del lenguaje fuente y una tercera pasada para la generacin de cdigo y optimizacin dependiente de la mquina C y Pascal son lenguajes de una pasada mientras que el lenguaje modula realiza 2 pasadas Ensambladores Ensamblador Un traductor cuyo lenguaje fuente es un ensamblador y el lenguaje objeto es el lenguaje mquina. Existen ensambladores con macroinstrucciones: Macroensambladores. Desensambladores Caso inverso a los ensambladores, traducen de cdigo mquina a ensamblador. Es un caso ms fcil puesto que hay una correspondencia directa entre las instrucciones ensamblador y el cdigo mquina. Conversores Traducen un lenguaje de alto nivel a otro lenguaje de alto nivel, para conseguir mayor portabilidad. Por ejemplo en un ordenador slo hay un compilador de PASCAL, y queremos ejecutar un programa escrito en C; Un conversor C > PASCAL nos solucionara el problema Intrprete Un intrprete es un programa que analiza y ejecuta simultneamente un programa escrito en un lenguaje fuente. Un intrprete hace una simulacin de la ejecucin del programa de entrada en la mquina donde se est ejecutando el intrprete. El intrprete va considerando una tras otra las instrucciones del programa interpretado y, para cada una de ellas, analiza su significado y procede de inmediato a realizar las tareas correspondientes, antes de pasar a la siguiente instruccin; en particular, si en el programa se indican operaciones de entrada/salida, el intrprete controlar su realizacin. s -- Intrprete del lenguaje D (datos) P/L M E I R (resultados)

P D R E M

programa escrito en L datos para una ejecucin de P resultados de una ejecucin de P errores (si existen y son detectados) mquina donde se ejecuta el intrprete

Tipos de interpretes: (segn la estructura interna del intrprete) Intrpretes puros Los lenguajes no necesitan de pseudocompilacin, analizan y ejecutan sentencia a sentencia todo el programa fuente, pueden considerarse intrpretes puros los intrpretes de comandos de la mayora de los sistemas operativos. La interpretacin pura en los lenguajes de alto nivel no suelen contruirse puesto que el proceso es bastante ineficaz. Intrpretes avanzados (o normales) Incorporan un paso previo de anlisis de todo programa fuente a pseudocompilacin generando posteriormente un lenguaje intermedio que es ejecutado por el mismo. Intrpretes incrementales Lenguajes que no se pueden compilar directamente, existen objetos que no son conocidos en tiempo de compilacin ( Lisp, prolog, smaltalk) Comparacin entre un traductor y un intrprete Aunque a simple vista pudiera apreciarse que las funciones de un traductor y de un intrprete son similares (ambos aceptan como entrada un programa escrito en un determinado lenguaje de programacin y con ambos se pretende conseguir la ejecucin de ese programa), sin embargo los conceptos de traduccin y de interpretacin son esencialmente distintos. Pueden enunciarse abundantes diferencias entre los procesos de traduccin y de interpretacin, entre las ms significativas estn: una traduccin siempre produce como salida una representacin del programa analizado (el cdigo destino); si ese cdigo fuera ejecutable en alguna mquina; su ejecucin habra de realizarse en otro momento (distinto del de la propia traduccin) una interpretacin simula la ejecucin de un programa; dicha ejecucin es controlada por el intrprete; en una interpretacin no se produce cdigo destino En relacin a un intrprete no existe el lenguaje destino (no se genera cdigo); aunque el concepto de lenguaje fuente es ms propio de los traductores, tambin puede decirse que el lenguaje para el que se construye el intrprete es su lenguaje fuente. Un intrprete necesita menos memoria, es ms fcil de depurar, tiene una mayor flexibilidad a la hora de modificar las caractersticas del lenguaje fuente, tienen una mayor portabilidad, potencian el uso de los sistemas interactivos, la dificultad y coste de programacin son menores( no necesitan fase de generacin de cdigo, optimizacin, montaje y reubicacin). No son tiles con estructuras complejas, programas que trabajan en modo produccin y la velocidad es importante e instrucciones son ejecutadas con frecuencia. En la actualidad suelen mezclarse ambas tcnicas (apdo. de modalidades de separacin semntica) : la primera agiliza la fase de produccin debido al desarrollo de tcnicas y herramientas de construccin de compiladores, mientras que la segunda facilita la ejecucin y depuracin Se puede decir que un ordenador es un intrprete de su propio lenguaje mquina, es decir siempre se produce un proceso de interpretacin. Un intrprete puede relacionarse a nivel de software o hardware Lenguajes intermedios Para acercar la separacin semntica de un programa escrito en un lenguaje de alto nivel a lenguaje mquina, puede emplearse una descomposicin del problema apoyada en la utilizacin de un lenguaje intermedio.

Un lenguaje intermedio es una notacin que permite representar algoritmos (secuencias de operaciones) y que recibe ese nombre por tener un nivel semntico medio situado entre el alto nivel del lenguaje fuente y el bajo nivel del lenguaje destino (mquina). Puede decirse que un lenguaje intermedio es una representacin ms abstracta y uniforme que un lenguaje mquina concreto. Con el uso de un lenguaje intermedio, el primer paso en la resolucin de la separacin semntica consiste en la traduccin del programa escrito en el lenguaje fuente (alto nivel) al lenguaje intermedio; aunque el programa resultante de esa traduccin todava no es directamente ejecutable en una mquina, se ha conseguido disminuir la separacin semntica entre el lenguaje fuente y la mquina destino. Leng. Fuente Separacin semntica entre lenguaje fuente e intermedio Leng. Intermedio Separacin semntica entre lenguaje intermedio y mquina Leng. mquina Los lenguajes intermedio no son lenguajes de programacin de ninguna mquina real, sino que corresponde a una mquina abstracta. Diseo de los lenguajes intermedios: - Lenguajes intermedios de alto nivel - lenguajes diseados para actuar en las primeras fases de traduccin (anlisis) o incluso de procesado. Son dependientes del lenguaje fuente e independiente de la arquitectura destino. Las tareas de dicho lenguajes comprobacin de tipos, generacin de cdigo y optimizacin de cdigo con independencia de la plataforma. Las representaciones de lenguajes intermedios de alto nivel mas empleados son: rboles de sintaxis abstracta AST, grafos dirigidos aciclicos GADs y grafos de dependencia. Facilitan la traduccin del lenguaje fuente; sus caractersticas estn prximas al lenguaje fuente; por ejemplo el cdigo P definido para favorecer la implementacin del lenguaje Pascal, - Lenguajes de medio nivel vlidos para representar un conjunto amplio de lenguajes fuente ( no siendo dependientes de uno concreto), vlidos para representar un conjunto extenso de arquitecturas hardware. Representaciones mas empleadas: mquinas de pila (representacin ms empleada de cdigo intermedio) , de tres direcciones(tercetos), de cuatro direcciones (cuartetos) y notacin polaca inversa (recorrido post orden) - leguajes intermedios de bajo nivel permiten traducir a distintos micros, de una misma arquitectura (dependientes de sta), se basan en lenguajes con registros simblicos Influidos por la mquina destino, estn prximos al lenguaje mquina.

Lenguaje1

Lenguaje2

Lenguajen

n lenguajes

Traduccin directa

n*m

Plataforma1

Plataforma2

P Plataforma O [1] m

m Plataformas

Traducciones de n lenguajes a m plataformas m*n

En la anterior representacin puede verse que para n lenguajes sobre m plataformas se necesitan n*m traducciones Ventajas del lenguaje intermedio Portabilidad de las aplicaciones: El cdigo intermedio, al ser independiente de la plataforma puede ser ejecutado en cualquiera que tenga disponible una maquina virtual Adecuacin de paradigmas complejos: Determinados paradigmas de programacin son complicados de traducir a cdigo binario dado su bajo nivel de abstraccin, son traducidos a cdigo intermedio Distribucin de aplicaciones por internet: Los mdulos de aplicaciones web se pueden distribuir a travs de un servidor. Cualquier mdulo de Internet dispone de una mquina virtual para cod. intermedio Intercomunicacin de aplicaciones: La representacin binaria de datos en distintas plataformas vara. El empleo de una misma maquina abstracta evita tener que traducirlos Inconvenientes Introduce en el compilador una nueva fase de traduccin. Perdida de eficiencia no permite una compilacin de una pasada Dificultad para definir un lenguaje intermedio adecuado en el compromiso entre lenguaje fuente y lenguaje mquina. Portabilidad Lenguaje1 C Compilacin a mquina abstracta Lenguaje intermedio Traduccin a mquina real n+m Lenguaje2 PASCAL Lenguajen JAVA n Lenguajes

Plataforma1 Intel

Plataforma2 Motorola

Plataforman Dec-Alpha

m Plataformas

En la anterior representacin puede verse, que con un lenguaje intermedio las traducciones se reducen de m*n a n+m El cdigo intermedio de un compilador suele ser cdigo del lenguaje de una mquina abstracta. Mquina diseada sin la intencin de ser implementada a nivel de hardware Mquinas virtuales Una mquina abstracta puede definirse como un modelo terico para ejecutar un conjunto de instrucciones en algn lenguaje formal (no requiere implementacin hardware, en tal caso se estara hablando de una mquina concreta). Una mquina virtual es una mquina abstracta para la que existe un intrprete. Tambin puede decirse que, una mquina virtual es una implementacin software de la especificacin de una mquina abstracta El lenguaje de la mquina virtual suele tener la funcin de lenguaje intermedio. Una mquina virtual se puede implementar sobre una mquina fsica; para ello ha de tenerse: - una estructura de datos que soporte la arquitectura de la mquina virtual, organizacin de memoria (pila, registros,) - un intrprete del lenguaje de la mquina virtual que se ejecute en la mquina fsica.(conjunto de instrucciones que pueden ejecutarse.

10

Hay una gran variedad de mquinas virtuales: unas basadas en pila, otras en registros o una combinacin de ambas; diseadas para facilitar la implementacin de lenguajes y para favorecer su portabilidad a distintas mquinas fsicas; por ejemplo: - mquina virtual de java, - mquina P para Pascal, - mquina A para Ada, - mquina EM, - .. Los lenguajes intermedios facilitan la portabilidad de diferentes lenguajes de programacin de alto nivel a distintas mquinas (fsicas). Si se quiere implementar un lenguaje de alto nivel en diferentes mquinas, se puede desarrollar un nico traductor del lenguaje fuente a un lenguaje intermedio y varios traductores (o intrpretes) del lenguaje intermedio a cada uno de los lenguajes mquina de las distintas mquinas (fsicas). Por ejemplo, el lenguaje de la mquina virtual de Java (bytecode) facilita la implementacin del lenguaje Java en diferentes mquinas fsicas: se tiene un nico traductor (compilador) de Java al lenguaje de bytecodes y una coleccin de intrpretes de bytecode (un intrprete por cada mquina fsica en la que se quieran ejecutar). El cdigo bytecode se est convirtiendo en un cdigo intermedio universal, ya existen intrpretess de JVM (mquina virtual de java) para todos los sistemas operativos

Lenguaje1 Compilacin a mquina abstracta

Lenguaje2

PLenguajen O [1]

N lenguajes

Lenguaje intermedio Traduccin a mquina real

N+m

Intrprete LI para P1 Plataforma1

Intrprete LI para P2 Plataforma2

P Intrprete O [1] LI para P2 Plataforman

Mquinas Virtuales M Plataformas

En lugar de traducir el cdigo intermedio a cdigo objeto de la plataforma destino, podemos utilizar una mquina virtual para cada plataforma El principal objetivo es reducir el numero de programas necesarios para construir un traductor portable que permita generar cdigo sobre una gran variedad de plataformas Arquitectura front-end/back-end Con frecuencia, las fases se agrupan en una etapa inicial (Front-End) y una etapa final (Back- End). La etapa inicial comprende aquellas fases, o partes de fases que dependen principalmente del lenguaje fuente y que son en gran parte independientes de la mquina objeto. Ah normalmente se introducen los anlisis lxicos y sintcticos, la creacin de la tabla de smbolos, el anlisis semntico y la generacin de cdigo intermedio. La etapa inicial tambin puede hacer cierta optimizacin de cdigo e incluye adems, el manejo de errores correspondiente a cada una de esas fases. La etapa final incluye aquellas partes del compilador que dependen de la mquina objeto y, en general, esas partes no dependen del lenguaje fuente, sino slo del lenguaje intermedio. En la etapa final, se encuentran aspectos de la fase de optimizacin de cdigo adems de la generacin de cdigo, junto con el manejo de errores necesario y las operaciones con la tabla de smbolos.

11

Front - end

Cdigo fuente Anlisis lxico Comp. lxicos Anlisis sintctico rbol sintctico Anlisis semntico Anlisis sintctico rbol anotado Generacin de cd. int. Cdigo intermedio Optimizacin de cd. int

Back-end

Generacin de cdigo Optimizacin de cdigo Cdigo objeto

Arquitectura Front- end / Back-end

Se ha convertido en rutina el tomar la etapa inicial de un compilador y rehacer su etapa final asociada para producir un compilador para el mismo lenguaje fuente en una mquina distinta. Otro motivo que justifica la divisin de la generacin de cdigo en dos etapas (intermedio y objeto) es la portabilidad: se puede construir una nica parte frontal que sirva para traducir el lenguaje fuente a un determinado lenguaje intermedio y varias partes terminales que generen cdigo traduciendo ese lenguaje intermedio a los lenguajes mquinas de distintas mquinas.
Front- end Para el lenguaje C

Lenguaje intermedio

Back-end Dec-Alpha

Back-end Motorola

Back-end Intel

Cod. maq Dec-Alpha

Cod. maq Motorola

Cod. maq Intel

Compilador C para tres mquinas diferentes.

Tambin resulta tentador compilar varios lenguajes distintos en el mismo lenguaje intermedio y usar una etapa final comn para las distintas etapas iniciales, obtenindose as varios compiladores para una mquina.
Pascal Front - End Java Front -End Front C End

Back End Cod. maq Intel Tres compiladores ( pascal, java y C) para una misma mquina

12

La representacin intermedia acta como medio de comunicacin entre el front-end y back-end. - Si se cambia el lenguaje fuente, se reescribe el front-end. - Si se cambia la mquina objeto, entonces se reescribe el back-end - Si aparece una nueva arquitectura, basta con desarrollar un traductor del lenguaje intermedio a esa mquina Modalidades de procesadores. Rara vez se realiza el proceso de traduccin o interpretacin (pura) para resolver el problema de separacin semntica, en la mayora de los casos coexisten, dndose primero la traduccin del fuente a una representacin intermedia, a la cual se le aplica el proceso de interpretacin. Todo lenguaje de programacin necesita de uno o ms procesadores de lenguajes. Cada mquina fsica requiere de un cdigo especfico lenguaje objeto (x 86) Para resolver el problema de la separacin semntica pueden desarrollarse distintas modalidades de procesadores de lenguajes. * Un compilador Un copilador, por s mismo constituye un procesador de un lenguaje de alto nivel; en el proceso de compilacin se obtiene el cdigo directamente ejecutable en la mquina ( Pascal, C, ADA). n1 Compilador n2 n1 n2 nivel de L (lenguaje de alto nivel) nivel de la mquina (fsica)

* Dos traductores Un traductor del lenguaje fuente a un lenguaje intermedio y otro traductor del lenguaje intermedio al lenguaje mquina. n1 Traductor n2 Traductor n3 * Un intrprete Aunque no es habitual su utilizacin (por cuestiones de eficacia), puede considerarse un proceso de interpretacin directa (pura) de un lenguaje de alto nivel; en este caso el propio intrprete constituira un procesador para el lenguaje de alto nivel. n1 Intrprete n2 n1 n2 nivel de L (lenguaje de alto nivel) nivel de la mquina (fsica) n1 n2 n3 nivel de L (lenguaje de alto nivel) nivel del lenguaje intermedio nivel de la mquina (fsica)

13

* Un traductor y un intrprete Un traductor del lenguaje fuente a un lenguaje intermedio y un intrprete del lenguaje intermedio (java, Perl, PHP). n1 Traductor n2 Intrprete n3 n1 n2 n3 nivel de L (lenguaje de alto nivel) nivel del lenguaje intermedio nivel de la mquina (fsica)

Herramientas para la construccin de procesadores de lenguajes A parte de las herramientas de desarrollo de software convencionales como: editores, depuradores, perfiladores,, para la construccin de procesadores de lenguajes, existen otras herramientas especializadas y cada vez ms, que ayudan a la construccin de procesadores, entre los que podemos destacar los siguientes: Generadores de analizadores lxicos Generacin basada en el uso de expresiones regulares, generan automticamente el cdigo fuente para el anlisis lxico a partir de una especificacin de los tokens. El generador es un autmata finito. El generador de nuestro estudio es JavaCC que genera cdigo en java. Generadores de analizadores sintcticos Construyen el cdigo fuente del analizador sintctico a partir de la especificacin de la gramtica del lenguaje fuente. El generador de nuestro estudio es JavaCC que genera cdigo en java. Analizadores de gramticas Dada una gramtica especificada formalmente, verifican si es de un determinado tipo o no. Normalmente se utilizan para verificar las gramticas LL(k) y LR(k). Mquinas de traduccin dirigida por sintaxis Producen un conjunto de rutinas que recorren el rbol sintctico y generan cdigo intermedio. Asocian una o ms traducciones a cada nodo sintctico. Generadores automticos de cdigo Trabajan con un conjunto de reglas que permiten la traduccin del cdigo escrito en lenguaje intermedio al lenguaje objeto. Las reglas suelen remplazar instrucciones de cdigo intermedio por patrones que contienen las instrucciones equivalentes de la mquina objeto. Analizadores de flujo Suministran la informacin necesaria para realizar las optimizaciones de cdigo. Entorno de desarrollo integrado Conjunto de aplicaciones que permiten la escritura de los procesadores: editor, compilador, depurador, enlazador Herramientas relacionadas con los procesadores de lenguajes Las tcnicas empleadas en la construccin de traductores, compiladores e intrpretes pueden aplicarse en la construccin de otras herramientas: Editores sensibles al contexto Avisan al programador de posibles errores sintcticos cuando est escribiendo un programa fuente. Actualmente es muy comn editores con sintaxis resaltada con colores, Conversores de formato Utilizan las tcnicas de los traductores para convertir una descripcin de ficheros en otra.

14

Preprocesadores Toman como entrada un conjunto de instrucciones y generan cdigo en un lenguaje de alto o medio nivel. Formateadores de cdigo fuente Toman como entrada un cdigo fuente y obtienen a la salida el mismo mostrado de manera que se pueda seguir la estructura del programa. Generadores de cdigo Permiten desarrollar aplicaciones a partir de unas especificaciones muy compactas, que pueden ser tratadas como un lenguaje de aplicacin. Un caso particular son los generadores de pantallas. Verificacin esttica de programas Leen el cdigo fuente y lo analizan para descubrir errores potenciales sin ejecutar dicho programa. Formateadores de texto Reciben como entrada un texto con indicaciones de cmo se desea la salida y generan dicho texto formateado en un fichero, o para una determinada impresora. Pueden estar especializados para frmulas matemticas, qumicas, msica, etc. Intrpretes de comandos de un sistema operativo Reciben rdenes del sistema operativo, las analizan y las ejecutan ( Ej.: COMMAND.COM de MSDOS). Construccin de entornos operativos Caso particular del anterior en el cual las rdenes suelen recibirse de forma grfica ( Ej. WINDOWS). Intrpretes para consultar base de datos: reciben las consultas, las analizan y las ejecutan (EJ.: SQL). Compiladores de silicio Utilizan las mismas tcnicas de construccin de compiladores e intrpretes pero implantadas en hardware. Procesamiento de lenguajes naturales Aplican las tcnicas de construccin de traductores a los lenguajes naturales, permitiendo el anlisis comprensin y traduccin (inteligencia artificial). Reconocimiento del habla Se realiza un anlisis de los sonidos para construir palabras (redes neuronales) Tipos de lenguajes de programacin Los lenguajes de programacin se pueden clasificar desde diferentes puntos de vista: Segn el grado de independencia de la mquina(nivel): Lenguaje mquina Representa la forma ms baja de un lenguaje de programacin., escrita en la notacin que entiende directamente un ordenador binario o hexadecimal. Se basa en la arquitectura de la mquina de Von Neumann. Lenguaje ensamblador Representa una versin simblica de un lenguaje mquina. Cada cdigo de operacin se indica por un cdigo simblico: ADD, MUL...Asignaciones de memoria se dan con nombre simblicos Lenguaje de nivel intermedio (caso del lenguaje C) Al ser un nivel intermedio dispone de caractersticas de los de bajo y alto nivel Caractersticas de los lenguajes mquina: Acceso directo a posiciones memoria. Almacenan variables en registros del procesador.. Caractersticas de lenguajes de alto nivel: Manejo de estructuras de control, Manejo de datos Lenguaje de alto nivel Caractersticas superiores a los lenguajes ensambladores No tienen acceso directo al sistema, estructuras de pueden ser datos complejas, utilizacin de bloques, procedimientos o subrutinas, (smalltalk, C++, Ada, Java, turbo Pascal) Lenguajes orientados a problemas concretos Resolucin de problemas en un campo especfico (SQL, XBASE, PostScript, SPSS)

15

Segn la forma de las instrucciones (caractersticas intrnsecas al lenguaje: Lenguajes imperativos o procedurales Orientados a instrucciones o sentencias, hacen uso masivo de variables, incorporacin de mecanismos de bloques. Estn Influidos por la mquina de Von Neumann. Programacin estructurada ( Pascal, C++, COBOL..). Lenguajes declarativos: lgicos y funcionales Lenguajes de muy alto nivel con notacin muy prxima al problema real del algoritmo que resuelven. - Funcionales: sus construcciones son llamadas a funciones. No hay instrucciones. Todo el programa es una funcin y todas las operaciones son funciones ms simples. En la ejecucin se aplica la funcin a datos de entrada (argumentos) y se obtiene el resultado calculado por la funcin (LISP). - Lgicos: instrucciones se forman siguiendo un tipo de lgica, maneja relaciones (predicados) entre objetos (datos). La relaciones se especifican con reglas y hechos. La ejecucin consiste en demostraciones de hechos sobre las relaciones mediante preguntas (PROLOG). Lenguajes concurrentes: Dos o ms tareas simultaneas o paralelas. Pueden ser una caracterstica propia del lenguaje o el resultado de ampliar las instrucciones de un lenguaje no concurrente: Ada, Concurrent C, concurrent Pascal. Lenguajes orientados a objetos: Basados en la teora de los objetos que permitiendo: la encapsulacin, herencia y polimorfismo ( java, C++, smalltalk). Segn la generacin: Primera generacin: Lenguajes mquina y ensamblador en los aos 50 Segunda generacin: Lenguajes con asignacin esttica de memoria ( en tiempo de compilacin). No manejan recursividad ni estructuras dinmicas de datos en los aos 60. (FORTRAN, COBOL). Tercera generacin: Programacin estructurada en los aos 70. Uso de subprogramas o mdulos, variables locales, recursividad y estructuras dinmicas.(Algol, PL/I, PASCAL, MODULA). Cuarta generacin: De muy alto nivel para tareas especficas a primero de los aos 80. Base de datos, herramientas CASE Quinta generacin: Inteligencia artificial (LISP PROLOG) Generacin orientada a objetos: Con la proliferacin de las interfaces grficas de usuarios en los aos 90 Generacin visual: Exigencia de los usuarios de interfaces amigables en los aos 90 (Visual Basic, Delphi) Generacin Internet: Necesidad de manejar aplicaciones en diferentes plataformas dentro de internet (Java, XMN, HTML, VRML) Otros lenguajes En informtica tambin se utilizan otros lenguajes que no son de programacin y que tienen otras aplicaciones, como pueden ser para describir formatos de texto, grficos, de sonido, etc. En cualquier caso, todos los lenguajes no naturales son formales, surgen primero las reglas gramaticales y se ajustan con todo rigor a ellas. Gracias a ello se pueden construir procesadores ( trmino genrico que hace referencia al proceso de transformacin) Tipos de lenguajes que no son de programacin: De descripcin de pginas: Postcript, True Page.... De formatos grficos no vectoriales: TIFF, GIF, PCX, BMP, JPEG.... De formatos grficos vectoriales: DXF, CGM.... De formatos de bases de datos: DBF, DBT, MDX.... De formatos de texto: RTF, ASCII, Word, WordPerfect.... De formatos de archivos de sonido: WAV, MIDI, MP3.... De formatos de archivos de vdeo: AVI, MOV,... De formatos de ayuda: HLP de Windows, HLP de Turbo Visin... De gestin electrnica de documentos e hipertexto: pdf de Acrobat, HTML, XML.....

16

TEMA 2 LENGUAJES FORMALES


2.1.- Conceptos bsicos sobre palabras. Lenguaje formal - Un lenguaje formal es un conjunto de palabras definidas sobre un alfabeto. Alfabeto - Se llama alfabeto a un conjunto finito, no vaco de smbolos. Se representan por (). Un alfabeto se define por la enumeracin de los smbolos que lo contiene. Ejemplos de alfabetos: 1 ={a,b}, 2={0,1}, morse ={.- , .-- ,..}, ASCII ={A, %, } HTML ={<HTML>, <BODY>, A..Z, a ..z,.}, =Conjunto de palabras de un diccionario Si 1 y 2 son alfabetos, 1 2 es un nuevo alfabeto. Si 1 y 2 son alfabetos, 1 2 es un nuevo alfabeto, siempre que 1 2 Smbolo - Un smbolo es un componente mnimo e indivisible que puede formar parte de una palabra. Un smbolo es una entidad abstracta que no tiene definicin. Los smbolos pueden estar formados por ms de un componente. a 1,, . morse, <HTML> Cadena, palabra - Una palabra es a una secuencia finita de smbolos de un alfabeto. Las palabras se representan por los ltimos smbolos del alfabeto castellano en minsculas x.y,z,.. x(1)=abab a , a es una palabra definida sobre . Cualquier programa (p.e en Pascal) ser una cadena sobre el alfabeto de caracteres ASCII Longitud de una palabra x - La longitud de una palabra es el conjunto de smbolos que tiene esa palabra, se representa por |x| x =aaaabb ; |x| = 6 Palabra vaca - es una palabra que no tiene smbolos, se representa por (psilon), y su longitud es 0, x= ; |x|=0. Un alfabeto , nunca tiene el smbolo vaco . = {a, b}, *={, a, b, ab, ba, aa, bb, aaa........}, * Sea el alfabeto , * es el conjunto de todas las palabras que se pueden formar con . Sobre cualquier alfabeto , * es infinito. * se denomina lenguaje universal definido sobre . Subpalabra - Sea una palabra x definida sobre ; subpalabra de x es una nueva palabra y, definida sobre el mismo alfabeto, formada por smbolos de x entrescados de forma consecutiva de sta. Sean x, y, z, v *, y es subpalabra de x si z, v * | x = vyz Sea x=aab, donde ={a, b}, subpalabras de (x) = {, a, aa, b, ab, aab} Subpalabra propia - x es una subpalabra propia de y existen z,v siendo alguna de ellas no vaca tales que vxz=y Prefijo de una palabra, es una subpalabra entresacada desde el inicio de dicha palabra. Sean x, y, z *, y es prefijo de x si z * | x = yz Sea x=aab, donde ={a, b} , prefijos(x) = {, a, aa, aab} Prefijo propio - y es prefijo propio de x si x =y z, si z + , z | x = yz Sufijo de una palabra, es una subpalabra entresacada desde el final de dicha palabra. Sean x, y, z *, y es sufijo de x si z * | x =z y Sea x=aab, donde ={a, b}, sufijo de (x) = {, b, ab, aab} Sufijo propio - y es sufijo propio de x si z + , z | x = z.y Cualquier palabra x incluyendo la palabra vaca, son prefijo y sufijo de s misma Subsecuencia de una palabra x, es una combinacin de smbolos de dicha palabra en orden, pero no tienen que ser consecutivos. Sea x=abab, donde ={a, b}, subsecuencias de (x) = {, bb, ab,..}

17

2.2.- Operaciones con palabras. Al estar los lenguajes formales compuestos de palabras, las operaciones de lenguajes formales, sern operaciones con palabras. Las operaciones a destacar con palabras son las siguientes: Concatenacin de palabras (.) Sean dos palabras x,y definidas sobre el mismo alfabeto , la concatenacin de ambas x.y (xy) es una nueva palabra z, formada por los smbolos x seguidos de los smbolos de y. x().y()=x()y()=z () x=ab, y=aa ; xy=z=abaa ; |x|+|y|=|z| Propiedades de la concatenacin x, y *, la operacin concatenacin (.) cumple las siguientes propiedades: Operacin cerrada x.y =z P. asociativa x(yz) = (xy)z E. neutro x = x=x Potencia de una palabra Dado que la concatenacin permite la propiedad asociativa, una palabra x, se puede concatenar consigo misma un nmero determinado n de veces, dando lugar a la potencia n-sima de esa palabra xn x=aab, x0= , x3=aabaabaab Propiedades de la potencia x * xn *
xn = si n=0 xn-1x si n>0

|xn|=n |x| Palabra inversa (refleja, transpuesta) Dada una palabra x definida sobre un alfabeto , su inversa o refleja x-1 (xi ), es una nueva palabra definida sobre el mismo alfabeto, formada por los mismos smbolos que tiene x pero situados en orden inverso. x=aab , x-1=baa Propiedades de la inversin x * x-1 *
x-1 =
-1

-1

si

x=

y a si x=ay

|x|=|x | La operacin inversa cumple la propiedad de idempotencia ( x-1 ) -1 = x Una palabra es igual a otra s tienen la misma longitud y los smbolos en la misma posicin.

2.3.- Conceptos bsicos de lenguajes formales


Un lenguaje formal L definido sobre un alfabeto , es cualquier subconjunto de *, conjunto de palabras con una significacin propia (lgica comn) y, tiene una definicin formalizada L() * L()={x* | x cumple con la definicin formal del lenguaje}

18

Ejemplos de lenguajes formales definidos sobre el alfabetos = {a,b}: L1 = {}= , lenguaje vaco Cardinal ({})=0 L2 = { }, lenguaje no vaco Cardinal ({ })=1 L3 = {a, b}, el lenguaje coincide con el alfabeto L4 = {a, ab, } el lenguaje contiene la palabra vaca L5 = {an, n0}= {a0, a1, a2,}={ , a, aa,} lenguaje formado por palabras que contienen cero o ms aes , definido por una notacin matemtica L6 ={anbm | n, m0}={a0b0, a0b1, .}= {, b,}={ , b,} lenguaje formado por palabras formadas por (0 o ms) aes seguidas de (0 o ms) bes, definido por una notacin matemtica L7 ={palabras formadas por un nmero impar de aes}={ a, ba, ab, bab, aaba,} *=lenguaje universal de , o cierre de . Lenguaje, formado de todas las palabras que se pueden construir con los smbolos {a,b} sin limitacin de orden y longitud, incluyendo la palabra vaca. 2.4.- Operaciones con lenguajes. Al ser un lenguaje formal un conjunto de palabras, se puede aplicar toda la teora de conjuntos sobre ellos. En ste texto vamos a estudiar las siguientes operaciones con lenguajes formales: Sean L1 y L2, lenguajes definidos sobre , L1, L2 * L1 ={, a, aa, aab}, L2 ={b, bb, aa, aabb} - Alternativa o unin de lenguajes Dado dos lenguajes L1 y L2 definidos sobre un mismo alfabeto , la unin de ambos es un nuevo lenguaje L3 , definido sobre el mismo alfabeto y formado por las palabras de L1 y L2 L1 | L2 = L1 L2 = {x * | xL1 xL2 } L1 ={, a, aa, aab} , L2 ={b, bb, aa, aabb} L1 | L2 ={ , a, aa, aab, b, bb, aabb} Propiedades que cumple la operacin (|) unin de lenguajes L * se cumplen las siguientes propiedades: Operacin cerrada L1| L2 = L3 P. idempotente L1| L1 = L1 P. conmutativa L1| L2 = L2|L1 P. asociativa L1| (L2|L3) = (L1|L2)|L3 E. neutro L1| = L1 - Concatenacin o yuxtaposicin Dado dos lenguajes L1 y L2 definidos sobre un mismo alfabeto , la concatenacin de ambos es un nuevo lenguaje L3, definido sobre el mismo alfabeto y formado por las palabras de L1 concatenadas con las palabras de L2 L1L2=L1 L2 = { xy *| xL1 yL2 } L1 ={, a, aa, aab} , L2 ={b, bb, aa, aabb} L1. L2 ={ b, bb, aa, aabb, ab, abb, aaa, aaabb, aabb, aabbb, aabaa, aabaabb } Propiedades que cumple la operacin (.) concatenacin de lenguajes L * se cumplen las siguientes propiedades: Operacin cerrada L1 L2 = L3 P. asociativa L1 (L2L3) = (L1L2)L3 E. neutro L1. = .L1=L1

19

La operacin concatenacin de lenguajes formales cumple con la propiedad distributiva con respecto a la operacin unin P. distributiva L1 (L2|L3) = (L1 L2|( L1L3) (L1|L2)L3 = (L1 L3)| ( L2L3)

- Potencia de lenguajes Dado que la concatenacin de lenguajes formales permite la propiedad asociativa, un lenguaje formal L1 se puede concatenar consigo mismo, un nmero determinado n de veces, dando lugar a la potencia n-sima de ese lenguaje Ln Ln=LLL..n veces L L1 ={,a,aa,aab} L1L1=L12 ={, a, aa , aab, a, aa, aaa, aaab, aa, aaa, aaaa, aaaab, aab, aaba, aabaa, aabaab} Propiedades de la potencia de lenguajes L * Ln * Operacin cerrada L * , Ln * Li .L = L.Li=Li+1 Cualquier lenguaje L0=
Ln =
n-1

si n=0

L L si n>0

En la definicin anterior existe una incongruencia para el lenguaje L= , 0= - L* (L estrella, cierre de Kleene) L* es el conjunto de palabras que se pueden formar al concatenar en cualquier orden y cantidad las palabras de L, incluyendo la palabra vaca.

L*=L |L | ..L = U Li Sea L1 ={, a, aa, aab}


i=0

L1* ={ } | {,a,aa,aab} | {, a, aa , aab, a, aa, aaa, aaab, aa, aaa, aaaa, aaaab, aab, aaba, aabaa, aabaab} | {.} | - L+ (L mas , cierre positivo de L) L+ es el conjunto de palabras que se pueden formar al concatenar en cualquier orden y cantidad las palabras de L Sea L1 ={, a, aa, aab} L+=L1| L2..Ln=L+= U Li
i=1

L1+ ={,a,aa,aab} | {, a, aa , aab, a, aa, aaa, aaab, aa, aaa, aaaa, aaaab, aab, aaba, aabaa, aabaab} | {.} L*= L+| L0 ; L*= L+| {} ; L+= L* sii L ; L+=L*.L - * ( sigma estrella, lenguaje universal sobre ) * es el conjunto de palabras que se pueden formar al concatenar en cualquier orden y cantidad los smbolos de , incluyendo la palabra vaca.

*= | | .= U i
0 1 2

*=L* sii L ; *=L+ sii L y L

i=0

20

- + (sigma mas) + es el conjunto de palabras que se pueden formar al concatenar en cualquier orden y cantidad los smbolos de , += 1|2.= U i
i=0

=L sii L y L ; L* ; + *
+ + +

- Interseccin de lenguajes Dado dos lenguajes L1 y L2 definidos sobre un mismo alfabeto , la interseccin de ambos L1L2 es un nuevo lenguaje L3 definido sobre el mismo alfabeto y formado por las palabras que pertenecen a L1 y a L2 L1 L2 = {x * | xL1 xL2 } L1 ={, a, aa, aab} , L2 ={b, bb, aa, aabb} L1L2 ={aa} Propiedades de la operacin (.) interseccin de lenguajes L * se cumplen las siguientes propiedades: Operacin cerrada L1 L2 = L3 P. idempotente L1 L1 = L1 P. conmutativa L1 L2 = L2L1 P. asociativa L1 (L2L3) = (L1L2) L3 E. neutro L1 *= L1 P. distributiva L1 (L2L3) = (L1 L2) (L1 L3) L1 (L2L3) = (L1L2) (L1 L3) - Sublenguaje de otro Sean dos lenguajes definidos sobre un alfabeto: L1 ={, a, aa, aab}, L2 ={ , a, aa, aab, b, bb, aabb} L1 es sublenguaje de L2 si L1 L 2 Todo lenguaje L1 definido por un alfabeto , es un sublenguaje del lenguaje universal *, L1 * L1={, a, aa, aab} { , a, b, aa, bb, ab, ba, aab,..} Dos lenguajes son iguales si todos sus elementos son iguales - Diferencia de lenguajes formales Dado dos lenguajes L1 y L2 definidos sobre un mismo alfabeto , la diferencia de ambos L1-L2, es un nuevo lenguaje L3 definido sobre el mismo alfabeto y formado por las palabras que pertenecen a L1 y no pertenecen a L2 L1-L2 = {x * | xL1 xL2 } L1 ={, a, aa, aab} , L2 ={b, bb, aa, aabb} L1-L2={, a, aab} Propiedades de la operacin (-) diferencia de lenguajes L * se cumplen las siguientes propiedades: Operacin cerrada L1- L2 = L3 P. idempotente E. neutro L1 - L1 = L1 L1- = L1

21

- Complemento de un lenguaje: Dado un lenguaje L definido sobre un alfabeto , su complementario L, es un nuevo lenguaje formal definido sobre el mismo alfabeto, compuesto de todas las palabras que se pueden formar con los smbolos de (* lenguaje universal) menos las palabras del propio L, L= * - L __ L = { x * | x * xL} Propiedades: L * se cumplen las siguientes propiedades: Operacin cerrada L * ; L * L = * - L L =L L L= L U L = *
- Otras propiedades: leyes de Morgan

L1 L2 = L1 U L2 L1 U L2 = L1 L2 - Lenguaje inverso Dado un lenguaje L definido sobre el alfabeto , su inverso L-1 es un nuevo lenguaje definido sobre el mismo alfabeto y, formado por las palabras inversas de L L-1 = { x-1 * | xL } L ={, a, aba, aab} , L-1 ={ , a, aba, baa } 2.5.- Mecanismos formales Un lenguaje formal se define por las propiedades que cumplen las palabras que lo componen. Las propiedades que cumplen las palabras del lenguaje deben permitir representarlas de una manera formalizada. Si el lenguaje es finito, para su definicin basta con su enumeracin, conocer su representacin L= { a, aa, aaa} lenguaje cuyas palabras estn formadas por: una, dos o tres aes Si es infinito no puede ser enumerado, habr que buscar un medio finito y preciso para su definicin. Pero ocurre que no todos los lenguajes formales pueden definirse de una forma finita y precisa L={, a, ,aa, ..ab, aab,b, bb, abb. .} = L={anbm | n,m0} Tiene una definicin en notacin matemtica, pero dicha definicin no aporta informacin para su tratamiento L= { a, abbaa, aabab, ababa, abbaa, aaabb,aaaaabbbb,.} {palabras que tienen un nmero impar de aes, empiezan por el smbolo a y tienen una a ms que bes} La definicin no es precisa, con las palabras anteriormente representadas, y dicha definicin no aporta informacin para su tratamiento Para evitar los anteriores problemas de indefinicin y tratamiento, se crearon los mecanismos formales: expresiones regulares, autmatas y gramticas: Las expresiones regulares son mecanismos que sirven para describir un tipo de lenguaje formal (lenguajes regulares). Los autmatas son mecanismos que permiten especificar de manera finita y precisa cualquier lenguaje formal, mecanismos que permiten simular el reconocimiento del lenguaje para dicha especificacin

22

Las gramticas son mecanismos que permiten especificar de manera finita y precisa cualquier lenguaje formal, mecanismos permiten simular la generacin de las palabras del lenguaje especificado. En este tema se ha hecho referencia a la definicin lenguaje formal para diferenciarlo de lenguaje natural. En general, un lenguaje natural es aquel que ha evolucionado con el paso del tiempo para fines de la comunicacin humana, evolucionan sin tener en cuenta reglas gramaticales estrictas que puede resolver situaciones ambiguas. Mientras que los lenguajes formales, al contrario que los naturales, estn definidos por reglas de produccin preestablecidas y se ajustan con todo rigor y formalidad a ellas. Ejercicios sobre lenguajes formales 1 - Alfabeto de entrada para los lenguajes- java , C, Pascal 2 - En una palabra de longitud n cuantas subpalabras hay en las definiciones: Prefijos, sufijos, prefijos propios,.. 3- Demostrar que (xy)-1= y-1.x-1 x,y *. 4 - Dados los siguientes lenguajes formales definidos sobre el alfabeto = {a, b}: L0={} L1={} L2={a} L3={a,b} L4={(ab)n | 0<= n < 2 } L5={ambl | m,l >= 0 } L6={anbn | n>=0 } L7 ={lenguaje formado por las palabras que tienen un nmero impar de aes}

Determinar para cada uno de ellos L0, L3 y L* 5- Sean las siguientes operaciones con los anteriores lenguajes formales: L0n L1n, L0n| L1n, L3n L1n, L3n | L1n, L3n L0n, L3n| L0n, L7n L5n, L7n| L5n , L0n , L3n, , L7n 1. Determinar qu lenguajes definen suponiendo que n = 0. 2. Determinar qu lenguajes definen suponiendo que n = 3 3. Determinar qu lenguajes definen suponiendo que n = * 6- Sea un alfabeto cualquiera y L un lenguaje cualquiera definido sobre el alfabeto anterior. Para cada una de las siguientes igualdades, justificar si siempre son ciertas o no. L*=L+ *=L+ L =*- L = L*-L +=L+ L+=L*- +=*- *=(*)-1 *= =+ L1-L2 = L1 L2 = L1L2 (L*)*=(L+)*=(L*)+=L*=(L+)+

(L*)I=(LI)* L1- (*-L1)=L1 L1-*-L1= L1-L2 = L1 L2 = L1L2 7 - Sea L1 un lenguaje definido sobre un alfabeto ={a,b} formado por las palabras que tienen un nmero impar de smbolos a y como mximo dos smbolos b consecutivos. Ejemplos vlidos: a, aaba, aaabbaba, babbabbab Ejemplos no vlidos: , aabbba, bb, abbabbaba Sea L2 un lenguaje definido sobre un alfabeto ={a,b} formado por las palabras que tienen un nmero par de smbolos a (el 0 se considera un nmero par) y como mximo dos smbolos b consecutivos. Ejemplos vlidos: , aa, aaaba, aaabbaaba, baabbabbab, bb Ejemplos no vlidos: a, aabbbaa, aabbabbaba Justificar si se cumplen o no las siguientes igualdades: L1 | L2=* , L1.L2=L2.L1 , L1*=* , L1=L2 complementario

23

2.6.- Gramticas Formales Una gramtica es un mecanismo formal generador de lenguajes formales, que especifica de una manera finita y precisa el conjunto de palabras que componen el lenguaje al que se quiere definir. Una gramtica est formada por un conjunto finito no vaco de reglas (producciones) a travs de las cuales se obtiene (genera) un lenguaje. - Definicin formal Una gramtica es un mecanismo formal compuesto por cuatro elementos G = (, N, S, P) en donde: - es el alfabeto terminal, alfabeto de las palabras del lenguaje que genera la gramtica N - es el alfabeto no terminal, alfabeto auxiliar que determina la complejidad de la estructura de las palabras a generar por la gramtica N= S - es el smbolo inicial a partir del cual se obtienen todas las palabras del lenguaje a generar por la gramtica SN P - es un conjunto finito de reglas de produccin a travs de las cuales se obtienen todas las palabras del lenguaje que genera la gramtica. P: { 11, 22..} , i ( N | )* N ( N | )*, i ( N | )* Ejemplo Sea un lenguaje formal compuesto por las palabras que se ajustan a la siguiente definicin: L( )={anbm | n, m0}={a0b0, a0b1, a1b0, a1b1,. Una gramtica que genera dicho lenguaje es la siguiente: G = ( ={a,b}, N={S,A,B},S, P) P: S AB A Aa | B Bb | - Derivacin en el entorno de una gramtica Derivacin en el entorno de una gramtica - es un proceso enfocado en la obtencin de las palabras del lenguaje que genera dicha gramtica Sea una gramtica G = (, N, S, P) P: { 11, 22, .. } (N | )*N( N| )*, ( N|)* L(G)={ x * | xG ( x deriva de G) } - Derivacin directa (derivacin de un paso) Consiste en aplicar sobre una palabra ( N | )* N ( N | )* obtenida de la gramtica G, una produccin 11 de la propia gramtica G. Sea la palabra 1 = 112
;

1,2 ( N | )*

1 (N | )* N (N | )*

Aplicando la produccin 11 de la gramtica G sobre dicha palabra 1, la palabra 1 se transforma en 112= 2 en donde 1,1,2 ( N | )* Es decir 112112
,

12

Por lo que puede decirse que la palabra 1 produce la palabra 2 (de ah el nombre de produccin en la definicin de gramticas), o bien que la palabra 2 deriva de la palabra 1. En un proceso de derivacin de un paso o produccin directa, es un proceso no determinista que slo se aplica a una produccin, aunque dicha produccin u otras de la gramtica se puedan aplicar sobre la misma palabra . Una palabra se deriva o se produce as misma sin aplicar el proceso de derivacin, se dice que se deriva en cero pasos.

24

Relacin de derivacin Sean las palabras i,m (N | )* N (N | )* se dice que estn en relacin de derivacin en la gramtica G, si la palabra (i produce la palabra m) o m deriva de la palabra i en cero o ms derivaciones directas. ij ; jk ; km La representacin de un proceso de cero o ms derivaciones se representa de la siguiente forma: i*m , de la misma manera para representar un proceso de una o ms derivaciones es la siguiente: i+m - Lenguaje generado por una gramtica Conjunto de palabras definidas sobre el alfabeto , que se obtienen desde el smbolo inicial en un proceso de derivacin de cero o ms pasos. S 1 2 3. x = x * L(G)={x | x * , S*x} Lenguaje generado por la siguiente gramtica: G = ( ={a, b}, N={S, A, B}, S, P) P: S AB A Aa | B Bb | AaB AaaB aB Aa AaBb Bb AabB bB AbBb Ab Aa anbm | n1, m0

SAB

. bm |m0 anbm | n0, m1

L(G)= {anbm | n0, m0}

AbB

... an | n0

Forma sentencial cualquier palabra obtenida de un proceso de derivacin; en el anterior ejemplo cualquier palabra derivada desde S: S , AB, ..aaabb, son formas sentenciales Si la forma sentencial est compuesta nicamente por smbolos terminales de la gramtica, se llama sentencia . En el ejemplo anterior son sentencias: , a , b, aa,..aaabb A partir de la anterior definicin, se puede decir que, el lenguaje generado por una gramtica es el conjunto de sentencias que pueden obtenerse desde el smbolo inicial en un proceso de derivacin. - Gramticas equivalentes Una gramtica genera un solo lenguaje, pero un lenguaje puede ser generados por muchas gramticas. Dos o ms gramticas se dice que son equivalentes, si generan el mismo lenguaje. Ejemplo: G1 = ( ={a, b}, N={S, A, B}, S, P) P: S AB A Aa | B Bb |

25

G2 = ( ={a, b}, N={S, A, B}, S, P) P: S aA| bB | A Aa | |bB B Bb |

Las gramticas G1 y G2 son equivalentes. Ambas generan el mismo lenguaje: L={anbm | n,m0}={a0b0, a0b1, a1b0, a1b1,. .} 2.7.- Clasificacin de las gramticas Noam Chomsky en 1959 clasific las gramticas en cuatro familias (Jerarqua de Chomsky) de gramticas, que difieren, atendiendo a la forma que pueden tener sus reglas de produccin. Sea una gramtica G = (, N, S, P) P: { ,..} ( N | )* N ( N | )*, ( N | )* clasificaremos las gramticas, en los siguientes cuatro tipos: - Gramticas de Tipo 3 (Gramticas regulares). Pueden ser a su vez, de dos tipos: Lineales por la derecha. Todas sus producciones son de la forma: A aB Aa A en donde A, B N , a Lineales por la izquierda. Todas sus producciones son de la forma: A Ba Aa A en donde A, B N , a Los lenguajes generados por estas gramticas se llaman lenguajes regulares o lenguajes de tipo 3 y, todos forman la clase de lenguajes L3. * Existen otras definiciones sobre las gramticas de tipo 3, entre otras, como aquellas que permiten las producciones de la forma: AaB, Aa y S (siempre que el lenguaje tenga la palabra vac a) En nuestro caso hemos cogido la ms simple ya que permite una mayor flexibilidad en el tratamiento y transformacin entre los mecanismos regulares. - Gramticas de Tipo 2 (Gramticas libres del contexto). Las producciones son de la forma: A donde A N , ( N | )* Los lenguajes generados por este tipo de gramticas se llaman lenguajes libres del contexto o lenguajes de tipo 2 y, todos forman la clase de lenguajes L2. - Gramticas de Tipo 1 (Gramticas sensibles al contexto). Las producciones son de la forma: en donde ( N | )* N ( N | )*, ( N | )*

||||

Se permite adems la produccin S siempre y cuando no aparezca el smbolo no terminal S en la parte derecha de ninguna regla de produccin. El sentido de estas reglas de produccin A es el de especificar que el smbolo A puede ser reemplazado por , en una derivacin directa slo cuando A aparezca en el contexto" de A .

26

Las producciones de este tipo de gramticas cumplen siempre que la parte izquierda tiene longitud menor o igual que la parte derecha, pero nunca mayor (excepto para S ). Esto quiere decir que la gramtica es no contrctil. Los lenguajes generados por las gramticas de tipo 1 se llaman lenguajes sensibles al contexto y, forman el conjunto de lenguajes de tipo L1 - Gramticas de Tipo 0 (Gramticas con estructura de frase, no restringidas) Son las gramticas ms generales, que por ello tambin se llaman gramticas sin restricciones. Esto quiere decir que las producciones pueden ser de cualquier tipo permitido, es decir, de la forma: , ( N | )*N ( N | )* ( N | )* Los lenguajes generados por estas gramticas son los lenguajes con estructura de frase, que se agrupan en la clase de lenguajes de tipo de L0. Estos lenguajes tambin se conocen como lenguajes recursivamente enumerables. Relacin de inclusin de las gramticas: Tipo 3 Tipo 2 Tipo 1 Tipo 0

Tipo 0

Tipo 1

Tipo 2

Tipo 3

2.8.- Determinacin del tipo de una gramtica Para determinar el tipo de una gramtica G, basta por equiparar las producciones de dicha gramtica a las producciones de las familias de los tipos de gramticas, empezando por las producciones de tipo superior, de no ser as se baja de tipo hasta encontrar un tipo que coincida con la dada. Ejemplo, dada la siguiente gramtica determinar el tipo de la misma. G = ( ={a,b}, N={S,A,B},S, P) P: S AB A Aa | B Bb |

La produccin S AB tipo 3 la gramtica G no es de tipo 3 Todas las producciones: {S AB, A Aa | , B Bb |}tipo 2, la gramtica G es de tipo 2 2.9.- Tipos de lenguajes formales De los tipos de familias de gramticas creados por Noam Chomsky (Jerarqua de Chomsky) se obtiene una clasificacin en los lenguajes que generan. Dado que un lenguaje, puede ser generado por varias gramticas, gramticas equivalentes que pueden ser de tipo diferente, existe un problema a la hora de relacionar lenguajes con gramticas, que tipo de gramtica asociar al lenguaje. Para solucionar la anterior indecisin, podemos aplicar el siguiente axioma a la hora de determinar el tipo del lenguaje generado por la gramtica: un lenguaje es de tipo N (N=0,1,2,3), si existe una gramtica con un tipo N que lo genera y no otra de un tipo N superior. Sea el lenguaje L()={anbm | n, m0}={a0b0, a0b1, a1b0, a1b1,.}, lenguaje que puede ser generado entre otras por las gramticas G1 y G2 Ejemplo: G1 = ( ={a, b}, N={S, A, B}, S, P) P: S AB , A Aa | , B Bb | G1 es una gramtica de tipo 2

27

G2 = ( ={a, b}, N={S, A, B}, S, P) P: S aA| bB | , A Aa | |bB , B Bb | G2 es una gramtica de tipo 3 Para determinar el tipo al que pertenece el lenguaje, ser el tipo de la gramtica con el tipo superior que lo genere, para este caso el tipo del lenguaje L()={anbm | n, m0 } ser de Tipo 3 (no existe una gramtica de un tipo superior que lo genere). Sea el lenguaje L( )={anbn | n0}={a0b0, a1b1, a2b2, a3b3,. G = ( ={a,b}, N={S,A,B},S, P) P: S aSb | El lenguaje anterior es de tipo 2, no existe una gramtica de un tipo superior que lo genere. El conjunto de los lenguajes de tipo 3 (regulares) definidos sobre un alfabeto , est incluido propiamente en el conjunto de los lenguajes tipo 2 ( libres de contexto) y, ste a su vez, est incluido propiamente en el conjunto de los lenguajes de tipo 1 (sensibles al contexto), que lgicamente est incluido en el conjunto de lenguajes tipo 0 (con estructura de frase). Relacin de inclusin de los tipos de lenguajes: L3 L2 L1 L0

L0

L1

L2

L3

Ejercicios de gramticas 1- Obtener una gramtica para cada uno de los siguientes lenguajes: a) = {a, b, c}, L = {an bm cn | n, m >= 1} b) = {a, b, c}, L = {an bm cn+2m | n >=0, m >= 1} c) = {a, b, c}, L = {an bn+m cm | n >= 1, m >= 0} d) = {a, b}, L = {an bm | n >= m >= 1} e) = {a, b}, L = {an bm | n > m >= 0} f) = {a, b, c}, L = {am bn ck | m > n + k ; n, k >=0} g) = {a, b}, L = { anbm | m <= n <= 2m ; n, m >=0} h) = {a, b}, L = { anbm | n <>m ; n, m >0} 2- Construir una gramtica que especifique el siguiente lenguaje: L = { w {0, 1, 2}* | w contiene exactamente dos o tres smbolos 0 en cualquier posicin}. Sera posible obtener una gramtica regular o de tipo 3? 3- Para las gramticas que se proponen a continuacin, determinar el tipo de las mismas y el lenguaje generado. a) S 0S | A A 0B | 0 B 1A b) S abA | bbB A bC Ba C cS |

28

4- Sea la siguiente gramtica definida sobre el alfabeto = {a, +, = } S BSa | aSa | a+a=aa Ba aB B+ +a Obtener el lenguaje generado por la misma 5 - Dado el alfabeto = {a, +, = } y el siguiente lenguaje: L={an+am=an+m | n, m > 0}, construir una gramtica de tipo 2 que defina dicho lenguaje. 6- Dado el alfabeto = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + ,- ,*, / }, sea el lenguaje L formado por todas las expresiones aritmticas que se pueden formar con los smbolos de este alfabeto, donde 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 son operandos y , + ,- ,*, / son los operadores binarios de suma, resta, producto y divisin respectivamente. Por ejemplo, pertenecen a este lenguaje las palabras 1, 1+0 y 5+3*8/7, y no pertenecen: 11, +1 1*/2. Determinar el tipo del lenguaje L, justificndolo mediante un mecanismo formal del tipo correspondiente. 7- Sea el lenguaje de sumas de nmeros naturales sobre = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + }. Ejemplos de palabras del lenguaje: 2+67+9870 35 Ejemplos de palabras no vlidas: 34+ 34++23 Representar mediante una gramtica de tipo 2 los siguientes lenguajes: a) Sea L1 el lenguaje de sumas en el que los nmeros naturales no pueden tener ceros a la izquierda. El nmero 0 se representar por un nico cero, nunca por una secuencia de ceros. i. Ejemplo:10+0 ii. Ejemplo de palabra no vlida: 03+12 b) Sea L2 el lenguaje de sumas en el que los nmeros naturales pueden empezar por 0, aunque no sea el nmero 0, pero en cada suma se cumple siempre la condicin de que el primer y el ltimo nmero tienen siempre la misma longitud (al menos habr dos nmeros). i. Ejemplo: 10+1+01 ii. Ejemplos de palabras no vlidas: 03+129 , 1 c) Sea L3 el lenguaje de sumas en el que los nmeros naturales pueden empezar por 0, aunque no sea el nmero 0, pero en el que se cumple la condicin de que al menos dos nmeros tienen la misma longitud. i. Ejemplo: 0503+30+450+89+203+03 8 - Dado el alfabeto ={a,b,0,1}, sea el lenguaje L={w(0|1)v | v,w pertenecen a {a,b}+ y |w|=|v|}, en el que adems se cumplen las siguientes restricciones: Si el dgito central es 0, w deber empezar por a Pero si el dgito central es 1, entonces es v quien empezar por a. Ejemplos de palabras vlidas: aba0bba, a0a, a0b, a1a, b1a, abb1abb Ejemplos de algunas palabras no vlidas: b0a, ba0aa, a1b, ba1ba Obtener una gramtica independiente del contexto que genere el lenguaje pedido, teniendo en cuenta las restricciones. 9- Con el alfabeto ={a,b,c} se define el lenguaje L = {wc n | w pertenece a {a,b}+, n>0} en el que adems se cumple que: si w termina en a, entonces la longitud de w es mayor o igual que n si w termina en b, entonces la longitud de w es menor o igual que n Obtener una gramtica independiente del contexto que genere el lenguaje pedido, teniendo en cuenta las restricciones. 10 - Dado el alfabeto = {a, b} sea el lenguaje: L = { vbbw | v, w {a,b}* y |v| >= |w| (la longitud de v es mayor o igual que la de w) } Obtener una gramtica independiente del contexto que genere el lenguaje pedido, teniendo en cuenta las restricciones.

29

Вам также может понравиться