Você está na página 1de 8

Lenguajes y Autmatas II

Anlisis semntico
Introduccin
Adems de controlar que un programa cumpla con las reglas de la gramtica del
lenguaje, hay que comprobar que lo que se quiere hacer tiene sentido. La verificacin
semntica se encarga de que los tipos que intervienen en las expresiones sean
compatibles o que los parmetros reales de una funcin sean coherentes con los
parmetros formales: p.ej. no suele tener mucho sentido el multiplicar una cadena de
caracteres por un entero.

1.1 rbol de Expresiones


Los rboles de expresiones representan el cdigo de nivel del lenguaje en forma de
datos. Los datos se almacenan en una estructura con forma de rbol. Cada nodo del
rbol de expresin representa un elemento de la gramtica, por ejemplo, una llamada al
mtodo o una operacin binaria, como x < y.
rbol de Sintaxis Abstracta es el resultado de la fase de anlisis sintctico o parser.
Recoge toda la informacin sintctica y semntica
Elimina los smbolos que no aportan significado
Los nodos reflejan los datos asociados a cada smbolo
El objetivo de las acciones semnticas es construir este rbol
Ejemplo A=b+c;

Ejercicio Se est compilando el siguiente programa, escrito en un lenguaje de programacin


ficticio, cuyo sintaxis resultar fcil de comprender.
Begin

Lenguajes y Autmatas II
Int a;
A=100;
A=A+A;
Output A
end
GRAMATICA
PROGRAMA->begin declaraciones;sentencias end
DECLARACIONES->DECLARACIONES | DECLARACION
DECLARACION->TIPO IDS
SENTENCIAS->SENTENCIA SENTENCIAS
SENTENCIA->ASIGNACION

1.2 Acciones semnticas de un analizador sintctico


Dependiendo del tipo de sentencias, las acciones semnticas pueden agruparse en:

Sentencias de Declaracin: Completar la seccin de tipos de la Tabla


de Smbolos.
Sentencias ejecutables: Realizar comprobaciones de tipos entre los
operandos implicados.
Funciones y procedimientos: Comprobar el nmero, orden y tipo de
los parmetros actuales en cada
llamada a una funcin o procedimiento.
Identificacin de variables: Comprobar si un identificador ha sido
declarado antes de utilizarlo.
Etiquetas: Comprobar si hay etiquetas repetidas y validacin.
Constantes: Comprobar que no se utilicen en la parte izquierda de una
asignacin.
Conversiones y equivalencias de tipo: Verificacin.
Sobrecarga de operadores y funciones: Detectar y solventar.
Emitir informes de errores semnticos
Construir el rbol de Sintaxis Abstracta

Las acciones semnticas por el mbito de ejecucin se pueden clasificar en acciones


semnticas estticas y acciones semnticas dinmicas.
El Analizador Semntico finaliza la fase de Anlisis del compilador y comienza la fase
de Sntesis, en la cual se comienza a generar el cdigo objeto.
La especificacin de la semntica puede realizarse de dos formas:

Lenguajes y Autmatas II

Lenguaje natural
Especificacin formal: Semntica Operacional, semntica denotacional,
semntica Axiomtica, Gramticas con Atributos.

En funcin del procedimiento utilizado para generar el programa objeto, se distinguen


de los siguientes tipos de compiladores: compiladores de un solo paso y compiladores
de dos o ms pasos.
Tarea: Realizar una tabla de diferencias entre compiladores de un paso y
compiladores de dos o ms pasos.
Compiladores de un solo paso
Integran la generacin de cdigo
con el anlisis semntico
Las rutinas de ensamblador se
entremezclan con el anlisis
semntico
Gramticas con atributos
Las llamadas a las rutinas
semnticas se realizan
directamente desde el analizador
sintctico.

Compiladores de dos o ms pasos


El analizador semntico genera un
cdigo abstracto llamado cdigo
intermedio.
Se utiliza una fase ms llamada
optimizador de cdigo.
Utilizan pilas semnticas.
Impone menos restricciones al
lenguaje fuente.
Requiere leer varias veces un
cdigo fuente para producir un
cdigo intermedio.
El anlisis semntico se hace
independientemente de la
generacin de cdigo.
Las acciones semnticas son por el
mbito de ejecucin.

Las representaciones intermedias facilitan la optimizacin de cdigo. Las


representaciones intermedias pueden ser la notacin sufija (expresiones aritmticas) y
las tuplas o vectores (cuadrplas) para representar las instrucciones que deben ser
ejecutadas.

1.3 Comprobaciones de tipo en expresiones


Un lenguaje con comprobacin fuerte de tipos es capaz de garantizar que los
programas se pueden ejecutar sin errores de tipo, por lo que los errores de tipo se
detectarn siempre en tiempo de compilacin.
Como mnimo, ante un error, un comprobador de tipos debe informar de la naturaleza y
posicin del error y recuperarse para continuar con la comprobacin del resto del
programa a analizar.
Veamos algunas de las operaciones a tener en cuenta en una comprobacin de tipos:

Lenguajes y Autmatas II

Conversin de Tipos: A veces es necesario transformar el tipo de una expresin


para utilizar correctamente un operador o para pasar de forma adecuada un
parmetro a una funcin.
Coercin: Es una conversin de tipos que realiza de forma implcita el propio
compilador. Si es el programador el que realiza la conversin se tratar entonces
de una conversin explcita.
Sobrecarga de operadores: La sobrecarga se resuelve determinando el tipo de
cada una de las expresiones intervinientes en la sobrecarga.
Funciones polimrficas: Son aquellas que trabajan con argumentos cuyo tipo
puede cambiar en distintas llamadas a la funcin.

Tarea: Presentar un ejemplo de cada uno de los puntos anteriores, considerando el


lenguaje Java

1.4. Pila semntica en un analizador sintctico.


El diseo ascendente se refiere a la identificacin de aquellos procesos que
necesitan computarizarse con forme vayan apareciendo, su anlisis como sistema y su
codificacin, o bien, la adquisicin de paquetes de software para satisfacer el problema
inmediato Los problemas de integracin entre los subsistemas son sumamente costosos
y muchos de ellos no se solucionan hasta que la programacin alcanza la fecha lmite
para la integracin total del sistema. Se necesita una memoria auxiliar que nos permita
guardar los datos intermedios para poder hacer la comparacin.
Para implementar un traductor para una definicin con atributos sintetizados con
la ayuda de un generador de analizadores sintcticos LR, se puede construir de tal
manera que evalu los atributos conforme analiza la entrada.
Un analizador sintctico ascendente utiliza una pila para guardar la informacin
acerca de los subrboles que ya han sido analizados. Se pueden utilizar campos
adicionales en la pila del analizador para guardar los valores.
Los valores de los atributos se calculan de acuerdo con las ecuaciones de los
atributos cada vez que se presenta un desplazamiento o una reduccin en la pila de
anlisis sintctico.

Por ejemplo:

1.5. Esquema de traduccin.


Un mtodo para describir el anlisis semntico es la identificacin de atributos, o
propiedades, de entidades del lenguaje que deben calcularse y escribir ecuaciones de atributos o

Lenguajes y Autmatas II
reglas semnticas. Un conjunto de atributos y ecuaciones relacionados con la gramtica se le
denomina gramtica con atributos. Las gramticas con atributos son ms tiles por que
obedecen al principio de traduccin dirigida por sintaxis.
Un atributo es cualquier propiedad de una construccin del lenguaje de programacin.
Ejemplos: el tipo de datos, el valor de una expresin, la ubicacin de la variable en la memoria,
el cdigo objeto de un procedimiento, el nmero de dgitos significativos de un nmero.
Los atributos se pueden establecer antes del proceso de compilacin, adems los atributos solo
se pueden establecer durante la ejecucin del programa.
Ejemplos de atributos:

El tipo de datos de una variable


El valor de una expresin
Ubicacin de una variable en la memoria
Cdigo objeto de un procedimiento
El numero de dgitos significativos en un numero

El proceso de calcular un atributo y asociar el valor calculado se le conoce como fijacin del
atributo. El tiempo que toma el proceso de compilacin/ejecucin cuando se presenta la fijacin
de un atributo se denomina tiempo de fijacin. Si el atributo puede fijarse antes de la ejecucin
se denomina esttico, mientras que los atributos que slo pueden fijarse durante la ejecucin se
denominan dinmico.

Tipo de datos: dinmico


Valores de expresiones: generalmente dinmicos.
Asignacin de variables: esttica o dinmica.
Cdigo objeto de un procedimiento: esttico

Gramticas de atributos
En la semntica dirigida por sintaxis los atributos estn directamente asociados en los smbolos
gramticas del lenguaje (los terminales y no terminales). Si X es un smbolo gramticas, y a es
un atributo asociado a X, entonces X.a es una regla gramatical.
Informalmente, se llamara atributos de un smbolo de la gramatica a toda la informacin
aadida en el rbol de derivacin por el analizador semntico, asociada a los smbolos de los
nodos anotados.
Una gramtica con atributos es una extensin de las gramticas independientes del contexto a
las que se aade un sistema de atributos formado por:

Un conjunto de atributos semnticos.


Los datos globales de la gramtica accesibles desde cualquiera de sus reglas, pero no
asociadas a un objeto en particular.
Un conjunto de acciones semnticas, distribuidas por las reglas de produccin.

Semntica dirigida por sintaxis

Lenguajes y Autmatas II
En la semntica dirigida por sintaxis los atributos estn directamente asociados con los smbolos
gramticas de los lenguajes.
Ejemplo. Considere la siguiente gramtica
numero->numero digito | digito
Numero->0 | 1 | 2 |3 |4 |5 |6 |7 |8 |9
El atributo ms importante de un nmero es el valor.

Entonces el numero contiene precisamente un dgito, y su valor es el valor de ese digito. La


ecuacin de atributo que expresa este hecho es:
Numero.val=digito.val
Regla gramatical
Numero1->numero2digito
Numero->digito
Digito->0
Digito->1
Digito->2
Digito->3
Digito->4

Reglas semnticas
Numero1.val=numero2.val*10+digito.val
Numero.val=digito.val
Digito.val=0
Digito.val=1
Digito.val=2
Digito.val=3
Digito.val=4

Ejemplo: Construir el rbol de anlisis semntico para el nmero 345

Ejercicio. Considere la siguiente gramtica para expresiones aritmticas enteras simples.

Exp->exp+term | exp-term | term


Term->term*factor | factor
Factor->(exp) | numero

Lenguajes y Autmatas II
El atributo principal es el valor.
Regla Gramatical
Exp1->exp2+term
Exp1->exp2-term
Exp->term
Term1->term2*factor
Term->factor
Factor->(exp)
Factor->numero

Reglas Semnticas
Exp1.val=exp2.val+term.val
Exp1.val=exp2.val-term.val
Exp.val=term.val
Term1.val->term2.val*factor.val
Term.val->factor.val
Factor.val=exp.val
Factor.val=numero.val

Ejercicio. Utilice la gramtica anterior para hallar (34-3)*42

1.6. Generacin de la tabla de smbolo y de direcciones.


Se trata sencillamente de una estructura de datos de alto rendimiento que
almacena toda la informacin necesaria sobre los identificadores de usuario. Tiene dos
funciones principales:
Efectuar chequeos semnticos.
Generar cdigo.
Esta estructura permanece en memoria slo en tiempo de compilacin, no de
ejecucin, excepto en aquellos casos en que se compila con opciones de depuracin.
Los intrpretes tambin suelen mantener la tabla de smbolos en memoria durante la
ejecucin, ya que sta se produce simultneamente con la traduccin. La tabla de
smbolos almacena la informacin que en cada momento se necesita sobre las variables
del programa; informacin tal como: nombre, tipo, direccin de localizacin en
memoria, tamao, etc. Una adecuada y eficaz gestin de la tabla de smbolos es muy
importante, ya que su manipulacin consume gran parte del tiempo de compilacin. De
ah que su eficiencia sea crtica.
La tabla de smbolos tambin sirve para guardar informacin referente a los
tipos de datos creados por el usuario, los tipos enumerados y, en general, cualquier
identificador creado por el usuario. En estos casos, el desarrollador puede optar por
mezclar las distintas clases de identificadores en una sola tabla, o bien disponer de
varias tablas, donde cada una de ellas albergar una clase distinta de identificadores:
tabla de variables, tabla de tipos de datos, tabla de funciones de usuario.
Cuando un lenguaje posee rea de declaraciones y rea de sentencias, la
aparicin de un identificador tiene una semntica bien diferente segn el rea en que se
encuentre:
Si aparece en el rea de declaraciones, entonces hay que insertar el identificador
en la tabla de smbolos, junto con la informacin que de l se conozca. Si el
identificador ya se encontraba en la tabla, entonces se ha producido una
redeclaracin y debe emitirse un mensaje de error semntico.
Si aparece en el rea de sentencias, entonces hay que buscar el identificador en
la tabla de smbolos para controlar que el uso que de l se est haciendo sea
coherente con su tipo. Si el identificador no se encuentra en la tabla, entonces es

Lenguajes y Autmatas II
que no ha sido previamente declarado, lo que suele considerarse un error
semntico del que hay que informar al programador.
En estos casos, el analizador lexicogrfico, cuando se encuentra un identificador
desconoce en qu rea lo ha encontrado, por lo que no resulta fcil incluir una accin
lxica que discrimine entre realizar una insercin o una bsqueda; as, deber ser el
analizador sintctico quien haga estas operaciones. As, el atributo del token
identificador suele ser su propio nombre.
Sin embargo, hay unos pocos lenguajes de programacin en los que no es
necesario declarar las variables, bien porque slo existe un nico tipo de datos (como en
nuestro ejemplo de la calculadora donde todo se consideran valores enteros) o bien
porque el propio nombre de la variable sirve para discernir su tipo (en BASIC las
variables que acaban en $ son de tipo cadena de caracteres). En estos casos, el propio
analizador lexicogrfico puede insertar el identificador en la tabla de smbolos la
primera vez que aparezca; antes de insertarlo realiza una operacin de bsqueda por si
ya exista. Y sea cual sea el caso, se obtiene la entrada o ndice de la tabla en la que se
encontraba o se ha incluido; dicho ndice ser el valor que el analizador lxico pasa al
sintctico como atributo de cada identificador.
La tabla de smbolo es el principal atributo heredado de un compilador. Las
principales operaciones de la tabla de smbolos son la insercin, bsqueda y
eliminacin.

1.7. Manejo de errores semnticos.


Los errores semnticos se encuentran en el sentido de la construccin: no tiene sentido
Ejemplo:
Dim A,B
A = Guatemala
B = A*8

Você também pode gostar