Download - INTRODUCCION analisis semantico
-
8/18/2019 INTRODUCCION analisis semantico
1/15
INTRODUCCION
En esta investigación entenderemos que el análisis semántico no es más que la salida deun resultado, estos debes ser correcto ya que este análisis detecta los errores que pueda
contener el programa.
El análisis semántico se trata de determinar el tipo de los resultados intermedios,
comprobar que los argumentos que tiene un operador pertenecen al conjunto de los
operadores posibles, y si son compatibles ente si, comprobará que el significado do lo
que se va leyendo es válido.
Podremos apreciar en cada fase del proceso de compilación se pueden encontrar errores
pero el análisis semántico detecta el error, la fase puede tratar el error, de manera que el
compilador pueda continuar, permitiendo así que se puedan detectar errores posteriores.Un compilador que se detenga cuando encuentre el primer error no es muy eficaz.
ANÁLISIS SEMANTICO 1
-
8/18/2019 INTRODUCCION analisis semantico
2/15
ANÁLISIS SEMANTICO
En el análisis semántico se detectan errores relacionados con la validez del programa. e puede decir que estos errores son de tipo sintáctico!semántico, pero no
pueden ser detectados por el analizador sintáctico, ya que se relacionan con
interdependencias entre las diferentes partes de un programa que no son reflejadas en un
análisis gramatical. El analizador semántico recibe la información resultado del análisis
sintáctico que puede ser un árbol jerárquico con la información relativa a la
organización de los to"ens en la instrucción que se está analizando.
#urante el análisis semántico de un lenguaje de fuerte c$equeo de tipos el árbol
sintáctico debe ser modificado para reflejar el análisis de los tipos de los datos. %ote que
$aciendo un c$equeo de tipos la constante &, al ser una constante entera debe ser
convertida a real para poder ser operada y las demás variables no tienen dificultad
alguna para ser utilizadas al ser todas reales.
El análisis semántico se trata de determinar el tipo de los resultados intermedios,
comprobar que los argumentos que tiene un operador pertenecen al conjunto de los
operadores posibles, y si son compatibles ente si, etc. En definitiva, comprobará que el
significado do lo que se va leyendo es válido.
El análisis semántico se realiza posteriormente al sintáctico y muc$o más difícil de
formalizar que 'ste.
(a salida )teórica* de la fase de análisis semántico sería un árbol semántico.
1.1 ARBOLES DE EXPRESIONES
(os árboles de e+presiones representan el código de nivel del lenguaje en forma de
datos. (os datos se almacenan en una estructura con forma de árbol. ada nodo del
árbol de e+presión representa una e+presión, por ejemplo, una llamada al m'todo o una
operación binaria, como + - y.
Un árbol de e+presión sirve para evaluar e+presiones del tipo /a 0 b12c3d.
Para que un árbol represente una e+presión se deben tomar en cuenta 4 características
muy importantes
ANÁLISIS SEMANTICO 2
-
8/18/2019 INTRODUCCION analisis semantico
3/15
• ualquier $oja está etiquetada sólo con un operando.
• ualquier nodo interior n está etiquetado por un operador.
5l introducir la e+presión debemos de tomar en cuenta las siguientes características
• (a raíz siempre debe ser un operador.
• (as $ojas siempre deben ser operandos.
• (os nodos deben estar etiquetados por operadores.
• i un operador tiene mayor prioridad que la raíz se coloca como $ijo.
• i un operador tiene igual o menor prioridad que un nodo se coloca como padre.
• Un nodo puede contener como $ijo otro subárbol que contiene una peque6a e+presión.
En los árboles de e+presión, la sucesión del preorden de etiquetas nos da lo que se
conoce como la forma prefijo de una e+presión
5nálogamente, la sucesión postorden de las etiquetas de un árbol e+presión nos da lo
que se conoce como la representación postfijo de una e+presión
7inalmente, el inorden de una e+presión en un árbol de e+presión nos da la e+presión
infijo en sí misma, pero sin par'ntesis
onstrucción de un árbol de e+presión
5lgoritmo
• 8ientras carácter diferente de nulo
• (eer carácter de la lista
• i es par'ntesis pasar al siguiente carácter
• rear un nodo nuevo que contenga ese carácter 9perando
ANÁLISIS SEMANTICO 3
-
8/18/2019 INTRODUCCION analisis semantico
4/15
• i el árbol está vacío $acer raíz a nuevo, si no recorrer el árbol por la derec$a $asta
llegar a un nodo con $ojas, si la $oja izquierda, no está etiquetada colocar operando, si
no colocarlo en la $oja derec$a.
9perador
• i la raíz es un operando, insertar nuevo en ese nodo, y convertir el operando en el
$ijo izquierdo, si no si $ay un par'ntesis abierto insertar nuevo en la :ltima $oja derec$a
y colocar operando como $ijo izquierdo.
• i el carácter anterior es par'ntesis izquierdo si el siguiente carácter es par'ntesis
derec$o si solo $ay un operador en el árbol nuevo se convierte en raíz, si no se inserta
en el :ltimo nodo derec$o, y el nodo se convierte en $ijo izquierdo.
• i no se cumple ninguna de las condiciones anteriores si la raíz es de igual prioridad o
menor prioridad convertir la raíz en el $ijo izq. de nuevo si no la prioridad del nodo raíz
es mayor al de nuevo insertar nuevo como $ijo derec$o y colocar el nodo reemplazado
como $ijo izquierdo.
1.2 ACCIONES SEMÁNTICAS DE UN ANALIZADOR SINTÁCTICO
#ependiendo del tipo de sentencias, las acciones semánticas pueden agruparse en
• entencias de #eclaración completar la sección de tipos de la ;abla de
ímbolos.• entencias )ejecutables* realizar comprobaciones de tipos entre los operandos
implicados.
• 7unciones y procedimientos comprobar el n:mero, orden y tipo de los
parámetros actuales en cada llamada a una función o procedimiento.
•
-
8/18/2019 INTRODUCCION analisis semantico
5/15
(a verificación de los tipos de datos se $ace asignando el valor de tipo de cada una de
los componentes l'+icos. Estos valores se comparan para verificar que los tipos de datos
coincidan y sean congruentes, de lo contrario no se pueden realizar los cálculos.
#efinición de un analizador sintáctico es la fase del analizador que se encarga dec$equear el te+to de entrada en base a una gramática dada. = en caso de que el
programa de entrada sea válido, suministra el árbol sintáctico que lo reconoce.
En teoría, se supone que la salida del analizador sintáctico es alguna representación del
árbol sintáctico que reconoce la secuencia de ;o"en suministrada por el analizador
l'+ico.
En la práctica, el analizador sintáctico tambi'n $ace
• 5cceder a la tabla de símbolos /para $acer parte del trabajo del analizador semántico1.
• $equeo de tipos /del analizador semántico1.
• >enerar código intermedio.
• >enerar errores cuando se producen.
• En definitiva, realiza casi todas las operaciones de la compilación. Este m'todo de
trabajo da lugar a los m'todos de compilación dirigidos por sinta+is.
8anejo de errores sintácticos
(os errores sintácticos son dados por una e+presión aritm'tica o par'ntesis no
equilibrados.
El manejo de errores de sinta+is es el más complicado desde el punto de vista de la
creación de compiladores. %os interesa que cuando el compilador encuentre un error, se
ANÁLISIS SEMANTICO 5
-
8/18/2019 INTRODUCCION analisis semantico
6/15
recupere y siga buscando errores. Por lo tanto el manejador de errores de un analizador
sintáctico tiene como objetivos
• ramática > /%, ;, P, 1
% A %o terminales.
; A ;erminales.
P A ?eglas de Producción.
A 5+ioma
-
8/18/2019 INTRODUCCION analisis semantico
7/15
tipo de comprobaciones son beneficiosas puesto que confieren seguridad a la ejecución
del programa.
Características
!#iferente de la dinámica en runtime.
!Ejemplo comprobación de tipos, flujo de control, unicidad.
• omprobaciones dinámicas (as comprobaciones dinámicas son aquellas que no se
realizan durante la fase de compilación y se delegan al momento de la ejecución del
programa. Ello requiere generar código ejecutable específicamente dise6ado para
realizar tales comprobaciones. (os lenguajes con una carga e+cesiva de comprobaciones
dinámicas generan programas más largos, lentos e inseguros en ejecución.
!eri"icaci#$ %e ti&'s
omprueba la compatibilidad de tipos de todas las e+presiones del código fuente
recuperando la información durante la gestión de declaraciones. 5demás se asegura de
que no e+iste en el programa ninguna referencia a ning:n símbolo no declarado.
Bay situaciones en las cuales se tiene un valor de un tipo dado y se desea almacenar ese
valor en una variable de un tipo diferente.
En algunos tipos es posible almacenar simplemente el valor sin una conversión de tiposC
lo que se denomina conversión automática.
5 la conversión de tipos se le llama coerción o casting.I$"ere$cia %e ti&'s
En lenguajes sin tipificación de variables o con sobrecarga se aplican tareas de
inferencia de tipos en el nivel gramatical de las e+presiones para resolver el tipo de
datos de la e+presión resultante en función del conte+to de evaluación.
Esto sólo es posible en alg:n lenguaje de programación, si el compilador reconoce que
la variable destino tiene la suficiente precisión para contener el valor origen. En Dava se
puede almacenar un valor byte en una variable int, dado que este tipo de datos es de
mayor precisión que el primero.
5 esto se le llama ensanc$amiento o promoción, dado que el tipo más peque6o se
ensanc$a o promociona al tipo compatible más grande. i por el contrario, se desea
asignar un valor de variable int a una variable byte se necesita realizar una conversión
de tipos e+plícita.
En algunos casos se puede realizar la conversión pero se pueden perder datos, como por
ejemplo al pasar un valor flotante a un entero.
5 esto se le llama estrec$amiento, dado que se estrec$a e+plícitamente el valor para que
quepa en el destino.
ANÁLISIS SEMANTICO 7
-
8/18/2019 INTRODUCCION analisis semantico
8/15
(a conversión de un tipo se realiza poniendo delante un nombre de tipo entre par'ntesis,
por ejemplo, /tipo1 valor.
Ejemplos de coerción byte aC int bC aA/byte1 bC
C'(&r')aci#$ %e Ti&'s
(a comprobación ayuda a evitar la mayoría de los errores de programación. Ejemplos
de comprobación de tipos
Para saber si el operador aplicado a los operadores es correcto.
E+isten dos tipos de comprobación estática y dinámica.
Un compilador debe informar de un error si se aplica un operador a un operando
incompatible, por ejemplo, si se suman una variable tipo matriz y una variable de
función.
4. omprobaciones del flujo de control.
(as proposiciones que $acen que el flujo del control abandone una construcción deben
tener alg:n lugar a dónde transferir el flujo de control Por ejemplo, una proposición
brea" en $ace que el control abandone la proposición que la engloba, $ile, for o
sitc$ más cercana si dic$a proposición engloba dora no e+iste, ocurre un error.
F. omprobación de unicidad definir un objeto una sola vez.
G. omprobaciones relacionadas con nombres. En ocasiones, el mismo nombre debe
aparecer dos o más veces en un mismo bloque de instrucciones, el compilador debecomprobar que se utilice el mismo nombre en ambos sitios.
omprobación estática #iferente de la dinámica /en runtime1 Ejemplos
omprobación de tipos
-
8/18/2019 INTRODUCCION analisis semantico
9/15
(as pilas se utilizan en muc$as aplicaciones que utilizamos con frecuencia.
(as pilas y colas son estructuras de datos que se utilizan generalmente para simplificar
ciertas operaciones de programación. Estas estructuras pueden implementarse mediante
arrays o listas enlazadas.
Un analizador sintáctico es un autómata de pila que reconoce la estructura de una
cadena de componentes l'+icos.
En general, el analizador sintáctico inicializa el compilador y para cada símbolo de
entrada llama al analizador morfológico y proporciona el siguiente símbolo de entrada.
5l decir pila semántica no se refiere a que $ay varios tipos de pila, $ace referencia a que
se debe programar :nica y e+clusivamente en un solo lenguaje, es decir, no podemos
mezclar código de 00 con Hisual Iasic.
Hentajas
• (os problemas de integración entre los subsistemas son sumamente costosos y
muc$os de ellos no se solucionan $asta que la programación alcanza la fec$a límite para
la integración total del sistema.
• e necesita una memoria au+iliar que nos permita guardar los datos para poder $acer
la comparación.
9bjetivo teórico
Es construir un árbol de análisis sintáctico, este raramente se construye como tal, sinoque las rutinas semánticas integradas van generando el árbol de inta+is abstracta. e
especifica mediante una gramática libre de conte+to.
El análisis semántico detecta la validez semántica de las sentencias aceptadas por el
analizador sintáctico. El analizador semántico suele trabajar simultáneamente al
analizador sintáctico y en estrec$a cooperación. e entiende por semántica como el
conjunto de reglas que especifican el significado de cualquier sentencia sintácticamente
correcta y escrita en un determinado lenguaje.
(as rutinas semánticas deben realizar la evaluación de los atributos de las gramáticas
siguiendo las reglas semánticas asociadas a cada producción de la gramática.
El análisis sintáctico es la fase en la que se trata de determinar el tipo de los resultados
intermedios, comprobar que los argumentos que tiene un operador pertenecen al
conjunto de los operadores posibles, y si son compatibles entre sí, etc.
En definitiva, comprobará que el significado de la que se va leyendo es válido. (a salida
teórica de la fase de análisis semántico sería un árbol semántico. onsiste en un árbol
sintáctico en el que cada una de sus ramas $a adquirido el significado que debe tener.
e compone de un conjunto de rutinas independientes, llamadas por los analizadores
morfológico y sintáctico. El análisis semántico utiliza como entrada el árbol sintáctico
ANÁLISIS SEMANTICO 9
-
8/18/2019 INTRODUCCION analisis semantico
10/15
detectado por el análisis sintáctico para comprobar restricciones de tipo y otras
limitaciones semánticas y preparar la generación de código.
(as rutinas semánticas suelen $acer uso de una pila que contiene la información
semántica asociada a los operadores en forma de registros semánticos.
?eglas semánticas
on el conjunto de normas y especificaciones que definen al lenguaje de programación
y están dadas por la sinta+is del lenguaje, las reglas semánticas asignan un significado
lógico a ciertas e+presiones definidas en la sinta+is del lenguaje.
(a evaluación de las reglas semánticas define los valores de los atributos en los nodos
del árbol de análisis sintáctico para la cadena de entrada. Una regla semántica tambi'n
puede tener efectos colaterales, por ejemplo, imprimir un valor o actualizar una variable
global.
ompatibilidad de tipos
#urante la fase de análisis semántico, el compilador debe verificar que los tipos y
valores asociados a los objetos de un programa se utilizan de acuerdo con la
especificación del lenguaje.
5demás debe detectar conversiones implícitas de tipos para efectuarlas o insertar el
código apropiado para efectuarlas así como almacenar información relativa a los tipos
de los objetos y aplicar las reglas de verificación de tipos.
5nalizadores descendentes
Parten del a+ioma inicial de la gramática, se va descendiendo utilizando las
derivaciones izquierdas, $asta llegar a construir la cadena analizada. e va construyendo
el árbol desde sus nodos terminales. Es decir, se construye desde los símbolos de cadena
$asta llegar al a+ioma de la gramática.
Iottom up
Es un principio de muc$os a6os del estilo de programación que los elementos
funcionales de un programa no deben ser demasiado grandes. i un cierto componentede un programa crece más allá de la etapa donde está fácilmente comprensible, se
convierte en una masa de la complejidad que encubre errores tan fácilmente como una
ciudad grande encubre a fugitivos.
;op!don
Este m'todo consiste en dividir los problemas en subproblemas más sencillos para
conseguir una solución más rápida. El dise6o descendente es un m'todo para resolver el
problema que posteriormente se traducirá a un lenguaje compresible por la
computadora.
ANÁLISIS SEMANTICO 1
0
-
8/18/2019 INTRODUCCION analisis semantico
11/15
Un parser ascendente utiliza durante el análisis una pila. En esta va guardando datos que
le permiten ir $aciendo las operaciones de reducción que necesita. Para incorporar
acciones semánticas como lo es construir el árbol sintáctico, es necesario incorporar a la
pila del parser otra columna que guarde los atributos de los símbolos que se vananalizando. Estos atributos estarían ligados a la correspondiente producción en la tabla
de parsing.
(a pila juega un papel fundamental en el desarrollo de cualquier analizador semántico.
#entro de cada elemento de la pila se guardan los valores que pueden tener una
e+presión.
1.+ ES,UEMA DE TRADUCCI-N
Un esquema de traducción es una gramática independiente de conte+to en la que se
asocian atributos con los símbolos gramaticales y se insertan acciones semánticas
encerradas entre llaves J K dentro de los lados derec$os de las producciones. (os
esquemas de traducción pueden tener tantos atributos sintetizados como $eredados.
uando se dise6a un esquema de traducción, se deben respetar algunas limitaciones
para asegurarse de que el valor de un atributo est' disponible cuando una acción se
refiera a 'l. Estas limitaciones, motivadas por las definiciones con atributos por la
izquierda, garantizan que las acciones no $agan referencia a un atributo que a:n no $aya
sido calculado. El ejemplo más sencillo ocurre cuando sólo se necesitan atributos
sintetizados, en este caso, se puede construir el esquema de traducción creando una
acción que conste de una asignación para cada regla semántica y colocando esta acción
al final del lado derec$o de la producción asociada.
;raducción descendente
e trabaja con esquema de traducción en lugar de $acerlo con definiciones dirigidas por
sinta+is, así que se puede ser e+plícito en cuanto al orden en que tienen que lugar las
acciones y las evaluaciones de los atributos.
Eliminación de la recursividad izquierda de un esquema de traducción
omo la mayoría de los operadores aritm'ticos son asociativos por la izquierda, es
natural utilizar gramáticas recursivas por la izquierda para las e+presiones. (a
transformación se aplica a esquemas de traducción con atributos sintetizados.
Para el análisis sintáctico descendente, se supone que una acción se ejecuta en el mismo
momento en que se e+pandiría un símbolo en la misma posición.
Un atributo $eredado de un símbolo debe ser calculado por una acción que aparezca
antes que el símbolo, y un atributo sintetizado del no terminal de la izquierda se debe
calcular despu's de que $ayan sido calculados todos los atributos de los que depende.
Un atributo $eredado de un símbolo debe ser calculado por una acción que aparezca
antes que el símbolo, y un atributo sintetizado del no terminal de la izquierda se debe
calcular despu's de que $ayan sido calculados todos los atributos de los que depende.
ANÁLISIS SEMANTICO 1
1
-
8/18/2019 INTRODUCCION analisis semantico
12/15
(os fragmentos de código así insertados se denominan acciones semánticas. #ic$os
fragmentos act:an, calculan y modifican los atributos asociados con los nodos del árbol
sintáctico. El orden en que se eval:an los fragmentos es el de un recorrido primero!
profundo del árbol de análisis sintáctico.9bs'rvese que, en general, para poder aplicar un esquema de traducción $ay que
construir el árbol sintáctico y despu's aplicar las acciones empotradas en las reglas en el
orden de recorrido primero!profundo. Por supuesto, si la gramática es ambigua una frase
podría tener dos árboles y la ejecución de las acciones para ellos podría dar lugar a
diferentes resultados. i se quiere evitar la multiplicidad de resultados /interpretaciones
semánticas1 es necesario precisar de qu' árbol sintáctico concreto se está $ablando.
1. /ENERACI-N DE LA TABLA DE S0MBOLO DE DIRECCIONES
(as tablas de símbolos /tambi'n llamadas tablas de identificadores y tablas de
nombres1, realizan dos importantes funciones en el proceso de traducción verificar que
la semántica sea correcta y ayudar en la generación apropiada de código. 5mbas
funciones se realizan insertando o recuperando desde la tabla de símbolos los atributos
de las variables usadas en el programa fuente. Estos atributos, tales como el nombre,
tipo, dirección de almacenamiento y dimensión de una variable, usualmente se
encuentran e+plícitamente en las declaraciones o más implícitamente a trav's del
conte+to en que aparecen los nombres de variables en el programa.
Una de las estructuras de datos que se encuentran relacionadas con las fases del proceso
de compilación es la tabla de símbolos, la cual tiene como propósito registrar
información que se comparte entre varias etapas y que permite administrar los recursosasociados a las entidades que manipulará el programa.
(a tabla de símbolos tiene típicamente la siguiente estructura Una tabla de símbolos
puede conceptualizarse como una serie de renglones, cada uno de los cuales contiene
una lista de valores de atributos que son asociados con una variable en particular. (as
clases de los atributos que aparecen en una tabla de símbolos dependen en alg:n grado
de la naturaleza del lenguaje de programación para el cual se escribe el compilador.
Por ejemplo, un lenguaje puede ser sin tipos, y por lo tanto el atributo tipo no necesita
aparecer en la tabla. imilarmente, la organización de la tabla de símbolos variará
dependiendo de las limitaciones de memoria y tiempo de acceso.
1. MANEO DE ERRORES SEMÁNTICOS
ANÁLISIS SEMANTICO 1
2
-
8/18/2019 INTRODUCCION analisis semantico
13/15
Es una de las misiones más importantes de un compilador, aunque, al mismo tiempo, es
lo que más dificulta su realización.
5 veces unos errores ocultan otros. 5 veces un error provoca una avalanc$a de muc$os
errores que se solucionan con el primero.
Es conveniente un buen manejo de errores, y que el compilador detecte todos los errores
que tiene el programa y no se pare en el primero que encuentre. Bay, pues, dos criterios
a seguir a la $ora de manejar errores
• Pararse al detectar el primer error.
• #etectar todos los errores de una pasada.
El análisis semántico es posterior al sintáctico y muc$o más difícil de formalizar que
'ste. e trata de determinar el tipo de los resultados intermedios, comprobar que losargumentos que tiene un operador pertenecen al conjunto de los operadores posibles, y
si son compatibles entre sí, etc. En definitiva, comprobará que el significado de lo que
se va leyendo es válido.
(a salida LteóricaL de la fase de análisis semántico sería un árbol semántico. onsiste en
un árbol sintáctico en el que cada una de sus ramas $a adquirido el significado que debe
tener. En el caso de los operadores polimórficos /un :nico símbolo con varios
significados1, el análisis semántico determina cuál es el aplicable.
Err'res 456ic's
(os errores l'+icos se detectan cuando el analizador l'+ico intenta reconocer
componentes l'+icos en el código fuente.
Err'res si$t7ctic's
Un error de sinta+is se detecta cuando el analizador sintáctico espera un símbolo que no
corresponde al que se acaba de leer. (os analizadores sintácticos (( y (? tienen la
ventaja de que pueden detectar errores sintácticos lo más pronto posible, es decir, se
genera un mensaje de error en cuanto el símbolo analizado no sigue la secuencia de los
símbolos analizados $asta ese momento.
Err'r se(7$tic'(os errores semánticos corresponden a la semántica del lenguaje de programación, la
cual normalmente no está descrita por la gramática. (os errores semánticos más
comunes son la omisión de declaraciones.
Err'res L#8ic's
(os comete el programador
Ejemplo una llamada infinitamente recursiva.
ANÁLISIS SEMANTICO 1
3
-
8/18/2019 INTRODUCCION analisis semantico
14/15
RESUMEN
omo bien pudimos ver que el analizador semántico se compone de un conjunto de
rutinas independientes, llamadas por los analizadores morfológico y sintáctico.
El análisis semántico utiliza como entrada el árbol sintáctico detectado por el análisis
sintáctico para comprobar restricciones de tipo y otras limitaciones semánticas y
preparar 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 dic$as rutinas las que llaman al
generador de código. El instrumento más utilizado para conseguirlo es la gramática de
atributos.
En ella se utiliza la estructura jerárquica determinada por la fase de análisis sintáctico
para identificar los operadores y operandos de e+presiones y proposiciones.
En compiladores de dos o más pasos, el análisis semántico se realiza
independientemente de la generación de código, pasándose información a trav's de un
arc$ivo intermedio, que normalmente contiene información sobre el árbol sintáctico en
forma linealizada para facilitar su manejo y $acer posible su almacenamiento en
memoria au+iliar.
ANÁLISIS SEMANTICO 1
4
-
8/18/2019 INTRODUCCION analisis semantico
15/15
BIBLIOGRAFIA:
$ttp33.slides$are.net3pepgonzalez3analisis!semantico
$ttp33.ecured.cu3inde+.p$p3;eorMFM5#aNdeNcompiladores
$ttp33itpn.m+3recursosisc3&semestre3leguajesyautomatas43UnidadM4O