Análisis Semántico - Departamento de Computación

Anuncio
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.
Descargar