Tema 5 (2 a parte): Traductores ascendentes

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

Tema 5: Traducción dirigida por la sintaxis

Tema 5: Traducción dirigida por la sintaxis

Tema 5. Análisis semántico

Tema 1: Introducción

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 5

Conceptos básicos sobre gramáticas

Tema 4: Análisis sintáctico ascendente. Análisis sintáctico ascendente: un ejemplo

COMPILADORES. Tema 4. Análisis semántico

ANÁLISIS SINTÁCTICO II GENERADOR DE ANALIZADORES SINTÁCTICOS ASCENDENTES

Práctica 4 Análisis LALR para milenguaje y construcción de un traductor de milenguaje

Lenguajes y Compiladores Traducción Dirigida por la Sintaxis

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

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

ANÁLISIS SEMÁNTICO ETDS VS DDS

Compiladores e Intérpretes Análisis Semántico I

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Gramáticas de Atributos

CUP. Diseño de compiladores. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP 20/04/2014

Temas. Objetivo. Analizador Sintáctico: funciones y tipos. Analizador Sintáctico Descendente. Analizador Sintáctico Ascendente

Examen de Procesadores de Lenguaje

Pontificia Universidad Católica del Ecuador

Análisis semántico I Traducción dirigida por la sintaxis

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

YACC. Los símbolos terminales que la gramática empleará. El axioma o símbolo inicial de la gramática. %token. %start

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE INGENIERÍA PROGRAMA DE ESTUDIO

Más sobre gramáticas independientes de contexto o incontextuales

Qué es el análisis semántico?

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

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

Seminario de introducción a Bison

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

Analizadores sintácticos LR(0) y SLR

TEORÍA. 1.- Escribir en pseudo-código el algoritmo del análisis sintáctico descendente con retroceso.

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V.

Elementos para el estudio de los compiladores

Procesadores de lenguaje

3 Curso de I.T. Informática de Sistemas. TEORÍA


Lenguajes de programación

PROGRAMA DE LABORATORIO POS-REQUISITO: Primer Semestre 2019 Ing. Mario José Bautista Fuentes AUXILIAR: Nery Galvez

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

16 Análisis sintáctico I

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 4

Tema 1. Introducción

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 3.

Tema 5. Análisis sintáctico ascendente

HERRAMIENTAS YACC Y BISON

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

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

Compiladores e intérpretes Introducción

4 o Ingeniería Informática

Tema: Análisis Sintáctico LR

Problemas de Procesadores de Lenguaje Juan Antonio Pérez Ortiz, japerez[en]dlsi.ua.es

TRADUCTORES E INTERPRETADORES

Compiladores: Introducción

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

Sintaxis y Semántica. Un repaso

TEORÍA. Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Septiembre de er Curso de I.T. Informática de Sistemas.

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

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

Desarrollo del Programa Docente de Procesadores del Lenguaje

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

Procesadores de Lenguaje

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

Yacc/Bison. Introducción

Análisis semántico. Análisis semántico. Índice

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 2.

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

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V.

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

COMPILACIÓN I

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

FLEX: A FAST LEXICAL ANALYZER GENERATOR

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

Tema 1.2. Un lenguaje mínimo y su procesador: Gramáticas de atributos y tabla de símbolos

Capítulo 5: Traducción Dirigida por Sintaxis

Procesadores de lenguaje Tema 4 Análisis semántico

PRÁCTICAS DE PROCESADORES DEL LENGUAJE CURSO 2008/2009

Generación de Código Intermedio

UNIVERSIDAD DE GUADALAJARA

Procesadores de lenguaje Tema 4 Análisis semántico

18 Análisis sintáctico III Compiladores - Profr. Edgardo Adrián Franco Martínez. Clasificación de métodos de análisis sintáctico Análisis descendente

Tema: Análisis Sintáctico LR

Análisis sintáctico Analizadores ascendentes

Tema 2: Análisis léxico

BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA FACULTAD CIENCIAS DE LA COMPUTACIÓN

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

Procesadores de Lenguaje

Unidad 5 Análisis semántico

FASES DE UN COMPILADOR

Tema: Análisis Semántico

Unidad IV Análisis Sintáctico. M.C. Juan Carlos Olivares Rojas

Teoría de Autómatas y Lenguajes Formales Práctica 4

División Académica de Informática y Sistemas

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