Вы находитесь на странице: 1из 24

Tema

Anlisis Semntico

9.1 Funcin del analizador semntico. 9.2 Tabla de smbolos 9.2.1 Funcin. 9.2.2 Caractersticas. 9.2.3 Contenido. 9.2.4 Estructura. 9.2.5 Operaciones. 9.3 Anlisis dirigido por sintaxis. 9.4 Gramtica con atributos. 9.4.1 Mtodos de evaluacin de los atributos. 9.4.2 Tipos de gramticas con atributos. 9.4.3 Esquemas de traduccin. 9.5 Comprobacin de tipos. 9.6 Conversin de tipos.

Bibliografa bsica [Aho90] [Trem85] Alfred V. Aho, Ravi Sethi, Jffrey D. Ullman Compiladores. Principios, tcnicas y herramientas. Addison-Wesley Iberoamericana 1990. J. Tremblay, P.G. Sorenson The theory and practice of compiler writing. Mc-Graw-Hill 1985.

TABLA DE SMBOLOS Objetivo. Delimitar el contexto de un conjunto de frases o instrucciones de un lenguaje libre de contexto. Desde el punto del analizador sintctico, lo nico que se necesita identificar es que determinadas palabras (pertenecientes a un COMPONENTE SINTCTICO) deben aparecer precedidas o seguidas por otras palabras.

Utilidad. Simplifican el anlisis sintctico. Ayudan en la comprobaciones SEMNTICAS. Ayudan en la generacin de cdigo.

Contenido de la tabla de smbolos. Esencialmente la informacin que aparece en la tabla de smbolos es de dos tipos: El propio smbolo, y Los atributos necesarios para definir el smbolo a nivel semntico y de generacin de cdigo. Los atributos requeridos para cada smbolo depende a nivel general si: del tipo de gestin de memoria, el lenguaje est, o no, estructurado en bloques, el smbolo es, o no, parmetros de un procedimiento o funcin.
2

CONSTRUCCIN DE LA TABLA DE SMBOLOS. 1. El analizador de lxico deber: Insertar los smbolo detectados en la tabla de smbolos, Crear la tabla de smbolos parcialmente, Sealar la lnea del programa fuente en donde aparecen. 2. El analizador semntico: Aadir los tipos, si procede, a los smbolos que aparecen en la tabla de smbolos. Cuando se hace una implantacin de una nica pasada, entonces los smbolos son insertados y calificados, a nivel semntica y de generacin de cdigo, por el analizador sintctico y en el mismo instante que son detectados por el analizador lxico y que son pasados al analizador sintctico. Operaciones sobre la tabla de smbolos. INSERTAR CONSULTAR MODIFICAR (aadir atributos nuevos) El CUANDO y el CMO se usan estas operaciones dependen del tipo de lenguaje: Lenguajes con DECLARACIONES DE VARIABLES: Explcitas: Declaraciones: slo INSERTAR. Referencia: slo CONSULTAR. Implcitas: CONSULTAR si no est ya incluida. INSERTAR, en caso contrario. Lenguajes con estructura de BLOQUE : CREAR SUBTABLAS.
3

IMPLEMENTACIN DE LA TABLA DE SMBOLOS La distribucin de la informacin de la tabla de smbolos depender de las caractersticas del lenguaje y de las restricciones establecidas para los smbolos. Campo dedicado para el smbolo Formato fijo Apropiado cuando se establece lmite en el nmero de caracteres que forman los smbolos y, adems, sea pequeo. En este caso slo se dispone de un rea fija en la tabla para almacenar el smbolo. Formato variable Se dispone de la tabla de smbolos y de un rea auxiliar en donde se introducen los smbolos de modo consecutivo. En la TS se sustituye el campo dedicado para el nombre del smbolo por un puntero al rea auxiliar y un entero que indica la longitud del mismo.

Inicio Longitud

1 4 ... 5 3 ...

M A T

T R E ...

Campo direccin Lenguajes SIN estructura de Bloque. Se asignan direcciones consecutivas segn el orden en el que aparecen declaradas. Lenguajes CON estructura de Bloque. Para cada bloque se asigna una subtabla, la direccin ser consecutiva para cada bloque Se necesitan dos campos: N Bloque Direccin Bloque

Se introduce este campo en la TS cuando se declara. Se utiliza este atributo en la fase de Generacin de cdigo. Campo Tipo Se introduce cuando se identifica una declaracin explcita o implcita de una variable. Se utiliza para determinar la memoria de almacenamiento y para la comprobacin de tipos. Campo N de dimensiones / Nde parmetros La realiza el analizador semntico y sirve para delimitar el tamao de memoria necesaria para representar el smbolo. (Ejemplo: el tamao o dimensin de un array; si se trata de una funcin o procedimiento, el nmero de argumentos que posee y sus tipos para la reserva de memoria). Campos Lista cruzada de referencia y Puntero de orden Son tiles para el programador del traductor con objeto de facilitar el uso de la TS.

ORGANIZACIN DE LA TABLA DE SMBOLOS a) Lenguajes SIN estructura de Bloque rboles binarios Ordenada LISTA No ordenada Tablas Hash (usando encadenamiento)

b) Lenguajes CON estructura de Bloque Una tabla para cada Bloque con estructura de PILA. Estructura Consta de una PILA + ndice (que apunta al inicio de las variables pertenecientes a cada bloque). El ndice nos muestra el comienzo y final de un bloque. Adems de insertar, consultar y modificar (completar la informacin de un smbolo), cuando se trabaja con bloques, se realizan adems las operaciones siguientes: Set (Marca de Inicio de bloque). Reset (Marca de Fin de bloque).

Ejemplo 1. Dada la secuencia de instrucciones siguientes. Se construye la tabla de smbolos de la siguiente forma:
Block Real x, y; String NAME; M1 : PBLOCK (Integer IND) ; Integer x; CALL M2 (IND+1) ; END M1 ; M2 : PBLOCK (Integer J) ; PBLOCK Array Integer (F(J)); Logical TEST ; END ; END M2 ; CALL M(X/Y) ; END;
8 7 6 5 4 3 2 1 X IND Indice de Bloque M1 NAME Y X 5 1 Bloque 2 Bloque 1 4 3 2 1 M1 NAME Y X 7 6 1 Bloque 4 Bloque 3 Bloque 1 TOP 7 6 5 TEST1 F J M2 Indice de Bloque

Operacin
Set BLK1 Set BLK2 Reset BLK2 Set BLK3 Set BLK4 Reset BLK4 Reset BLK3 Reset BLK1 Fin Compilacin

Smbolos activos
M1, NAME, Y, X X, IND, M1, NAME, Y, X M2, M1, NAME, Y, X J, M2, M1, NAME, Y, X TEST, F, J, M2, M1, NAME, Y,X J, M2, M1, NAME, Y, X M2, M1, NAME, Y, X

Smbolos inactivos

X, IND X, IND X, IND TEST, F, X, IND J, TEST, F, X, IND M2, M1, NAME, Y, X, J, TEST, F, X, IND

GRAMTICA CON ATRIBUTOS Una gramtica con atributos es una gramtica de contexto libre cuyos smbolos pueden tener asociados atributos y las producciones pueden tener asociadas reglas de evaluacin de los atributos. Cada smbolo puede tener asociado un nmero finito de atributos. Cada produccin puede tener asociada un nmero finito de reglas de evaluacin de los atributos. Los valores de los atributos debern estar asociados con un dominio de valores. Sea G = (T, N, P, S) una gramtica de contexto libre y C = {c1,c2,, cn} el conjunto de atributos asociados con los smbolos de la gramtica G. Dada una regla de evaluacin b = f(c1,,ck) asociado con la produccin A P. Atributo Heredado: Si b est asociado con algn smbolo de . Atributo Sintetizado: Si b est asociado con el smbolo no terminal A.

ATRIBUTOS SINTETIZADOS

Evaluacin: Las reglas de evaluacin de los atributos sintetizados se realizan cuando se aplican reducciones en el anlisis sintctico.

Requisitos para la evaluacin: . Las reglas de evaluacin de los atributos deben definirse en funcin de los atributos asociados con los smbolos gramaticales a su derecha. . Realizar un anlisis ascendente.

Gramticas S-Atribuidas: Cuando todos los atributos asociados con los smbolos gramaticales son sintetizados. Ejemplo 2. Se muestra un ejemplo de gramtica S-Atribuida: Deseamos evaluar expresiones a la vez que la analizamos: Sea el conjunto de producciones y acciones siguientes: L E E T T F F E E+T T T*F F (E) digito ACCIONES { print (E1.val) } { E0.val=E1.val + T3.val } { E0.val =T1.val } { T0.val = T1.val * F3.val } { T0.val = F1.val } { F0.val = E2.val } { F0.val = digito }

La evaluacion de la expresin: 3*5+4n

L n

E
E.val=19

E
E.val=15

T
T.val=4

T
T.val=15

F
F.val=4

T
T.val=3

F
F.val=5

digito=4

F
F.val=3

digito=5

digito=3

10

ATRIBUTOS HEREDADOS La evaluacin de un atributo heredado depende de los atributos asociados con los smbolos precedentes en la derivacin. Requisitos: Realizar un anlisis descendente. Dada la gramtica y las reglas de evaluacin siguientes: Producciones D TL T int T real L L , id L id Reglas L2.in = T1.tipo; T0.tipo = entero; T0.tipo = real; L1.in = L0.in; aadetipo(id, L0.in); aadetipo(id, L0.in);

Real id1,id2,id3
D

T T.tipo = real L L.her = real L L.her = real id1 aadetipo(id,real) ,

L L.her = real , id3 aadetipo(id,real)

real

id3 aadetipo(id,real)

11

GRAFOS DE DEPENDENCIA. Cuando aparecen definidos atributos sintetizados y heredados, es necesario establecer un ORDEN DE EVALUACIN DE LOS ATRIBUTOS El grafo de dependencia es un grafo dirigido construido por el algoritmo siguiente: Nodos: Para cada nodo del rbol de anlisis n hacer: Para cada atributo s asociado a Los smbolos del nodo n hacer: Construir un nodo etiquetado con a. Arcos: Para cada regla semntica b=f(e1,...,en) asociada con la produccin del nodo n hacer: Para i=1,..n Hacer: Trazar arcos desde ci a b. Mtodos de Evaluacin de las Reglas Semnticas: 1. rbol de anlisis: para cada entrada se construye el rbol sintctico (Grafos cclicos). 2. Basado en las reglas semnticas: Dependiendo de las reglas semnticas (atributos heredados o sintetizados) se establece el orden de evaluacin. 3. Dirigido por sintaxis: El orden de evaluacin es impuesto por la estrategia de anlisis.

12

EVALUACIN ASCENDENTE Gramticas S-Atribuidas: La estructura de la pila se adecua para que cada smbolo de la gramtica disponga de sus atributos asociados. La evaluacin de los atributos se realiza cuando se REDUCE.

0 5 6 7

... X Y Z ...

... X.x, X.y,...X.z Y.u,...,Y.s Z.a,...,Z.c ...

Gramticas L-Atribuidas: Sea la produccin A X1 X2 ...Xn. Una gramtica es L-atribuida si todos los atributos Heredados asociados con Xj , 1 j n, slo depende: 1. de los atributos asociados con los smbolos X1X2...Xj-1 2. de atributos asociados con A

TODA GRAMTICA L-ATRIBUIDA PUEDE SER EVALUADA MEDIANTE ANLISIS ASCENDENTE.

13

COMPROBACIONES SEMNTICAS Comprobaciones ESTTICAS. Las comprobaciones sintcticas y semnticas. Comprobaciones DINMICAS. Realizadas en tiempo de ejecucin. Comprobaciones SEMNTICAS De TIPO. Verificacin del tipo de los operandos en las expresiones. De FLUJO de CONTROL. Verifica los puntos del programa de salida y entrada del control. De UNICIDAD. Verifica la presencia de smbolos de forma nica. (ejemplo: declarar un smbolo una sla vez). Relacin de NOMBRES. Un mismo nombre puede aparecer ms de una vez.

14

EXPRESIONES DE TIPOS Tipos bsicos (Tipos simples) son expresiones de tipo. Ejemplo: boolean, char, integer, real, ... Una expresin de tipos puede ser nombrada por un nombre. Un nombre de tipos es una expresin de tipos. En una expresin de tipo pueden aparecer VARIABLES DE TIPOS. CONSTRUCTORES DE TIPOS Matrices (Arrays) Array (I, T) : Expresin de tipo que representa: Tipo de una matriz con elementos de tipo T y conjunto de ndices I. En Pascal:
VAR A: array [1..10] of integer;

Le asocia la expresin tipo: array (1..10, integer) a A Producto Sea T1 y T2 expresiones de tipo, entonces T1 T2 (producto cartesiano) es tambin una expresin de tipo. Registro Es como producto pero con nombre. Record (direccin integer) (lexema array(1..15,char))) type file=record direccion : integer ; lexema : array[1..15] of char ; end ;

15

Apuntadores Sea T una expresin de tipo, entonces pointer(T) es una expresin de tipo. Pointer(FILA) : apunta a un objeto tipo FILA
VAR p : ^FILA

Funciones Como una funcin matemtica Sean D y R dos expresiones de tipos entonces: D Ejemplo: char char pointer(integer)
function f(a, b : char) : ^integer;

R, es otra expresin de tipo

REPRESENTACIN DE LAS EXPRESIONES DE TIPOS Mediante grafo dirigido acclico (GDA) Ejemplo: char char pointer(integer) hojas interiores: constructor de expresiones o expresiones de tipos. hojas finales: tipos bsicos. pointer pointer char char integer char integer

16

Representacin de expresiones de tipos por mapa de bit (usado por D.M. Ritchie para el compilador de C) Se parte de los constructores bsicos: Codificacin pointer (T) : Expresin Puntero 01 freturn (T) : Expresin funcin 11 array (T) : Expresin array 10 Tipos bsicos Boolean Char Integer Real Codificacin 0000 0001 0010 0011

Representacin de las expresiones de tipo Expresiones de Tipo char freturn (char) pointer (freturn (char)) array (pointer (freturn (char))) Mapa de Bit 000000 0001 000011 0001 000111 0001 100111 0001

La principal ventaja es que se ahorra espacio: Dos secuencias de bit distintas representan expresiones de tipos distintos. Pero dos secuencias de bit iguales no podemos asegurar que se correspondan con tipos equivalentes.

17

Equivalencia estructural Dos expresiones de tipos son equivalentes estructuralmente si responde a un mismo tipo bsico o est formada a base de aplicar el mismo constructor de tipos sobre expresiones equivalentes estructuralmente o los mismos tipos bsicos. Modo de determinar si dos expresiones de tipos son equivalentes: a) Aplicando GDA. b) Algoritmo de anlisis de los constructores.

Algoritmo de equivalencia estructural function equivest (s, t) : boolean ; begin if s y t son el mismo tipo_bsico then return true ; else if s = array(s2,s2) and t = array(t1,t2) then return equivest (s1,t1) and equivest (s2,t2); else if s = s1 s2 and t = t1 t2 then return equivest (s1,t1) and equivest (s2,t2); else if s = pointer(s1) and t = pointer(t1) then return equivest (s1,t1); else if s = s1 s2 and t1 = t1 t2 then return equivest (s1,t1) and equivest (s2,t2) else return false ; end;

18

Equivalencia de nombre Cuando las expresiones de tipos son nombradas, entonces dos expresiones de tipos son equivalentes de nombre si y solo si ambas expresiones son idnticas. Si aparecen expresiones de tipos nombradas, tambin ha de ser reconsiderado el concepto de equivalencia estructural. Dos expresiones de tipos son equivalentes estructuralmente si sustitudos los nombres de tipos por sus correspondientes expresiones de tipos, resultan dos nuevas expresiones de tipos que son equivalentes estructuralmente. Ejemplo 3. Definicin de registros en C y PASCAL.
/* Lenguaje C */ { Lenguaje PASCAL } type enlace = ^nodo ; nodo = RECORD info : integer ; siguiente : enlace ; END ;

struct nodo { int info ; struct nodo *siguiente ; } ;

La declaracin en C evita los ciclos en los grafos de tipos utilizando la equivalencia estructural para todos los tipos excepto en los registros.
nodo = record nodo = record

X X X X

X X

info

integer

siguiente

pointer

info

integer

siguiente

pointer

nodo

(a)

(b)

PROBLEMA: estudio de la equivalencia en grafos cclicos.


19

ESPECIFICACIN DE UN COMPROBADOR DE TIPOS ELEMENTAL Un comprobador de tipos ha de disponer de: Asignacin de tipos. Comprobador de tipos en las expresiones. Comprobador de tipos en las proposiciones o sentencias. Comprobador de tipos de las funciones. Bsicamente se advierten dos tareas: De asignacin. De evaluacin y comprobacin.

Ejemplo 4. Sea un lenguaje sencillo que obedece a una gramtica con el conjunto de producciones siguientes: P D D T E S a) b) c) d) D;E;S D;D id : T | char | integer | array [num] of T | ^T | T -> T literal | num | id | E mod E | E[E] | E^ | E(E) | id := E | if E then S | while E do S | S ; S

Asignacin de tipos. Comprobacin de tipos en expresiones. Comprobacin de tipos en proposiciones. Comprobacin de tipos en funciones.

20

a) Asignacin de tipos
P D D T T T T T D;E;S D;D id : T char integer ^T1 array[num] of T1 T1 -> T2 { aadetipo(id.entrada, T.tipo); } { T.tipo := char ; } { T.tipo := integer ; } { T.tipo := pointer (T.tipo) ; } { T.tipo := array (1..num.val, T1.tipo) ; } { T.tipo := T1.tipo T2.tipo; }

b) Comprobacin de tipos en las expresiones


E E E E literal num id E1 mod E2 { E.tipo := char ; } { E.tipo := integer ; } { E.tipo := busca (id.entrada) ; } { E.tipo := if E1.tipo=integer and E2.tipo=integer then integer else error_tipo; } {E.tipo := if E2.tipo=integer and E1.tipo=array (s, t) then t else error_tipo; } {E.tipo := if E2.tipo=pointer (t)

E1[E2]

E1^

then t else error_tipo ; }

c) Comprobacin del tipo en proposiciones


21

id := E

{ id.tipo := busca (id.entrada); S.tipo := if id.tipo=E.tipo then vacio else error_tipo; } { S.tipo := if E.tipo=boolean then S1.tipo else error_tipo; }

if E then S1

while E do S1 { S.tipo := if E.tipo=boolean then S1.tipo else error_tipo; } S1 ; S2 { S.tipo := if S1.tipo=vacio and S2.tipo=vacio then vacio else error_tipo; }

d) Comprobacin del tipo en funciones En la fase de declaraciones ha de ser definido el tipo


E E1(E2) { E.tipo := if E2.tipo= s and E1.tipo= s t then t else error_tipo; }

22

Ejemplo 5. Dadas las sentencias vlidas para la gramtica definida en el ejemplo 4.


a : integer ; b : char ; a := b mod 18 ;

Tabla de smbolos a integer b char

El rbol sintctico para las declaraciones es: De igual modo, el rbol sintctico para la asignacin es:

23

TPICOS EN LA COMPROBACIN DE TIPOS Conversin de tipos (Coercin). Implcita: Se realiza automticamente por medio del compilador. Explcita: Se explicita por parte del programador la conversin. Ejemplo 6. A partir de una gramtica que admite tipos real y entero, se muestra la conversin de ambos ante una operacin binaria.
E E E E ConstEntera ConstReal id E1 op E2 { E.tipo := integer ; } { E.tipo := real ; } { E.tipo := busca (id.entrada) ; } { E.tipo := if E1.tipo=integer and E2.tipo=integer then integer else if E1.tipo=integer and E2.tipo=real then real else if E1.tipo=real and E2.tipo=integer then real else if E1.tipo=real and E2.tipo=real then real else error_tipo ; }

Sobrecarga de Funciones y Operadores. +, -, son smbolos sobrecargados ya que su significado depender del contexto. (, ), pueden estar sobrecargados (ADA, FORTRAN), ya que se usan como referencia de elementos de matrices y como funciones. La sobrecarga se resuelve, en algunos casos, en base a los tipos de las expresiones en donde aparecen.
24

Вам также может понравиться