COMPILADORES E INTERPRETES Análisis semántico: Estudia el significado de la sentencia Procesadores de lenguaje: Convierte un programa fuente hecho en un lenguaje fuente a un programa objeto hecho en un lenguaje objeto. En consecuencia, es un programa que esta hecho en maquina virtual y es transformado a un programa que entienda la maquina real. Observe el esquema: Maquina Virtual (Generado por SO) Maquina Real para para fuente (hecho en Leng. Fuente) CONVERTIR objeto (hecho en Leng. Objeto) Instrucciones máquina El lenguaje objeto es creado por el compilador, el cual debe estar preparado para el sistema operativo en el que será ejecutado y a la arquitectura respectiva del hardware. Por ejemplo, existen compiladores que a un programa fuente lo transforman a ejecutable para Windows (arquitectura CISC) o para MacOS (arquitectura RISC). Firmware (microprograma ubicado en la ROM) Especie de caja negra (no perceptible por el usuario) fuente (hecho en Pascal) Compilador (hecho en lenguaje C++) objeto (o para un SO Windows - CISC) (o para un SO MacOS - RISC) Lenguaje fuente Lenguaje de implementación Lenguaje objeto Un SO de arquitectura ietaria son aquellas que restringen el desarrollo de aplicaciones sólo a esa misma familia de SO, por ejemplo, Windows: sus aplicaciones no pueden ser ejecutadas por otros SO tal como MacOS o LINUX Interprete Java (utiliza bytecode) Lenguaje de implementación C++ Sistema Computacional Por eso se dice que el Java es el sucesor del C ++ Un SO de arquitectura abierta es aquel en que sus aplicaciones pueden ser ejecutadas en cualquier otro SO, como por ejemplo LINUX puede ser instalado en cualquier arquitectura como CISC o RISC, es decir se puede instalar en una PC o una Mac (Apple) respectivamente. Existen decompiladores que transforman un exe a código fuente. Pero, debe saberse de antemano cual fue el lenguaje que lo originó. Ing. Luis Reyes Lescano 1
Tipos de procesadores de lenguaje Traductores F uente Compilador objeto F uente Ensamblador objeto (Leng. de alto niv el o medio niv el) (Leng. objeto o máquina) (Leng. de ensamble) (Leng. objeto o máquina) Funcionalad: Toma todo el programa fuente y genera las instrucciones máquina (Prog.objeto), inclusive genera el exe que es igual al Prog.objeto+cargadores (rutinas de ejecusión del SO). Interpretes F uente (Leng. de alto niv el) Interprete objeto (Leng. objeto o máquina) Funcionalad: Toma el programa fuente y genera instrucciones máquina necesarias sentencia por sentencia (fuente) sobre la marcha. Muchas veces no genera el ejecutable y para esto necesita del software de apoyo (linker). Estructura de un compilador Etapa de Análisis Análisis Léxico Análisis Sintáctico Análisis Semántico Tabla de símbolos uniformes Etapa de Síntesis Generación código interno Optimizador Generación código final Tabla de manejo de errores PROG. FUENTE PROG. OBJETO ANALISIS LEXICO - Es un análisis lineal - Se da de izquierda a derecha - Necesita de un analizador léxico o scaner Ing. Luis Reyes Lescano 2
Funcionalad: - Se encarga de disponer el programa fuente en unades sintácticas, es decir, palabras con significado io, denominados componentes léxicos o tokens. Por ejemplo: palabras reservadas, entificadores, constantes, operadores aritméticos, operadores relacionales, operadores lógicos, símbolos de asignación, símbolos de puntuación o caracteres especiales del lenguaje, etc. - Elimina los caracteres en forma de espacios en blanco, ejemplo: espacio en blanco, tabulaciones y saltos de línea. - Elimina los comentarios. - Actualiza la tabla de símbolos uniformes, que es la contenedora de todos los tokens del programa fuente actual. Conceptos básicos: - Palabra reservada: Es aquella palabra del io lenguaje de programación que no se puede usar como entificador de variables ni como funciones de usuario. Mayormente todas las palabras clave son reservadas, pero algunas palabras reservadas no siempre son palabras clave. Ejemplo de palabras claves: main, if, else, switch, while, do, etc. Ejemplo de palabras reservadas: printf(), scanf(), getch(), putpixel(), gotoxy(), etc. Estas últimas palabras son reservadas, pero no son palabras clave ya que pueden ser creadas por el usuario como funciones ias, siempre y cuando no se usen las librerías del C++. token Identificador de función printf ( %d, dato); int a =1; float suma ( a, b ); Identificador de variable - Tabla de símbolos uniformes: Se basa en: Tabla de terminales (palabras reservadas) Tabla de entificadores (variables) Tabla de literales (constantes) ANALISIS SINTA CTICO - Es un análisis de tipo jerárquico. - Necesita de un analizador sintáctico o módulo denominado Parser Funcionalad: - Verifica en forma permanente la correcta escritura de las sentencias, teniendo como parámetros un conjunto de reglas denominada gramática. - Una gramática se representa formalmente o matemáticamente en base a un cuádruple de la forma: G = (P, T, N, S), donde: P = Producciones o reglas T = Conjunto de terminales N = Conjunto de no terminales S = Axioma, símbolo distinguo o metanoción Ing. Luis Reyes Lescano
- Sigue la forma BNF (Backus Naur Form) que coince con la gramática de libre contexto de Chomsky. Ejemplo: Reglas para el reconocimiento de una sentencia de asignación: 1. Un entificador es una expresión. 2. Un número es una expresión.. Pueden darse los siguientes casos: expresión + expresión expresión - expresión expresión * expresión expresión / expresión Todas ellas son expresiones. Identificador = expresión es una osición. Transformando estas reglas a BNF, sería: exp exp exp exp exp - exp exp exp = exp O SE PUEDE REPRESENTAR exp exp - exp = exp Ahora planteemos estas reglas o producciones a una sentencia de asignación: X = A + * C - = X * + - A C árbol aritmético = exp X exp - exp A C parser P: {exp exp - exp = exp } T: {X,=,A,+,,*,C,-,} N: {,exp,} S: {} forma gramatical Ing. Luis Reyes Lescano
EJERCICIOS I. Desarrollar el parser para el reconocimiento de las siguientes sentencias de asignación: a. X = A * B / C / 2 + * ( + / 2) = exp X 2 C A B 2 b. X = + * + 1 / 2 / * 6 + ( * ) = exp X exp exp 6 1 2 Ing. Luis Reyes Lescano
c. X = ((A + ) + * + (6 / * )) / 2 + * = exp X 2 A 6 d. X = (A + ( * + (6 * / / 2)) + * ) / / 2 = exp X exp exp 2 A exp / exp 2 6 Ing. Luis Reyes Lescano 6
II. Desarrollar las gramáticas para el reconocimiento de: a. Sentencia condicional if() _cond if (exp) then {} if (exp) then {} else {} dig 0 9 dig dig letra a z A Z comp letra dig _ ( letra dig _ ) comp letra letra (comp) op_arit + - * / op_rel < > <= >= <> exp_arit exp op_arit exp exp_rel exp op_rel exp exp_log exp AND exp exp OR exp NOT exp exp exp_arit exp_rel exp_log _asig = exp _var ++ _declar tipo _asig tipo _asig _var _declar _cond (_asig _var _declar _cond) b. Sentencia repetitiva for() _rep for (inicia; evalua; var) {} inicia _asig _declar (_asig _declar), inicia evalua exp_rel exp_log var _var _asig (_var _asig), var _asig _var _declar _cond _rep (_asig _var _declar _cond _rep) c. Sentencia de control while() _ctrl while (evalua) {} do {} while (evalua) Definición de reglas que serán utilizadas para la construcción de la gramática de las sentencias siguientes. A xioma de la gramática que irá incrementándose _asig _var _declar _cond _rep _ctrl (_asig _var _declar _cond _rep _ctrl) d. Sentencia de selección múltiple switch() _selec switch () {enuncia defa} enuncia case valores: ; break; case valores: ; break; enuncia valores letra, valores letra, valores defa enuncia default: ; break; _asig _var _declar _cond _rep _ctrl _selec (_asig _var _declar _cond _rep _ctrl _selec) e. Sentencia de escritura printf() _esc printf ( cuerpo ) printf ( cuerpo, var_esc) cuerpo cad format (cad format) cuerpo cad letra dig car_esp delim (letra dig car_esp delim) cad format %d %f %c %s car_esp!? < > # $ % & @ / ) ( ; :,.... delim eb TAB space var_esc exp_arit ( exp_arit ), var_esc _asig _var _declar _cond _rep _ctrl _selec _esc (_asig _var _declar _cond _rep _ctrl _selec _esc) f. Sentencia de lectura scanf() _lect scanf ( format, var_lect) var_lect & ( &) var_lect _asig _var _declar _cond _rep _ctrl _selec _esc _lect (_asig _var _declar _cond _rep _ctrl _selec _esc _lect) Ing. Luis Reyes Lescano 7