Generación de Código Intermedio

Documentos relacionados
Procesadores de lenguaje Tema 7 Generación de código intermedio

GENERACIÓN DE CÓDIGO INTERMEDIO ÁRBOLES DE SINTAXIS ABSTRACTA (ASA)

Unidad VI Generación de Código Intermedio. M.C. Juan Carlos Olivares Rojas

Un. VI. Generador de código intermedio.

ÍNDICE UNIDAD 2: GENERACION DE CODIGO INTERMEDIO

GENERACIÓN DE CÓDIGO INTERMEDIO CÓDIGO DE TRES DIRECCIONES

Lenguajes y Compiladores Traducción Dirigida por la Sintaxis

Diseño de Compiladores I. Estructura General de un Compilador

AMBIENTES DE COMPILACION

Análisis Semántico y Traducción Dirigida por la Sintaxis. Programación II Margarita Álvarez

Conceptos básicos sobre gramáticas

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Unidad II: Análisis semántico

Unidad 5 Análisis semántico

Código Intermedio. Compiladores II 1

CÓMO DESARROLLAR Y PROBAR PROGRAMAS?, COMPRUÉBALO!

Definición de la sintaxis (1) Definición de la sintaxis (2) Definición de la sintaxis (3)

FASES DE UN COMPILADOR

GENERACIÓN DE CÓDIGO

Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas

Compiladores e intérpretes Introducción

Tema 7. Generación de código

Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas

16 Análisis sintáctico I

Concepto de compilador Intérprete Fases de un Compilador Herramientas de construcción de Compiladores

Teoría de autómatas. Un enfoque práctico. Recortables. Thelma Cantú María Gpe. Mendoza

OPTIMIZACIÓN DE CÓDIGO

Árboles de Decisión Árboles de Sintaxis

ÁRBOLES DE SINTAXIS. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales.

UNIDAD V. Analisis Semantico. 5.1 Introduccion. Analizador Semántico. Verifica que el significado de las construcciones del lenguaje tengan sentido.

Compiladores: Sesión 16. Análisis semántico, traducción dirigida por sintaxis

Tema: Análisis de código intermedio

Compiladores: Sesión 15. Análisis semántico, traducción dirigida por sintaxis

Lenguajes de programación

Compiladores: Generación de Código. Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. María Constanza Pabón

Examen de Procesadores de Lenguaje

Traductores del lenguaje Pau Arlandis, Andrés Orcajo, Guillermo Ramos, Álvaro J. Aragoneses.

Compiladores: Análisis Semántico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inès Alvarez V.

NOMBRE DEL CURSO: Organización de Lenguajes y Compiladores 2

Toda copia en PAPEL es un "Documento No Controlado" a excepción del original.

Objetivos Que el estudiante logre conocer, comprender y manejar conceptos y técnicas vinculados con el Analizador Léxico, para lo cual debe:

Lenguajes y Compiladores Introducción. Compiladores 1

Analizador Léxico. Programación II Margarita Álvarez. Analizador Léxico - Funciones

GENERACIÓN DE CÓDIGO INTERMEDIO EJEMPLOS PARA DISTINTAS ESTRUCTURAS DE DATOS

Introducción a la construcción de compiladores

Lenguaje de programación. COMPILADORES Unidad I: Introducción al proceso de compilación

NOMBRE DEL CURSO: Organización de Lenguajes y Compiladores 2

Introducción. Las gramáticas definen las reglas que definen a los lenguajes Las reglas pueden tener una diversa variedad de esquemas

Análisis semántico: Comprobación de tipos

Compiladores: Generación de Código Intermedio

Gramáticas de Atributos

COMPILADORES. Tema 4. Análisis semántico

ANÁLISIS SEMÁNTICO ETDS VS DDS

Análisis semántico. Análisis semántico. Índice (I)

Introducción. Análisis Semántico. José M. Castaño. Teoría de Lenguajes 2011 Departamento de Computación FCEyN, UBA

Se pueden agrupar las reglas que tienen la misma parte izquierda:

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Semántica: principales usos. Semántica: principales enfoques. Semántica Operacional. Sintaxis abstracta de un lenguaje (sujeto) Semántica Operacional

Procesadores de lenguaje Tema 1 Introducción a los compiladores

El lenguaje C. 1. Identificadores, constantes y variables

ANÁLISIS SEMÁNTICO GRAMÁTICAS DE ATRIBUTOS Y TIPOS

Tema: Análisis Léxico

Principios de Computadoras II

Un. I. Introducción a la programación de sistemas

token siguiente! Tabla de símbolos

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

YACC (Yet Another Compiler Compiler) LALR(1) Parser Generator

Lenguajes y Compiladores Aspectos Formales (Parte 1) Compiladores

Unidad 2. Introducción Lenguajes y Compiladores

Introducción al Diseño de Compiladores. Año

Sintaxis y Semántica. Un repaso

ANÁLISIS SEMÁNTICO LA TABLA DE SÍMBOLOS

Tema 5. Análisis semántico

Controla el flujo de tokens reconocidos por parte del analizador léxico. 4.2 Introduccion a las gramaticas libres de contexto y arboles de derivacion

GLOSARIO 1. Qué es bit y byte? Bit: Es la unidad mínima de información. Puede ser 0 o 1. Byte: Es el conjunto de 8 bits. Ejemplo:

Contenido. Capítulo 1. Teoría de conjuntos. 1. Capítulo 2. Lenguaje. 39. Capítulo 3. Lenguajes formales. 55

Lenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores

Transcripción:

Generación de Código Intermedio Programación II Margarita Álvarez Generación de código intermedio Con la generación de código intermedio se inicia la tarea de síntesis. Aunque un programa fuente se puede traducir directamente a lenguaje objeto, algunas ventajas de utilizar una forma intermedia son: Aumentar la portabilidad del compilador de una máquina a otra: Se puede utilizar el mismo analizador para diferentes generadores. Se pueden utilizar optimizadores independientes de la máquina. Facilitar la división en fases del proyecto. Analizador Sintáctico Comprobación estática Gen. Código intermedio Código intermedio Generador de código Distinto formato de las instrucciones: Notación polaca inversa o notación postfija Árboles sintácticos Código de tres direcciones 1

Notación postfijo La notación postfija de una expresión E se puede definir como: 1. Si E es una variable o una constante, entonces la notación postfija de E es también E. 2. Si E es una expresión de la forma E 1 ope 2 donde op es cualquier operador binario, entonces la notación postfija de E es E 1 E 2 op donde E 1 y E 2 son las notaciones postfijas de E 1 y E 2 respectivamente. 3. Si E es una expresión de la forma (E 1 ) entonces la notación postfija de E 1 es también la notación postfija de E. Ejemplos (9-5)+2 95-2+ 9-(5+2) 952+- a:= b*-c+b*-c abc-*bc-*+:= Notación postfijo - Ejemplo Definición dirigida por la sintaxis Producciones expr expr + término expr expr término expr término término 0 término 9 Reglas semánticas expr.t expr.t término.t + expr.t expr.t término.t - expr.t término.t término.t 0 término.t 9 Operador de concatenación 9-5+2 expr.t = 95-2+ expr.t = 95- + término.t = 2 expr.t = 9 - término.t = 5 término.t 9 = 9 5 2 Resultado: 95-2+ A cada no terminal está asociado un atributo t con un valor de la cadena que representa la notación postfija de la expresión generada por ese no terminal en un árbol de análisis sintáctico. 2

Notación postfijo - Ejemplo Esquema de Traducción Producciones expr expr + término expr expr término expr término término 0 término 9 Acciones semánticas {print( + )} {print( - )} {print( 0 )} {print( 9 )} 9-5+2 expr.t print( + ) expr.t print( - ) + término.t expr.t - término.t 2 término.t 5 print(5) 9 print(9) print( 2 ) Resultado: 95-2+ Árbol sintáctico El uso de árboles sintácticos como representación intermedia permite que la traducción se separe del análisis sintáctico. Es una forma condensada de un árbol de análisis sintáctico. Útil para representar construcciones de lenguajes. Ejemplos S if B then S1 else S2 Árbol de análisis sintáctico Árbol sintáctico 3

Grafo dirigidos acíclicos para expresiones (GDA) Identifican las subexpresiones comunes de una expresión. Un nodo interior representa un operador y sus hijos los operandos. Un nodo tiene más de un padre. Ejemplo: a + a * (b - c) + (b - c) * d Código de tres direcciones Es una secuencia de proposición de la forma general: x:= y op z donde x,y y z son nombres, constantes o variables temporales, op representa cualquier operador. Ejemplos x+y*z t 1 := y*z t 2 := x + t 1 a := b*-c+b*-c t 1 := -c t 2 := b * t 1 t 3 := -c t 4 := b * t 3 t 5 := t 2 + t 4 a := t 5 a = + * b - c * b - c 4

Código de tres direcciones Implementación de proposiciones de tres direcciones Una proposición de tres direcciones es una forma abstracta de código intermedio. En un compilador estas proposiciones se pueden implementar como registros con campos para el operador y los operandos. Las implementaciones pueden ser: Triplas Cuádruplas Triplas Indirectas 5

Cuádruplas Se implanta en una secuencia de registros con 4 campos: o Operación o Argumento1 o Argumento2 o Resultado Ejemplo a:=b* -c+b* -c Los nombres t1, t2 y t3 pueden ser registros de la máquina o posiciones de memoria temporales, que desaparecen cuando se termina la compilación. Cuádruplas En general, las instrucciones que no requieren todos los campos dejan vacíos los que no utilizan, por ejemplo: las proposiciones con operadores unarios no utilizan arg2. Los saltos condicionales e incondicionales ponen la etiqueta (label) en Resultado. Los contenidos de los campos Argumento1, Argumento2 y Resultado son generalmente punteros a la Tabla de Símbolos. 6

Triplas Para evitar introducir nombres temporales en la Tabla de Símbolos, se hace referencia a un valor temporal mediante la posición de la proposición que lo calcula. En este caso los registros son de 3 campos. Triplas Indirectas Se hace una lista de los punteros a triplas. 7

Comparación de las representaciones La diferencia en la implementación es cuestión de mayor o menor indirección: Las triplas necesitan menos espacio y el compilador no genera identificadores temporales, pero cambiar de sitio una proposición que defina un valor temporal exige modificar todas las referencias a él. Esto representa un inconveniente a la hora de optimizar el código, ya que en cada paso del proceso de optimización hay que cambiar constantemente las proposiciones de lugar. Este problema no lo presentan las triplas indirectas. Una proposición puede trasladarse reordenando únicamente la lista de proposiciones. En la práctica se utiliza la notación de cuádruplas como implementación del código de 3 direcciones. 8