5

¿Cómo se hace el análisis semántico por un compilador (generalmente)?Análisis semántico en compiladores

Tuve que responder a esta pregunta en mi último examen, no fue suficiente para el profesor.

Incluí BNF (con un ejemplo) y tarjetas sintácticas en mi respuesta, a lo que me preguntó: "¿Qué sucede cuando el compilador encuentra una declaración como int i;?"

+0

¿No cubrió este material en su clase? –

+0

@IraBaxter: Sí, pero superficialmente de lo que preguntó durante el examen. (mal mal inglés, lo siento) – Overflowh

+1

Esto es más como un "problema humano" que un "problema técnico", a veces los maestros esperan que una respuesta sea muy específica a lo que hablan en clase ... – umlcat

Respuesta

7

Hora de leer Aho & Ullman/Dragon reserve con cuidado.

El análisis semántico es la actividad de un compilador para determinar qué tipos de varios valores son, cómo esos tipos interactúan en expresiones y si esas interacciones son semánticamente razonables. Por ejemplo, no se puede multiplicar razonablemente una cadena de nombre de la clase, aunque ningún editor le impedirá escribir

"abc" * MyClass 

Para ello, el compilador debe primero identificar las declaraciones y alcances, y por lo general registra el resultado de esta paso en un conjunto de tablas de símbolos. Esto le dice qué significa identificadores específicos en contextos específicos. También debe determinar los tipos de varias constantes literales; "abc" es un tipo diferente de 12.2e-5.

Luego debe visitar todas las ubicaciones donde se usan identificadores y literales, y verificar que el uso del identificador/literal y los resultados calculados sean compatibles con la definición del lenguaje (como en el ejemplo anterior).

En cuanto a cómo se hace esto: por lo general se analiza el código fuente, se construye una representación del programa (árboles de sintaxis son muy populares), y se camina que la representación ("visitada") elemento por elemento para recoger/validar la información semántica. La tabla de símbolos generalmente es solo un conjunto de tablas hash asociadas con el árbol de sintaxis que representa un alcance, el hash desde los identificadores hasta las estructuras que contienen declaraciones de tipo.

+0

Creo que lo he entendido.¿Podría darme un ejemplo, por favor? Por ejemplo, cuando un compilador encuentra una declaración en una función (como 'long double f;'), pone en una tabla que 'f' es un símbolo, que ocupa 8 bytes, que puede contener números flotantes, que se define solo en el alcance de la función, y su rango de valores? – Overflowh

+1

@unNatural: Sí, lo tienes bien. La clave es la asociación entre el alcance, el identificador y el * tipo * de identificador. Otros datos (como float toma 8 bytes) no necesariamente tienen que estar en la tabla de símbolos, porque ese hecho es probablemente cierto en todo el compilador para cualquier valor flotante. Es útil para las etapas posteriores del compilador capturar información de rango si puede determinarlo, y esto es posiblemente un análisis semántico, pero la mayoría de la gente no piensa en el análisis de rango como "análisis semántico de compilador" en el estrecho margen de esta discusión . –

+0

Ok, está claro :) Disculpe si abuso de su disponibilidad, pero tengo otra pregunta. De acuerdo con lo que dijo, parece que el BNF no tiene nada que ver con el proceso de análisis semántico. Es correcto, o estoy equivocado? – Overflowh

Cuestiones relacionadas