Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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).
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)
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
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
Manejo de Errores
Optimizacin de Cdigo
Generacin de Cdigo
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.
La interpretacin es til en: Sistemas interactivos. Programas de pequea envergadura. Programas de prototipo y de enseanza.
Pgina 4
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.
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.
Pgina 6
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".
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
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.
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>
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.
a.out
Acciones
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
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); }
Pgina 10
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
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
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
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)
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
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.
Pgina 15
/ a b c * ^ 2
Smbolo a b c
Lnea 1 1 1
/ a
int
/ int * a
int
* int b
int
b
int
^ c 2
^ int c 2
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.
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) ) ) ) ) )
Cudrupla
(+,b,c,T1)
(*,a,T1,T2)
Pgina 18
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:
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.
Pgina 20
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.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).
Pgina 21
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
?- 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]
(+, 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).
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.
Pgina 25
8.3 Registros.
8.3.1 Distribucin. 8.3.2 Asignacin.
Pgina 26