Introducción Análisis Semántico José M. Castaño Teoría de Lenguajes 2011 Departamento de Computación FCEyN, UBA Compiladores Introducción Análisis Léxico Análisis Sintáctico Análisis Semántico Generación Código Intermedio Optimización Generación Código Introducción Introducción • Reconocer/Generar un lenguaje independiente de contexto (CFL). • Poder expresivo CFL • Análisis léxico (tokenización, lexers, scanners) • Análisis sintáctico • Mientras se reconoce se construye árbol (AST), para hacer algo más ... Introducción Introducción • Análisis léxico: condiciones de buena formación a nivel palabra • Análisis sintáctico: condiciones de buena formación a nivel estructural. • Análisis semántico: condiciones de buena formación a nivel interpretación. ASTs: Abstract Syntax Trees Introducción • árbol para codificar la estructura lógica (Abstracción de la sintaxis particular) • Elimina símbolos inútiles • Elimina nodos internos • Traducción última. Cómo se construye el AST? Introducción • Acciones semánticas • Asociar el código con cada producción • Mientras se hace el análisis sintáctico se ejecuta el código para construir el AST • El orden exacto del código depende del parsing • Traducción dirigida por la sintaxis Análisis Semántico Introducción • Verificar que el input tenga un significado o interpretación. • Verificar propiedades que no se pueden verificar al nivel sintáctico. • Desafío: • Rechazar el mayor númeor de programas sin interpretación • Aceptar el mayor número de programas correctos. • Hacerlo lo más rápido posible. • También guardar información que puede ser usada posteriormente (alcance de variables, herencia, etc.) Análisis Semántico: Más allá de CFL Introducción Algunas preguntas... • Se declaró x antes de usarlo? • Se declaró x pero no se usa? • Es el tipo de una expresión el que corresponde? • La referencia a una posición en un array está dentro de sus límites? • ... Más allá de CFL Introducción • Usamos una gramática de mayor poder expresivo que una CFG? • Usamos una estructura de datos adicional? Una pila semántica? • Necesitamos guardar la información semantica. • Gramáticas de Atributos • Usamos métodos ad-hoc? Más allá de CFL Introducción • Importancia del formalismo de las gramáticas de atributos • Claridad formal • Base para la práctica ad-hoc • Limitaciondes de las GA motivan la práctica • Computación no-local • Necesidad de información centralizada Análisis Semántico Introducción Dos enfoques: • Gramática de Atributos • Aumentar CFG • Traducción dirigida por la sintaxis • Recorrer recursivamente el AST • Construir el AST • Usar funciones y recursión para explorar el árbol. Propagación de la información Introducción • El análisis semántico requiere comparar información que se tiene en distintas partes del árbol de derivación. • Comparar declaración de una variable con asignación de la misma variable. • La información se propaga hacia un nodo común para llegar hasta el punto donde se la necesita. Atributos Introducción • Para poder realizar un movimiento de información es necesario extender la gramática • Permitir que los símbolos (tanto terminales como no terminales) tengan información asociada: atributo. • Cada símbolo puede tener asociado uno o más atributos. • Notación similar a Java: atributos de un objeto o en C: componente de una estructura : • nombreSímbolo.nombreAtributo • Ej: no terminal E, con atributo val: E.val Gramática de Atributos Introducción • Una CFG aumentada con atributos • Cada símbolo gramatical tiene un conjunto de atributos asociados. • Cada producción tiene una regla semántica asociada • Traducción Dirigida por la Sintaxis (SDD) • Usar los atributos para el análisis/traducción semántica. • Chequeo de tipos. • Generación del código intermedio Más sobre atributos Introducción • Atributos: • Es una asociación de un nombre a un dominio de datos (par atributo, valor) • El atributo de nombre val tomar valores numéricos • Un atributo de nombre tipo que toma como valor los tipos permitidos • Propagación (de atributos): • Cálculo de los atributos en función de los valores de los que dependen Dos tipos de atributos Introducción • Atributos sintetizados • Los valores de los atributos se evalúan bottom up • El valor del nodo superior se define por los valores de los hijos • El valor del símbolo a izquierda depende del RHS de la regla • Atributos heredados • Los valores de los atributos se evalúan top down • El valor de un nodo se define en términos de los valores del nodo superior o nodos hermanos • Se define el valor de elementos en RHS por elementos en RHS o LHS. • Reglas de atributos • Información local: sólo se refieren a símbolos en la producci ón correspondiente. Ejemplo Introducción E E T T →T +E →T → int → int ∗ T E1 .val = T .val + E2 .val E.val = T .val T .val = int.val T1 .val = int.val ∗ T2 .val Árbol anotado o decorado con atributos Introducción E T T.val=4 int int.val=4 E.val=10 + int E E T T →T +E →T → int → int ∗ T E E.val=6 T T.val=6 int.val=2 * E1 .val = T .val + E2 .val E.val = T .val T .val = int.val T1 .val = int.val ∗ T2 .val T T.val=3 int int.val=3 Observaciones Generales Introducción • Las gramáticas de atributos tienen el mismo poder expresivo que las máquinas de Turing • Los atributos se pueden calcular usando pasadas reiteradas sobre el AST • Evaluación basada en las dependencias. • El grafo de las dependencias debe ser acíclico. • La definición de atributos puede ser cíclica. • Verificar si una gramática de atributos es cíclica es decidible pero puede ser costoso. • Los atributos heredados pueden ser manipulados usando una estructura de datos global (tabla de símbolos) • Subconjuntos útiles: gramática de atributos S- y L- Gramática de atributos-S Introducción • Sólo tiene atributos sintetizados • Adecuada para parsing shift-reduce E →T +E E →T T → int T → int ∗ T E1 .val = T .val + E2 .val E.val = T .val T .val = int.val T1 .val = int.val ∗ T2 .val Propagación en gramática-S Introducción E T int E + T int.val=4 int int.val=2 T * int E E T T →T +E →T → int → int ∗ T E1 .val = T .val + E2 .val E.val = T .val T .val = int.val T1 .val = int.val ∗ T2 .val int.val=3 Propagación en gramática-S Introducción E T T.val=4 int int.val=4 E + T int int.val=2 T * int E E T T →T +E →T → int → int ∗ T E1 .val = T .val + E2 .val E.val = T .val T .val = int.val T1 .val = int.val ∗ T2 .val int.val=3 Propagación en gramática-S Introducción E T T.val=4 int int.val=4 E + T int int.val=2 * T T.val=3 int E E T T →T +E →T → int → int ∗ T E1 .val = T .val + E2 .val E.val = T .val T .val = int.val T1 .val = int.val ∗ T2 .val int.val=3 Propagación en gramática-S Introducción E T T.val=4 int int.val=4 E + T int E E T T →T +E →T → int → int ∗ T int.val=2 T.val=6 * E1 .val = T .val + E2 .val E.val = T .val T .val = int.val T1 .val = int.val ∗ T2 .val T T.val=3 int int.val=3 Propagación en gramática-S Introducción E T T.val=4 int int.val=4 + int E E T T →T +E →T → int → int ∗ T E E.val=6 T T.val=6 int.val=2 * E1 .val = T .val + E2 .val E.val = T .val T .val = int.val T1 .val = int.val ∗ T2 .val T T.val=3 int int.val=3 Propagación en gramática S Introducción E T T.val=4 int int.val=4 E.val=10 + int E E T T →T +E →T → int → int ∗ T E E.val=6 T T.val=6 int.val=2 * E1 .val = T .val + E2 .val E.val = T .val T .val = int.val T1 .val = int.val ∗ T2 .val T T.val=3 int int.val=3 Gramática de atributos-L Introducción Gramatica para declarar variables: • D: Declaracion • T: Tipo • L: Lista • id identificador D → TL T → int T → real L → L, i L → id Gramática de atributos-L Introducción • Tiene sólo atributos-L • Determinados por nodo superior o hermano a izquierda. D → TL T → int T → real L → L1 , i L→i L.type = T .type T .type = entero T .type = real L1 .type = L.type, i.type = L.type i.type = L.type Propagación en Gramática-L Introducción Input: int var1, x, y Propagación en Gramática-L Introducción Input: int var1, x, y Propagación en Gramática-L Introducción Input: int var1, x, y Propagación en Gramática-L Introducción Input: int var1, x, y Propagación en Gramática-L Introducción Input: int var1, x, y Resúmen Gramáticas de atributos S y L Introducción • En una gramática de atributos L los atributos heredados se calculan de izquierda a derecha. • N ::= S1 S2 S3 • Los atributos de S1 no dependen de S2 ni de S3. • Fácil de implementar en parser top-down, los nodos de los que dependen los atributos ya fueron procesados • Una gramática de atributos S, tiene sólo atributos sintetizados. • Se usa con un parser bottom-up. Introducción Gramática de atributos Extendida • Extensión de CFG en la que se permite: • Cada símbolo tenga asociado 1 o más atributos con un nombre y un tipo. • Cada regla de producción tenga asociada 1 o más acciones semánticas, cada una de las cuales especifica cómo cada atributo se puede calcular a partir de los atributos de otros símbolos de la regla de producción. • Datos globales, accesibles desde las reglas, no asociadas a ningún símbolo concreto. • Se aplican las reglas de producción y también las reglas semánticas asociadas. Resulta en árbol anotado con valores de los atributos en cada nodo. • Atributos de los símbolos: información local de las reglas. • Es posible modificar alguna estructura de datos o información general del compilador (global a todas las reglas). Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Introducción Traducción dirigida por la sintaxis Con la producción A → i := E, se asocia una acción de agregar el valor de E a i.