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

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

cadena3). 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. p. pareja = "Luisa" & " y " & "Carmen" # en Visual Basic. No obstante. Mediante una propiedad de la cadena que delimite su longitud (Length en C#) para las de tipo estático. [editar] Ejemplos de algunas operaciones comunes Asignación: asignarle una cadena a otra char *strcpy(char []. en muchos lenguajes. # en Smalltalk Comparación: Compara dos cadenas en orden lexicográfico . # en Smalltalk strcat(cadena1. # en C cadena1=cadena2. se usan secuencias de escape. strcat(cadena1. const char[]). # en C (Debe haber suficiente espacio en la primera) Nº de caracteres de una cadena int strlen(const char[]). 'Carmen'. # en C++ cadena1 := cadena2 # en Smalltalk Concatenación: unir dos cadenas de caracteres. # en C Devuelve el nº de caracteres sin contar el '\0' cadena. las expresiones para producir estas secuencias de escape dependen del lenguaje de programación que se esté usando. mientras que C# sí). $pareja = "Joshua". pareja := 'Luisa' ."Lidia" # en Perl y PHP.: «\"» (sin comillas). o de naturaleza estática (su longitud es fija a lo largo del tiempo de ejecución). [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). e. pareja = "Luisa" + " y " + "Carmen". Esto se aplica a otros caracteres reservados o no imprimibles como el retorno de carro. 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. Una forma común. # en C++ y Java con la clase String. Para poder mostrar una comilla (") dentro de la cadena y no tener problemas con las comillas que la delimitan.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.length(). # en C++ cadena size." y ". ' y ' .cadena2). de escapar un carácter es anteponiéndole un «\» (sin comillas).

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

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

. pagos en línea. Este archivo se llama ejecutable. Java. sufrir una fase de compilación intermediaria. de ese modo.). pequeños programas que a menudo se cargan en páginas web. 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 . Python. en ciertos casos. hace que cualquier persona pueda conocer los secretos de fabricación de un programa y. Los applets Java. Por otro lado. existe el riesgo de que los derechos de autor no sean respetados..) dado que el programa escrito en estos lenguajes puede. comunicaciones seguras. la ejecución se vuelve más rápida. 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. Sin embargo. Por otra parte. en un archivo escrito en un lenguaje ininteligible (por lo tanto diferente al archivo fuente ) y no ejecutable (requeriría un interprete).class).. al ser directamente un lenguaje legible. un programa compilado tiene la ventaja de garantizar la seguridad del código fuente. Además. no es tan flexible como un programa escrito en lenguaje interpretado. Lenguajes intermediarios Algunos lenguajes pertenecen a ambas categorías (LISP. como sólo es necesaria una traducción. son archivos compilados que sólo pueden ejecutarse dentro de un navegador web (son archivos con la extensión . En efecto. 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.necesita ningún otro programa para ejecutarse a sí mismo.. copiar su código o incluso modificarlo. Algunos ejemplos de lenguajes ampliamente usados A continuación. el lenguaje interpretado. Por lo tanto. ciertas aplicaciones aseguradas necesitan confidencialidad de código para evitar las copias ilegales (transacciones bancarias.

6 Estructura de traductor Traductores y estructura Traductor: En un sentido orientado hacia la computación.5 Herramientas computacionales de lenguaje 1. 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). 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). 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. Ensambladores. a un . Su estructura podría ser expresada de la siguiente manera: Existen distintos tipos de traductores. de manera general. entre ellos destacan: EnsambladoresEs un tipo de traductor que convierte programas escritos en lenguaje ensamblador en programas escritos en código máquina. 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.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. un traductor.

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

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

Es el tipo de traductor más conocido. Ejemplos de compiladores: C. etc. 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). comprueba su validez. genera el árbol de derivación y rellena los valores de la tabla de símbolos. 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. Son más rápidos que los intérpretes pero presentan mayor dificultad a la hora de detectar errores. Alfred ilustra las fases de un compilador como lo muestra la siguiente figura . Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar. Pascal. El autor. Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto. Back-end: es la parte que genera el código máquina. a partir de los resultados de la fase de análisis. y está compuesta por las fases comprendidas entre el Análisis Léxico y la Generación de Código Intermedio. e incluye las fases correspondientes al Análisis Léxico (que consiste en la descomposición del programa fuente en componentes léxicos). Suele incluir la generación y optimización del código dependiente de la máquina. C++. El código que genera el Back End normalmente no se puede ejecutar directamente. realizada por el Front End. • 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. 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. sino que necesita ser enlazado por un programa enlazador (linker). 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). • Alternativamente. • Análisis: Se trata de la comprobación de la corrección del programa fuente. 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).

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

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

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

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

.Autor: Julio Cesar Neira Hern?ndez Yesenia Rocha Cisneros Yoc Rodrigo Pacheco Hern?ndez Catedr?tico: 15/02/2010 Partes: 1.. Especificación de Opciones de Proceso. 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. Propiedades características de los robots. Cl. Una . Sistemas de Procesamiento de Datos Programación Orientada a Objetos Estructura de un objeto. El robot y su funcionamiento. Encapsulamiento y ocultación. regístrese gratis o si ya está registrado. Organización de los objetos.. inicie sesión.. 2 Página anterior Volver al principio del trabajo Página siguiente Comentarios Para dejar un comentario. Rupturas de Informe Definición de una Ruptura de Informe.

com es poner el conocimiento a disposición de toda su comunidad.Ruptura de Informe se usa para dividir. identificadores. Por ejemplo. signos de final de instrucción. avanzadas formulas matemáticas. lo traduce y a continuación lo ejecuta. Fases de Proceso de un compilador 1. Términos y Condiciones | Haga publicidad en Monografías. C++.monografias. que son secuencias de caracteres con un significado colectivo.com/trabajos79/introduccion-programacion-sistemas/introduccionprogramacion-sistemas2. El objetivo de Monografias. es obligatoria la cita del autor del contenido y de Monografias.com. esquemas o tablas complejas. Intérprete: toma el programa fuente. Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. palabras reservadas. El Centro de Tesis. Documentos. 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. Recuerde que para ver el trabajo en su versión original completa. 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. Publicaciones y Recursos Educativos más amplio de la Red. 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. puede descargarlo desde el menú superior. Asimismo. Ejemplos de lenguajes compilados son Pascal.shtml#ixzz2Jljwb64g 1. El proceso de montaje conduce a un programa en lenguaje máquina directamente ejecutable. C.com S.com como fuentes de información. Un ejemplo de lenguaje interpretado es Java.com | Contáctenos | Blog Institucional © Monografias.).Analizador Léxico: Realiza un análisis del archivo.A..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).. La cadena de entrada se lee e izquierda a derecha y se va agrupando en componentes léxicos.. . etc.

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

Sign up to vote on this title
UsefulNot useful