1. ANÁLISIS SEMÁNTICO
Grupo 6: Irigoin Castillo, Cristhian
Martínez Roldan, Julio
Paucar Méndez , Martin
UNIVERSIDAD NACIONAL DEL CALLAO
Facultad de Ingeniería Industrial y de Sistemas
3. INTRODUCCIÓN A LA SEMÁNTICA DE LOS
LENGUAJES DE PROGRAMACIÓN DE ALTO NIVEL
El análisis semántico es la fase del compilador en
la que se comprueba la corrección semántica del
programa.
Suele estar compuesto por un conjunto de
subrutinas independientes, que pueden ser
invocadas por los analizadores morfológico y
sintáctico.
4. OBJETIVOS DEL ANALIZADOR SEMÁNTICO
Cuando se utiliza un identificador, éste ha sido
declarado previamente.
Se ha asignado valor a las variables antes de su uso.
Los índices para acceder a los arrays están dentro del
rango válido.
En las expresiones aritméticas, los operandos respetan
las reglas sobre los tipos de datos permitidos por los
operadores.
Cuando se invoca un procedimiento, éste ha sido
declarado adecuadamente. Además, el número, tipo y
posición de cada uno de sus argumentos debe ser
compatible con la declaración.
Las funciones contienen al menos una instrucción en la
que se devuelve su valor al programa que las invocó.
5.
6. ANÁLISIS SEMÁNTICO Y GENERACIÓN DE
CÓDIGO
Compiladores de un solo paso:
Compiladores de dos o más pasos:
7. ANÁLISIS SEMÁNTICO EN COMPILADORES DE
UN SOLO PASO
En los compiladores de un paso, no se utilizan
representaciones intermedias, ya que la generación
del código objeto se entremezcla con el análisis
semántico. En estos compiladores resulta más
complicado utilizar técnicas de optimización de
código y de gestión de memoria.
8.
9. ANÁLISIS SEMÁNTICO EN COMPILADORES DE
MÁS DE UN PASO
Cuando se diseña un compilador de más de un
paso, se utilizan representaciones intermedias para
facilitar las fases de optimización de código y
gestión de memoria que se realizarán en los pasos
siguientes.
Obsérvese que la salida del análisis semántico es
una representación intermedia, que aparece
contenida en un fichero. Las representaciones
intermedias no tienen necesariamente que ocupar
espacio en disco. un compilador, construido de
acuerdo con este esquema, puede terminar la fase
de generación de código optimizado realizando
pasos adicionales sobre la representación
intermedia.
12. Informalmente, se llamará atributos de un símbolo
de la gramática a toda información añadida en el
árbol de derivación por el analizador semántico,
asociada a los símbolos de los nodos anotados
13. ÁRBOLES SINTÁCTICOS ATRIBUIDOS
Los nodos-padre de los
árboles sintácticos,
decorados por los
atributos, se vuelven
árboles sintácticos
atribuidos
14. GRAFOS DE DEPENDECIAS DE ATRIBUTOS
Las ecuaciones
semánticas introducen
dependencias que se
muestran como grafos
de dependencias de
atributos
Los nodos son los
atributos y los arcos
van de los atributos de
la derecha de una
ecuación al atributo de
la izquierda
15. CÁLCULO DEL VALOR DE LOS ATRIBUTOS
El valor de un
atributo se calcula
evaluando la
función semántica
correspondiente
sobre los otros
atributos, según el
orden del grafo de
dependencias de
atributos
16. PROPAGACIÓN DE ATRIBUTOS
De la instrucción declarativa, la tabla
de símbolos y
el analizador morfológico obtenemos
los atributos de los operandos
18. ORDEN DE RECORRIDO DEL ÁRBOL DE ANÁLISIS
Los analizadores descendentes siguen el que se
conoce como recorrido en profundidad por la
izquierda con vuelta atrás, lo que significa que,
entre todos los nodos posibles, siempre se
continúa por uno de los más profundos. En caso de
empate, se toma el nodo que aparezca lo más a la
izquierda posible (por la izquierda).
19. Obsérvese que los nodos se visitan en el siguiente orden (se resaltan en
cursiva los nodos visitados más de una vez):D, T, int, T, D, L, L, L, i,
var1, i, L, L,‘,’,L, i, x, i, L, L,‘,’,L, i, y, i, L, D.
20. En los analizadores ascendentes no se conoce la
producción aplicada hasta que no se ha analizado la
parte derecha, por lo que las acciones semánticas
deberán aplicarse al final de la producción.
Obsérvese que los nodos se visitan en el siguiente
orden: int, T, var1, i, L,‘,’, x, i, L, ‘,’, y, i, L, D.
21. TIPOS DE GRAMATICAS DE ATRIBUTOS
Sintetizados. Su valor esta en función de los
atributos en nodos hijos.
Heredados.
Su valor esta en función de los atributos en nodos
padres y/o hermanos.
22. COMPROBACIONES QUE DEBE REALIZAR
UN COMPILADOR
Comprobación Estática
Facilita la depuración de programas ya que verifica los
errores posibles.
No requiere guardar toda la información acerca de los
objetos de datos.
Comprobación Dinámica
No requiere de una definición previa del tipo de dato para las
variables.
El tipo de dato asociado al nombre de la variable puede
cambiar durante su ejecución.
23. REGLAS SEMÁNTICAS
Una regla semántica es una expresión formal asociada a
una regla de producción que permite definir la
semántica de la construcción gramatical asociada a la
misma en términos de los símbolos de la regla de
producción.
Contamos con 2 tipos de Reglas Semánticas:
Reglas de ecuaciones de atributos.
Reglas de acción semántica.
24. ECUACIONES DE ATRIBUTOS
Los valores de los atributos, de cada símbolo gramatical, están
relacionados con los valores de los atributos de los otros símbolos en
la regla.
𝑋𝑖. 𝑎𝑗 = 𝑓𝑖𝑗 𝑋0. 𝑎1, … , 𝑋0. 𝑎 𝑘, 𝑋1. 𝑎1, … , 𝑋 𝑛. 𝑎1, … , 𝑋 𝑛. 𝑎 𝑘
donde:
𝑓𝑖𝑗: es una función matemática de sus argumentos.
𝑎𝑗, … , 𝑎 𝑘: es la colección de todos los atributos para todas las reglas
gramaticales.
𝑋𝑖: símbolos gramaticales.
25. ECUACIONES DE ATRIBUTOS
Ahora veremos un ejemplo para la cadena 𝒇𝒍𝒐𝒂𝒕 𝒙, 𝒚;
Consideremos la siguiente gramática simple para declaraciones de
variables de tipo int y float en una sintaxis tipo C:
𝑑𝑒𝑐𝑙 → 𝑡𝑦𝑝𝑒 𝑣𝑎𝑟L𝑖𝑠𝑡;
𝑡𝑦𝑝𝑒 → 𝒊𝒏𝒕 | 𝒇𝒍𝒐𝒂𝒕
𝑣𝑎𝑟𝐿𝑖𝑠𝑡 → 𝒊𝒅, (𝑣𝑎𝑟𝐿𝑖𝑠𝑡 | 𝒊𝒅)
27. ECUACIONES DE ATRIBUTOS
Las ecuaciones de atributo se pueden exhibir en un árbol de análisis
gramatical.
Regla Gramatical Reglas Semánticas
𝑑𝑒𝑐𝑙 →
𝑡𝑦𝑝𝑒 𝑣𝑎𝑟𝐿𝑖𝑠𝑡;
𝑣𝑎𝑟𝐿𝑖𝑠𝑡. 𝑑𝑡𝑦𝑝𝑒 =
𝑡𝑦𝑝𝑒. 𝑑𝑡𝑦𝑝𝑒
𝑡𝑦𝑝𝑒 → 𝒊𝒏𝒕 𝑡𝑦𝑝𝑒. 𝑑𝑡𝑦𝑝𝑒 = 𝑖𝑛𝑡𝑒𝑔𝑒𝑟
𝑡𝑦𝑝𝑒 → 𝒇𝒍𝒐𝒂𝒕 𝑡𝑦𝑝𝑒. 𝑑𝑡𝑦𝑝𝑒 = 𝑟𝑒𝑎𝑙
𝑣𝑎𝑟𝐿𝑖𝑠𝑡1 → 𝒊𝒅,
𝑣𝑎𝑟𝐿𝑖𝑠𝑡2
𝑖𝑑. 𝑑𝑡𝑦𝑝𝑒 = 𝑣𝑎𝑟𝐿𝑖𝑠𝑡1. 𝑑𝑡𝑦𝑝𝑒
𝑣𝑎𝑟𝐿𝑖𝑠𝑡2. 𝑑𝑡𝑦𝑝𝑒 =
𝑣𝑎𝑟𝐿𝑖𝑠𝑡1. 𝑑𝑡𝑦𝑝𝑒
𝑣𝑎𝑟𝐿𝑖𝑠𝑡 → 𝒊𝒅 𝑖𝑑. 𝑑𝑡𝑦𝑝𝑒 = 𝑣𝑎𝑟𝐿𝑖𝑠𝑡. 𝑑𝑡𝑦𝑝𝑒
28. GRAFOS DE DEPENDENCIAS
Un grafo de dependencias describe el flujo de información
entre las instancias de atributos en un árbol de análisis
sintáctico específico; una flecha de una instancia de
atributo a otra significa que el valor de la primera se
necesita para calcular la segunda.
29. GRAFOS DE DEPENDENCIAS
Algoritmo para su construcción:
Para cada nodo 𝒏 en el árbol de análisis sintáctico hacer
Para cada atributo 𝑎 del símbolo gramatical en el nodo 𝑛
hacer
Construir un nodo en el grafo de dependencias para 𝑎;
Para cada nodo 𝒏 en el árbol de análisis sintáctico hacer
Para cada regla semántica 𝑏 ≔ 𝑓 𝑐1, 𝑐2, … , 𝑐 𝑘 asociada con
la producción utilizada en 𝑛 hacer
Para cada 𝑖 ≔ 1 hasta k hacer
Construir una arista desde el nodo 𝑐𝑖 hasta el nodo para 𝑏;
30. GRAFOS DE DEPENDENCIAS
Ahora veremos un ejemplo para ello utilizaremos la gramática anterior
y la misma cadena de entrada: 𝑓𝑙𝑜𝑎𝑡 𝑥, 𝑦
31. ACCIONES SEMÁNTICAS
• Una acción semántica se ejecuta justo cuando se han reconocido los
símbolos que se encuentran a su izquierda en el cuerpo de la
producción.
• Define solo el valor de los atributos de los símbolos que aparecen en
la producción.
• La acción semántica se puede ver como una regla semántica
asociada a un nuevo símbolo no terminal cuya única producción
asociada 𝑀 → 𝑒 es ejecutada
32. CONCLUSIÓN
Concluimos que el analizador semántico es tan importante
como vital para un compilador, debido a que este analiza
cada estructura sintáctica verificando la coherencia de la
misma.
Para esto emplea las estructuras:
Árbol sintáctico
Tabla de Símbolos
Que son las más primordiales para este análisis.