P. 1
Unidad 1 de Automatas

Unidad 1 de Automatas

|Views: 4|Likes:
Publicado porWence Perez

More info:

Published by: Wence Perez on Apr 27, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

06/01/2015

pdf

text

original

1.

1 ALFABETO
El alfabeto, abecedario o abecé de una lengua o idioma es el conjunto ordenado de sus letras. Es también la agrupación, con un orden determinado, de las grafías utilizadas para representar el lenguaje que sirve de sistema de comunicación. El término alfabeto procede del griego ἀλφάβετον (alfábeton), derivado de las dos primeras letras griegas ἄλφα (alfa, α) y βῆτα (beta, β), derivadas a su vez de las letras fenicias ʾalp y bēt, que significaban ‘buey’ y ‘casa’ respectivamente. El alfabeto griego es una adaptación del alfabeto fenicio, que también dio lugar entre otros al hebreo y al árabe. Por su parte, el término «abecedario» proviene del latín tardío abecedārium, también derivado del nombre de las primeras letras, en este caso cuatro: a (a), b (be), c (ce) y d (de). Algunas letras pueden recibir uno o varios diacríticos con el fin de diferenciar los sonidos de la lengua o poder evitar las ambigüedades. De la misma forma, el alfabeto puede ser entendido por el uso de letras suplementarias. Las evoluciones fonéticas de una lengua se crean a un ritmo diferente de la evolución escrita. La escritura alfabética no garantiza una correspondencia unívoca entre los fonemas y los grafemas. En otros ámbitos (matemáticas, por ejemplo), un alfabeto es un conjunto finito y ordenado de símbolos.

1.2Cadena de caracteres

Esta imagen muestra la relación entre las cadenas de caracteres, las fórmulas bien formadas y los teoremas. En algunos sistemas formales, sin embargo, el conjunto de los teoremas coincide con el de las fórmulas bien formadas. En programación, una cadena de caracteres, palabra, ristra de caracteres o frase (string en inglés) es una secuencia ordenada de longitud arbitraria (aunque finita) de elementos que pertenecen a un cierto lenguaje formal o alfabeto análogas a una frase o a

etc). '@'. mientras que un carácter de esa cadena (un char en inglés) suele ser representado entre comillas simples ('p'). el espacio en blanco ' '. . En general. En este caso. Concatenación: Consiste en unir dos cadenas o más (o una cadena con un carácter) para formar una cadena de mayor tamaño. Por ejemplo. para palabras. símbolos diversos '!'. Búsqueda: Consiste en localizar dentro de una cadena una subcadena más pequeña o un carácter. en principio éstas podrían ser muchas y llegar a ser muy sofisticadas. Enlazados letra a letra. Comparación: Se utiliza para comparar dos cadenas. Generalmente son guardados un carácter a continuación de otro por una cuestión de eficiencia de acceso. en C: char c = 'a'. una cadena de caracteres es una sucesión de caracteres (letras. hay que definir (o conocer) cuales son las operaciones que podemos hacer con ellas. se utilizan normalmente como un tipo de dato predefinido. los números del '0' al '9'. frases o cualquier otra sucesión de caracteres. aquí se exponen algunas de ellas: • • • • • Asignación: Consiste en asignarle una cadena a otra. a esta cadena se la llama cadena vacía. '%'. Las cadenas se pueden almacenar físicamente: • • Seguidas. Representación Una cadena suele ser representada entre comillas dobles superiores ("palabra"). char str[5] = "hola". Desde un punto de vista de la programación. una cadena podrá estar formada por cualquier combinación finita de todo el juego de caracteres disponibles (las letras de la 'a' a la 'z' y de la 'A' a la 'Z'. al considerar las cadenas como un tipo de datos. Extracción: Se trata de sacar fuera de una cadena una porción de la misma según su posición dentro de ella. Un caso especial de cadena es la que contiene cero caracteres. En este mismo ámbito (el de la programación). o matriz de datos de una sola fila (array en inglés). en teoría de autómatas es común denotar a la misma por medio de la letra griega . se almacenan en un vector de datos.una oración. Operación con cadena de caracteres Siguiendo en el ámbito de la informática. si no se ponen restricciones al alfabeto. números u otros signos o símbolos).

' y ' ." y ".length(). const char[]). # en C (Debe haber suficiente espacio en la primera) Nº de caracteres de una cadena int strlen(const char[]).Generalmente para acceder a un carácter en una posición determinada se suele usar la forma variable[posición] como cuando se accede a un vector. Una forma común. No obstante. Para poder mostrar una comilla (") dentro de la cadena y no tener problemas con las comillas que la delimitan. 'Carmen'. # en C++ cadena1 := cadena2 # en Smalltalk Concatenación: unir dos cadenas de caracteres. mientras que C# sí). o de naturaleza estática (su longitud es fija a lo largo del tiempo de ejecución). e. $pareja = "Joshua".cadena2). en muchos lenguajes. de escapar un carácter es anteponiéndole un «\» (sin comillas).: «\"» (sin comillas). p. strcat(cadena1. pareja = "Luisa" & " y " & "Carmen" # en Visual Basic. # en C++ cadena size. pareja = "Luisa" + " y " + "Carmen". cadena3). las expresiones para producir estas secuencias de escape dependen del lenguaje de programación que se esté usando. El final de la cadena se delimita de diferente manera en uno u otro caso: • • Mediante un carácter de fin de cadena ("\0" en C) para las cadenas de tipo dinámico. # en C++ y Java con la clase String. # en Smalltalk strcat(cadena1. Mediante una propiedad de la cadena que delimite su longitud (Length en C#) para las de tipo estático. # en C cadena1=cadena2. En este segundo caso el programador debe prever que al recorrer la cadena los indíces no se vayan de los límites previstos (C no permite que las cadenas crezcan automáticamente de forma explícita. se usan secuencias de escape. Esto se aplica a otros caracteres reservados o no imprimibles como el retorno de carro."Lidia" # en Perl y PHP. [editar] Cadenas dinámicas y estáticas Las cadenas pueden ser de naturaleza dinámica (pueden alterar su longitud durante el tiempo de ejecución). # en Smalltalk Comparación: Compara dos cadenas en orden lexicográfico . [editar] Ejemplos de algunas operaciones comunes Asignación: asignarle una cadena a otra char *strcpy(char []. # en C Devuelve el nº de caracteres sin contar el '\0' cadena. pareja := 'Luisa' .

El código escrito en este tipo de lenguaje se transforma en código máquina para que el procesador pueda procesarlo. Se trata de dos conceptos totalmente diferentes. un lenguaje de programación es un modo práctico para que los seres humanos puedan dar instrucciones a un equipo. por lo tanto. El ensamblador fue el primer lenguaje de programación utilizado. Un lenguaje de programación es muy estricto: A CADA instrucción le corresponde UNA acción de procesador. # en C Devuelvee <0 si la 1ª es menor.int strcmp(const char[]. razón por la cual se han desarrollado lenguajes intermediarios comprensibles para el hombre.' repeat: 5. este lenguaje se parece tanto al lenguaje máquina que depende estrictamente del tipo de procesador utilizado (cada tipo de procesador puede tener su propio lenguaje máquina). # en C++ Devuelve un valor de verdad cadena1 = cadena2 # en Smalltalk Devuelve true o false. el término "lenguaje natural" define un medio de comunicación compartido por un grupo de personas (por ejemplo: inglés o francés)." x 5 # pone 5 puntos en Perl puntos := Generator generateJoin: '. etc. Los lenguajes que los equipos usan para comunicarse entre ellos no tienen nada que ver con los lenguajes de programación. El término "portabilidad" describe la capacidad de usar un programa de software en diferentes tipos de equipos. no es comprensible para los seres humanos. Así. No obstante. que consisten en una serie de 0 y 1 ( datos binarios). Se trata de datos tal como llegan al procesador. cadena1>cadena2. de 5 puntos en Smalltalk # Genera una cadena 1. un programa desarrollado para un equipo no puede ser portado a otro tipo de equipo. const char[]).3 LENGUAJE Lenguaje de programación Un lenguaje de programación" es un lenguaje diseñado para describir el conjunto de acciones consecutivas que un equipo debe ejecutar. pero los desarrolladores pueden comprenderlo. El lenguaje utilizado por el procesador se denomina lenguaje máquina. Por lo tanto. >0 si es mayor y 0 si son iguales cadena1==cadena2. El lenguaje máquina. Para poder utilizar un programa de software escrito en un código ensamblador en otro tipo de equipo. ¡a veces será necesario volver a escribir todo el programa! . Es muy similar al lenguaje máquina. Multiplicar una cadena: repetir una cadena un número de veces $puntos =". Por otro lado. se los conoce como protocolos de comunicación.

los lenguajes imperativos estructurados carecen de flexibilidad debido a la secuencialidad de las instrucciones. diferente al lenguaje máquina. un lenguaje de programación tiene varias ventajas: • • es mucho más fácil de comprender que un lenguaje máquina: permite mayor portabilidad. dividirse en dos categorías: • • lenguajes interpretados lenguajes compilados Lenguaje interpretado Un lenguaje de programación es. Por lo tanto. crea un nuevo archivo independiente que no . agrupados en bloques y compuestos de órdenes condicionales que permiten al programa retornar a un bloque de comandos si se cumple la condición. por definición. Estos fueron los primeros lenguajes de programación en uso y aún hoy muchos lenguajes modernos usan este principio. Un programa escrito en un lenguaje interpretado requiere de un programa auxiliar (el intérprete). Lenguaje de programación imperativo Un lenguaje imperativo programa mediante una serie de comandos. en líneas generales.Por lo tanto. Cuando una función se invoca a sí misma. Lenguaje compilado Un programa escrito en un lenguaje "compilado" se traduce a través de un programa anexo llamado compilador que. lenguajes funcionales. es decir que puede adaptarse fácilmente para ejecutarse en diferentes tipos de equipos. devuelve un nuevo estado de resultado y recibe como entrada el resultado de otras funciones. que traduce los comandos de los programas según sea necesario. a su vez. Interpretación y compilación Los lenguajes de programación pueden. debe traducirse para que el procesador pueda comprenderlo. Lenguaje de programación funcional Un lenguaje de programación funcional(a menudo llamado lenguaje procedimental) es un lenguaje que crea programas mediante funciones. Lenguajes de programación imperativos y funcionales Los lenguajes de programación generalmente se dividen en dos grupos principales en base al procesamiento de sus comandos: • • lenguajes imperativos. hablamos de recursividad. No obstante.

en ciertos casos. Java. Python. pagos en línea.. Además.). copiar su código o incluso modificarlo. ya que cada modificación del archivo fuente (el archivo comprensible para los seres humanos: el archivo a compilar) requiere de la compilación del programa para aplicar los cambios. Sin embargo. ciertas aplicaciones aseguradas necesitan confidencialidad de código para evitar las copias ilegales (transacciones bancarias. Por lo tanto. En efecto. como sólo es necesaria una traducción..class). no es tan flexible como un programa escrito en lenguaje interpretado. en un archivo escrito en un lenguaje ininteligible (por lo tanto diferente al archivo fuente ) y no ejecutable (requeriría un interprete).. existe el riesgo de que los derechos de autor no sean respetados. Algunos ejemplos de lenguajes ampliamente usados A continuación. de ese modo.necesita ningún otro programa para ejecutarse a sí mismo. Por otra parte. sufrir una fase de compilación intermediaria. hace que cualquier persona pueda conocer los secretos de fabricación de un programa y. Este archivo se llama ejecutable. un programa compilado tiene la ventaja de garantizar la seguridad del código fuente.) dado que el programa escrito en estos lenguajes puede. Lenguajes intermediarios Algunos lenguajes pertenecen a ambas categorías (LISP. encontrará una breve lista de los lenguajes de programación actuales: Lenguaje ADA BASIC C C++ Cobol Fortran Java Principal área de aplicación Tiempo real Programación para fines educativos Programación de sistema Compilado/interpr etado Lenguaje compilado Lenguaje interpretado Lenguaje compilado Programación de sistema orientado Lenguaje compilado a objeto Administración Cálculo Programación orientada a Internet Lenguaje compilado Lenguaje compilado Lenguaje . Un programa escrito en un lenguaje compilado posee la ventaja de no necesitar un programa anexo para ser ejecutado una vez que ha sido compilado.. Por otro lado. la ejecución se vuelve más rápida. Los applets Java. al ser directamente un lenguaje legible. pequeños programas que a menudo se cargan en páginas web. el lenguaje interpretado. son archivos compilados que sólo pueden ejecutarse dentro de un navegador web (son archivos con la extensión . comunicaciones seguras.

los preprocesadores (toma como entrada código en alto nivel y genera como salida código en alto nivel) y el ensamblador (toma como entrada código en ensamblador y genera como salida código en bajo nivel). un traductor. Su estructura podría ser expresada de la siguiente manera: Existen distintos tipos de traductores.intermediario MATLAB Cálculos matemáticos LISP Pascal PHP Inteligencia artificial Perl Cálculos matemáticos Cálculos matemáticos Inteligencia artificial Educación Desarrollo de sitios web dinámicos Inteligencia artificial Procesamiento de cadenas de caracteres Lenguaje interpretado Lenguaje interpretado Lenguaje intermediario Lenguaje compilado Lenguaje interpretado Lenguaje interpretado Lenguaje interpretado 1. Ensambladores.5 Herramientas computacionales de lenguaje 1. de manera general.6 Estructura de traductor Traductores y estructura Traductor: En un sentido orientado hacia la computación. a un . es un software que toma como entrada un programa escrito en un código llamado fuente y genera como salida otro programa en un código llamado objeto. entre ellos destacan: EnsambladoresEs un tipo de traductor que convierte programas escritos en lenguaje ensamblador en programas escritos en código máquina. El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga de traducir un fichero fuente escrito en un lenguaje ensamblador. Algunos ejemplos de traductores son los compiladores (toma como entrada código en alto nivel y genera como salida código en bajo nivel). los interpretes (toma como entrada código en alto nivel y genera como salida un código intermedio).

. antes de la generalización de los lenguajes de alto nivel. Preprocesadores "racionales". en un lenguaje de programación que no las tenga. Por ejemplo. el preprocesador de C hace que el contenido del archivo reemplace a la proposición #include cuando procesa un archivo que contenga a esa proposición. muchos de ellos teniendo compatibilidad hacia atrás pudiendo trabajar con programas con estructuras de 16 bits. ejecutable directamente por la máquina para la que se ha generado. Inclusión de archivos. Ensambladores modulares 32-bits o de alto nivel. que es el único código entendible por la computadora. macros). cuando el primero no puede pasar a lenguaje máquina directamente. y pueden realizar las funciones siguientes: • • Procesamiento de macros. Funcionamiento El programa lee el fichero escrito en lenguaje ensamblador y sustituye cada uno de los códigos mnemotécnicos que aparecen por su código de operación correspondiente en sistema binario. Un preprocesador puede insertar archivos de encabezamiento en el texto del programa. parámetros y cosas tales como los modos de direccionamiento. como proposiciones while o if. o macro ensambladores. Además. El propósito para el que se crearon este tipo de aplicaciones es la de facilitar la escritura de programas. Estos preprocesadores enriquecen los lenguajes antiguos con recursos más modernos de flujo de control y de estructuras de datos. Son de muy bajo nivel. reconoce una serie de directivas (o meta instrucciones) que indican ciertos parámetros de funcionamiento del ensamblador. Ensambladores modulares. permitiendo también el uso de macros. Hacen todo lo que puede hacer un ensamblador. y su tarea consiste básicamente en ofrecer nombres simbólicos a las distintas instrucciones. es en la práctica imposible. un preprocesador de este tipo podría proporcionar al usuario macros incorporadas para construcciones. Tipos de ensambladores Podemos distinguir entre tres tipos de ensambladores: • Ensambladores básicos. Descendientes de los ensambladores básicos. fueron muy populares en las décadas de los 50 y los 60.fichero objeto que contiene código máquina. Son ensambladores que aparecieron como respuesta a una nueva arquitectura de procesadores de 32 bits. Los preprocesadores producen la entrada para un compilador. que son abreviaturas de construcciones más grandes. Por ejemplo. Además de realizar la misma tarea que los anteriores. y además proporcionan una serie de directivas para definir e invocar macroinstrucciones (o simplemente. Un preprocesador puede permitir a un usuario definir macros. • • Preprocesadores Traduce un lenguaje de alto nivel a otro. La evolución de los lenguajes de programación a partir del lenguaje ensamblador originó también la evolución de este programa ensamblador hacia lo que se conoce como programa compilador. permiten utilizar estructuras de programación más complejas propias de los lenguajes de alto nivel. • . ya que escribir directamente en código binario.

Estos preprocesadores tratan de crear posibilidades al lenguaje que equivalen a macros incorporadas. el lenguaje Equel es un lenguaje de consulta de base de datos integrado en C. los procesadores de macros admiten parámetros formales en su definición. Los procesadores de macros tratan dos clases de proposiciones: definición de macros y uso de macros. o puede hacer referencia al programa que lleva a cabo tanto la traducción como la ejecución. sin relación con C.También existen intérpretes que incluyen cierta "compilación" en el medio. valores para sus parámetros formales. La interpretación es una de las formas de ejecución de los programas de computadoras. pero muy buenos para la depuración de programas.• Extensiones a lenguajes. BASIC Intérpretes vs compiladoresCualquier lenguaje puede ser ejecutado tanto vía intérprete o vía compilador. El uso de una macro consiste en dar nombre a la macro y proporcionar parámetros reales. es que cuando un programa es interpretado. Esto se debe a que el intérprete debe analizar cada sentencia en el programa en cada ejecución (un análisis en tiempo real). la principal desventaja de los intérpretes. y se traducen a llamadas de procedimiento a rutinas que realizan el acceso a la base de datos. Las definiciones normalmente se indican con algún carácter exclusivo o palabra clave. El preprocesador considera las proposiciones que empiezan con ## como proposiciones de acceso a la base de datos. porque mapear los identificadores para almacenar las localizaciones debe hacerse repetidas veces en tiempo real. la otra es la compilación. También el acceso a variables es más lento en un intérprete. el cuerpo transformado reemplaza el uso de la propia macro. como define o macro. Compiladores . Son relativamente lentos. es decir. que constituye su definición. pero algunos lenguajes suelen asociarse más a una vía que a la otra. PERL. después. A menudo. suele ejecutarse más lento que si el mismo programa estuviese compilado.En general. Son aquellos que compilan a un código intermedio llamado bytecode.También puede darse que un programa contenga partes que son implementadas via intérprete y otras vía compilador. esto es. El procesador de macros sustituye los parámetros reales por lo parámetros formales del cuerpo de la macro. Lenguajes interpretados: PHP. y por esto son llamados "lenguajes interpretados" o "lenguajes compilados" respectivamente. Constan de un nombre para la macro que se está definiendo y de un cuerpo.El término "intérprete" puede hacer referencia al programa que ejecuta el código fuente que acaba de ser traducido a una forma intermedia. un "valor" es una cadena de caracteres). Preprocesadores: • • • • Macros (expansión de funciones) Inclusión de archivos (bibliotecas) Procesadores racionales Extensiones al leguaje (inclusión de ensamblador en C) Intérpretes Se trata de traductores-ejecutores ya que con cada instrucción realizan un proceso triple de lectura-traducción-ejecución. símbolos que se reemplazarán por valores (en este contexto. que es más eficiente de ejecutar que hacerlo directamente desde el código fuente. Por ejemplo.

Suele incluir la generación y optimización del código dependiente de la máquina. Se trata de un programa que traduce código fuente escrito en un lenguaje de alto nivel (Pascal) en código máquina (no siempre). • Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas. Ejemplos de compiladores: C. C++. genera el árbol de derivación y rellena los valores de la tabla de símbolos. Back-end: es la parte que genera el código máquina. Son más rápidos que los intérpretes pero presentan mayor dificultad a la hora de detectar errores. Pascal. e incluye las fases correspondientes al Análisis Léxico (que consiste en la descomposición del programa fuente en componentes léxicos). • Alternativamente. • Análisis: Se trata de la comprobación de la corrección del programa fuente. El código que genera el Back End normalmente no se puede ejecutar directamente. las fases descritas para las tareas de análisis y síntesis se pueden agrupar en Front-end y Back-end: • Front-end: es la parte que analiza el código fuente. etc. Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto.Es el tipo de traductor más conocido. El autor. y está compuesta por las fases comprendidas entre el Análisis Léxico y la Generación de Código Intermedio. específico de una plataforma. Análisis Sintáctico (agrupación de los componentes léxicos en frases gramaticales ) y Análisis Semántico (comprobación de la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico). a partir de los resultados de la fase de análisis. sino que necesita ser enlazado por un programa enlazador (linker). Alfred ilustra las fases de un compilador como lo muestra la siguiente figura . comprueba su validez. realizada por el Front End. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar. Partes de un compilador La construcción de un compilador involucra la división del proceso en una serie de fases que variará con su complejidad. Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele estar formado por una o varias combinaciones de fases de Generación de Código (normalmente se trata de código intermedio o de código objeto) y de Optimización de Código (en las que se busca obtener un código lo más eficiente posible).

Estas herramientas utilizan lenguajes especializados para especificar e implantar el componente. La siguiente es una lista de algunas herramientas útiles para la construcción de compiladores: 1... Análisis Semántico.Generadores de analizadores léxicos. Estas herramientas generan automáticamente analizadores léxicos. Muchos de los generadores de analizadores sintácticos utilizan poderosos algoritmos de análisis sintáctico. 2. el análisis sintáctico consumía no sólo gran parte del tiempo. que el lenguaje reconocerá.. Las herramientas más efectivas son las que ocultan los detalles del algoritmo de generación y producen componentes que se pueden integrar con facilidad al resto del compilador. . Esta fase se considera ahora una de las más fáciles de aplicar. La organización básica del analizador léxico resultante es en realidad un autómata finito. por lo general a partir de una especificación basada en expresiones regulares.Separa las Cadenas en unidades llamadas Tokens y las compara con la tabla de símbolos. En los primeros compiladores.. palabras reservadas. de ejecución del compilador. Es decir que haya cadenas validas en las Variables.Checa que exista coherencia entre los identificadores y que la expresión sea correcta.Compara los resultados obtenidos en la anterior etapa con las gramáticas.. y pueden utilizar algoritmos bastantes complejos. y son demasiado complejos para realizarlos manualmente. El la tabla de símbolos están definidos todos los símbolos (caracteres).Generadores de analizadores sintácticos. normalmente a partir de una entrada fundamentada en una gramática independiente del contexto.Traduce de código fuente a un código como ensamblador acercándose a el lenguaje maquina. Estos generadores producen analizadores sintácticos. Generadores de Código para Compiladores (Compilador de Compilador) Se han creado algunas herramientas generales para el diseño automático de componentes específicos de compilador. Tamaño y tiempo el código anterior.Análisis Léxico. Generación de Código intermedio. Los únicos errores que podría generar es que encuentre algún carácter desconocido (inexistente en la tabla de símbolos)..Reduce en forma. sino gran parte del esfuerzo intelectual de escribirlo. Optimización. Análisis Sintáctico. etc..

FLEX es una herramienta para generar programas capaces de reconocer patrones de texto.Generadores automáticos de código. haciendo entradas en una tabla de símbolos. Estos producen grupos de rutinas que recorren el árbol de análisis sintáctico. La técnica fundamental es la de "concordancia de plantillas". que consiste en la recolección de información sobre la forma en que se transmiten los valores de una parte de un programa a cada una de las otras partes. las especificaciones se pueden transcribir manualmente a un programa operativo empleando técnicas de diagramas de transiciones. Las proposiciones de código intermedio se reemplazan por "plantillas" que representan secuencias de instrucciones de máquina. LEX es una herramienta utilizada en la especificación de analizadores léxicos para varios lenguajes. Se pueden utilizar las especificaciones tipo Lex aunque no se disponga de un compilador Lex. La idea básica es que se asocian una o más "traducciones" con cada nodo del árbol de análisis sintáctico. y la especificación de su entrada. de modo que las suposiciones sobre el almacenamiento de las variables concuerden de plantilla a plantilla. 5. en una posición fija (estática) de memoria o pueden tener asignada una posición en una pila. utilizando expresiones regulares. en la que el usuario proporciona los detalles relativos a la relación que hay entre las proposiciones en código intermedio y a la información que se está recolectando. por ejemplo. 4. Las distintas tareas de esta naturaleza se pueden efectuar esencialmente con la misma rutina.. cuya ejecución se pueda pedir a un analizador léxico. Esta herramienta se denomina compilador Lex (PCLEX para el entorno DOS). y cada traducción se define partiendo de traducciones en sus nodos vecinos en el árbol.Dispositivos para análisis de flujo de datos.Dispositivos de traducción dirigida por la sintaxis. Las reglas deben incluir suficiente detalle para poder manejar los distintos métodos de acceso posibles a los datos. las variables pueden estar en registros. lenguaje Lex. Como suele haber muchas opciones en relación con la ubicación de las variables (por ejemplo. El usuario establece las reglas a usar y Flex generará el programa que buscará esos patrones. El reconocimiento de patrones es muy útil en muchas aplicaciones.. en uno o varios registros o en memoria). y es necesario seleccionar una buena cobertura sin una explosión combinatoria en el tiempo de ejecución del compilador. La razón por la que la gente usa Flex es porque es mucho más fácil establecer las reglas a usar que escribir directamente un programa que busque el texto. Estas son: . Mucha de la información necesaria para hacer una buena optimación de código implica hacer un "análisis de flujo de datos". se puede combinar la especificación de patrones con acciones.3. Tales herramientas toman un conjunto de reglas que definen la traducción de cada operación del lenguaje intermedio al lenguaje de máquina para la máquina objeto. por ejemplo.. PATRONES Los patrones en la entrada se escriben utilizando un conjunto extendido de expresiones regulares. El estudio de una herramienta existente permitirá mostrar cómo. hay muchas formas posibles de "cubrir" el código intermedio con un conjunto dado de plantillas.

lo que refleja la popularidad de los generadores de analizadores sintácticos al principio de los años setenta. Se trata de una herramienta que facilita la construcción de analizadores léxicos y sintácticos por el método de las funciones recursivas. A grandes rasgos.YACC significa "otro compilador de compiladores más" (del inglés Yet Another CompilerCompiler).Metacompilador en Java) es el principal metacompilador en JavaCC. JAVACC.C. lo que le confiere una interesante propiedad de independencia respecto al entorno. cuando S. aunque permite una notación relajada muy parecida a la BNF. Este generador se encuentra disponible como una orden del sistema Unix y se ha utilizado para facilitar la implantación de cientos de compiladores. tanto por sus posibilidades. (Java Compiler Compiler . los analizadores generados utilizan la técnica descendente a la hora de obtener el árbol sintáctico. sus principales características son las siguientes: . CARACTERÍSTICAS GENERALES: JavaCC integra en una misma herramienta al analizador lexicográfico y al sintáctico. De esta manera. Johnson creó la primera versión de Yacc. como por su ámbito de difusión. y el código que genera es independiente de cualquier biblioteca externa.

y DEBUG_TOKEN_MANAGER. pero están disponibles para poder ser procesados por el desarrollador. No obstante. De esta manera la gramática puede ser leída y mantenida más fácilmente. un preprocesador para el desarrollo de árboles con características muy potentes. • Las especificaciones léxicas y sintácticas se ubican en un solo archivo. lo que lo hace apto para entornos profesionales y lo ha convertido en uno de los metacompiladores más extendidos. Esto facilita la descripción de los elementos del lenguaje. se transforme en LL(k) sólo en tales puntos. Ello permite trabajar con especificaciones más claras. • La especificación léxica puede definir tokens de manera tal que no se diferencien las mayúsculas de las minúsculas bien a nivel global. espaciadores (SKIP) y de continuación (MORE). DEBUG_LOOKAHEAD. • Genera por defecto un analizador sintáctico LL(1). permitiendo el uso de gramáticas de propósito general y la utilización de atributos tanto sintetizados como heredados durante la construcción del árbol sintáctico. . de forma que las especificaciones léxicas también pueden incluir cualquier carácter Unicode. proporcionando información diagnóstica completa. • Los tokens especiales son ignorados por el analizador generado. JavaCC es uno de los que poseen mejor gestión de errores. bien en un patrón concreto. puede haber porciones de la gramática que no sean LL(1). • Adopta una notación BNF propia mediante la utilización de símbolos propios de expresiones regulares. tales como (A)*. No obstante. • Incluye la herramienta JJTree. • Incorpora distintos tipos de tokens: normales (TOKEN). • Permite entradas codificadas en Unicode. Los analizadores generados por JavaCC son capaces de localizar exactamente la ubicación de los errores. lo que es resuelto en JavaCC mediante la posibilidad de resolver las ambigüedades desplazar/desplazar localmente en el punto del conflicto. pero se conserva LL(1) en el resto de las reglas mejorando la eficiencia. a la vez que permite una mejor gestión de los mensajes de error y advertencia por parte de JavaCC en tiempo de metacompilación.• Genera analizadores descendentes. (A)+. • De entre los generadores de analizadores sintácticos descendentes. • JavaCC ofrece muchas opciones diferentes para personalizar su comportamiento y el comportamiento de los analizadores generados. mediante las opciones DEBUG_PARSER. recomendamos el uso de ciertos comentarios para mejorar la legibilidad. • Permite depurar tanto el analizador sintáctico generado como el lexicográfico. • Es altamente eficiente. cuando se introducen acciones semánticas. En otras palabras. • Admite el uso de estados léxicos y la capacidad de agregar acciones léxicas incluyendo un bloque de código Java tras el identificador de un token. • Incluye la herramienta JJDoc que convierte los archivos de la gramática en archivos de documentación. tales como los identificadores Java que permiten ciertos caracteres Unicode que no son ASCII. especiales (SPECIAL_TOKEN). permite que el así.

Rupturas de Informe Definición de una Ruptura de Informe. Propiedades características de los robots.. regístrese gratis o si ya está registrado. El robot y su funcionamiento. Especificación de Opciones de Proceso... Organización de los objetos. Una . Agregar un comentario Enviar comentario Los comentarios están sujetos a los Términos y Condiciones Trabajos relacionados Estudio sobre los lenguajes de programación para la robótica Origen de la palabra robot y su significado. Actualmente una de las áreas más ca. Encapsulamiento y ocultación. Cl.Autor: Julio Cesar Neira Hern?ndez Yesenia Rocha Cisneros Yoc Rodrigo Pacheco Hern?ndez Catedr?tico: 15/02/2010 Partes: 1. 2 Página anterior Volver al principio del trabajo Página siguiente Comentarios Para dejar un comentario. Sistemas de Procesamiento de Datos Programación Orientada a Objetos Estructura de un objeto. inicie sesión..

lo traduce y a continuación lo ejecuta. palabras reservadas. etc. El Centro de Tesis. Un ejemplo de lenguaje interpretado es Java. La cadena de entrada se lee e izquierda a derecha y se va agrupando en componentes léxicos.com | Contáctenos | Blog Institucional © Monografias.monografias. es obligatoria la cita del autor del contenido y de Monografias.A. identificadores. esquemas o tablas complejas. Intérprete: toma el programa fuente. El objetivo de Monografias. Asimismo.shtml#ixzz2Jljwb64g 1. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. que son secuencias de caracteres con un significado colectivo.. C.com es poner el conocimiento a disposición de toda su comunidad. avanzadas formulas matemáticas. Ejemplos de lenguajes compilados son Pascal.. Ver mas trabajos de Programacion Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página. signos de final de instrucción.com/trabajos79/introduccion-programacion-sistemas/introduccionprogramacion-sistemas2. Compilador: es un programa que se encargan de convertir las instrucciones escritas en un lenguaje de programación en instrucciones escritas en lenguaje máquina (0´s y 1´s) que la computadora pueda entender.com S. Publicaciones y Recursos Educativos más amplio de la Red. Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.). Recuerde que para ver el trabajo en su versión original completa.Analizador Léxico: Realiza un análisis del archivo.com.7 fases de copilador Fases de Compilación de un Programa La compilación consiste en la traducción de un programa fuente escrito en un lenguaje de alto nivel a un programa objeto y luego se debe utilizar un programa llamado montador o enlazador (linker). puede descargarlo desde el menú superior.Ruptura de Informe se usa para dividir..com como fuentes de información. cerrar E-mail: Contraseña: Regístrese gratis ¿Olvidó su contraseña? Ayuda Recordarme en este equipo Iniciar sesión Leer más: http://www. Por ejemplo. Fases de Proceso de un compilador 1. Términos y Condiciones | Haga publicidad en Monografías. . Documentos. El proceso de montaje conduce a un programa en lenguaje máquina directamente ejecutable. C++.

Generador de código intermedio Algunos compiladores generan una representación explicita del programa fuente. 2. Produce las estructuras necesarias para la generación del código. que por lo general consiste en un código de maquina relocalizable o código ensamblador. 7. 4.Generador de código Esta fase final de un compilador. Genera el código objeto. Fase de generación. en lenguajes independientes de la plataforma como JAVA.. reúne información sobre los tipos.. El uso de los registros de la CPU es relevante.Analizador Semántico Busca errores semánticos. Controla la corrección del programa fuente. Esta representación debe ser fácil de producir. Hace uso intensivo de la tabla de símbolos . Este código es independiente de la maquina y a veces se usa en un conjunto con interpretes. manejando errores en cada etapa. depende de la maquina y el lenguaje intermedio. En cualquiera de estos tres análisis pueden producirse errores. 5.Agrupación lógica de un compilador Es la fase de análisis..-Optimización Esta fase trata de mejorar el código intermedio. o las estructuras que generaran el código definitivo de modo de que resulte un código de maquina más rápido de ejecutar para guardarlos valores calculados por cada instrucción... 6. rangos permitidos existencia de variables. depende del lenguaje fuente y son independientes de las maquinas. ayudar a la optimización y fácil de traducir al programa objeto. Las posiciones de memoria relativas se seleccionan para cada variable. identifica operadores en base al árbol sintáctico producido en el análisis anterior Ejemplo de error: operación entre tipos de datos incompatibles.Analizador Sintáctico Realiza un análisis jerárquico agrupado de los componentes léxicos en frases gramaticales que el compilador utiliza. 3.Cada componente es asociada ala categoría que pertenece.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->