AMBIENTES DE COMPILACION

Documentos relacionados
Generación de Código Intermedio

Unidad II: Análisis semántico

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

Lenguajes y Compiladores Traducción Dirigida por la Sintaxis

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

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

GRAMATICAS LIBRES DEL CONTEXTO

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

16 Análisis sintáctico I

LENGUAJES Y GRAMÁTICAS

Árboles de Decisión Árboles de Sintaxis

Compiladores. Análisis Sintáctico Ascendente. Adrian Ulises Mercado Martínez. Facultad de Ingeniería, UNAM. 5 de septiembre de 2013

Conceptos básicos sobre gramáticas

Tema 5. Análisis semántico

TEMA 1. PROGRAMACIÓN DE UN COMPUTADOR

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

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

Tema#2. Tipos de Datos 10

Pontificia Universidad Católica del Ecuador

Gramáticas libres de contexto

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Tema 2. Concepto de Algoritmo

Tipos De Datos. Numéricos. Alfanuméricos (string) Arreglos (Vectores, Matrices) Estructurados Registros (Def. Por el Archivos Usuario) Apuntadores

Unidad 2. Introducción Lenguajes y Compiladores

Escuela Normal Superior N 40 Mariano Moreno. Cuadernillo Propedéutico 2017 Nivel Superior

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

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

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

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

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

Compiladores e intérpretes Introducción

Laboratorio de Arquitectura de Redes. Operadores y expresiones en lenguaje C

Fundamentos de Programación 2017-I

PROGRAMA DE LABORATORIO SECCIÓN: ÁREA A LA QUE PERTENECE: POS-REQUISITO: AUXILIAR:

OPTIMIZACIÓN DE CÓDIGO

Prof. María Alejandra Quintero. Informática Año

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

Curso de Java Introducción a la Programación II

Área: INFORMÁTICA. Saber- Saber: Identificar DFD como herramienta para escribir los algoritmos de forma lógica.

El lenguaje C. 1. Identificadores, constantes y variables

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

Lenguaje de Diseño. Primera Parte. Segundo Cuatrimestre 2017

Introducción a la construcción de compiladores

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

UNIVERSIDAD MODULAR ABIERTA FACULTAD DE CIENCIAS ECONOMICAS

Unidad III: Introducción a la Programación

Las expresiones son combinaciones de constantes, variables, símbolos de operación, paréntesis y nombres de funciones especiales.

Procesadores de Lenguaje

HERRAMIENTAS YACC Y BISON

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Expresiones y sentencias

Operadores y Expresiones

Este método de diseño de algoritmos en etapas, yendo de los conceptos generales a los de detalle, se conoce como método descendente (top-down).

COMPILADORES. Tema 4. Análisis semántico

Lenguaje de Diseño. Primera Parte. Resolución de Problemas y Algoritmos. Primer Cuatrimestre Ing. En Informática e Ing.

Lenguajes de programación

Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I

Lenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores

Lenguajes y Compiladores Aspectos Formales (Parte 1) Compiladores

NOMBRE DEL CURSO: Organización de Lenguajes y Compiladores 2 CÓDIGO: 781 CRÉDITOS: 5 ÁREA A LA QUE PERTENECE: POST- REQUISITO:

DIAGRAMAS DE FLUJO ELEMENTOS E INSTRUCCIONES A USAR EN UN DIAGRAMA DE FLUJO

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

Ciencias de la Computación I

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

1. Acciones en Yacc. %{ #include <stdio.h> yyerror (char *s) { fprintf (stderr, %s\n, s) ; } %} %% : S \n {printf ( Correcto\n );} ; : ( S ) S

Elementos para el estudio de los compiladores

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa

Tema: Introducción a compiladores y MUSIM/0

Procesadores de Lenguajes. Análisis sintáctico. Gramáticas libres de contexto

Números enteros (cortos, largos y sin signo) Números reales (precisión simple y doble) Carácter y cadenas de caracteres. Lógicos.

FASES DE UN COMPILADOR

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

Principios de Computadoras II

ÍNDICE UNIDAD 2: GENERACION DE CODIGO INTERMEDIO

Los parámetros: son los campos que se comunican a los métodos de los objetos.

Procesadores de lenguajes Ingeniería Informática Especialidad de Computación Tercer curso, segundo cuatrimestre

EXPRESIONES Y OPERADORES

Una clasificación de los tipos de datos existentes en los diferentes lenguajes de programación se presenta a continuación:

ANÁLISIS LÉXICO Ing. Ronald Rentería Ayquipa

Transcripción:

AMBIENTES DE COMPILACION Los compiladores a menudo producen como resultado del análisis semántico, una forma de representación intermedia del código fuente. Hoy en día, es cada vez más común que, en ambientes de estación de trabajo o de computador central, todos los compiladores de los distintos lenguajes generen el mismo código intermedio, el cual después, por un generador de código, es transformado en el código objeto. Esto tiene una gran ventaja: si se cambia el sistema operativo o alguna otra cosa, solo hay que reemplazar el generador de código, y no todo todos los compiladores. La generación de códigos intermedios aumenta la transportabilidad de los compiladores, ya que no es necesario cambiar sus partes independientes de la máquina para un nuevo hardware distinto. CODIGO FUENTE CODIGO INTERMEDIO CODIGO HEXADECIMAL Int suma_enteros( int i,j, suma) { suma=i+j; } *SECTION 9 Define la sección de código. * SECTION 14 define la sección de Pila SECTION 9 xdef.suma_enteros MOVE.L 4(A7), D1 MOVE.L 8(A7), D0 MOVE.L 12(A7).A0 ADD.L D1,D0 MOVE.L D0(A0) RTS * SECTION 14 * Asignaciones de suma_enteros 00000000 222F 0004 00000004 202F 0008 00000008 206F 000C 0000000C D081 0000000E 2080 00000010 4E75 * 4(A7).i * 8(A7).j * 12(a7).suma ANALISIS Y SINTESIS La compilación de un programa consiste en analizar y sintetizar dicho programa, es decir, determinar la estructura y el significado de un código fuente y traducir ese código fuente a un código de máquina equivalente. Las tareas o fases principales de un compilador son: Análisis léxico. Análisis sintáctico. Análisis semántico. Generación de código. Podemos considerar a un programa como un flujo de caracteres que sirven como entrada para el análisis léxico. La tarea del análisis léxico consiste en reconocer los componentes léxicos dentro de ese flujo, es decir, transformar un flujo de caracteres en un flujo de componentes léxicos (como Docente: Ing. Mirko Manrique Ronceros ~ 1 ~

los textos en lenguaje natural, podemos distinguir entre palabras y componentes léxicos: el número de palabras determina el tamaño del vocabulario del programa, mientras que el número de componentes léxicos determina la longitud del programa. Por ejemplo: La proposición i:= 10; Producirá lo siguiente: el i el símbolo de asignación := el número 10 el símbolo delimitador; (punto y coma) Los es o nombres reconocidos se organizan en una tabla de símbolos, que es una estructura de datos que contiene registros con campos de atributo para cada nombre. El contenido de la tabla de símbolos se completa con el análisis léxico y sintáctico y se usará para el análisis semántico y la generación de código. El siguiente paso es el análisis sintáctico. La palabra Sintaxis significa estructura del orden de las palabras en una frase. Otro término utilizado para el análisis sintáctico es el análisis jerárquico. La tarea del análisis sintáctico es revisar si los símbolos aparecen en el orden correcto (es decir, revisar si el programa fuente fue diseñado de acuerdo con la sintaxis del lenguaje de programación) y combina los símbolos del código fuente para formar unidades gramaticales. En esta fase se detectan errores de sintaxis como: h + x := x * y En general, las unidades gramaticales se organizan y representan con árboles de análisis sintáctico o árboles sintácticos. En la siguiente figura se muestra el árbol de análisis sintáctico de la siguiente proposición: h:= x + y x * y Asignación h := x + y x * y Docente: Ing. Mirko Manrique Ronceros ~ 2 ~

Después del análisis semantico y el de tipos. El análisis semantico es mucho más difícil que el sintáctico, pues hay que considerar el significado de una unidad gramatical; es decir hay que interpretarla. Esto se puede lograr traduciendo la entrada a una forma de representación intermedia. Por ejemplo, nunca hubiéramos definido la variable h de la figura, la proposición de asignación no tendría sentido. En forma análoga, la asignación de una variable booleana a una variable real tampoco tendrá sentido. Este tipo de inconsistencias será reconocido por el análisis de tipos. El código objeto se genera en la última fase de la compilación: el generador de código. En esta fase el código intermedio se transforma en código de maquina y la memoria necesaria quedara determinada. Obviamente, esta es la única fase que depende del hardware, ya que por lo general, los conjuntos de instrucciones varían de un computador a otro. Ambigüedad Se ha de tener cuidado al considerar la estructura de una cadena según una gramática. Aunque es evidente que cada árbol de análisis sintáctico deriva exactamente la cadena que leer en sus hojas, una gramática puede tener más de un árbol de análisis sintáctico que genere una cadena dada de componentes léxicos. Esta clase de gramática se dice que es ambigua. Para demostrar que una gramática es ambigua, lo único que se requiere es encontrar una cadena de componentes léxicos que tenga más de un árbol de análisis sintáctico. Como una cadena que cuenta con más de un árbol de análisis sintáctico suele tener más de un significado, para aplicaciones de compilación es necesario diseñar gramáticas no ambiguas o utilizar gramáticas ambiguas con reglas adicionales para resolver las ambigüedades. Por ejemplo, si se tiene la 9 5 + 2 tiene ahora más de un árbol de análisis sintáctico. Los dos árboles de 9 5 + 2 corresponden a dos formas de agrupamientos entre paréntesis de la : (9 5) + 2 y 9 (5 + 2). Esta segunda forma de agrupamiento entre paréntesis da a la el valor de 2, en lugar del valor acostumbrado 6. Asociatividad de operadores Por convención, 9 + 5 + 2 es equivalente a (9 + 5) + 2, y 9 5 2 es equivalente a (9 5) 2. Cuando un operando con 5 tiene operadores a su izquierda y derecha, se necesitan convenciones para decidir que operador considera es operando. Se dice que el operador + asocia a la izquierda, porque un operando que tenga un signo + a ambos lados es tomado por el operador que esté a su izquierda. En la mayoría de los lenguajes de programación, los cuatro operadores matemáticos, adición, sustracción, multiplicación y división son asociativos a la izquierda. Docente: Ing. Mirko Manrique Ronceros ~ 3 ~

Algunos operadores comunes, como la exponenciacion son asociativos por la derecha. Otro ejemplo análogo, el operador de asignación = en C es asociativo por la derecha; en C la a = b = c; con un operador asociativo por la derecha, son generadas por la siguiente gramática: derecha letra = derecha letra letra a b... z El contraste entre un árbol de análisis sintáctico para un operador asociativo por la izquierda como y un árbol de análisis sintáctico para un operador asociativo por la derecha como =, se muestra la siguiente figura: derecha digito letra = derecha digito 2 a letra = derecha digito 5 b letra 9 c Procedencia de operadores Considere la 9 + 5 * 2. Hay dos interpretaciones posibles de esta : (9 + 5) * 2 o 9 + (5 * 2). La asociatividad de + y * no resuelve esta ambigüedad. Por esta razón, se necesita conocer la precedencia relativa de los operadores cuando esté presente más de una clase de operadores. Se dice que * tiene mayor precedencia que + si * considera sus operandos antes que lo haga +. En aritmética elemental, la multiplicación y división tiene mayor precedencia que la adición y sustracción. Por tanto 5, es considerado por * en 9 + 5 * 2 y en 9 * 5 + 2; es decir las expresiones son equivalentes a 9 + (5 * 2) y (9 * 5) + 2, respectivamente. TRADUCCION DIRIGIDA POR LA SINTAXIS Para traducir una construcción de un lenguaje de programación, un compilador puede necesitar tener en cuenta muchas características, además del código generado para la construcción. Por ejemplo, puede ocurrir que el compilador necesite conocer el tipo de la construcción, la posición de la primera instrucción del código objeto o el numero de instrucciones generadas. Por tanto, los atributos asociados con las construcciones se mencionan de manera abstracta. Un atributo puede representar cualquier cantidad, por ejemplo, una, una cadena, una posición de memoria o cualquier otra cosa. Docente: Ing. Mirko Manrique Ronceros ~ 4 ~

Notación Posfija La notación posfija de una E se puede definir de manera inductiva como sigue: 1. Si E es una variable o una constante, entonces la notación posfija de E es también E. 2. Si E es una de la forma E1 op E2, donde op es cualquier operador binario, entonces la notación posfija de E es E 1E 2op, donde E 1 y E 2 son las notación posfijas de E1 y E2 respectivamente. 3. Si E es una de la forma (E1), entonces la notación posfija de E1 es también la notación posfija de E. La notación posfija no necesita paréntesis, porque la posición y la ariedad (numero de argumentos) de los operadores permiten solo una descodificación de una posfija. Por ejemplo, la notación posfija de (9 5) + 2 es 95-2+ y la notación posfija de 9-(5+2) es 952+-. Docente: Ing. Mirko Manrique Ronceros ~ 5 ~