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

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

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

Tema 1.4. Un lenguaje mínimo y su procesador: El lenguaje objeto y la máquina virtual

Tema 5. Análisis semántico

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

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

LENGUAJES Y GRAMÁTICAS

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

Tema 5: Traducción dirigida por la sintaxis

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

Qué es el análisis semántico?

TEMA 3: ANÁLISIS SEMÁNTICO

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

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

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

16 Análisis sintáctico I

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

Gramáticas de Atributos

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

Lenguajes y Compiladores Aspectos Formales (Parte 1) Compiladores

Conceptos básicos sobre gramáticas

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

Análisis léxico. Formalización y desarrollo. Procesadores de Lenguajes. Ingeniería Técnica superior de Ingeniería Informática

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

Elementos de un programa en C

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

PRÁCTICAS DE PROCESADORES DEL LENGUAJE CURSO 2008/2009

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

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

Generación de Código Intermedio

FASES DE UN COMPILADOR

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

FUNDAMENTOS DE INFORMÁTICA

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

Unidad II: Análisis semántico

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

ESTRUCTURAS DE DATOS Y ALGORITMOS

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

Tema 2: Desarrollo de Algoritmos. E.E. de Algorítmica

Procesadores de lenguaje Tema 4 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

Gramaticas Independientes del Contexto, ejemplos y ejercicios

Capítulo 5: Traducción Dirigida por Sintaxis

Tema: Análisis Semántico

Lenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores

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

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

Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1

Recopilación de ejercicios sobre esquemas de traducción en exámenes de Compiladores e intérpretes

Unidad 2. Introducción Lenguajes y Compiladores

NOTAS PARA LA MATERIA LENGUAJES DE PROGRAMACIÓN

Desarrollo del Programa Docente de Procesadores del Lenguaje

Computación I Curso 2016 Facultad de Ingeniería Universidad de la República

Analizador Sintáctico Ascendente

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

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

Procesamiento de Lenguajes (PL) Curso 2015/2016. Práctica 5: traductor a código m2r

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

Unidad I: Análisis semántico

El proceso del Análisis Léxico

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

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

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

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

Bison. Introducción. Índice. Introducción Uso de Bison con Flex. Formato del fichero de especificación de Bison

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

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

Tema: Análisis Léxico

Programación MODULAR: Subalgoritmos - funciones y procedimientos

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

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

Unidad III Análisis Léxico. M.C. Juan Carlos Olivares Rojas

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4

TEMA 2: ANÁLISIS LÉXICO-SINTÁCTICO

Introducción. El proceso de traducción

Algoritmos y programas. Algoritmos y Estructuras de Datos I

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

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

GRAMATICAS LIBRES DEL CONTEXTO

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:

Tema 1. Introducción

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

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

UIT-T Z.314 SECTOR DE NORMALIZACIÓN DE LAS TELECOMUNICACIONES DE LA UIT

Programación en Visual Basic Ricardo Rodríguez García

Estructuras de Datos y Algoritmos

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Introducción a la lingüística computacional

Java. Introducción a la Programación Orientada a Objetos

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

Computabilidad y lenguajes formales: Sesión 19. Gramáticas Incontextuales (Context Free Grammars)

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

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

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

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

SSL Guia de Ejercicios

Capítulo 8. Árboles. Continuar

Introducción a la programación: Contenido. Introducción

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

Transcripción:

Tema 1.2. Un lenguaje mínimo y su procesador: Gramáticas de atributos y tabla de símbolos Profesor Federico Peinado Elaboración del material José Luis Sierra Federico Peinado Ingeniería en Informática Facultad de Informática Universidad Complutense de Madrid Curso 2009-2010

Semántica de un lenguaje de programación Hasta ahora hemos hablado de la forma (sintaxis) de las sentencias de un lenguaje de programación, pero cómo podemos expresar su significado (semántica)? Donald E. Knuth propuso el formalismo de las gramáticas de atributos para expresar la semántica de cualquier lenguaje incontextual, basándose en estas ideas: Semántica de traducción: Cada sentencia se asocia con otra sentencia en un lenguaje objeto de los significados Ej. 4 * 5 significado apila 4, apila 5, multiplica Principio de composicionalidad: La sentencia significado asociada a cada categoría sintáctica dependerá de las sentencias significado de sus subcategorías sintácticas Ej. El de una expresión (33 + 4*5) se compone con el de los operandos (33 y 4*5) y de la operación (+) Ingeniería en Informática 1.2-1

Gramáticas de atributos Se parte de la gramática incontextual y se le añade: Un conjunto de atributos semánticos que se asociarán a las categorías sintácticas categoriax.a 1, categoriax.a 2,, categoriax.a n categoriay.a 1, categoriay.a 2,, categoriay.a n Un conjunto de ecuaciones semánticas que servirán para calcular el de los atributos de la categoría sintáctica del lado izquierdo de las producciones usando los es de los atributos de las categorías sintácticas del derecho a 1 = f 1 (a x, a x+1, a x+2, a y ) a 2 = f 2 (a x, a x+1, a x+2, a y ) Las funciones f 1, f 2, se llaman funciones semánticas Ingeniería en Informática 1.2-2

Ejemplo de gramática de atributos Bits ::= Bits Bit Bits o. = Bits 1. * 2 + Bit. Bits ::= Bit Bits. = Bit. Bit ::= 0 Bit. = 0 Bit ::= 1 Bit. = 1 * Para distinguir varias apariciones de una misma categoría sintáctica en una producción de una gramática de atributos conviene ponerles subíndices (0, 1, ) Ingeniería en Informática 1.2-3

Árboles sintácticos atribuidos Los nodos-padre de los árboles sintácticos, decorados por los atributos, se vuelven árboles sintácticos atribuidos Ej. Bits Bits Bits Bit Bit 1 Bit 1 0 Ingeniería en Informática 1.2-4

Grafos de dependencias de atributos Las ecuaciones semánticas introducen dependencias que se muestran como grafos de dependencias de atributos Los nodos son los atributos y los arcos van de los atributos de la derecha de una ecuación al atributo de la izquierda Ej. Bits Bits Bits Bit Bit 1 Bit 1 0 * En este ejemplo el grafo es simplemente un árbol, pero más adelante los hay más complejos Ingeniería en Informática 1.2-5

Cálculo del de los atributos El de un atributo se calcula evaluando la función semántica correspondiente sobre los otros atributos, según el orden del grafo de dependencias de atributos Ej. 1*2 + 0 = 2 Bits Bits 1 Bits Bit 0 Bit 1 2*2 + 1 = 5 1 Bit 1 0 1 Estos 1 s y 0 s son símbolos terminales (= categorías léxicas) y por lo tanto no tienen significado directamente atribuible Ingeniería en Informática 1.2-6

Atributos léxicos Hay varios tipos de atributos interesantes para definir la gramática de atributos de un lenguaje de programación Los atributos léxicos se asocian a todos los terminales de la gramática (= categorías léxicas) y contienen el concreto de los lexemas que han sido reconocidos categoria-léxicax.lex categoria-léxicay.lex Como la gramática no captura la microsintaxis (nos quedamos en las categorías léxicas) hace falta alguna manera de acceder a la cadena concreta que hay por debajo Ej. El nombre de un Identificador, los dígitos de un Número, etc. Asumiremos que vienen prefijados de manera externa a la gramática de atributos Ej. Lo hace el analizador léxico Ingeniería en Informática 1.2-7

Ejemplo con atributos léxicos Bits ::= Bits Bit Bits o. = Bits 1. * 2 + De(Bit.lex) Bits ::= Bit Bits. = De(Bit.lex) Bit ::= 0 Bit.lex = 0 Bit ::= 1 Bit.lex = 1 2*2 + De("1") = 5 1*2 + De("0") = 2 De("1") = 1 Bits Bits Bits Bit lex Bit "0" lex "1" Bit lex Ingeniería en Informática 1.2-8 "1"

Atributos sintetizados y gramáticas s-atribuidas Todos los atributos que se calculan según el principio de composicionalidad se llaman atributos sintetizados Ej. Los atributos anteriores lex y Las gramáticas de atributos que únicamente poseen atributos sintetizados se llaman gramáticas s-atribuidas La evaluación en una gramática s-atribuida se puede hacer con un recorrido en postorden de los árboles sintácticos atribuidos Ejemplo (repaso): Preorden: a b e f l m g c h i d j n o k p q Inorden: e b l f m g a h c i n j o d p k q Postorden: e l m f g b h i c n o j p q k d a Ingeniería en Informática 1.2-9

Gramáticas de atributos (contextuales) Muchas veces el cálculo del de los atributos necesita información adicional de contexto Se necesita generalizar el formalismo de las gramáticas de atributos Ej. Para interpretar el identificador de una variable (sustituirlo por su ) hay que conocer su dirección en memoria, que se estableció en la sección de declaración de variables De esta forma una gramática de atributos ya puede ser gramática contextual (que define un lenguaje contextual) Ingeniería en Informática 1.2-10

Atributos heredados La gramática de atributos se extiende con información del contexto (= parte no inferior del árbol sintáctico atribuido) Principio de composicionalidad generalizado: La sentencia significado asociada a cada categoría sintáctica dependerá de las sentencias significado de sus subcategorías sintácticas y de las categorías sintácticas que formen parte de su contexto Todos los atributos que se calculan según el principio de composicionalidad generalizado (usando al menos un atributo del contexto) se llaman atributos heredados * Los atributos sintetizados son como es de salida de las categorías sintácticas (suben hacia la raíz el programa-), mientras que los atributos heredados son como es de entrada (bajan hacia las hojas las expresiones, etc.-) Ingeniería en Informática 1.2-11

Ejemplo con atributos heredados Números en base X: Para interpretar un número hay que saber interpretar sus dígitos y además conocer la base Ej. AF3 = 2803) 10 porque A=10, F=15, 3=3 y la base es 16 Ej. AF3 = 13503) 10 porque A=10, F=15, 3=3 y la base es 36 Número ::= Número Dígito Número o. = Número 1.*Número o.base + De(Dígito.lex,Número o.vdigs) Número 1.base = Número o.base Número 1.vdigs = Número o.vdigs Número ::= Dígito Número. = De(Dígito.lex,Número.vdigs) * vdigs es un atributo en forma de tabla con el de los dígitos Ingeniería en Informática 1.2-12

Ejemplo con atributos heredados base vdigs base vdigs Numero 16 Numero base vdigs Numero 10 Lexema 3 3 A 10 F 15 175 Digito Valor Digito lex 2803 F" lex 3 Digito lex A" * Si la base fuese 36 o el asociado a los lexemas fuese distinto, todos los es del árbol serían otros Ingeniería en Informática 1.2-13

Ciclos en los grafos de dependencias de atributos Normalmente los grafos de dependencias de atributos no contienen ciclos (acíclicos) El orden de evaluación es sencillamente el orden topológico del grafo Sin embargo una gramática de atributos puede generar grafos de dependencias de atributos con ciclos (cíclicos) Ej. pareja ::= persona persona persona o.v = f(persona 1.v) persona 1.v = f(persona o.v) pareja.v = persona 1.v v persona pareja v v persona Ingeniería en Informática 1.2-14

El problema de la circularidad Una gramática de atributos es circular cuando da lugar a grafos de dependencias de atributos cíclicos Evitaremos la circularidad a la hora de hacer gramáticas de atributos para un lenguaje de programación Aunque, al igual que la ambigüedad, la circularidad es un problema que puede ser tratable en algunos casos en esta primera parte del curso no lo admitiremos Existen algoritmos para comprobar la circularidad de una gramática de atributos, que también se usan en la generación automática de procesadores del lenguaje eficientes partiendo de su gramática de atributos Ingeniería en Informática 1.2-15

Gramáticas de atributos l-atribuidas Una gramática de atributos es l-atribuida (se hereda por la izquierda) cuando en cada producción N ::= X 1 X 2 X n los atributos heredados de cada X i dependen sólo de: Los atributos heredados de N Los atributos sintetizados de X 1, X 1,, X i-1 La evaluación en una gramática l-atribuida se puede hacer con un recorrido en preorden de los árboles sintácticos atribuidos para los atributos heredados, y un recorrido en postorden para los sintetizados Intentaremos trabajar siempre con gramáticas l-atribuidas, aunque también existen técnicas para tratar algunos casos donde se hereda por la derecha Ingeniería en Informática 1.2-16

Tabla de símbolos (TS) Los lenguajes de programación incluyen mecanismos para definir nuevos símbolos junto con el significado que les da el usuario Ej. Declaración de que X e Y son variables y son de tipo entero: var x,y: Integer; La tabla de símbolos (= el diccionario específico de un programa) es la estructura de datos que permite almacenar esa información semántica Sirve para dar soporte a las restricciones contextuales (ej. impedir que se usen variables sin declarar) y es de utilidad tanto en el análisis como en la síntesis de un programa Ingeniería en Informática 1.2-17

Estructura y construcción de la tabla de símbolos Al definir un lenguaje de programación, también hay que diseñar la tabla de símbolos que permite almacenar la información expresable mediante declaraciones Especificando estructura en abstracto Especificando operaciones de acceso y modificación Especificando algoritmo de construcción Precisamente el algoritmo de construcción (que mientras analiza la sección de declaraciones va rellenando la tabla) utiliza una gramática de atributos * Aquí estudiamos conceptos básicos sobre la estructura y la construcción de la tabla de símbolos, que serán ampliados al hablar sobre la síntesis en procesadores de lenguaje Ingeniería en Informática 1.2-18

Ampliación del ejemplo: Secuencia de instrucciones de asignación 1. Descripción informal del lenguaje Cada asignación tiene la forma variable := expresión Las expresiones pueden contener variables Restricción contextual: las variables deben haber sido previamente declaradas antes de usarse en una asignación más todo lo dicho antes para las expresiones aritméticas Ejemplo de frase (= miniprograma) en este lenguaje: tiempo; espacio; velocidad & espacio := 25; tiempo := 30; velocidad := espacio / tiempo Ingeniería en Informática 1.2-19

Ampliación del ejemplo: Secuencia de instrucciones de asignación 2. Definición léxica parte-entera 0 [1-9]{dígito}* parte-decimal.{dígito}+ número {parte-entera}{parte-decimal}? letra [a-z] [A-Z] dígito [0-9] identificador {letra}({letra} {dígito})* + \+ - \- * \* / / ( \( ) \) asignación := separador & punto-y-coma ; := := & & ; ; Ingeniería en Informática 1.2-20

Ampliación del ejemplo: Secuencia de instrucciones de asignación 3. Definición sintáctica incontextual Prog ::= Decs & Is Decs ::= Dec Decs ; Dec Dec ::= iden Is ::= I Is ; I I ::= IAsig IAsig ::= iden := Exp Exp ::= Exp OpAd Term Exp ::= Term Term ::= Term OpMul Fact Term ::= Fact Fact ::= num iden ( Exp ) OpAd ::= + - OpMul ::= * / Ingeniería en Informática 1.2-21

Ampliación del ejemplo: Secuencia de instrucciones de asignación 4. y 5. Definición sintáctica contextual y definición semántica Estructura de la tabla de símbolos Conjunto de identificadores que implícitamente se asume que son todos de tipo real Ej. Identificador Dirección (celda de memoria) tiempo 16058 espacio 16060 Ingeniería en Informática 1.2-22

Ampliación del ejemplo: Secuencia de instrucciones de asignación 4. y 5. Definición sintáctica contextual y definición semántica Operaciones de la tabla de símbolos Las tres operaciones más básicas posibles: creats Crea la tabla inicialmente añadeid Añade un nuevo identificador a la tabla existeid Nos dice si un identificador está en la tabla Ingeniería en Informática 1.2-23

Ampliación del ejemplo: Secuencia de instrucciones de asignación 4. y 5. Definición sintáctica contextual y definición semántica Operaciones de la tabla de símbolos Géneros: TS,ID (alias de String), BOOL Operaciones privadas: []: TS.: TS ID TS Operaciones públicas: creats: TS añadeid: TS ID TS existeid: TS ID BOOL Ecuaciones: creats = [] añadeid(ts,id) =.(TS,id) existeid(.(ts,id o ),id 1 ) = (id o == id 1 ) existeid(ts,id 1 ) existeid([],_) = false En vez de usar una signatura formal (como la especificación algebraica) nos conformaremos con una descripción informal de la semántica de las operaciones creats():ts El resultado es una TS vacía añadeid(ts:ts, id:string):ts El resultado es la TS resultante de añadir id a ts existeid(ts: TS, id:string):boolean El resultado es true si id aparece en ts, false en caso contrario Ingeniería en Informática 1.2-24

Ampliación del ejemplo: Secuencia de instrucciones de asignación 4. y 5. Definición sintáctica contextual y definición semántica Construcción de la tabla de símbolos La tabla de símbolos puede verse como un atributo sintetizado de una gramática de atributos que vamos a definir para expresar el sublenguaje de la sección de declaraciones de un lenguaje de programación Luego en el sublenguaje de la sección de código curiosamente se ve al revés, como atributo heredado Declaraciones Instrucciones La TS se sintetiza La TS se hereda Ingeniería en Informática 1.2-25

Ampliación del ejemplo: Secuencia de instrucciones de asignación 4. y 5. Definición sintáctica contextual y definición semántica Construcción de la tabla de símbolos Ej. Sección de declaración de variables Decs ts Decs Dec ts id lex iden ; Dec iden id lex * id es otro atributo sintetizado, con información del identificador declarado Decs ::= Dec Decs.ts = añadeid(creats(),dec.id) Decs ::= Decs ; Dec Decs o.ts = añadeid(decs 1.ts,Dec.id) Dec ::= iden Dec.id = iden.lex Ingeniería en Informática 1.2-26

Sintaxis abstracta La sintaxis abstracta de un lenguaje es el tipo abstracto de datos que representa las características sintácticas esenciales para el procesamiento de sus sentencias La tabla de símbolos es, por lo tanto, la sintaxis abstracta del sublenguaje de la sección de declaraciones de un lenguaje de programación Ingeniería en Informática 1.2-27

Ampliación del ejemplo: Secuencia de instrucciones de asignación Sentencia 4. y 5. Definición sintáctica contextual y definición semántica Construcción de la tabla de símbolos Ej. Decs. Decs ; Dec x;y;z. z Decs ;. Dec iden y z [] x Dec iden x iden y Sintaxis concreta Sintaxis abstracta (se prescinde de toda la estructura de no terminales, etc.) Ingeniería en Informática 1.2-28

Críticas, dudas, sugerencias Federico Peinado www.federicopeinado.es Ingeniería en Informática