Está en la página 1de 9

Universidad Nacional del Santa Curso: Teora de Compiladores

Docente: Ing. Mirko Manrique Ronceros ~ 1 ~


ANLISIS SEMNTICO
El anlisis semntico dota de un significado coherente a lo que hemos hecho en el anlisis
sintctico. El chequeo semntico 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
FUNCIONES PRINCIPALES
Identificar cada tipo de instruccin y sus componentes
Completar la Tabla de Smbolos
Realizar distintas comprobaciones y validaciones:
Comprobaciones de tipos.
Comprobaciones del flujo de control.
Comprobaciones de unicidad.
Comprobaciones de emparejamiento.
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:
Lenguaje natural
Especificacin formal: Semntica Operacional, semntica denotacional, semntica
Axiomtica, Gramticas con Atributos.
ACCIONES SEMNTICAS
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.
Universidad Nacional del Santa Curso: Teora de Compiladores
Docente: Ing. Mirko Manrique Ronceros ~ 2 ~
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.
GRAMTICAS CON ATRIBUTOS
Una Gramtica con Atributos es una generalizacin de las Gramticas Libres de Contexto,
denominada Definicin Dirigida por la Sintaxis:
Cada smbolo gramatical puede tener asociado un conjunto finito de atributos, que
pueden ser de los siguientes tipos:
Sintetizados: su valor se calcula en funcin de los atributos de los nodos hijos.
Heredados: su valor se calcula en funcin de los atributos de los nodos
hermanos y/o del nodo padre.
Cada atributo tomar valores en un dominio.
Cada produccin llevar asociadas un conjunto de reglas semnticas.
Las relaciones de dependencia entre atributos, establecidas por las reglas
semnticas, se representarn mediante el Grafo de Dependencias.
A partir de estas gramticas se llevan a cabo las denominadas Traducciones dirigidas por
sintaxis.
Atributos Sintetizados
En el caso de los smbolos terminales de la gramtica, su atributo no es ms que el
lexema asociado al token reconocido por el analizador lxico.
Una gramtica con atributos se denomina Gramtica S-Atribuida si todos los atributos son
sintetizados. Siempre es posible transformar una Gramtica con Atributos en Gramtica
S-Atribuida.
Universidad Nacional del Santa Curso: Teora de Compiladores
Docente: Ing. Mirko Manrique Ronceros ~ 3 ~
Ejemplo: Analizar la forma sentencial 12+3*6, a partir de la siguiente definicin dirigida
por la sintaxis:
Atributos Heredados
Una gramtica con atributos se denomina Gramtica L-Atribuida si cada atributo que se
evala cumple una de las siguientes condiciones:
Es un atributo sintetizado
Dada una produccin A X
1
X
2
..X
j
..X
n
, el atributo heredado asociado a X
j
depende nicamente de los atributos de X
1
,...,X
j-1
y/o de atributos heredados
asociados al smbolo A.
Grafo de Dependencias
Para calcular el valor de un atributo es necesario calcular en primer lugar los valores de
los atributos de los que depende, para lo cual se deber establecer una dependencia
entre atributos mediante un Grafo de Dependencias.
Ejemplo: Analizar la forma sentencial real id1, id2, id3 a partir de la siguiente definicin
dirigida por la sintaxis:
Ejemplo: Dada la gramtica G = ({L, A}, {a}, {L AL | A, A a}, L), obtener una
gramtica con atributos que al analizar una cadena calcule el nmero de as que la
componen.
Universidad Nacional del Santa Curso: Teora de Compiladores
Docente: Ing. Mirko Manrique Ronceros ~ 4 ~
Ejemplo: Dada la gramtica G = ({L, E, R}, {,, id, [, ]}, {L id | id[E], E R| E, R , R
id}, L), definir un atributo denominado num_dimensiones y las reglas semnticas
asociadas a cada produccin, de forma que al analizar una sentencia obtengamos el
nmero de dimensiones que tiene el array referenciado.
Ejemplo: Dada la gramtica G = ({S, L, B}, {0, 1, .}, {S L.L | L, L LB | B, B 0 |
1}, S), obtener una gramtica con atributos que al analizar un nmero en binario calcule
su equivalente en decimal.
Evaluacin de Atributos con Analizadores Sintcticos Descendentes LL(1)
Las Gramticas L-Atribuidas engloban a la mayora de las gramticas con atributos
basadas en gramticas LL(1).
Se define Esquema de Traduccin como una gramtica con atributos cuyas acciones
semnticas se expresan entre llaves, y se encuentran intercaladas entre los smbolos de
la parte derecha de las producciones asociadas a la gramtica, o bien al final de las
mismas.
Para realizar el Anlisis Sintctico Descendente de atributos con una gramtica LL(1)
ser necesario transformar dicha gramtica a un Esquema de Traduccin en el que se
insertarn las acciones semnticas necesarias, teniendo en cuenta que un valor de un
atributo debe estar calculado antes de poder ser utilizado.
El Analizador es similar, pero ahora trabajar con producciones compuestas de los
smbolos ms las acciones semnticas:
a) Al aplicar una produccin introduciremos en la pila los smbolos y las acciones
semnticas.
b) Cuando en el tope de la pila se encuentre una accin semntica, pasaremos a
ejecutarla, eliminndola a continuacin del tope.
Ejemplo: Dada la gramtica G = {{E, T}, {+, -, (, ), num}, {E E+T | E-T | T, T
(E) | num}, E}:
a) Obtener un Esquema de Traduccin que permita conocer el resultado de una
operacin vlida para dicha gramtica.
b) Aplicar un Anlisis Sintctico Descendente de atributos sobre el Esquema de
Traduccin obtenido para analizar la evaluacin de la expresin 6-3+4.
Universidad Nacional del Santa Curso: Teora de Compiladores
Docente: Ing. Mirko Manrique Ronceros ~ 5 ~
Ejemplo: Dada la gramtica G = {{E, T, R}, {+, -, (, ), num}, {E TR, R +TR | -TR |
, T (E) | num}, E}:
a) Obtener un Esquema de Traduccin que permita conocer el resultado de una
operacin vlida para dicha gramtica.
b) Aplicar un Anlisis Sintctico Descendente de atributos sobre el Esquema de
Traduccin obtenido para analizar la evaluacin de la expresin 6-3+4.
Evaluacin de Atributos con Analizadores Sintcticos Ascendentes LR(1)
En los analizadores LR no se conoce la produccin aplicada hasta que no se ha analizado
la parte derecha, por lo que las acciones semnticas debern aplicarse al final de la
produccin.
En las Gramticas S-Atribuidas las producciones con sus correspondientes acciones
semnticas presentan la siguiente forma:
A A1A2...An {acciones semnticas}
En las Gramticas L-Atribuidas pueden presentarse de esta otra forma:
A {0} A1 {1} A2 {2} ... An {n}
Donde {0}, {1}, ... , {n} son acciones semnticas.
Para poder trabajar con ellas se han de transformar de la siguiente manera:
A S0 A1 S1 A2 S2 An {n} S0 {0}
S1 {1}
.
Sn-1 {n-1}
Donde S0, S1, , Sn son nuevos smbolos no terminales.
Para la realizacin del anlisis, los atributos pueden almacenarse en una pila adicional, o
bien en la misma pila.
Para la gramtica G = ({E, T}, {+, -, (, ), num}, {E E+T | E-T | T, T (E) |
num}, E), podramos realizar una implementacin de las acciones semnticas asociadas
de la siguiente manera, para un analizador LR:
Universidad Nacional del Santa Curso: Teora de Compiladores
Docente: Ing. Mirko Manrique Ronceros ~ 6 ~
Los fragmentos de cdigo se ejecutarn justo antes de que tenga lugar una reduccin por
la regla asociada.
COMPROBACIN DE TIPOS
Aspectos Generales
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:
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.
Universidad Nacional del Santa Curso: Teora de Compiladores
Docente: Ing. Mirko Manrique Ronceros ~ 7 ~
Especificacin de un Comprobador de Tipos Bsico
Bsicamente se debern realizar dos tareas:
1. Asignacin de tipos: En las declaraciones.
2. Evaluacin y comprobacin de tipos: En las expresiones y en las funciones, as
como en las sentencias.
Sea la gramtica:
P D ; S
D D ; D | id: T
T char | entero | real | booleano | array[num] of T | ^T | T T
S id := E | if E then S | while E do S | S;S
E literal | num | id | id[E] | id^ | E op_lgico E | E op_arit E | E mod E | id(E)
Primer paso: Asignacin de tipo
P D ; S
D D ; D
D id : T {Aadir_TS(id.entrada, T.tipo}
T char {T.tipo = char}
T entero {T.tipo = entero}
T real {T.tipo = real}
T booleano {T.tipo = booleano}
T array[num] of T1 {T.tipo = array(num.val, T1.tipo)}
T ^T1 {T.tipo = puntero(T1.tipo)}
T T1 T2 {T.tipo = T1.tipo T2.tipo}
Universidad Nacional del Santa Curso: Teora de Compiladores
Docente: Ing. Mirko Manrique Ronceros ~ 8 ~
Segundo paso: Comprobacin de tipo en expresiones
E literal {E.tipo = char}
E num {E.tipo = entero}
E id {E.tipo = Consultar_TS(id.entrada)}
E id[E1]
{id.tipo = Consultar_TS(id.entrada)}
{E.tipo =si (id.tipo=array(s,t) y E2.tipo=entero)
entonces t
sino error_tipo}
E E1 op_lgico E2
{E.tipo = si (E1.tipo=booleano y E2.tipo=booleano)
entonces booleano
sino error_tipo}
E id^
{id.tipo = Consultar_TS(id.entrada)}
{E.tipo = si (id.tipo = puntero(t))
entonces t
sino error_tipo}
E E1 mod E2
{E.tipo = si (E1.tipo=entero y E2.tipo=entero)
entonces entero
sino error_tipo}
E id (E2)
{id.tipo = Consultar_TS(id.entrada)}
{E.tipo = si id.tipo = s y E1.tipo= s t)
entonces t
sino error_tipo}
Universidad Nacional del Santa Curso: Teora de Compiladores
Docente: Ing. Mirko Manrique Ronceros ~ 9 ~
Tercer paso: Comprobacin de tipo en sentencias
S id:=E {id.tipo = Consultar_TS(id.entrada)}
{S.tipo = si (id.tipo = E.tipo)
entonces vacio
sino error_tipo}
S if E then S1 {S.tipo = si (E.tipo = booleano)
entonces S1.tipo
sino error_tipo}
S while E do S1 {S.tipo = si (E.tipo = booleano)
entonces S1.tipo
sino error_tipo}
S S1; S2 {S.tipo = si (S1.tipo=vacio y S2.tipo=vacio)
entonces vacio
sino error_tipo}

También podría gustarte