Análisis Semántico y Traducción Dirigida por la Sintaxis Programación II Margarita Álvarez
Análisis Semántico Comprobación estática Comprobación de tipos: la aplicación de los operadores y operandos deben ser compatibles. Comprobaciones del flujo del control: las proposiciones que hacen que se abandone el flujo del control de una construcción debe transferirse a otro punto. (break, exit) Comprobaciones de unicidad: hay situaciones en los que un objeto sólo puede definirse una vez exclusivamente. Las etiquetas de una sentencia case no deben repetirse. Comprobaciones relacionadas con nombre: el mismo nombre debe aparecer dos o más veces. En Ada el nombre que aparece en un bloque puede aparecer al principio y final, el compilador debe comprobar que se utiliza el mismo en ambos sitios.
Análisis Semántico Además de comprobar que un programa cumple con las reglas de la gramática, hay que comprobar que lo que se quiere hacer tiene sentido. Esta fase también modifica la tabla de símbolos y suele estar mezclada con la generación de código intermedio. Las gramáticas independientes del contexto no son suficientes para realizar el análisis semántico. Por ejemplo, no hay forma de comprobar si una variable ha sido definida ya, o si existe una determinada etiqueta. Es necesario definir un tipo de gramática más rica como las gramáticas de atributo.
Traducción dirigida por la sintaxis Se estudió dos notaciones: Expresiones Regulares para expresar la estructura léxica. Gramáticas libres de contexto para expresar la estructura sintáctica. Para las siguientes fases del compilador no existe una notación similar, se usa un formalismo llamado traducción dirigida por la sintaxis.
Traducción dirigida por la sintaxis Asocia información a la construcción del lenguaje. Atributos en los símbolos de la gramática. Los valores de los atributos se calculan mediante reglas semánticas asociadas a las producciones gramaticales. Existen dos notaciones para asociar reglas semánticas con producciones Las definiciones dirigidas por la sintaxis Los esquemas de traducción
Definiciones dirigidas por la sintaxis Cada símbolo tiene un conjunto de atributos asociados Atributo: una cadena, número, tipo, posición de memoria, etc. NombredeSímbolo.NombredeAtributo Cada producción A α tiene asociada un conjunto de acciones semánticas que se representan como una función: X.atr f (Y 1.atr,..., Y n.atr) Existen dos tipos de atributos: Atributo sintetizado: El valor a asignar a un nodo depende del valor de los nodos hijos. Atributo heredado: El valor de un nodo se pasa a un nivel inferior o igual en el árbol. Su valor depende del valor de los hermanos y del padre.
Definiciones dirigidas por la sintaxis Ejemplo calculadora: Sintetizados, Análisis Ascendente Producciones L E n E E + T E T T T * F T F F (E) F dígito Reglas semánticas Print(E.val) E.val = E.val + T.val E.val = T.val T.val = T.val * F.val T.val = F.val F.val = E.val F.val = dígito.valex Evaluación de la expresión 3 * 5 + 4
Definiciones dirigidas por la sintaxis Ejemplo declaración de tipos : Heredados Producciones D T L T int T real L L, id L id Reglas semánticas L.her = T.tipo T.tipo = int T.tipo = real L.her = L.her AgregarTipo(id.entrada,L.her) AgregarTipo(id.entrada,L.her) Real id 1, id 2, id 3
Esquema de traducción Un esquema de traducción es una gramática libre de contexto en la que se encuentran intercaladas en los lados derechos de las producciones, fragmentos de programas llamados acciones semánticas. X ab {accion();} b Notación complementaria donde las acciones se encuentran o bien intercaladas entre los símbolos de la parte derecha de las producciones, o bien al final de las mismas. Inserción de acciones semánticas al final de cada producción. S B1 B2 { B1.atr = 1; B2.atr = 2; } B x { print(b.atr); } Acciones semánticas intercaladas Proced procedure {CrearAmbito();} id Args Decl Sentencias;