Estructura del Compilador
Análisis Léxico
El análisis léxico lee flujo de caracteres que componen el programa fuente y los agrupa en secuencias significativas conocidas como lexemas, para cada lexema el analizador léxico produce como salida un token.
Lexemas
Agrupación de secuencias significativas.
posicion = inicial + velocidad * 60
Posición es un lexema que se asigna a un token <id,1>El símbolo de asignación = es un lexema que se le asigna el nombre de <=>Inicial es un lexema que se asigna a un token <id,2>El símbolo de más + es un lexema que se le asigna el nombre de <+>Velocidad es un lexema que se asigna a un token <id,3>El símbolo de más * es un lexema que se le asigna el nombre de <*>60 es un lexema que se le asigna el nombre de <60> (hablando en sentido técnico, para el lexema 60 formaríamos un token como <número,4> donde 4 apunta a la tabla de símbolos para representación interne del entero 60 )
Token
La producción de salida del analizador léxico de un lexema.
<nombre-token>
Es un símbolo abstracto que se utiliza durante el análisis sintáctico.
<valor-atributo>
Apunta a una entrada de la tabla de símbolos para este token.
Análisis Sintáctico
El Análisis sintáctico o parsing, utiliza los primeros componentes de los tokens producidos por el analizador de léxico para crear una representación intermedia en forma de árbol que describa las estructura gramatical del flujo de tokens.
Árbol sintáctico
¿QUÉ SON LOS ÁRBOLES SINTÁCTICSO?Es una representación que describe la estructura gramatical de los tokens, en el cual cada nodo interior representa una operación y los hijos representan los argumentos de la operación.https://drive.google.com/file/d/11_gXvivWDb8yU5FuW1AlrIMd53Bqbrob/view?usp=sharing
Ejemplo
El árbol tiene un nodo interior etiquetado como *, con id, 3 como su hijo izquierdo, y el entero 60 como su hijo derecho.El nodo id, 3 representa el identificador velocidad. El nodo etiquetado como * hace explicito que primero debemos multiplicar el valor de velocidad por 60.El nodo etiquetado como + indica que debemos sumar el resultado de esta multiplicación al valor de inicial. La raíz del árbol, que se etiqueta como =, indica que debemos almacenar el resultado de esta suma en la ubicación para el identificador posición.Este ordenamiento de operaciones es consistente con las convenciones usuales de la aritmética, las cuales nos indicanque la multiplicación tiene mayor precedencia que la suma y, por ende, debe realizarse antes que la suma.
Análisis Semántico
Análisis Semántico:Utiliza el árbol sintáctico y la información en la tabla de símbolos para comprobar la conciencia semántica del programa fuente con la dedición del lenguaje. También recopila información sobre el tipo y la guarda.
Comprobación (verificación)de tipos
El compilador verifica que cada operador tenga operandos que coinciden.
Coerciones
La especificación del lenguaje que permite ciertas conversiones de tipo.
Ejemplo
Suponga que posición, inicial y velocidad se han declarado como números de punto flotante, y que el lexema 60 por sí solo forma un entero. El comprobador de tipo en el analizador semántico de la descubre que se aplicael operador * al número de punto flotante velocidad y al entero 60. En este caso, el entero puede convertirse en un número de punto flotante. La salida del analizador semántico tiene un nodo adicional para el operador inttofloat, que convierte de manera explícita su argumento tipo entero en un número de punto flotante. En el capítulo 6 hablaremos sobre la comprobación de tipos y el análisis semántico.
Generación de Código Intermedio
Generación de Código IntermedioEl proceso de traducir un programa fuente a código destino, un compilador puede construir una o más representaciones intermedias. Los compiladores generan un nivel bajo explícito, o una representación intermedia similar al código máquina, que podemos considerar como un programa para una máquina abstracta, el cual debe tener dos propiedades importantes: Fácil de Traducir.Fácil de Traducir en la máquina destino.
Código tres direcciones
Código tres direcciones Consiste en una secuencia de instrucciones similares a ensamblador, con tres operados por instrucción. Cada operando puede actuar como registro. La salida del generador de código intermedio consiste en una secuencia de código de tres direcciones.
Optimización de Código
Optimización de CódigoIndependiente de la máquina trata de mejorar el código intermedio, de manera que se produzca un mejor código destino.
Compiladores Obtimizadores
Aquellos que realizan la mayor optimización
Ejemplo
El optimizador puede deducir que la conversión del 60, de entero a punto flotante, puede realizarse de una vez por todas en tiempo de compilación, por lo que se puede eliminar la operación inttofloat sustituyendoel entero 60 por el número de punto flotante 60.0. Lo que es más, t3 se utiliza sólo una vez para transmitir su valor a id1, para que el optimizador pueda transformar.
Generación de Código
Generación de Código Recibe como entrada una representación intermedia del programa fuente y la asigna al lenguaje destino. Si el lenguaje destino es código maquina, se seleccionan registros o ubicaciones(localidades.) Un aspecto crucial en en la generación de código es la asignación juiciosa de los registros para guardar variables.
Asignación de Especio de Almacenamiento
La organización del espacio de almacenamiento en tiempo de ejecución depende del lenguaje que se esté compilando. Se realiza durante la generación de código intermedi, o la generación de código.
Sandra Dayanira López Gómez
201504459
Bibliografía
COMPILADORES. PRINCIPIOS, TÉCNICAS YHERRAMIENTAS. Segunda edición