Procesamiento Semántico en Compiladores: Verificación y Generación de Código

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 3,41 KB

Unidad V. La Fase Semántica en la Compilación

La fase semántica se compone de un conjunto de rutinas independientes, llamadas por los analizadores morfológico y sintáctico.

La verificación semántica utiliza como entrada el árbol sintáctico detectado por el análisis sintáctico para comprobar restricciones de tipo y otras limitaciones semánticas, preparando así la generación de código.

En compiladores de un solo paso, las llamadas a las rutinas semánticas se realizan directamente desde el analizador sintáctico, y son dichas rutinas las que invocan al generador de código. El instrumento más utilizado para conseguirlo es la gramática de atributos.

En compiladores de dos o más pasos, la verificación semántica se realiza independientemente de la generación de código, pasándose información a través de un archivo intermedio que, normalmente, contiene datos sobre el árbol sintáctico en forma linealizada (para facilitar su manejo y hacer posible su almacenamiento en memoria auxiliar).

En cualquier caso, las rutinas semánticas suelen hacer uso de una pila (la pila semántica) que contiene la información semántica asociada a los operandos (y a veces a los operadores) en forma de registros semánticos.

Aspectos Clave de la Verificación Semántica

  • Traducción dirigida por la sintaxis: la semántica está atada a la sintaxis.
  • Noam Chomsky: autonomía de la sintaxis (colorless green ideas sleep furiously).
  • Gramáticas con atributos: reglas + símbolos de acción semántica.
  • Rutinas semánticas: se activan para realizar una verificación semántica o generar código.

¿Por qué Realizar la Verificación Semántica?

  • Asegurarnos de que el programa cumple con la definición del lenguaje de programación.
  • Proveer mensajes de error útiles al usuario.

Tipos de Chequeos Semánticos

Chequeos Estáticos

  • Chequeos de Control de Flujo
    • El control de flujo del programa es sensible al contexto.
    • Ejemplos:
      • La declaración de una variable debe ser visible al usarla (en scope).
      • La declaración de una variable debe estar antes de usarla.
      • Cada camino de salida (exit path) retorna un valor del tipo correcto.
  • Chequeos de Unicidad
    • Uso (y mal uso) de identificadores.
      • No se puede representar en una CFG (mismo token).
    • Ejemplos:
      • Ningún identificador puede ser usado para dos definiciones diferentes en el mismo scope.
  • Chequeos de Tipo
    • Los chequeos semánticos más extensos.
    • Ejemplos:
      • Que el número de argumentos coincida con el número de parámetros formales y que los tipos correspondientes sean equivalentes.
        • Si se llama como expresión, debe retornar un tipo.
        • Cada acceso a una variable debe coincidir con la declaración (arreglo, estructura, etc.).
        • Los identificadores en una expresión deben ser “evaluables”.
        • El LHS de una asignación debe ser “asignable”.
        • En una expresión, los tipos de las variables, tipos de retorno de métodos y de operadores deben ser “compatibles”.

Chequeos Dinámicos

  • Chequeos de límites de arreglos.
  • Chequeo de desreferencia del puntero nulo.

Entradas relacionadas: