Está en la página 1de 26

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Unidad I. Introduccin a la programacin de sistemas.


1.1 Qu es y qu estudia la programacin de sistemas?
Un sistema es un conjunto de componentes y programas que interaccionan entre s para lograr un objetivo comn, logrando que una computadora de una imagen coherente y monoltica ante sus usuarios. La programacin de sistemas es un rea especializada dentro de las ciencias de la computacin que busca convertir las especificaciones de los sistemas en instrucciones de mquina que produzcan los resultados deseados. Estudia la teora de mquinas y su aplicacin en el diseo de sistemas digitales y de arquitectura de computadoras.

1.2 Herramientas desarrolladas con la teora de programacin de sistemas.


a) b) c) d) Sistemas con Inteligencia artificial aplicada a trabajo cooperativo. Sistemas para arquitecturas paralelas y distribuidas. Sistemas de tiempo real. Sistemas empotrados, etc.

Figura 1.1. Tux de Linux por dentro

1.3 Lenguajes.
Se llama lenguaje a cualquier tipo de cdigo estructurado, para el que existe un contexto de uso y ciertos principios combinatorios formales. Existen contextos tanto naturales como artificiales. El lenguaje humano se basa en la capacidad de los seres humanos para comunicarse mediante el uso de signos. El lenguaje animal se basa en el uso de seales sonoras, visuales, y olfativas, a modo de signos, para sealar a un referente o un significado diferente de dichas seales. Los lenguajes formales son construcciones artificiales humanas, que se usan en matemticas y otras disciplinas formales, incluyendo lenguajes de programacin. Estas construcciones tienen estructuras internas que comparten con el lenguaje humano natural, por lo que pueden ser en parte analizados con los mismos conceptos que ste. 1.3.1 Lenguajes naturales. El lenguaje natural es el que utiliza una comunidad lingstica para comunicarse y est construido con reglas y convenciones lingsticas y sociales. Es el lenguaje hablado o escrito por humanos para propsitos generales de comunicacin. El individuo por el hecho de nacer en sociedad acepta normativamente el lenguaje de su propia comunidad lingstica. Algunos ejemplos de lenguaje natural son el ingls, el espaol, el francs, y cualquier otro idioma que se hable en alguna parte del mundo. El lenguaje natural se considera un instrumento sumamente adaptado a la comunicacin de la vida ordinaria, pero ambiguo y vago para el punto de vista de la comunicacin cientfica. 1.3.2 Lenguajes artificiales. El lenguaje artificial tiene como finalidad evitar los inconvenientes de ambigedad y vaguedad de los lenguajes naturales u ordinarios, por ello, presenta un grado de artificialidad y convencionalidad mucho mayor por lo que se refiere a la construccin de smbolos y al significado que se les asigna. Smbolos y significados no pertenecen a ninguna comunidad natural de hablantes, sino a grupos de hablantes relacionados por objetivos cientficos o tcnicos. El lenguaje artificialmente construido se divide en tcnico y formal. El lenguaje tcnico utiliza el lenguaje natural, pero previamente definido en gran parte de sus trminos, de manera que las palabras adquieren un significado propio y adecuado a los fines de la comunidad que las utiliza. Por ejemplo, el lenguaje de la fsica define el sentido en que utiliza trminos, tambin propios del lenguaje ordinario, como son fuerza, masa, velocidad, espacio.
Ing. Victor M. Caldern Hdez. Pgina 1

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

El lenguaje formal, a su vez, es una clase de lenguaje artificial en el que no slo se construyen artificial y convencionalmente los smbolos propios del lenguaje, sino tambin sus reglas de construccin y sus reglas de transformacin. Los lenguajes formales, si adoptan adems una interpretacin, se convierten en lenguajes plenamente formalizados. 1.3.3 Proceso de la comunicacin. Es un proceso mediante el cual un sistema transmite informacin a otro sistema que es capaz de recibirla. Est compuesto de un emisor (emite el mensaje o informacin), receptor (recibe el mensaje), mensaje (informacin que se transmite), canal (medio o va utilizado para transmitir el mensaje) y cdigo (conjunto de signos y reglas necesarios para la elaboracin del mensaje tanto el emisor como el receptor deben conocer las reglas de codificacin y descodificacin).

1.4 Traductor y su estructura.

Figura 1.2. Proceso de la comunicacin

La traduccin es una actividad que consiste en comprender el significado de una informacin en un idioma, llamada informacin origen o informacin de salida, para producir una informacin con significado equivalente, en otro idioma, llamada informacin traducida o informacin meta. El resultado de esta actividad se denomina traduccin. El objetivo de la traduccin es crear una relacin de equivalencia entre lo original y lo traducido, es decir, la seguridad de que se est obteniendo el mismo mensaje, a la vez que se tienen en cuenta aspectos como el gnero textual, el contexto, las reglas de la gramtica de cada uno de los idiomas, las convenciones estilsticas, la fraseologa, etc. Es importante diferenciar la traduccin de la interpretacin. En la traduccin se transfieren ideas de una lengua a otra, mientras que en la interpretacin las ideas se expresan oralmente o mediante la gesticulacin (como sucede en el lenguaje de signos) de una lengua a otra. Segn el anlisis de los procesos implicados en la traduccin e interpretacin, podra considerarse que esta ltima constituye una subcategora de la traduccin. En un sentido orientado a la computacin, un traductor es un software que toma como entrada un programa escrito en un cdigo llamado fuente y genera como salida otro programa en un cdigo llamado objeto. Su estructura bsica es: cdigo fuente >>>>> traductor >>>>> cdigo objeto. Algunos ejemplos de traductores son: A) B) C) D)

Figura 1.3. Proceso de traduccin

Compiladores.- toman como entrada cdigo en alto nivel y generan como salida cdigo en bajo nivel. Interpretes.- toman como entrada cdigo en alto nivel y genera como salida un cdigo intermedio. Preprocesadores.- toman como entrada cdigo en alto nivel y genera como salida cdigo en alto nivel. Ensambladores.- toman como entrada cdigo en ensamblador y genera como salida cdigo en bajo nivel. 1.4.1 Ensambladores.

Es el programa que realiza la traduccin de un programa escrito en ensamblador a lenguaje mquina. Esta traduccin es directa e inmediata, ya que las instrucciones en ensamblador no son ms que nemotcnicos de las instrucciones mquina que ejecuta directamente la CPU. Podemos distinguir entre tres tipos de ensambladores: 1) Ensambladores bsicos. Son de muy bajo nivel, su tarea consiste en ofrecer nombres simblicos a las distintas instrucciones. 2) Ensambladores modulares o macro ensambladores. Hacen todo lo que puede hacer un ensamblador y proporcionan una serie de directivas para definir e invocar macroinstrucciones. 3) Ensambladores modulares 32-bits o de alto nivel. Son ensambladores que aparecieron como respuesta a una nueva arquitectura de procesadores de 32 bits, realizan la misma tarea que los anteriores, permitiendo tambin el uso de macros, permiten utilizar estructuras de programacin ms complejas propias de los lenguajes de alto nivel.
Ing. Victor M. Caldern Hdez. Pgina 2

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

1.4.2 Compiladores. Un compilador es un programa que traduce, un programa escrito en un lenguaje de programacin a otro lenguaje de programacin, es decir es un programa que permite traducir un cdigo fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (lenguaje mquina). Un compilador contiene en si otros programas (preprocesador, linker o ligador, depurador y el ensamblador. El preprocesador se ocupa de incluir archivos, expandir macros, eliminar comentarios y otras tareas similares. El linker se encarga de construir el archivo ejecutable aadiendo al archivo objeto generado por el compilador las cabeceras necesarias y las funciones de librera utilizadas por el programa fuente. El depurador permite eliminar cdigo no utilizable o sobrante. Finalmente, muchos compiladores, en vez de generar cdigo objeto, generan un programa que debe despus convertirse en un ejecutable mediante un programa ensamblador. Componentes en que se divide un compilador 1) Anlisis Lxico.- lee los caracteres del programa fuente y los agrupa en cadenas que representan los componentes lxicos (lexema o token). 2) Anlisis Sintctico.- los token se agrupan en frases gramaticales que el compilador utiliza para sintetizar la salida. 3) Anlisis Semntico.- detectar instrucciones con estructura sintctica correcta, pero sin significado para la operacin implicada. 4) Generacin de Cdigo Intermedio.- se genera un subprograma para una mquina abstracta, debe tener dos propiedades importantes: fcil de producir y fcil de traducir al programa objeto. 5) Optimizacin de Cdigo.- mejora el cdigo intermedio generando un cdigo de mquina ms rpido de ejecutar. 6) Generacin de Cdigo.- es la fase final de un compilador y se tiene como resultado un cdigo objeto. 7) Administrador de la Tabla de Smbolos.- maneja los accesos a la tabla de smbolos, en cada una de las etapas de compilacin de un programa. 8) Manejador de Errores.- controla de manera eficientemente los errores encontrados en cada una de las fases de la compilacin de un programa. Los compiladores se clasifican en: Una sola pasada.- examina el cdigo fuente una vez, generando el cdigo o programa objeto. Pasadas mltiples.- requieren pasos intermedios para producir un cdigo en otro lenguaje, y una pasada final para producir y optimizar el cdigo producido durante los pasos anteriores. Optimacin.- lee un cdigo fuente, lo analiza y descubre errores potenciales sin ejecutar el programa. Compiladores incrementales.- generan un cdigo objeto instruccin por instruccin (en vez de hacerlo para todo el programa) cuando el usuario teclea cada orden individual. Ensamblador.- el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla. Compilador cruzado.- se genera cdigo en lenguaje objeto para una mquina diferente de la que se est utilizando para compilar. Compilador con montador.- compilador que compila distintos mdulos de forma independiente y despus es capaz de enlazarlos. Autocompilador.- compilador que est escrito en el mismo lenguaje que va a compilar. Metacompilador.- 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.
Pgina 3
Manejo de la Tabla de Smbolos

Anlisis Lxico

Anlisis Sintctico

Anlisis Semntico

Generacin de Cdigo Intermedio

Manejo de Errores

Optimizacin de Cdigo

Generacin de Cdigo

Figura 1.4. Estructura de un compilador

Ing. Victor M. Caldern Hdez.

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

1.4.3 Intrpretes. Los intrpretes realizan dos operaciones: 1) traducen el cdigo fuente a un formato interno y 2) ejecutan o interpretan el programa traducido al formato interno. A la primera parte del intrprete suelen denominarle compilador, aunque el cdigo interno que genera no es el lenguaje de la mquina, ni siquiera lenguaje simblico, ni tampoco un lenguaje de alto nivel. Caractersticas de los intrpretes: Ahorra memoria. Produce un resultado que no se puede almacenar, lo cual hace la ejecucin lenta. No demasiado eficiente, cada vez que se entre en un bucle se analizaran sus sentencias. Facilita el proceso de depuracin. No produce resultados transportables.

Figura 1.5. Estructura de un Intrprete

La interpretacin es til en: Sistemas interactivos. Programas de pequea envergadura. Programas de prototipo y de enseanza.

1.5 Generadores de cdigo para compiladores (compilador de compilador).


Un compilador de compiladores o metacompilador, 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. Se han creado algunas herramientas generales para el diseo automtico de componentes especficos de compilador. La siguiente es una lista de algunas herramientas tiles para la construccin de compiladores: 1) Generadores de analizadores sintcticos, producen analizadores sintcticos, normalmente a partir de una entrada fundamentada en una gramtica independiente del contexto. 2) Generadores de analizadores lxicos, generan automticamente analizadores lxicos a partir de una especificacin basada en expresiones regulares. 3) Dispositivos de traduccin dirigida por la sintaxis, producen grupos de rutinas que recorren el rbol de anlisis sintctico. Asocian una o ms traducciones con cada nodo del rbol de anlisis sintctico, y cada traduccin se define partiendo de traducciones en sus nodos vecinos en el rbol. 4) Generadores automticos de cdigo, toman un conjunto de reglas que definen la traduccin de cada operacin del lenguaje intermedio al lenguaje de mquina para la mquina objeto. Se debe incluir suficiente detalle para poder manejar los distintos mtodos de acceso posibles a los datos. 5) Dispositivos para anlisis de flujo de datos, consiste en la recoleccin de informacin sobre la forma en que se transmiten los valores de una parte de un programa a cada una de las otras partes. LEX es una herramienta utilizada en la especificacin de analizadores lxicos para varios lenguajes. Esta herramienta se denomina compilador Lex (PCLEX para el entorno DOS), y la especificacin de su entrada, lenguaje Lex. FLEX es una herramienta para generar programas capaces de reconocer patrones de texto. El usuario establece las reglas a usar y Flex generar el programa que buscar esos patrones. YACC (Yet Another Compiler-Compiler), este generador se encuentra disponible como una orden del sistema Unix y se puede utilizar para facilitar la implantacin de cientos de compiladores. JAVACC (Java Compiler Compiler), se trata de una herramienta que facilita la construccin de analizadores lxicos y sintcticos por el mtodo de las funciones recursivas.

Ing. Victor M. Caldern Hdez.

Pgina 4

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Unidad II. Introduccin al diseo de los lenguajes de programacin.


2.1. Visin del problema.
Antes de disear un lenguaje de programacin se debe determinar el propsito del lenguaje y su clasificacin. Los lenguajes de programacin pueden ser de propsito general o especficos y su tipo puede ser de alto, mediano o bajo nivel. Adems debe identificar la funcionalidad especfica del lenguaje, ya que puede ser slo la estructuracin de contenido, visualizacin de informacin o bien realizar la conversin de un documento, etc. Tambin podra crear lenguaje para el modelado de lenguajes de programacin. Al construir un lenguaje de modelado se debe proporcionar modelos de diseo que permitan caracterizar el desarrollo de aplicaciones, que sea capaz de capturar la semntica del modelo al que se ajusta el lenguaje de programacin. El modelado de diseo proporcionado por el lenguaje de modelado debe ser capaz de capturar la semntica del programa que implementa la especificacin de requisitos. El disear completamente un lenguaje, se debe de pensar con cuidado para no hacer una extensin muy grande y compleja como llega a ser un nuevo lenguaje. Podra apoyarse de otros lenguajes al retener algunas interfaces con un viejo lenguaje. Tambin, si se opta por mejorar un lenguaje existente, es necesario escoger cuidadosamente un lenguaje base para que el trabajo de la extensin se aminorare y la extensin se acople adecuadamente al lenguaje que se est modificando. En este caso el objetivo es el de producir un lenguaje, el cual se ms grande aunque igualmente bien construido.

2.2. Consideraciones Preliminares.


Se debe tomar en cuenta las palabras reservadas del lenguaje, los operadores, los tipos de datos y considerar el objetivo del lenguaje, si es un lenguaje de enseanza o si es un lenguaje para desarrolladores de sistemas. Adicionalmente se debe determinar si ser visual o no visual, la eficiencia del lenguaje, tiempo de compilacin del cdigo fuente y ejecucin del cdigo objeto. La calidad del lenguaje de programacin est dada por: 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) Eficiencia.- capacidad para el aprovechamiento ptimo de los recursos que emplea. Portabilidad.- posibilidad de ser ejecutado en distintos entornos lgicos o fsicos. Verificabilidad.- capacidad para soportar procedimientos de pruebas, test o ensayos. Integridad.- nivel de proteccin frente a procesos que traten de alterarlo. Facilidad de uso.- comodidad y claridad en la interaccin con el usuario. Exactitud.- alcance de la precisin de los resultados obtenidos. Robustez.- cantidad de instrucciones y operaciones soportadas, tanto para software como hardware. Extensibilidad.- capacidad para incrementar sus instrucciones o posibilidad de ser modificado o adaptado. Compatibilidad.- facilidad de poder ser aplicados en conjuncin con otros programas o lenguajes. Reutilizacin.- posibilidad de utilizarlo total o parcialmente en nuevos contextos.

Generalmente se disea un lenguaje porque se necesita establecer comunicacin con algo de manera fcil y rpida, por ejemplo un archivo, un hardware, una base de dato; dependiendo de la tarea que se quiera realizar entonces ser el lenguaje a disear. Otras cosas a considerar son como se va a manejar la memoria, y a que tipo de computadoras estar enfocado.

2.3. Objetivos y filosofas del diseo de los lenguajes de programacin.


Algunos objetivos para el diseo de los lenguajes pueden ser: Comunicacin humana. Prevencin y Deteccin de errores. Usabilidad. Portabilidad. Independencia de la mquina. Filosficamente los lenguajes:
Ing. Victor M. Caldern Hdez. Pgina 5

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Deben lograr la comunicacin entre emisor y receptor. Es importante que el lenguaje sea ms leble que fcil de escribir, ya que un programa generalmente se escribe una vez y se lee muchas veces (documentacin, mantenimiento, etc.). Separacin de la interfaz de la implementacin. Soportar mltiples arquitecturas de computadoras (mquinas virtuales). Control de apuntadores. Control de tipo de datos robustos. Simplicidad por eficiencia.

2.4. Diseo detallado.


Considerar caractersticas como: Patrones de diseo. Paquetes (bibliotecas, APIs, componentes). Excepciones. Validaciones. Marco de trabajo. Utileras auxiliares (preprocesador, enlazador). Inclusin de otros lenguajes El diseo detallado tiene que ver con la especificacin de detalles algortmicos, representaciones concretas de datos, interconexiones entre funciones y estructuras de datos; el diseo detallado tiene que ver ms con aspectos semnticos y menos con detalles sintcticos. Se debe iniciar el diseo detallado mediante una estructura arquitectnica a la que se le van a proporcionar los detalles algortmicos y las representaciones concretas de datos. Posteriormente se debe proceder a la instrumentacin, la cual comunica los aspectos de la sintaxis del lenguaje de programacin, el estilo de codificacin la documentacin interna, y la insercin de pruebas y depuraciones al cdigo. El diseo detallado permite el diseo de algoritmos y representaciones de datos en un nivel ms alto de abstraccin y notacin que el que proporciona el lenguaje de instrumentacin. Una especificacin adecuada de diseo detallado minimiza el nmero de sorpresas durante la instrumentacin del producto.

2.5. Caso de estudio.


Este tema ser desarrollado en equipo, de la misma manera que el trabajo de la unidad anterior, pero considerando lo siguiente: 1) 2) 3) 4) 5) 6) 7) 8) Explicacin del lenguaje que se va a desarrollar. Problemtica que pretende resolver. Vocabulario del lenguaje. Reglas de estructuracin. Semntica. Si se creara cdigo intermedio. En caso de darse el punto 6) Si se mejora ese cdigo. Si se tendr cdigo objeto final o ser interpretado.

Ing. Victor M. Caldern Hdez.

Pgina 6

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Unidad III. Anlisis Lxico.


Un analizador lxico o analizador lexicogrfico (scanner), es un programa que recibe como entrada el cdigo fuente de otro programa y produce una salida compuesta de elementos lxicos (tokens) o smbolos.

3.1 Introduccin a los Autmatas finitos y expresiones regulares.


Un autmata finito (AF) es un modelo matemtico que realiza cmputos en forma automtica sobre una entrada para producir una salida. Est conformado por: a) un alfabeto, b) un conjunto de estados y c) un conjunto de transiciones entre dichos estados. Se basa en una funcin de transicin, que recibe una cadena de caracteres (estado inicial) pertenecientes a un alfabeto. Lee dicha cadena a medida que el autmata se desplaza de un estado a otro (carcter a carcter), para finalmente detenerse en una salida (estado final) y aceptar o rechazar la cadena. Un autmata finito determinista es una 5-tupla (Q, , q0, , F) donde: Q es un conjunto finito de estados. es un alfabeto finito. q0 es el estado inicial. es una funcin de transicin. F es un conjunto de estados finales o de aceptacin.

Una expresin regular (ER) describe un conjunto de cadenas sin enumerar sus elementos, es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje, cada expresin regular tiene un autmata finito asociado. Una barra vertical separa las alternativas e las expresiones regulares, es posible usar un cuantificador tras un carcter para especificar la frecuencia con la que puede ocurrir. Los ms comunes son +, ? y *: El signo ms (+) indica que el carcter al que sigue debe aparecer al menos una vez. Por ejemplo, "ho+la" describe el conjunto infinito hola, hoola, hooola, hoooola, etc. El signo de interrogacin (?) indica que el carcter al que sigue puede aparecer como mucho una vez. Por ejemplo, con la expresin "ob?scuro" se puede formar la palabra oscuro y obscuro. El asterisco (*) indica que el carcter que lo precede puede aparecer cero, una, o ms veces. Por ejemplo, "0*42" permite formar los nmeros 42, 042, 0042, 00042, etc. Los parntesis pueden usarse para definir el mbito y precedencia de los dems operadores. Por ejemplo, "(p|m)adre" es lo mismo que "padre|madre".

3.2 Analizador de lxico.


La funcin principal del analizador lxico (AL) es la de generar una lista ordenada de tokens, a partir de los caracteres de entrada, para ser usados por el analizador sintctico (AS) para construir el rbol sintctico. Por lo tanto es un mdulo complementario y a disposicin del analizador sintctico. El AL tiene las siguientes funciones adicionales: 1. 2. 3. 4. 5. 6. 7. 8. 9.
Programa Fuente Analizador Lxico

Token Nuevo Token? Manejador de errores Analizador Sintctico

Figura 3.1. Estructura de un Analizador Lxico.

Eliminacin de caracteres no vlidos. Auxiliar en el manejo de errores elaborado por el analizador sintctico. Manejo de algunos errores. Manejo del archivo de entrada del programa fuente: abrirlo, leer sus caracteres, cerrarlo y gestionar posibles errores de lectura. Eliminar comentarios, espacios en blanco, tabuladores y saltos de lnea (caracteres no vlidos para formar un token). Inclusin de archivos de libreras. La expansin de macros y funciones. Contabilizar el nmero de lneas y columnas para emitir mensajes de error. Reconocimiento y ejecucin de las directivas de compilacin (por ejemplo, para depurar u optimizar el cdigo fuente).
Pgina 7

Ing. Victor M. Caldern Hdez.

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Para crear un analizador lxico se puede hacer de una de las siguientes maneras: Obtener el autmata finito determinista (AFD) de la expresin regular que describe los tokens y simularlo. Obtener el autmata finito no determinstico (AFND) y simularlo. Obtener el AFND y despus un equivalente AFD.

Se puede simular de dos formas: 1) implementar directamente la funcin o 2) simular las transiciones mediante sentencias condicionales.

3.3 Manejo de localidades temporales de memoria (buffers).


Es de suma importancia el manejo de localidades de memoria (buffers) para la lectura del cdigo fuente y anlisis del mismo, esto debido a que es ms rpido y eficiente manipular cadenas de caracteres en memoria primaria que en disco. Antiguamente, con las limitaciones en las capacidades de memoria de las pc, al AL requera de mucho tiempo y constantes lecturas a disco duro, lo que a veces provocaba errores de lectura. Un ejemplo del uso de buffers en el AL es el siguiente, Suponga que obtiene de un archivo la siguiente lnea o instruccin. arreglo[i]=2+4*a esto se almacena en memoria de la siguiente manera: Buffer de entrada: a r r
Inicio del lexema

a
carcter analizado

Cada componente lxico va acompaado de su lexema y se obtiene como resultado: <TKN ID, arreglo> <TKN CORAPER, [> <TKN ID, i> <TKN CORCIERRE, ]> <TKN NUM, 2> <TKN OPADD, +> <TKN NUM, 4> <TKN OPMUL, *> <TKN ID, a>

3.4 Creacin de tablas de smbolos.


Una tabla de smbolos es una estructura de datos que contiene un registro por cada identificador, con los campos para los atributos del identificador. La estructura de datos permite encontrar rpidamente el registro de cada identificador y almacenar o consultar rpidamente datos en un registro. Cuando el analizador lxico detecta un identificador en el programa fuente, el identificador se introduce en la tabla de smbolos. Las fases restantes introducen informacin sobre los identificadores en la tabla de smbolos y despus la utilizan de varias formas. Las tablas de smbolos (tambin llamadas tablas de identificadores o tablas de nombres), realizan dos funciones en el proceso de traduccin: verificar que la semntica sea correcta y ayudar en la generacin apropiada de cdigo. En la tabla de smbolos, los atributos anexos de los identificadores usados en el programa fuente son: el nombre, tipo, direccin de almacenamiento y dimensin de una variable. La tabla de smbolos tiene como propsito registrar informacin que se comparte entre varias etapas y que permite administrar los recursos asociados a las entidades que manipular el programa. La creacin de la tabla de smbolos compete inicialmente al analizador de lxico, quien registrar a las entidades (Identificadores) de manera nica. En el contexto de un programa las entidades pueden describir propiamente objetos manipulables por el lenguaje (variables, constantes o funciones) o descriptores de acciones (palabras reservadas); ambas situaciones son reconocidas bajo el mismo patrn de identificador y la tabla de smbolos se emplea para hacer su discriminacin. Como las palabras reservadas es un conjunto de entidades conocido y finito, la tabla de smbolos se inicializa con ellas y cuando se reconoce un identificador, su lexema se busca en la tabla y si se encuentra en ella, se regresa el token correspondiente.
Ing. Victor M. Caldern Hdez. Pgina 8

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

3.5 Manejo de errores lxicos.


Cada fase de anlisis puede encontrar errores. Sin embargo, despus de detectar un error. Cada fase debe tratar de alguna forma ese error, para poder continuar la compilacin, permitiendo la deteccin de ms errores en el programa fuente. Un compilador que se detiene cuando encuentra el primer error, no resulta tan til como debiera. Las fases de anlisis sintctico y semntico por lo general manejan una gran proporcin de los errores detectables por el compilador. La fase lxica puede detectar errores donde los caracteres restantes de la entrada no forman ningn componente lxico del lenguaje. Los errores lxicos se detectan cuando el AL intenta reconocer componentes lxicos y la cadena de caracteres de la entrada no encaja con ningn patrn. Son situaciones en las que usa un carcter invlido (@, $, ", >, ...), que no pertenece al vocabulario del lenguaje de programacin, al escribir mal un identificador, palabra reservada u operador. Los errores lxicos tpicos son: 1) 2) 3) 4) Nombre ilegales de identificadores.- un nombre contiene caracteres invlidos. Nmeros incorrectos.- un nmero contiene caracteres invlidos o no est formado correctamente. Errores de ortografa en palabras reservadas.- caracteres omitidos, adicionales o cambiados de sitio. Fin de archivo.- se detecta un fin de archivo a la mitad de un componente lxico.

Los mtodos de recuperacin de errores lxicos se basan en saltarse caracteres en la entrada hasta que un patrn se ha podido reconocer; o bien optar por la insercin, borrado, sustitucin de un carcter en la entrada o intercambio de dos caracteres consecutivos.

3.6 Generadores de cdigo lxico: Lex y Flex.


Todos los analizadores lxicos realizan la misma funcin pero pueden reconocer diferentes tokens y pueden tener diferentes ER para el anlisis. Por ello y para ahorrar esfuerzo es mejor utilizar generadores automticos de analizadores lxicos. Estos generadores slo necesitan conocer la especificacin de tokens a reconocer. Lex (Lexical Analyzer Generator) o Flex (Fast Lexical Analyzer Generator) son generadores automticos de analizadores lxicos en lenguaje C. Es software de GNU y requiere un archivo de entrada, con la especificacin de los componentes lxicos y las expresiones regulares que los definen.
Programa Fuente en Lex (archivo.l) lex.yy.c Archivo de entrada Compilador de Lex o Flex Compilador de Lex o Flex a.out lex.yy.c

a.out

Acciones

Figura 3.2. Funcionamiento de Lex o Flex.

Genera un archivo de salida el cual es un programa en C, que implementa dicho analizador, preparado para ser compilado y utilizado. El cdigo C generado contiene una funcin llamada yylex(), que localiza cadenas en la entrada (lexemas) que se ajusten a uno de los patrones lxicos especificados en el cdigo fuente Lex, realizando entonces las acciones asociadas a dicho patrn, yylex() puede llevar a cabo cualquier tipo de acciones ante un determinado patrn y, en particular, puede comportarse como un analizador lxico. Un archivo Lex o Flex consiste de tres partes: 1) definiciones, 2) reglas y 3) rutinas auxiliares. Todo separado por %%, su estructura bsica es: { definiciones } %% { reglas } patrn 1 { cdigo C } patrn 2 { cdigo C } ... patrn n { cdigo C } %% { cdigo auxiliar } La seccin de definiciones incluye declaraciones de variables, constantes y definiciones regulares que pudieran ser utilizadas ms adelante. La seccin de reglas describe cada patrn y cada accin es un fragmento de cdigo que indica la accin que se debe realizar cuando se encuentra dicho patrn. La seccin de cdigo auxiliar contienen las funciones que pueden ser llamadas por las acciones de la seccin de reglas.
Ing. Victor M. Caldern Hdez. Pgina 9

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Siempre se debe considerar que al incluir cdigo en C, este debe estar entre %{ y %}, adems Flex hace correspondencia siempre con la cadena ms larga. Si se verifican dos patrones, se elige la regla que aparece primero por ello se debe colocar las palabras reservadas antes que los identificadores).
Smbolo [] \ ^ *, +, (), | ? {} Tabla 3.1 Smbolos para definir ER. Uso Define una clase Define un rango de valores Notifica el uso de smbolo especial Negacin Cadena de caracteres Operadores de ER Opcionalidad Expansin de macros definidas al inicio Ejemplo [0-9] [a-z] \t [^xy] Hola [0-9]+ [0-9]+(.[0-9]+)? {digito}

Palabra char * yytext; int yyleng Int yylex(); FILE * yyin; FILE * yyout; char input(); void output(c); void unput(c);

Tabla 3.2 Algunas palabras reservadas de Lex. Uso Almacena un lexema reconocido Longitud del lexema Llamada al analizador, regresa el tipo de token (0 si es EOF) Archivo de entrada, por defecto stdin Archivo de salida, por defecto stdout Carcter actual en el buffer Escribe un carcter en la salida Regresa un carcter al buffer de entrada

Para compilar un programa hecho en flex desde Linux: flex ejemplo1.l cc lex.yy.c -o a lfl a < entrada Ejemplo de un programa en flex para contar los identificadores, los nmeros reales y los enteros que estn presentes en un programa que recibe de entrada. %{ int nlineas=0; int nid=0; int nentero=0; int nreal=0; %} letra [a-zA-Z] digito [0-9] %% {letra}({letra}|{digito})* {printf("identificador %s \n", yytext); nid++;} {digito}+ {printf("entero %d \n", atoi(yytext)); nentero++;} {digito}+.{digito}+[\n] {nlineas++;} . {/* otra cosa, no hacer nada */} %% int main(int argc, char **argv) { yylex(); printf ("Nmero de lneas: %d \n", nlineas); printf ("Nmero de identificadores: %d \n", nid); printf ("Nmero de enteros: %d \n", nentero); printf ("Nmero de reales: %d \n", nreal); exit(0); }

Ing. Victor M. Caldern Hdez.

Pgina 10

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Unidad IV. Anlisis sintctico.


En el anlisis sintctico se verifican las funciones sintcticas o relaciones de concordancia y jerarqua que guardan las palabras agrupndose entre s, de un correcto anlisis sintctico depende la interpretacin y uso de las expresiones. Un analizador sintctico (AS o en ingls parser), es la parte del compilador que transforma su entrada en un rbol de derivacin, que son ms tiles para el posterior anlisis y capturan la jerarqua implcita de la entrada. Los lenguajes habitualmente reconocidos por los analizadores sintcticos son los lenguajes libres de contexto. Los lenguajes libres de contexto son aquellos reconocibles por un autmata de pila, de modo que todo analizador sintctico que reconozca un lenguaje libre de contexto es equivalente en capacidad computacional a un autmata de pila. La tarea esencial de un analizador es determinar si una determinada entrada puede ser derivada desde el smbolo inicial, usando las reglas de una gramtica formal. Existen esencialmente dos formas de lograr esto: 1) Anlisis sintctico descendente (Top-Down-Parser). 2) Anlisis sintctico ascendente (Bottom-Up-Parser).

4.1 Introduccin a las Gramticas libres de contexto y rboles de derivacin.


Una gramtica libre de contexto (o de contexto libre) es una gramtica formal en la que cada regla de produccin es de la forma: Vw Donde V es un smbolo no terminal y w es una cadena de terminales y/o no terminales. Se dice que es libre de contexto por el hecho de que el no terminal V puede siempre ser sustituido por w sin tener en cuenta el contexto en el que ocurra. Las gramticas libres de contexto permiten describir la mayora de los lenguajes de programacin, pero estas gramticas son suficientemente simples como para permitir el diseo de eficientes algoritmos de anlisis sintctico. La notacin ms frecuentemente utilizada para expresar gramticas libres de contexto es la forma Backus-Naur. Una gramtica libre de contexto puede ser definida mediante la 4-tupla, G = (Vt, Vn, P, S) donde: Vt es un conjunto finito de terminales. Vn es un conjunto finito de no terminales. P es un conjunto finito de producciones. S Vn es el denominado smbolo inicial. Ejemplo de una gramtica libre de contexto para la expresin (x + y) *x - z *y / (x + x): S x | y | z | S + S | S - S | S *S | S/S | (S) Un rbol de derivacin permite mostrar grficamente cmo se puede derivar cualquier cadena de un lenguaje a partir de una gramtica que genera ese lenguaje. Un rbol es un conjunto de nodos unidos por arcos, un arco conecta dos nodos distintos. El rbol de derivacin tiene las siguientes propiedades: El nodo raz est rotulado con el smbolo distinguido de la gramtica. Cada hoja corresponde a un smbolo terminal o un smbolo no terminal. Cada nodo interior corresponde a un smbolo no terminal.

Gramticas ambiguas.- Una gramtica es ambigua si permite construir dos o ms rboles de derivacin distintos para la misma cadena. Por lo tanto, para demostrar que una gramtica es ambigua lo nico que se necesita es encontrar una cadena que tenga ms de un rbol de derivacin. Si todas las gramticas independientes del contexto para un lenguaje son ambiguas, se dice que el lenguaje es un lenguaje independiente del contexto inherentemente ambiguo. Estas gramticas son ms difciles de analizar porque el analizador no puede decidir siempre que produccin aplicar.
Ing. Victor M. Caldern Hdez. Pgina 11

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Derivaciones.- Existen principalmente dos formas de describir cmo una gramtica de una cadena puede ser derivada desde el smbolo inicial. 1) La derivacin por la izquierda es aquella en la que se opta por reemplazar siempre el no terminal de ms a la izquierda primero. 2) La derivacin por la derecha se define como la lista que se obtiene si siempre se reemplaza primero el no terminal de ms a la derecha. Ejemplo de derivaciones: Si se toma la cadena "1 + 1 + 1" con la siguiente gramtica: (1) S S + S (2) S 1 Su derivacin a la izquierda dara la estructura de derivacin: SS+S SS+S+S SS+S+1 SS+1+1 S1+1+1 {{{1}S + {1}S}S + {1}S}S Donde {...}S indica la subcadena reconocida como perteneciente a S. Por la derecha su derivacin dara la estructura de la manera: S S+S S S+S+S S 1+S+S S 1+1+S S 1+1+1 La distincin entre derivacin por la izquierda y por la derecha es importante porque en la mayora de analizadores, la transformacin de la entrada es definida dando una parte de cdigo para cada produccin que es ejecutada cuando la regla es aplicada. De modo que es importante saber qu derivacin aplica el analizador, porque determina el orden en el que el cdigo ser ejecutado. Una derivacin tambin puede ser expresada mediante un rbol sintctico, los arboles de derivacin de las derivaciones anteriores serian: S S + S S + S 1 1 1 1 S S + S S + S 1 1

Figura 4.1. rbol de derivacin por la izquierda.

Figura 4.2. rbol de derivacin por la derecha.

4.2 Diagramas de sintaxis.


Los diagramas sintcticos o de sintaxis son una manera de representar una gramtica libre de contexto. Son una alternativa grfica para la Forma de Backus-Naur (BNF, por sus siglas en ingls) o la Forma Extendida de Backus-Naur (EBNF, por sus siglas en ingles). Cada diagrama tiene un punto de entrada y un punto final. El diagrama describe los caminos posibles entre estos dos puntos pasando a travs de otros no terminales y terminales. Los terminales son representados por cajas redondas mientras los no terminales se representan por cajas cuadradas.
Ing. Victor M. Caldern Hdez. Pgina 12

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Los lenguajes pueden ser especificados mediante un conjunto de reglas que se llaman gramtica, en BNF toda regla comienza con un nombre (lado izquierdo) seguido por el carcter : y posteriormente aparece el cuerpo (lado derecho) de la regla. Todas las reglas terminan con el carcter ; por ejemplo: nombre : cuerpo ; Las reglas pueden ser de tres tipos: 1) alternativas, 2) enumeraciones y, 3) referencias a smbolos bsicos del vocabulario o a otras reglas. El tipo de regla ms flexible es la alternativa. Las alternativas sirven para otorgar varias opciones a elegir. Las diferentes opciones de la regla se separan con un el carcter |. Por ejemplo, para indicar que una Notebook puede ser Toshiba, Dell, o Lenovo se puede escribir de la manera: Notebook : Toshiba | Dell | Lenovo ; Aqu se hace la suposicin de que las marcas de laptop son smbolos bsicos del vocabulario de un lenguaje. Adems de smbolos del vocabulario, se pueden utilizar otras reglas. Por ejemplo, como se utilizara la regla anterior para definir la regla Computadoras: Computadoras : Notebook | Netbook | Desktop ; Notebooks : Toshiba | Dell | Lenovo ; Netbooks : HP | Acer | Asus ; Desktops : Emachine | Gateway ; Se pueden incluir comentarios de una sola lnea (con la doble barra, //) o de varias lneas (entre /* y */). Las reglas de enumeracin no son ms que una lista ordenada de referencias (a otras reglas o a elementos del vocabulario). Sirven para reconocer series de elementos. Los elementos simplemente se escriben unos detrs de otros, en el orden deseado, y separados por espacios, retornos de carro o tabulaciones. Por ejemplo: Dato : Las Notebooks procesador son mejores ; procesador : Intel | AMD | Atom ; En este caso los smbolos bsicos del lenguaje son. Las, son, mejores, Intel, AMD, Atom y los asociados a Notebooks. Dato y procesador son reglas de la gramtica. La regla Dato permite reconocer varias entradas. Por ejemplo reconocer la entrada Las Dell Intel son mejores o Las Lenovo Atom son mejores. En BNF es posible utilizar enumeraciones como sub reglas de alternativas: Dato: Las netbook Netbooks son mejores | La Desktops de escritorio es rpida ; Las referencias a otras reglas o smbolos, tambin denominados patrones repetitivos, se emplean para reconocer cero, uno o ms elementos. En BNF los patrones repetitivos deben implementarse con la recursin, es decir, con una regla que se llame a s misma. Por ejemplo, para reconocer una llamada a una funcin con una lista de cero o ms parmetros se hace de la forma: Referencia: Identificador PA listaParametros PC ; listaParametros : parametro listaParametros // regla recursiva | parmetro ; parametro : Notebooks | procesador ; Suponiendo que PA es el parntesis abierto y PC es el parntesis cerrado, tendremos que la regla descrita permitir reconocer entradas como Laptop(Intel) o computadora(HP, AMD). Ntese que en la implementacin de este conjunto de reglas se ha utilizado una alternativa de uno o ms. EBNF permite el uso de sub reglas de una enumeracin, pero para ello es recomendable utilizar parntesis por ejemplo: orden: Iniciar (Sistema | Aplicacin) DE (Windows | Antivirus | Textos);
Ing. Victor M. Caldern Hdez. Pgina 13

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

EBNF introduce dos operadores nuevos: la clausura positiva (que se representa con el smbolo +) y cierre de Kleene (que se representa con el asterisco, *). Estos dos operadores se emplean en conjuncin con los parntesis para indicar repeticin. La clausura positiva indica esto se repite una o ms veces mientras que el cierre de Kleene indica cero o ms veces, tambin se puede utilizar la recursin aunque en la mayora de los casos bastar con los cierres y clausuras. EBNF permite dos tipos adicionales de sub reglas: la opcionalidad y la negacin. Una sub regla opcional se representa con el operador de opcionalidad, que es la interrogacin (?). Normalmente se utiliza en conjuncin con los parntesis. La sub regla opcional es una regla que puede estar o puede no estar en la entrada. El smbolo de la negacin (~). Sirve para indicar que se espera una entrada que sea cualquier entrada que NO satisfaga esta regla. Normalmente se utiliza en los analizadores lxicos. Este es un ejemplo de lo visto en este tema, para expresiones que contienen slo nmeros enteros, sumas y multiplicaciones (tomado de http://en.wikipedia.org/wiki/File:Syntax_Diagrams.png)

Figura 4.3. Ejemplo de Diagrama de Sintaxis.

Este diagrama es equivalente a la siguiente gramtica EBNF: <expression> ::= <term> {+ <term>} <term> ::= <factor> {* <factor>} <factor> ::= <constant> | <variable> | (<expression>) <variable> ::= x | y | z <constant> ::= <digit>{<digit>} <digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Ing. Victor M. Caldern Hdez. Pgina 14

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

4.3 Precedencia de operadores.


La precedencia de operadores es un conjunto de reglas que controla el orden en que se realizan las operaciones cuando se evala una expresin. Las operaciones con mayor precedencia se realizan antes que las de menor prioridad. Por ejemplo, la multiplicacin se realiza antes que la suma. Los parntesis en una expresin modifican el orden de evaluacin determinado por la precedencia de operador. Esto significa que una expresin encerrada entre parntesis se evala por completo antes de usar su valor en el resto de la expresin. Se respetan las reglas del lenguaje formal de las matemticas o si se cambian debe especificarse adecuadamente.

4.4 Analizador sintctico.


4.4.1 Analizador descendente (LL). En ste analizador las entradas son de izquierda a derecha y la construccin de derivaciones inician por la izquierda de una sentencia o enunciado. La clase de gramtica que es analizable por este mtodo es conocida como gramtica LL. Las diferentes formas del anlisis descendente son: a) anlisis sintctico con retroceso, se van probando una por una todas las reglas candidatas a ser aplicadas para construir el rbol de anlisis sintctico. Cuando una regla seleccionada falla, entonces se retrocede y se prueba con la siguiente regla. b) anlisis sintctico predictivo, se decide qu regla de produccin aplicar a cada paso en funcin de los elementos terminales que se encuentran en la cabeza de lectura de la cadena de entrada. 4.4.2 Analizador ascendente (LR, LALR). El anlisis sintctico ascendente es una tcnica de anlisis sintctico que intenta comprobar si una cadena X pertenece al lenguaje definido por una gramtica L(G) aplicando los siguientes criterios: 1) 2) 3) 4) 5) Partir de los elementos terminales de la frase X. Escoger reglas gramaticales estratgicamente. Aplicar a la inversa derivaciones por la derecha (Right Most Derivation). Procesar la cadena de izquierda a derecha. Intentar alcanzar el axioma para obtener el rbol de anlisis sintctico o error. El anlisis ascendente genera una cadena de derivacin por la derecha leda en sentido inverso.

4.5 Administracin de tablas de smbolos. 4.6 Manejo de errores sintcticos y su recuperacin. 4.7 Generadores de cdigo para analizadores sintcticos: Yacc, Bison.

Ing. Victor M. Caldern Hdez.

Pgina 15

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Unidad V. Anlisis semntico.


5.1 Analizador semntico.
El anlisis semntico busca establecer el tipo de los resultados intermedios, comprobar que los argumentos de un operador son operadores posibles, y si son compatibles entre s, etc. El analizador semntico comprobar que el significado de lo que se va leyendo sea vlido. Esto lo logra mediante el uso de un conjunto de rutinas independientes, llamadas por los analizadores morfolgico y sintctico. El anlisis semntico utiliza como entrada el rbol sintctico detectado por el anlisis sintctico para comprobar restricciones de tipo y otras limitaciones semnticas y preparar la generacin de cdigo. En compiladores de un paso, las llamadas a las rutinas semnticas se realizan desde el analizador sintctico y estas llaman al generador de cdigo. En compiladores de dos o ms pasos, el anlisis semntico se realiza independientemente de la generacin de cdigo, pasando informacin a travs de un archivo intermedio que contiene informacin sobre el rbol sintctico. La salida posible del analizador semntico es un rbol semntico.

5.2 Verificacin de tipos en expresiones.


La verificacin de los tipos de datos se hace asignando el valor de tipo de cada una de los componentes lxicos (propagacin de atributos). Estos valores se comparan para verificar que los tipos de datos coincidan y sean congruentes, de lo contrario no se pueden realizar los clculos . Las rutinas semnticas suelen hacer uso de una pila (pila semntica) que contiene la informacin semntica asociada a los operandos, y en caso necesario de los operadores, en forma de registros semnticos. Ejemplo del funcionamiento del analizador semntico: int a, b, c; a / b * c^2;
Figura 5.1. Definicin de variables y expresiones Tabla 5.1. Tabla de Smbolos (Anlisis Lxico)

/ a b c * ^ 2

Smbolo a b c

Memoria 0000:0000 0000:0002 0000:0004

Lnea 1 1 1

/ a
int

/ int * a
int

Figura 5.2. rbol de Derivacin (Anlisis Sintctico)

* int b
int

b
int

^ c 2

^ int c 2

int int Figura 5.3. Atributos de operandos (Anlisis Semntico)

int int Figura 5.4. Propagacin atributos (Anlisis Semntico)

5.3 Conversin de tipos.


En ocasiones sucede que se tiene un valor de un tipo y se pretende almacenar ese valor en una variable de un tipo diferente. En algunos lenguajes de programacin para algunos tipos, es posible almacenar simplemente el valor sin una conversin de tipos si el compilador reconoce, que la variable destino tiene el suficiente tamao para contener el valor origen; a esto se le denomina conversin implcita. Por ejemplo, en Java se puede almacenar un valor byte en una variable int, dado que este tipo de datos es de mayor tamao que el primero, el tipo ms pequeo se convierte al tipo ms grande. Si por el contrario, se desea asignar un valor de variable int a una variable byte se necesita realizar una conversin de tipos explcita. Pero en algunos casos se puede realizar la conversin pero se pueden perder datos, como por ejemplo al pasar un valor flotante a un entero.
Ing. Victor M. Caldern Hdez. Pgina 16

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

5.4 Acciones agregadas en un analizador sintctico descendente (top-down).


Se agreg al analizador sintctico descendente el uso de una pila auxiliar de smbolos terminales y no-terminales, para determinar qu produccin debe aplicarse. En cada momento se busca en una tabla de anlisis sintctico el smbolo de pre anlisis que se est observando en ese momento y, en base con el smbolo en la cima de la pila, se decide la accin a realizar. A este tipo de analizador se le denomina, analizador sintctico descendente dirigido por tabla. Este tipo de analizador est compuesto de: Buffer de entrada.- contiene la cadena de componentes lxicos que se va a analizar seguida del smbolo # de fin de cadena. Figura 5.5. Esquema del AS descendente dirigido por tablas Pila de anlisis sintctico.- contiene la secuencia de smbolos de la gramtica y el smbolo # en la parte de abajo que indica la base de la pila. Tabla de anlisis sintctico.- es una matriz bidimensional que dirige el anlisis y es diferente segn la gramtica usada. Salida.- es una serie de producciones utilizadas en el anlisis de la secuencia de entrada.

El analizador sintctico tiene en cuenta en cada momento, el smbolo de la cima de la pila (para estos apuntes se le llamara ap) y el smbolo actualmente en anlisis de la cadena de entrada (el smbolo de pre anlisis, aqu se le llamara an). Estos dos smbolos determinan la accin a realizar, que pueden ser: Si ap == an == #, el anlisis sintctico ha llegado al final y la cadena ha sido reconocida con xito. Si ap == an #, el terminal se saca de la pila (se ha reconocido ese terminal) y se avanza en la entrada obteniendo el siguiente componente lxico. Si ap es no-terminal, entonces se consulta en la tabla una produccin a aplicar o si est vaca es porque ocurri un error. Si es una produccin de la forma sx1x2..xn, se introducen los smbolos xn..x2x1 en la pila (observe que es en orden inverso al que aparecen). Si es un error el analizador llama a una rutina de error.

El anlisis sintctico dirigido por tabla es ms eficiente en cuanto a tiempo de ejecucin y espacio, puesto que usa una pila para almacenar los smbolos a reconocer en vez de llamadas a procedimientos recursivos.

5.5 Pila semntica en un analizador sintctico ascendente (bottom up).


En un anlisis bottom-up, se asocia a cada smbolo no terminal una informacin semntica, y a cada regla de produccin una accin semntica. Por ejemplo, sea la gramtica E ::= E + T E ::= E - T E ::= T T ::= T * F T ::= T / F T ::= F F ::= i F ::= (E) F ::= -F La regla F::=i asocia a F como informacin semntica el identificador concreto. La regla F::=(E) asocia a F como informacin semntica la informacin semntica asociada a E. La informacin semntica se suele almacenar en otra pila paralela, aqu se aplican las pilas para analizar y hasta evaluar las expresiones, esto se hace de la siguiente manera, suponga que se tiene la siguiente expresin, Ejemplo: al analizar la expresin a*(b+c). La pila sintctica quedara de la forma.
Ing. Victor M. Caldern Hdez. Pgina 17

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Pila a F(a) T(a) T(a)* T(a)*( T(a)*(b T(a)*(F(b) T(a)*(T(b) T(a)*(E(b) T(a)*(E(b)+ T(a)*(E(b)+c T(a)*(E(b)+F(c) T(a)*(E(b)+T(c) T(a)*(E(b)+T(c) T(a)*(E(T1) T(a)*(E(T1)) T(a)*F(T1) T(T2) E(T2)

Entrada a*(b+c) *(b+c) *(b+c) *(b+c) (b+c) b+c) +c) +c) +c) +c) c) ) ) ) ) )

Regla F::=i T::=F

Cudrupla

F::=i T::=F E::=T

F::=i T::=F E::=E+T E::=E+T F::=(E) T::=T*F E::=T

(+,b,c,T1)

(*,a,T1,T2)

5.6 Administracin de la tabla de smbolos. 5.7 Manejo de errores semnticos.

Ing. Victor M. Caldern Hdez.

Pgina 18

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Unidad VI. Generacin de cdigo intermedio.


Despus del anlisis semntico es recomendable generar una representacin intermedia explcita del programa fuente. Esta representacin intermedia debe tener dos propiedades: a) debe ser fcil de producir y, b) fcil de traducir al programa objeto. El cdigo de tres direcciones es la forma ms usada de representacin intermedia y consiste en que cada instruccin tiene como mximo tres operandos.

6.1 Lenguajes intermedios.


No existe un nico lenguaje intermedio para todos los compiladores, cada desarrollador de compiladores suele tener su propio lenguaje intermedio. La utilizacin de un lenguaje intermedio permite construir en menos tiempo un compilador para otra mquina y, tambin permite construir compiladores para otros lenguajes fuente generando cdigos para la misma mquina. La generacin de cdigo intermedio transforma un rbol de anlisis sintctico (semntico) en una representacin en un lenguaje intermedio, que suele ser cdigo sencillo para poder generar el cdigo mquina. Una forma de representacin intermedia es mediante el cdigo de tres direcciones. Una sentencia en cdigo de tres direcciones tiene la forma operando := operando operador operando, donde operando son los operandos y operador es un operador binario. Tambin permite condiciones simples y saltos. Por ejemplo, para la siguiente sentencia: FOR (I=0; I<10; I++){ IF(I/2==0) PAR++; ELSE IMPAR++; } El cdigo intermedio generado (cdigo en tres direcciones) ser: I=0; L1: IF I < 10 GOTO L2 GOTO L6 L2: T1 = I / 2 IF T1 == 0 GOTO L3 GOTO L4 L3: PAR = PAR + 1 GOTO L5 L4: IMPAR= IMPAR + 1 L5: I = I + 1 GOTO L1 L6: . . . . . . . Existen 3 tipos de lenguajes intermedios: Tipo 1.- es una representacin ms abstracta y uniforme que un lenguaje mquina, su funcin es la de descomponer las expresiones complejas en binarias y las sentencias complejas en sentencias simples. Ventajas: Permite una fase de anlisis (anlisis semntico) independiente de la mquina. Realiza optimizaciones sobre el cdigo intermedio.

Desventajas: Prdida de eficiencia. Introduce en el compilador una nueva fase de traduccin.


Pgina 19

Ing. Victor M. Caldern Hdez.

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Tipo 2.- son los lenguajes intermedios que utilizan: rbol sintctico. rbol sintctico abstracto. o Todos los nodos del rbol representan smbolos terminales. o Los nodos hijos son operandos y los nodos internos son operadores. Grafo dirigido acclico (GDA). Notacin posfija. Definicin de una mquina abstracta. N-tupla o Cada sentencia del lenguaje intermedio consta de N elementos (Operador, Operando1, Operando2, , Operando N1) o Los ms usuales son los tercetos (tripletas) y los cuartetos (cudruplas), llamados tambin cdigo de tres direcciones. Tipo 3.- se compone nicamente de tripletas y cuartetas. Tripletas: < operador> <operando_1> <operando_2> Ejemplo: d=a+b*c [1] (*, b, c) [2] (+, a, [1]) [3] (=, d, [2]) Cuartetos: Ejemplo:

d=a+b*c (*, b, c, temp1) (+, a, temp1, temp2) (=, temp2, , d)

6.2 Notaciones.
6.2.1 Infija. En esta notacin se escriben los operadores entre los operandos (por ejemplo a+b/c), en la notacin infija en ocasiones es necesario rodear entre parntesis a los grupos de operandos y operadores, para indicar el orden en el cual se deben realizar las operaciones (por ejemplo (a+b)/c). Si no se emplean los parntesis se emplean las reglas de prioridad de operadores que determinan el orden de las operaciones. No se tiene una estructura sencilla para representar esta notacin en la computadora por ello se utilizan otras notaciones. 6.2.2 Postfija. La Notacin Polaca Inversa o notacin postfija es un mtodo alternativo de introduccin de datos, en el que primero estn los operandos y despus viene el operador que va a realizar los clculos sobre ellos (infijo a+b/c postfija abc/+). No necesitan usar parntesis para indicar el orden de las operaciones mientras la aridad del operador sea fija. Esta notacin evala los datos cuando se introducen y los almacena en una estructura del tipo LIFO (Last In First Out), lo que optimiza los procesos de programacin ya que al evaluar los datos directamente al introducirlos no es necesario ordenar la evaluacin de los mismos como sucede en la notacin infija, as, para hacer una suma a+b=c se hara de la forma a b +, dejando el resultado en c directamente. 6.2.3 Prefija. La notacin polaca o notacin prefija, es una forma de notacin cuya caracterstica distintiva es que coloca los operadores a la izquierda de sus operandos (infijo a+b/c prefija +a/bc). Si la aridad de los operadores es fija, el resultado es una sintaxis que carece de parntesis u otros signos de agrupacin, y todava puede ser analizada sin ambigedad. La notacin de prefijo es utilizada en las operaciones basadas en pila, debido a que distingue fcilmente el orden de las operaciones sin usar parntesis para evaluar las operaciones, no necesita una jerarqua operacional como en la notacin infija.

Ing. Victor M. Caldern Hdez.

Pgina 20

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Las expresiones se leen de izquierda a derecha, primero se busca un operador y posteriormente se buscan dos operandos. Si se encuentra otro operador antes de que se localicen los dos operandos, el operador anterior colocado a un lado hasta que el nuevo operador sea resuelto. Este proceso se itera hasta que un operador sea resuelto.

6.3 Representacin de cdigo intermedio.


Se tienen varias formas para representar cdigo intermedio. Estas notaciones simplifican la traduccin del cdigo fuente a cdigo objeto ahorrando y reduciendo smbolos de la tabla de smbolos. 6.3.1 Notacin Polaca. Cuando se realice la reduccin empleando la notacin polaca, se describen las uniones detalladas del paser con el resto del compilador. Un ejemplo claro de notacin polaca con generacin de cdigo intermedio es el lenguaje ensamblador, por ejemplo: Se tiene la expresin R=A+B/C al evaluarla se hara de la siguiente manera, se pasa a notacin polaca =R+A/BC, es necesario usar registros para la evaluacin de la expresin y queda en cdigo intermedio de la siguiente manera: Operacin /BC +Aax =Rbl Cdigo Mov ax, B Div ax,C Mov bl, A Add bl, al Lea cl, R Mov cl, bl

6.3.2 Cdigo P. Se refiere al pre cdigo de la compilacin, es un lenguaje intermedio o cdigo portable que proporciona un formato alternativo binario para cdigo nativo de cualquier compilador binario. Que contenga una mquina virtual para ejecutar cdigo p. La implementacin ms famosa de este cdigo est hecha para cdigo en pascal, pero tambin est presente en los lenguajes desarrollados por Microsoft, en MATLAB, Java y muchos ms. En comparacin con una traduccin directa a cdigo mquina, la traduccin a cdigo p y su ejecucin ofrece ms ventajas. Por su portabilidad es ms fcil escribir un pequeo intrprete de cdigo p, de lo que es modificar un compilador para generar cdigo nativo para la misma mquina. El implementar la generacin de cdigo mquina es una de las partes ms complicadas de escribir un compilador. En comparacin, la generacin de cdigo p es mucho ms fcil. Tiene un tamao compacto debido a que el cdigo p se basa en una mquina virtual ideal, un programa de cdigo p es a menudo ms pequeo que el mismo programa traducido a cdigo mquina. Cuando la depuracin de cdigo p se ejecuta, el intrprete puede aplicar controles adicionales de tiempo de ejecucin que son difciles de implementar con cdigo nativo. En la dcada de 1990, la traduccin al cdigo p se convirti en una estrategia popular para las implementaciones de lenguajes como Python y Java. El lenguaje de estudio para estos apuntes es el Prolog, proveniente del francs Programation et Logique, es un lenguaje de programacin lgico e interpretado, bastante popular en el medio de investigacin en Inteligencia Artificial. Inicialmente se trataba de un lenguaje totalmente interpretado hasta que, a mediados de los 70 se desarroll un compilador capaz de traducir Prolog en un conjunto de instrucciones de una mquina abstracta denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces Prolog es un lenguaje semi-interpretado. Prolog pertenece al paradigma de los lenguajes lgicos, lo que lo hace diferente de otros lenguajes ms populares tales como Fortran, Pascal, C, etc. En los cuales las instrucciones se ejecutan normalmente en orden secuencial, es decir, una a continuacin de otra, en el mismo orden en que estn escritas y slo vara cuando se alcanza una instruccin de control (un bucle o ciclo, una instruccin condicional o una transferencia).

Ing. Victor M. Caldern Hdez.

Pgina 21

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Los programas en Prolog se componen de clusulas que constituyen reglas del tipo si es verdad el antecedente, entonces es verdad el consecuente. Pero en Prolog primero se debe de escribir el consecuente y luego el antecedente, el antecedente puede ser una conjuncin de condiciones que se denomina secuencia de objetivos. Cada objetivo se separa con una coma y puede considerarse similar a una instruccin o llamada a procedimiento de los lenguajes imperativos. Por ejemplo: esmejorque(100, 70). Se lee de la siguiente manera: 100 es mejor que 70. Prolog utiliza tambin listas, estas son colecciones de elementos y se dividen en dos partes: a) Cabeza.- es el primer elemento de la lista y, b) Cola.- es una lista con el resto de los elementos de la lista. La cabeza y la cola de una lista se separan con el smbolo |, un % indica un comentario. Ejemplo de Cdigo Prolog % declaraciones fabrica(intel, pentium). % Intel fabrica pentium fabrica(intel, celeron). % Intel fabrica celeron fabrica(intel, centrino). % Intel fabrica centrino % dual core es posterior de pentium si pentium es anterior a dual core esposteriora(dual core, pentium):- esanteriora(pentium, dual core). % pentium es anterior a core duo si core dou es posterior de dual core y pentium es anterior a dual core esanteriora(pentium, core dou):- esposteriora(core dou, dual core), esanteriora(pentium, dual core). % celeron y centrino son de la misma familia si el fabricante de celeron es tambin de centrino y si celeron % no es lo mismo que centrino esfamiliade(celeron, centrino):- celeron \== centrino. % core dou es familiar de pentium si core dou pertenece a centrino o Intel fabrica core duo esfamiliarde(core duo, pentium):- pertenecea(core duo, centrino). esfamiliarde(core duo, pentium):- fabrica(intel, core duo). % consultas % celeron es familia de pentium ?- esfamiliade(celeron, pentium). si % core dou es posterior a pentium ?- esposteriora(core duo, pentium). si % dual core es anterior a core duo? ?- esanteriora(dual core, core duo). no % Ejemplo sobre Listas Prolog % las listas se encuentran entre []. % para determinar que una lista vaca es 0 se hace de la manera. longitud([], 0). % para lograr obtener la cantidad de elementos en una lista se hace de la manera. longitud([H|T], N):- longitud(T, N0), N is N0 + 1. ?- longitud([a,b,c], L). 3
Ing. Victor M. Caldern Hdez. Pgina 22

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

?- longitud([a,b,c],4). No % un elemento pertenece a la lista si coincide con la cabeza o si se encuentra en la cola de la lista. pertenece(X, [X|_]). pertenece(X, [_|R]):- pertenece(X, R). ?- pertenece(1, [1, 2, 3]). si ?- pertenece(2, [1, [2, 3]]). no ?- pertenece([2, 3], [1, [2, 3]]). si 6.3.3 Triplos.

Es una notacin compuesta de 3 elementos: <operador>, <operando1>, <operando2> el resultado se asocia al nmero de tripleta. Por ejemplo: W*X+(Y+Z) quedara de la manera: [1] *, W, X [2] +, Y, Z [3] +, [1], [2] Observe que toda expresin o instruccin, se debe descomponer en partes ms pequeas, de manera que solo estn formadas por 3 componentes o elementos. Un ejemplo de una condicin seria: if a>10 THEN r=a else r=10+1 [1] >, a, 10 2. saltar si falso, [1], 5 3. =, r, a 4. saltar, , 7 [5] +, 10, 1 6. =, r, [5] 7. ... El problema de las tripletas radica en que la optimizacin supone mover tripletas y hay que recalcular las referencias. Esto sucede en las tripletas indirectas y la solucin al problema de la reordenacin se logra mediante la indireccin. Esto se puede observar en el siguiente ejemplo: A=B+C*D/E F=C*D sin optimizar [1] *, C, D [2] /, [1], E [3] +, B, [2] [4] =, A, [3] [5] *, C, D [6] =, F, [1] 6.3.4 Cudruplos. Las cudruplas se componen como su nombre lo dice de 4 elementos, <operacin>, <operando1>, <operando2>, <resultado> un ejemplo seria: (A+B)*(C+D)-E
Ing. Victor M. Caldern Hdez. Pgina 23

optimizada [1] *, C, D [2] /, (1), E [3] +, B, [2] [4] =, A, [3] [5] =, F, [1]

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

(+, A, B, T1) (+, C, D, T2) (*, T1, T2, T3) (-, T3, E, T4) Donde T1, T2, T3, T4 son variables temporales. Las cudruplas facilitan la aplicacin de muchas optimizaciones, pero hay que tener un algoritmo para la reutilizacin de las variables temporales (reutilizacin de registros del procesador).

6.4 Esquemas de generacin.


Los esquemas es una representacin bsica de las operaciones que se pueden realizar por el lenguaje de programacin, utilizando arboles de anlisis para la generacin de cdigo intermedio. Y se asocia a un grupo de instrucciones a aplicar a la expresin. Los esquemas de generacin son las estrategias o acciones que se debern realizarse y tomarse en cuenta en el momento de generar cdigo intermedio. 6.4.1 Expresiones. Toda expresin debe reducirse a sus partes mnimas y de esa manera obtener una plantilla o esquema de cmo solucionar la instruccin. Por ejemplo: a=b+c*d/e Se descompone en las operaciones prefijas: [1] *, c, d [2] /, [1], e [3] +, b, [2] 4. =, a, [3] El esquema de instrucciones queda de la manera: Operador Operando, Operando 6.4.2 Declaracin de variables, constantes. Las declaraciones de variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple. Por ejemplo int a,b,c; Se descompone en: int a; int b; int c; 6.4.3 Estatuto de asignacin. Las operaciones de asignacin deben quedar expresadas por una expresin sencilla, si est es compleja se debe reducir hasta quedar un operador sencillo. Por ejemplo: x = a+b/5; Debe quedar de la forma: y = b/5; z = a+y; x=z. 6.4.4 Estatuto condicional. 6.4.5 Estatuto de ciclos. 6.4.6 Arreglos. 6.4.7 Funciones.
Ing. Victor M. Caldern Hdez. Pgina 24

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Unidad VII. Optimizacin.


7.1 Tipos de optimizacin.
7.1.1 Locales. 7.1.2 Bucles. 7.1.3 Globales. 7.1.4 De mirilla.

7.2 Costos.
7.2.1 Costo de ejecucin. 7.2.2 Criterios para mejorar el cdigo. 7.2.3 Herramientas para el anlisis del flujo de datos.

Ing. Victor M. Caldern Hdez.

Pgina 25

Ingeniera en Sistemas Computacionales

PROGRAMACIN DE SISTEMAS (ISIC-2004-296)

Unidad VIII. Generacin de cdigo objeto.


8.1 Lenguaje mquina.
8.1.1 Caractersticas. 8.1.2 Direccionamiento.

8.2 Lenguaje ensamblador.


8.2.1 Caractersticas. 8.2.2 Almacenamiento.

8.3 Registros.
8.3.1 Distribucin. 8.3.2 Asignacin.

8.4 Administracin de memoria.

Ing. Victor M. Caldern Hdez.

Pgina 26

También podría gustarte