Es una descripción de la fase de análisis semántico de la compilación. Es una fase intermedia que vincula la fase de análisis inicial de un compilador con la fase de síntesis final
La programación informática o programación algorítmica, acortada
Análisis semántico
1. Es una descripción de la fase de análisis
semántico de la compilación. Es una fase
intermedia que vincula la fase de análisis
inicial de un compilador con la fase de
síntesis final
ANÁLISIS
SEMÁNTICO
AUTÓMATAS Y COMPILADORES
CALDASDOMINGUEZ, ROQUE
2. Contenido
1. INTRODUCCIÓN ------------------------------------------------------------------------------------2
2. ATRIBUTOS Y GRAMÁTICA CON ATRIBUTOS------------------------------------------------3
A. ATRIBUTOS: --------------------------------------------------------------------------------------- 3
B. GRAMATICA CON ATRIBUTOS------------------------------------------------------------------ 3
FORMA DE UNA SEMANTICA DIRIGIDA POR SINTAXIS-------------------------------------------------------------4
3. NOTACIONES PARA LA ESPECIFICACIÓN DE UN TRADUCTOR---------------------------5
A. Definición dirigida por sintaxis (DDS):--------------------------------------------------------- 5
B. ESQUEMA DE TRADUCCIÓN (ETDS) ------------------------------------------------------------ 6
4. TRADUCCIÓN A UNA REPRESENTACIÓN INTERMEDIA -----------------------------------7
A. ÁRBOL SINTÁCTICO ABSTRACTO --------------------------------------------------------------- 7
B. NOTACIÓN POSFIJA ------------------------------------------------------------------------------ 8
C. CÓDIGO DES TRES DIRECCIONES --------------------------------------------------------------- 8
3. 1. INTRODUCCIÓN
En el análisisléxicoysintáctico se handesarrolladolastécnicasadecuadasparacomprobarque
una serie de palabrasy símbolosestánbienconstruidosrespectoalas reglasimpuestasporun
lenguaje concreto. Pero el hecho de que estén bien construidos u ordenados no quiere decir
que su significadoseael deseadoporel creadordel compilador,porloque hayque comprobar
que lo que se quiere hacer tiene sentido.
Esta fase de análisis trata de verificar que los tipos que intervienen en las expresionessean
compatiblesentre sí,que losparámetrosque se lepasanalossubprogramasseanlosadecuados
tanto en número como en tipo, que las funciones devuelven valores adecuados en cuanto al
tipo, etc.
El análisis semántico involucra tanto la descripción de los análisis a realizar como la
implementaciónde losanálisisutilizandoalgoritmosapropiados.Eneste sentido,essemejante
al análisis léxico y sintáctico. En el análisis sintáctico,por ejemplo, utilizamos gramáticas libres
de contextoenlaformaBNFpara describirlasintaxisydiversosalgoritmosde análisissintáctico
descendiente y ascendiente para implementar la sintaxis. En el análisis semántico la situación
no es tan clara, en parte porque no hay un método estándar (como el BNF) que permita
especificar la semántica estática de un lenguaje, y en parte porque la cantidad y categoría del
análisissemánticovaríademasiadode unlenguaje aotro. Un métodopara describirel análisis
semántico que los escritores de compiladores usan muy a menudo con buenos efectos es la
identificaciónde atributos, o propiedades, de entidadesdel lenguaje que deben calcularse y
escribir ecuaciones de atributos o reglas semánticas, que expresan cómo el cálculo de tales
atributosestárelacionadoconlasreglasgramaticalesdel lenguaje.Unconjuntoasíde atributos
y ecuacionesse denominagramáticacon atributos.Las gramáticas conatributossonmás útiles
paraloslenguajesque obedecenelprincipiode lasemánticadirigidaporsintaxis,lacual asegura
que el contenido semántico de un programa se encuentra estrechamente relacionado con su
sintaxis.
4. 2. ATRIBUTOSY GRAMÁTICACONATRIBUTOS
A. ATRIBUTOS:
Los atributos son información personalizada (semántica) de los símbolos (terminales y no
terminales).Porloque cadatipode símbolo(terminalesynoterminales) puedeteneratributos
diferentes.Estainformaciónviajaatravésdel árbol de análisissintácticoadjuntaacadasímbolo
(terminalesynoterminales).Lasaccionessemánticasse encargande manipularel contenidode
losatributosparaverificarque existe unsignificadocorrectoenlarelaciónde lossímbolosentre
sí. Ejemplos típicos de atributos son:
El tipo de dato de una variable.
E l valor de una expresión.
La ubicación de una variable en la memoria.
E l código objeto de un procedimiento.
El número de dígitos significativos en un número.
Los atributos se pueden establecer antes del proceso de compilación (o incluso en la
construcciónde un compilador). Porejemplo,el númerode dígitossignificativosenunnúmero
se puede establecer(oporlomenosdarunvalormínimo) medianteladefinicióndeunLenguaje.
Además, los atributos solo se pueden determinar durante la ejecución del programa como el
valorde unaexpresión(noconstante).olaubicaciónde unaestructura dedatosdinámicamente
asignada.El procesode calcular un atributoy asociar su valorcalculadocon la construccióndel
lenguaje encuestiónse definecornofijacióndel atributo.Losatributosque puedenfijarse antes
de la ejecución se denominan estáticos mientras que los atributos que sólo se pueden fijar
durante la ejecución son dinámicos.
B. GRAMATICA CON ATRIBUTOS
Una gramáticaconatributosesunagramáticade contextolibrecuyosterminalesynoterminales
pueden tener asociados atributos y las producciones pueden tener asociadas reglas de
evaluaciónde losatributos.Cadasímbolopuede tenerasociadounnúmerofinitode atributos.
En lasemánticadirigidaporsintaxislosatributosestándirectamenteasociadosconlossímbolos
gramaticalesdel lenguaje(losterminalesynoterminales).Elvalorde unatributoenunnodode
un árbol de análisis sintáctico (terminales y no terminales) se define mediante una regla
semántica asociadaa la producciónutilizadaendichonodo.El valor de un atributosintetizado
en un nodo se calcula a partir de los valores de los atributos de los hijos de dicho nodo en el
5. árbol de análisissintáctico;el valorde unatributoheredadose calculaapartir de losvaloresde
los atributos en los hermanos y el padre de dicho nodo.
Un árbol de análisis sintáctico que muestre los valores de los atributos en cada nodo se
denominaunárbol de análisis sintáctico con anotaciones.El procesode calcular losvaloresde
los atributos en los nodos se denomina anotar o decorar el árbol de análisis sintáctico.
FORMA DE UNA SEMANTICA DIRIGIDA POR SINTAXIS
Cadaproducciónpuede tenerasociadaunnúmerofinitode reglasdeevaluacióndelosatributos.
Los valores de los atributos deberán estar asociados con un dominio de valores.
Sea G = (T, N, P, S) una gramática de contexto libre y 𝐶 = {𝑐1, 𝑐2,…, 𝑐𝑛} el conjunto de
atributos asociados con los símbolos (terminales y no terminales) de la gramática G.
Dada una regla de evaluación 𝑏 → 𝑓(𝑐1,… , 𝑐𝑘) asociado con la producción.
b dependede losatributos 𝑐1,… , 𝑐𝑘 Unagramáticacon atributosesuna semánticadirigidapor
la sintaxisenlaque lasfuncionesenlasreglassemánticasnopuedentenerefectoscolaterales.
EJEMPLO: La definición dirigida por la sintaxis de la figura 2.1 es para un programa para una
calculadora de escritorio. Esta definición asocia un atributo sintetizado con un valor entero
llamado val a cada uno de los no terminales E, T y F. Para cada producción de E, T y E, la regla
semántica calcula el valor del atributo val para el no terminal del lado izquierdo a partir de los
valores de val de los no terminales del lado derecho.
PRODUCCIÓN REGLA SEMÁNTICA
𝐿 −> 𝐸 𝑝𝑟𝑖𝑛𝑡(𝐸. 𝑣𝑎𝑙)
𝐸−> 𝐸 + 𝑇 𝐸. 𝑣𝑎𝑙−> 𝐸. 𝑣𝑎𝑙 + 𝑇. 𝑣𝑎𝑙
𝐸−> 𝑇 𝐸. 𝑣𝑎𝑙−> 𝑇. 𝑣𝑎𝑙
𝑇−> 𝑇 ∗ 𝐹 𝑇. 𝑣𝑎𝑙−> 𝑇. 𝑣𝑎𝑙 ∗ 𝐹. 𝑣𝑎𝑙
𝑇−> 𝐹 𝑇. 𝑣𝑎𝑙−> 𝐹. 𝑣𝑎𝑙
𝐹−> ( 𝐸 ) 𝐹. 𝑣𝑎𝑙−> ( 𝐸. 𝑣𝑎𝑙 )
𝐹−> 𝑑𝑖𝑔𝑖𝑡𝑜 𝐹. 𝑣𝑎𝑙−> 𝑑𝑖𝑔𝑖𝑡𝑜. 𝑣𝑎𝑙
Figura 2.1|DEFINICIÓN DIRIGIDA PORSINTAXISDEUNA CALCULADORA SENCILLA
6. 3. NOTACIONESPARALAESPECIFICACIÓNDEUN
TRADUCTOR
Existen dos formas de asociar acciones semánticas con reglas de producción.
Las más significativas tenemos:
A. Definición dirigida por sintaxis (DDS):
Consiste enasociarunaacción semánticaa una regladeproducción, perosinindicarcuandose
debe ejecutar dicha acción.
En una DDS se hace lo mismo que en las gramáticas con atributos, pero además se puede
manipularinformaciónexternaalagramática(estamanipulaciónesnecesariaparaimplementar
compiladores reales). De todas formas, no se indicará el orden de ejecución de las acciones
semánticas.
Definidotambiéncomounformalismoparaespecificarlastraduccionesparalasconstrucciones
en función de atributos asociados con sus componentes sintácticos.
Se suele representarenunatablacon doscolumnasytantas fialascomoreglasde lagramática.
En la primeracolumnase pone la reglade lagramática y en la segundalasaccionessemánticas
asociadas a dicha regla.
Ejemplo
REGLASSEMANTICA
𝐿 −> 𝐸 “𝑛”𝑝𝑟𝑖𝑛𝑡(𝐸. 𝑣𝑎𝑙)
𝐸 −> 𝐸1 + 𝑇𝐸. 𝑣𝑎𝑙 = 𝐸1. 𝑣𝑎𝑙 + 𝑇. 𝑣𝑎𝑙
𝐸 −> 𝑇𝐸. 𝑣𝑎𝑙 = 𝑇. 𝑣𝑎𝑙
𝑇 −> 𝑇1 ∗ 𝐹𝑇. 𝑣𝑎𝑙 = 𝑇1. 𝑣𝑎𝑙 ∗ 𝐹. 𝑣𝑎𝑙
𝑇 −> 𝐹𝑇. 𝑣𝑎𝑙 = 𝐹. 𝑣𝑎𝑙
𝐹 −> ( 𝐸). 𝑣𝑎𝑙 = 𝐸. 𝑣𝑎𝑙
𝐹 −> 𝑐𝑡𝑒𝐹. 𝑣𝑎𝑙 = 𝑐𝑡𝑒. 𝑣𝑎𝑙
Ingresando la cadena 3+5*4
Su árbol sintáctico correspondiente sería:
7. Figura 3.1|ARBOL SEMANTICO PARA EL EJEMPLO
En una DDS especifica el valor de los atributos, pero no especifica la forma de evaluación.
Existen 2 tipos o métodos para la evaluación:
Evaluación mediante Grafos:
Es independiente del reconocimiento sintáctico. Durante el proceso de parsing se genera el
grafo de dependencia de atributos.
Posteriormente se computanlos valores de los atributos respetando el orden impuesto por el
grafo de dependencias.
Evaluación durante el Parsing:
La evaluación se produce durante el reconocimiento sintáctico.
B. ESQUEMA DE TRADUCCIÓN (ETDS)
Es una gramática atribuida en la que hay intercalados en el lado derecho de las reglas de
producción, fragmentos de código de lenguaje de programación, que implementan acciones
semánticas.
Un ETDS es un DDS en que se da un orden de ejecución de acciones semánticas. Las acciones
semánticasse situaránaladerechade lossímbolosalosque se refierenyentrellaves.Estaregla
de situarlasaccionessemánticasdespuésde lossímbolosqueutilizandaunordende ejecución.
La traducciónenlas ETDS solopuede realizarse de unasolapasada.Porlotanto, nopermitirála
herencia de atributos desde la derecha hacia la izquierda.
8. Los ETDS se utilizana menudopara convertirun formatode un lenguajeenel formatode otro
lenguaje.
4. TRADUCCIÓNA UNAREPRESENTACIÓNINTERMEDIA
Una estructurade datosque representael programafuentedurante latraducciónse denomina
representaciónintermedia, o IR (por las siglas del término en inglés) para abreviar. A fin de
realizaroptimizacionessobre unprogramay para generarcódigo,esconveniente produciruna
representaciónintermedia más adecuada para estas tareas que la representación del árbol de
análisis sintáctico.
A. ÁRBOL SINTÁCTICO ABSTRACTO
Aunque unárbol sintácticoabstractoesunarepresentaciónadecuadadelcódigofuente,incluso
para lageneraciónde código,nose parecenni remotamenteal códigoobjetivo,enparticularen
su representación de construcciones de flujo de control, donde el código objetivo, como el
códigode máquinaocódigoensamblador,empleansaltosmásque construccionesde altonivel,
como las sentencias if y while. Por lo tanto, un escritorde compiladorespuede deseargenerar
unanuevaformade representaciónintermediadel árbolsintácticoque separezcamásal código
objetivo o reemplace del todo al árbol sintáctico mediante una representación intermedia de
esaclase,yentoncesgenere códigoobjetivode estanuevarepresentación.Unarepresentación
intermediadeestanaturalezaque se parece al códigoobjetivose denominacódigointermedio.
Un árbol abstracto de sintaxis es un árbol de análisis sintáctico de información innecesaria, tal
como lasproduccionesúnicas.Cadano hojarepresentaunoperadorycada hojarepresentaun
operando.
Así 𝐴 + 𝐵 podría tener los siguientes árboles: de análisis sintáctico y abstracto de sintaxis
9. Figura 4.1|ARBOL ABSTRACTOSINTACTICO
B. NOTACIÓN POSFIJA
La notación polaca posfija es una línea de código lineal que es más útil para la generación de
código que para la fase de optimización, puesto que es difícil hacer las clasificacionesde las
transformacionesenellaque se realizandurantelafase deoptimización.Enesencia,lanotación
polaca posfija coloca primero los operandos seguidos por su operador.
De este modo,
𝐴 + 𝐵
Se convierte en
𝐴𝐵 +
Y
𝐴 + 𝐵 ∗ 𝐶
Se transforma
𝐴𝐵𝐶 ∗ +
C. CÓDIGO DES TRES DIRECCIONES
El códigode tres direccionesesunlenguaje intermediousadoporcompiladoresoptimizadores
para ayudar en las transformaciones de mejora de código. La instrucción básica del código de
10. tresdireccionesestádiseñadapararepresentarlaevaluaciónde expresionesaritméticasytiene
la siguiente forma general:
𝑋 = 𝑌 𝑜𝑝 𝑍
Cada instrucciónde códigode tres direccionestiene alosumotres operandosyes típicamente
una combinación de asignación y operador binario por ejemplo 𝑡1 = 𝑡2 + 𝑡3 .
Ya que el códigode tresdireccionesesusadocomounlenguajeintermedioenloscompiladores,
los operando normalmente no contendrán direccionesde memoria o registros concretos, sino
que direccionessimbólicasque seránconvertidasendireccionesrealesdurantelaasignaciónde
registros.
El nombre "códigode tresdirecciones"vienede estaformade instrucción,yaque porlogeneral
cada unode losnombresX,YyZrepresentanunadirecciónde lamemoria.Sinembargo,observe
que el uso de la direcciónde x difiere del usode las direccionesde Y y Z, y que tanto Y como Z
(peronox) puedenrepresentarconstantesovaloresde literales sin direcciones de ejecución.
Obsérvese que no se permite ninguna expresión aritmética compuesta, pues solo hay un
operadorenel ladoderechode unaproposición.Paravercómolassecuenciasde códigode tres
direcciones de esta forma pueden representar el cálculo de una expresión, considere la
expresión aritmética:
2 ∗ 𝑎 + (𝑏 − 3)
Como árbol sintáctico
Figura 4.2| ÁRBOLSINTÁCTICO
El código de tres direcciones correspondiente es:
𝑡 1 = 2 ∗ 𝑎
𝑡 2 = 𝑏 − 3
𝑡 3 = 𝑡1 + 𝑡 2
Esta descomposición de expresiones aritméticas complejas y de preposiciones de flujo del
control anidadashace el códigode tresdireccionesdeseable paralageneracióndecódigoobjeto
11. y para la optimización. El uso de nombres para los valores intermedios calculados por un
programa permite que el código de tres direcciones se reorganice fácilmente.