Tema 5 (2 a parte): Traductores ascendentes. Algoritmo de análisis ascendente. Procesamiento de Lenguajes. E E op T E T T num

Documentos relacionados
PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Procesadores de lenguaje Tema Análisis sintáctico (Parte II)

Procesadores de Lenguaje

Procesadores de lenguaje Tema 6 La tabla de símbolos

Capítulo 5: Traducción Dirigida por Sintaxis

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior. Trabajo Final

JavaCC Parte I. 1 Compiladores / Guía VII / Ciclo Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores.

Procesadores de Lenguaje

Compiladores: Parsing ascendente

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

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

Construcción de tablas de análisis sintáctico LL(1)

TRADUCTORES, COMPILADORES E INTÉRPRETES. EJERCICIOS TEMA 5, 6, 7 y 8.

E Ú E +T T T Ú T * F F F Ú ( E ) NUM. Queremos calcular: Los pasos que seguiremos serán:

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

Tema 3: Análisis sintáctico descendente. Cómo funciona el analizador sintáctico?

Hoja técnica sobre yacc 1 y lex 2. Introducción. lex PL, 2014/2015 1

GENERADOR DE COMPILADORES BASADO EN

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Tema 2 Introducción a la Programación en C.

Tema V Generación de Código

Tema 1: Introducción

Elementos de un programa en C

TADs en C. Matías Bordese Algoritmos y Estructuras de Datos II - Laboratorio 2013

Unidad II: Análisis semántico

Procesadores de Lenguaje

Tema 13: Apuntadores en C

Tabla de Símbolos. Programación II Margarita Álvarez

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Equivalencia Entre PDA y CFL

Tema 1.3. Un lenguaje mínimo y su procesador: Restricciones contextuales

Capítulo 16. Diagrama de Clases UML

Las Etapas de la Compilación

Programación. Test Autoevaluación Tema 3


INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Tema 3. Análisis sintáctico descendente

Carrera: SCC Participantes. Representantes de la academia de sistemas y computación de los Institutos Tecnológicos.

Universidad de Costa Rica. Escuela de Ciencias de la Computación e Informática CI-2700 TÓPICOS ESPECIALES - COMPILADORES.

41 Jornadas Argentinas de Informática Concurso de Trabajos Estudiantiles Categoría: Teoría de la Computación, Modelos Formales y Compiladores.

Expresiones y sentencias

Tema 1: Introducción

Tema: Tabla de Símbolos

7.4. UTILIDADES DE LAS PILAS

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

TUTORIAL SOBRE HOJAS DE CALCULO

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Constantes. Las constantes no cambian durante la ejecucion de un programa en C++, en C++ existen 4 tipos de constantes:

int int. 1622

Instituto Tecnológico de Celaya

Unidad I: Análisis semántico

Tema 4. Operadores y Expresiones

Sintaxis básica, variables y 7pos

Diseño de compiladores. Organización de memoria. Organización de memoria. Organización de memoria. Zona de código 04/05/2014 ORGANIZACIÓN DE MEMORIA

2.2 Nombres, Ligado y Ámbito

GUÍA DOCENTE DE PROYECTO DE AUTÓMATAS Y LENGUAJES

COMPILADORES Teoría e implementación. Jacinto Ruiz Catalán

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

TEMA 2. CODIFICACIÓN DE LA INFORMACIÓN

Procesadores de lenguaje Tema Análisis sintáctico (Parte I)

Unidad 4. Autómatas de Pila

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Capítulo 3 Análisis sintáctico

Datos y tipos de datos

Programación con C Intermedio

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

Al concluir está práctica el estudiante será capaz de elaborar programas utilizando apuntadores y arreglos.

El análisis descendente LL(1) 6, 7 y 13 de abril de 2011

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013

GUÍA DOCENTE DE AUTÓMATAS Y LENGUAJES

2. Se puede aplicar a la representación intermedia un optimizador de código independiente de la máquina.

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Iván Ruiz Rube Departamento de Ingeniería Informática Escuela Superior de Ingeniería Universidad de Cádiz

Tema 7. Generación de código

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

El lenguaje C. 1. Identificadores, constantes y variables

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

Tema 6 Organización y gestión de la memoria

Programación de Sistemas Depuradores (Debugger) MIS. Lizbeth Hdz. Glz.

Qué es un programa informático?

GENERACIÓN DE CÓDIGO

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

ANÁLISIS SEMÁNTICO. Especificación formal: Semántica Operacional, semántica denotacional, semántica Axiomática, Gramáticas con Atributos.

AUTÓMATAS DE PILA Y LENGUAJES INDEPENDIENTES DEL CONTEXTO

PROPIEDADES DE LOS CAMPOS. Cada campo de una tabla dispone de una serie de características que proporcionan un control

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Truco para encontrar y reemplazar líneas manuales por marcas de párrafo

Un. VI. Generador de código intermedio.

Tema II: Metodología para la construcción de programas

Generador de analizadores léxicos FLEX

Guía de inicio rápido

LABORATORIO DE PROCESADORES DE LENGUAJE Curso: Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison

Generador de analizadores sintácticos BISON

4.1 Conversión de formato WAV a MP3

Exterior del algoritmo. Entorno. Usuario. Procesador. Escribir. v1 v2 v3. Leer. <acción> {; <acción>}

Lenguajes (gramáticas y autómatas)

Introducción a la Operación de Computadoras Personales

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Definición de Memoria

Transcripción:

Tema 5 (2 a parte): Traductores ascendentes Procesamiento de Lenguajes Dept. de Lenguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 1 / 16 Algoritmo de análisis ascendente E E op T E T T num op num $ E T 0 d3 1 2 1 d4 aceptar 2 r2 r2 3 r3 r3 4 d3 5 5 r1 r1 PILA ENTRADA ACCIÓN 0 1+2-3$ d3 0 3 +2-3$ r3 0 2 +2-3$ r2 0 1 +2-3$ d4 0 1 4 2-3$ d3 0 1 4 3-3$ r3 0 1 4 5-3$ r1 0 1-3$ d4 0 1 4 3$ d3 0 1 4 3 $ r3 0 1 4 5 $ r1 0 1 $ aceptar Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 2 / 16

Algoritmo de análisis ascendente (2) E E op T E T T num op num $ E T 0 d3 1 2 1 d4 aceptar 2 r2 r2 3 r3 r3 4 d3 5 5 r1 r1 PILA ENTRADA ACCIÓN 0 1+2-3$ d3 0 num +2-3$ r3 0 T +2-3$ r2 0 E +2-3$ d4 0 E op 2-3$ d3 0 E op num -3$ r3 0 E op T -3$ r1 0 E -3$ d4 0 E op 3$ d3 0 E op num $ r3 0 E op T $ r1 0 E $ aceptar Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 3 / 16 Algoritmo de análisis ascendente (3) E E op T E T T num op num $ E T 0 d3 1 2 1 d4 aceptar 2 r2 r2 3 r3 r3 4 d3 5 5 r1 r1 PILA ENTRADA ACCIÓN 0 1+2-3$ d3 0 num 1 +2-3$ r3 0 T +2-3$ r2 0 E +2-3$ d4 0 E op + 2-3$ d3 0 E op + num 2-3$ r3 0 E op + T -3$ r1 0 E -3$ d4 0 E op - 3$ d3 0 E op - num 3 $ r3 0 E op - T $ r1 0 E $ aceptar Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 4 / 16

Implementación de un ETDS E E op T {E.trad := op.trad ( E 1.trad, T.trad ) } E T {E.trad := T.trad} T num {T.trad := num.lexema} Los atributos se almacenan en una pila paralela a la que tiene los estados del analizador, y las acciones se ejecutan al reducir 0 1+2-3$ d3 0 num +2-3$ r3 T.trad := num.lexema 1 0 T +2-3$ r2 E.trad := T.trad 1 0 E +2-3$ d4 1 Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 5 / 16 Implementación de un ETDS (2) 0 E op 2-3$ d3 1 + 0 E op num -3$ r3 T.trad := num.lexema 1 + 2 0 E op T -3$ r1 E.trad := op.trad (... 1 + 2 0 E -3$ d4 s(1,2) 0 E op 3$ d3 s(1,2) - 0 E op num $ r3 T.trad := num.lexema s(1,2) - 3 0 E op T $ r1 E.trad := op.trad (... s(1,2) - 3 0 E $ aceptar r(s(1,2),3) Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 6 / 16

Notación de yacc y bison El programa yacc (y su sucesor bison) es un generador de compiladores (yet another compiler-compiler). A partir de ETDS en una notación determinada, genera un programa en C que analiza sintácticamente (usando un analizador ascendente LALR(1)) y a la vez traduce un programa fuente. Ejemplo: e : e OP t { $$.trad=cat($2.trad,"(",$1.trad,",",$3.trad,")") } t { $$.trad=$1.trad } t : NUM { $$.trad=$1.lexema } Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 7 / 16 Implementación de ETDS Resumen: Cada estado del analizador en la pila se puede asociar con un símbolo terminal o no terminal de la gramática (el símbolo con el que se llega a ese estado). Los atributos se almacenan en una pila paralela a la del analizador Las acciones semánticas se ejecutan justo antes de reducir por una regla Problemas: 1 Cómo implementamos las acciones semánticas intermedias? 2 Cómo implementamos los atributos heredados? Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 8 / 16

Implementación de acciones intermedias En general, las acciones intermedias se utilizan para asignar valores a atributos heredados, pero en algún caso se usan para otras tareas, como almacenar valores en la tabla de símbolos. Por ejemplo: D T id {anadirts(id.lexema, T.tipo)}L {...} T int {T.tipo := ENTERO} T float {T.tipo := REAL} La solución es utilizar un nuevo no terminal, que llamaremos marcador, con una única regla que deriva a ɛ y al reducir por esa regla ejecutaremos la acción intermedia: D T id M L {...} M ɛ {anadirts(id.lexema, T.tipo)} T int {T.tipo := ENTERO} T float {T.tipo := REAL} MUY IMPORTANTE: no es necesario modificar el ETDS (no es posible), solamente la tabla de análisis. Los atributos que necesita la acción están en la pila, más abajo. Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 9 / 16 Implementación de acciones intermedias (2) D T id M L {...} M ɛ {anadirts(id.lexema, T.tipo)} T int {T.tipo := ENTERO} T float {T.tipo := REAL} 0 int a$ desplazar 0 int a$ reducir T int T.tipo := ENTERO 0 T a$ desplazar ENTERO 0 T id $ reducir M ɛ anadirts(id.lexema,t.tipo) ENTERO a 0 T id M $ reducir L ɛ... ENTERO a Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 10 / 16

Implementación de acciones intermedias (3) El yacc (y el bison) generan automáticamente los marcadores para las acciones intermedias: d : t ID { anadirts($2.lexema,$1.tipo) } L {... } t : INT { $$.tipo = ENTERO } FLOAT { $$.tipo = REAL } Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 11 / 16 Implementación de atributos heredados Aunque se conozca la posición en la pila del no terminal propietario del atributo heredado, no se le puede asignar un valor al atributo puesto que esa posición será ocupada por uno o más símbolos (los primeros de las partes derechas de las reglas del no terminal) antes que por el no terminal SOLUCIÓN: asociar cada atributo heredado con un atributo sintetizado ya existente, o bien con un atributo sintetizado de un marcador Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 12 / 16

Implementación de atributos heredados (2) Ejemplo 1: D T {L.th = T.tipo}L {...} L {L 1.th = L.th}L 1 coma id {anadirts(id.lexema, L.th)} L id {anadirts(id.lexema, L.th)} T int {T.tipo := ENTERO} T float {T.tipo := REAL} En yacc, se escribiría de esta manera, asociando L.th con T.tipo (que es $0.tipo): d : t l {... } l : l COMA ID { anadirts($3.lexema,$0.tipo) } ID { anadirts($1.lexema,$0.tipo) } t :... Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 13 / 16 Implementación de atributos heredados (3) Ejemplo 2: D T {L.th = T.tipo}L {...} D T var {L.th = T.tipo}L {...} L {L 1.th = L.th}L 1 coma id {anadirts(id.lexema, L.th)} L id {anadirts(id.lexema, L.th)} T... Se puede seguir asociando L.th con T.tipo, pero están a diferente distancia en las dos reglas. Solución: igualar las distancias. d : t VAR l {... } t {} l {... } // el marcador ocupa el lugar de VAR l : l COMA ID { anadirts($3.lexema,$-1.tipo) } ID { anadirts($1.lexema,$-1.tipo) } Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 14 / 16

Implementación de atributos heredados (4) Ejemplo 3: D T id {L.th = T.tipo anadirts(id.lexema, T.tipo)}L {...} L coma id {L 1.th = L.th anadirts(id.lexema, L.th)}L 1 {...} L ɛ T... No se puede asociar L.th con T.tipo porque la distancia es variable (en este ejemplo depende del número de id que aparezcan). Solución: almacenar L.th en el marcador de la acción intermedia (usando $$ nos referimos a los atributos del marcador). d : t ID { anadirts($2.lexema,$1.tipo) $$.tipo=$1.tipo } l {... l : COMA ID { anadirts($2.lexema,$0.tipo) $$.tipo=$0.tipo } l /* epsilon */ Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 15 / 16 Implementación de atributos heredados (5) Resumen: Es necesario asociar un atributo sintetizado de otro símbolo (que podría ser un marcador) con el atributo heredado Se debe asegurar que el atributo sintetizado asociado está siempre a la misma distancia en la pila en todas las reglas en que se use el atributo heredado Se debe intentar evitar el uso de atributos heredados, rediseñando la gramática si fuese necesario Si hay atributos heredados y/o acciones intermedias, es siempre preferible la recursividad por la izquierda a la recursividad por la derecha Más información: páginas 130-150 del libro Diseño de compiladores, de A. Garrido et al. Procesamiento de Lenguajes Tema 5 (2 a parte): Traductores ascendentes 16 / 16