1. Herramientas de Análisis de Programas Fuente Capítulo 3 Materia: Compiladores Docente: Ing. Carlos J. Archondo O. 1
2. Introducción Muchas herramientas de software que manipulan programas fuente realizan primero algún tipo de análisis. Algunos ejemplos de tales herramientas son: Editores de estructuras. Impresoras estéticas. Verificadores estáticos. Intérpretes. 2 Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
3.
4. El editor de estructuras no sólo realiza las funciones de creación y modificación de textos de un editor de textos ordinario, sino que también analiza el texto del programa imponiendo al programa fuente una estructura jerárquica apropiada.
5. De esa manera, el editor de estructuras puede realizar tareas adicionales útiles para la preparación de programas.
6. Por ejemplo:Puede comprobar si la entrada está formada correctamente. Puede proporcionar palabras clave de manera automática. Puede saltar desde un begin o un paréntesis izquierdo hasta su correspondiente end o paréntesis derecho. Además, la salida de tal editor suele ser similar a la salida de la fase del análisis de un compilador. 3 Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
7.
8. Por ejemplo:Los comentarios pueden aparecer con un tipo de letra especial. Las proposiciones pueden aparecer con una indentación proporcional a la profundidad de su anidamiento en la organización jerárquica de las proposiciones. 4 Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
9. Verificadores Estáticos Un verificador estático lee un programa, lo analiza e intenta descubrir errores potenciales sin ejecutar el programa. La parte del análisis es similar a la que se encuentra en los compiladores de optimación. Así un verificador estático puede detectar si hay partes de un programa que nunca se podrán ejecutar o si cierta variable se usa antes de ser definida. Además, puede detectar errores de lógica como intentar utilizar una variable real como apuntador, empleando las técnicas de verificación de tipos. 5 Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
10.
11. Para una proposición de asignación, por ejemplo, un intérprete podría:Construir un árbol y después efectuar las operaciones de los nodos conforme “recorre” el árbol. En la raíz descubriría que tiene que realizar una asignación, y llamaría a una rutina para evaluar la expresión siguiente y después almacenaría el valor resultante en la localidad de memoria asignada con el identificador posición. En el hijo siguiente de la raíz, la rutina descubriría que tiene que calcular la suma de dos expresiones. Se llamaría a si misma de manera recursiva para calcular el valor de la variable inicial. 6 Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
12. Flex:Generador de Analizadores Léxicos Materia: Compiladores Docente: Ing. Carlos J. Archondo O. 7 Flex es una herramienta para generar scanners: Programas que reconocen patrones léxicos en un texto. Flex lee los ficheros de entrada dados, o la entrada estándar si no se le ha indicado ningún nombre de fichero, con la descripción de un escáner a generar. La descripción se encuentra en forma de parejas de expresiones regulares y código C, denominadas reglas. Flex genera como salida un fichero fuente en C, `lex.yy.c', que define una rutina `yylex()'. Este fichero se compila y se enlaza con la librería `-lfl' para producir un ejecutable. Cuando se arranca el fichero ejecutable, este analiza su entrada en busca de casos de las expresiones regulares. Siempre que encuentra uno, ejecuta el código C correspondiente.
13. Flex:Ejemplo La siguiente entrada de Flex especifica un escáner que siempre que encuentre la cadena "username" la reemplazará por el nombre de entrada al sistema del usuario: %% usernameprintf( "%s", getlogin() ); Por defecto, cualquier texto que no reconozca el analizador léxico de Flex se copia a la salida, así que el efecto neto de este escáner es copiar su fichero de entrada a la salida con cada aparición de "username" expandida. En esta entrada, hay solamente una regla: "username" es el patrón y el "printf" es la acción. El "%%" marca el comienzo de las reglas. 8 Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
14. Flex:Formato del Fichero de Entrada El fichero de entrada de Flex está compuesto de tres secciones, separadas por una línea donde aparece únicamente un `%%' en esta: definiciones %% reglas %% código de usuario Definiciones: Contiene declaraciones de definiciones de nombres sencillas para simplificar la especificación del escáner, y declaraciones de condiciones de arranque. Reglas: Contiene una serie de reglas de la forma: patrón acción Código de usuario: Simplemente se copia a `lex.yy.c' literalmente. Esta sección se utiliza para rutinas de complemento que llaman al escáner o son llamadas por este. 9 Materia: Compiladores Docente: Ing. Carlos J. Archondo O.
15. Interacción con el Usuario #include "stdio.h“ #include "conio.h“ #include "iostream.h“ voidmain(void) { int variable,op,op2; char comentario[20],posmem[5]; clrscr(); cout <<"Compilador manual de Basic de 4 lineas para suma o resta"; cout<<"Que instruccion: 1.PRINT 2.INPUT: "; cin>>variable; if (variable==1){ cout<<"Que desea imprimir: 1.Texto 2.Variable:"; cin>>op; if (op==1){ cout<<"Escriba el texto:"; gets(comentario); gotoxy(30,10);cout<<"EAP "; gotoxy(34,10);cout<<comentario; gotoxy(50,10);cout<<"PRINT '"<<comentario<<"'"; } if (op==2){ cout<<"Que variable: 1.AX 2.Memoria:"; cin>>op2; if (op2==1){ gotoxy(30,10);cout<<"EAP "; gotoxy(50,10);cout<<"PRINT A"; } if (op2==2){ cout<<"Que posicion de memoria: "; gets(posmem); gotoxy(30,10);cout<<"MOV AX,"<<posmem; gotoxy(30,11);cout<<"EAP"; gotoxy(50,10);cout<<"PRINT B"; } } } if (variable==2){ gotoxy(30,10);cout<<"LDT"; gotoxy(30,11);cout<<"MOV 1A,AX"; gotoxy(50,10);cout<<"INPUT A"; } getch(); } Existen algunos compiladores como el DFD, que generan código por interacción con el usuario. El programa del ejemplo que vemos, es un sencillo generador de código de Assembler y Basic, ambos generados a la vez por interacción con el usuario. 10 Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Este programa servirá como base para diseñar un compilador
16. Pantallas Generadas por el Ejemplo El modo de encarar los programas es muy diferente entre el Basic y el Assembler, por lo que se deberá ver en detalle su formato. Como se puede apreciar el crear un compilador no es tarea sencilla, pero siguiendo los pasos de los estudios realizados por los expertos programadores se puede llegar a diseñarlos. 11 Materia: Compiladores Docente: Ing. Carlos J. Archondo O. Assembler Basic