Você está na página 1de 9

Universidad Nacional del Santa

Curso: Teora de Compiladores

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 Comprobaciones Comprobaciones Comprobaciones de tipos. del flujo de control. de unicidad. 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.

Docente: Ing. Mirko Manrique Ronceros

~1~

Universidad Nacional del Santa Identificacin de antes de utilizarlo.

Curso: Teora de Compiladores

variables: Comprobar si un identificador ha sido declarado

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.

Docente: Ing. Mirko Manrique Ronceros

~2~

Universidad Nacional del Santa

Curso: Teora de Compiladores

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 X1X2..Xj..Xn, el atributo heredado asociado a Xj depende nicamente de los atributos de X1,...,Xj-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.

Docente: Ing. Mirko Manrique Ronceros

~3~

Universidad Nacional del Santa

Curso: Teora de Compiladores

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 basadas en gramticas LL(1). las gramticas con atributos

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 smbolos ms las acciones semnticas: compuestas de los

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.

Docente: Ing. Mirko Manrique Ronceros

~4~

Universidad Nacional del Santa

Curso: Teora de Compiladores

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 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 S1 {1} . Sn-1 {n-1} {0} correspondientes acciones

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:

Docente: Ing. Mirko Manrique Ronceros

~5~

Universidad Nacional del Santa

Curso: Teora de Compiladores

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.

Docente: Ing. Mirko Manrique Ronceros

~6~

Universidad Nacional del Santa Especificacin de un Comprobador de Tipos Bsico Bsicamente se debern realizar dos tareas: 1. Asignacin de tipos: En las declaraciones.

Curso: Teora de Compiladores

2. Evaluacin y comprobacin de tipos: En las expresiones y en las funciones, as como en las sentencias. Sea la gramtica: PD;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 PD;S DD;D D id : T T char T entero T real T booleano T array[num] of T1 T ^T1 T T1 T2

{Aadir_TS(id.entrada, T.tipo} {T.tipo = char} {T.tipo = entero} {T.tipo = real} {T.tipo = booleano} {T.tipo = array(num.val, T1.tipo)} {T.tipo = puntero(T1.tipo)} {T.tipo = T1.tipo T2.tipo}

Docente: Ing. Mirko Manrique Ronceros

~7~

Universidad Nacional del Santa Segundo paso: Comprobacin de tipo en expresiones E literal E num E id E id[E1] {E.tipo = char} {E.tipo = entero}

Curso: Teora de Compiladores

{E.tipo = Consultar_TS(id.entrada)}

{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}

Docente: Ing. Mirko Manrique Ronceros

~8~

Universidad Nacional del Santa Tercer paso: Comprobacin de tipo en sentencias S id:=E

Curso: Teora de Compiladores

{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.tipo = si (E.tipo = booleano) entonces S1.tipo sino error_tipo} {S.tipo = si (S1.tipo=vacio y S2.tipo=vacio) entonces vacio sino error_tipo}

S while E do S1

S S1; S2

Docente: Ing. Mirko Manrique Ronceros

~9~

Você também pode gostar