Está en la página 1de 20

19/09/2013

UNIDAD I.- ANALISIS SEMANTICO

1.1.- Arboles de expresiones.


1.2.- Acciones semnticas de un analizador sintctico.
1.3.- Comprobaciones de tipos en expresiones .
1.4.- Pila semntica en un analizador sintctico.
1.5.- Esquema de traduccin.
1.6.- Generacin de la tabla de smbolo y de direcciones.
1.7.- Manejo de errores semnticos.

MATERIA: LENGUAJES Y
AUTMATAS II
Dra. Miriam Martnez Arroyo

Introduccin

El lenguaje es un vehculo por el cual se transmiten instrucciones a un


procesador para que las ejecute y produzca ciertos resultados.
Es tarea del compilador extraer el contenido semntico incluido en las
sentencias del programa.

INTRODUCCIN

El compilador hasta ahora


Anlisis lxico
Detecta entradas de tokens legales

Anlisis Sintctico
Detecta entradas con rboles mal formados.

Anlisis Semntico
Detecta todos los errores restantes

Ciertos aspectos relativos a la correccin de un programa no se pueden


expresar claramente mediante el lenguaje de programacin.
Es necesario dotar al compilador de rutinas auxiliares para captar todo lo
que no se ha expresado mediante la sintaxis del lenguaje.

Introduccin

Semntica: conjunto de reglas que espe significado de cualquier


sentencia sintcticamente correcta y escrita en un determinado
lenguaje.
El anlisis semntico, a diferencia de otras no se realiza claramente
diferenciado del resto de las tareas del compilador.
Fase en la que se obtiene informacin necesaria para la compilacin, tras
conocer la estructura sintctica del programa.
Completa las fases de anlisis lxico y sintctico incorporando comprobaciones
que no pueden asimilarse al mero reconocimiento de una cadena dentro de un
lenguaje

19/09/2013

Objetivo del anlisis semntico

Objetivo del anlisis semntico

Algunas de estas comprobaciones son:


La semntica del lenguaje forma parte de la especificacin del
mismo. Normalmente la semntica de un lenguaje se describe de
manera informal.

Para realizar el anlisis semntico se utilizan gramticas de


atributos, que bsicamente, son gramticas independientes del
contexto en las que los smbolos tienen asignados atributos o valores
semnticos.

El objetivo del anlisis semntico es comprobar si la semntica del


programa que se est compilando cumple las especificaciones de la
semntica del lenguaje fuente.

Por qu necesitamos el anlisis semntico

Hay dos tipos de atributos:


sintetizados: corresponden al no terminal de la parte izquierda de una regla. Se
calculan a partir de los atributos de los smbolos de la parte derecha de la
regla.
heredados: corresponden a los smbolos de la parte derecha de la regla. Se
construyen a partir de los atributos de los smbolos de ambas partes de la regla.

10

Verificaciones de varias clases, tpicamente:

El analizador sintctico no puede detectar todos los errores.


Algunos constructores del lenguaje no son libres de contexto

Que todos los identificadores estn declarados.


Los tipos de las expresiones y la compatibilidad de las
asignaciones.
Invocacin de mtodos compatibles con las declaraciones
etc
Los requerimientos dependes del lenguaje.

Ejemplo: declaracin de identificadores y su uso.


No puedes utilizar una GLC para describir que alguna palabra
particulares aparezca dos veces en una cadena separada por un texto
en medio.
Una versin abstracta del problema es:
{wcw | w (a | b)* }
declaracin

Qu hace el anlisis semntico?

uso

Se asocia informacin a las construcciones del lenguaje de programacin


proporcionando atributos a los smbolos de la gramtica.
Ejemplo:
el valor de una expresin,
el tipo de una variable,
su mbito,
un trozo de cdigo,
el nmero de argumentos de una funcin,
etc.
Los valores de los atributos se calculan mediante reglas semnticas
asociadas a las producciones gramaticales.

El anlisis semntico incluye:

11

La construccin de la Tabla de Smbolos para llevar un seguimiento del


significado de los identificadores en el programa:

12

variables,
funciones,
tipos,
parmetros y
mtodos de paso de parmetros en funciones,
Etc.

Realizar la comprobacin e inferencia de tipos en expresiones y


sentencias. Por ejemplo:

que ambos lados de una asignacin tengan tipos adecuados,


que no se declaren variables con el mismo nombre,
que los parmetros de llamada a una funcin tengan tipos adecuados,
nmero de parmetros correcto,
Etc.

19/09/2013

14

1.1.-ARBOL DE EXPRESIONES

1.1.- Arboles de expresiones.

13

Las expresiones regulares que se pueden representar a travs de los


smbolos contenidos en un alfabeto, tambin se pueden representar
a travs de rboles, que se denominan rboles de expresiones.
La informacin contenida en los rboles de expresio-nes tienen las
siguientes caractersticas.
Se almacena en forma de estructura jerrquica, porque los
componentes estn en diferentes niveles.

La informacin se almacena en forma Dinmica porque su


forma, tamao y contenido pueden variar durante la
ejecucin.

15

Propiedades de los rboles

16

Los rboles de expresiones estn compuestos por los


siguientes elementos:

Los datos son almacenados de forma Organizada porque


importa la forma en que est dispuesto el contenido.

Token.- es una Unidad mnima de informacin entendible por


un compilador. Puede ser un ope-rando o un operador.

La consulta de los datos se hace de manera rpida y


eficiente obteniendo mejores resultados.

Operandos.- Los operandos pueden ser las hojas de los


nodos.
Raz.- La raz de un rbol puede ser cuaquier operador
aritmtico.

Reglas para un rbol

17

La reglas para representar una expresin mediante un rbol


son las siguientes:
1.- Cada hoja est etiquetada con un operando y solo consta de
ese operando.

rboles de expresin

18

Representan un orden de ejecucin

para la expresin siguiente:

2.- Cada nodo interior n est etiquetado con un solo


operador.

(A* B) + C * D + E

*
C

3.- Las hojas estn representadas por los operandos y los nodos
por la raz de cada rbol.

19/09/2013

Otro ejemplo de rbol sintctico para una expresin


Aritmtica:

19

20

21

22

23

24

(7 + 12) * (-9) -171

*
+

12

Ejemplo:
x=(x+y)*(a-b)

19/09/2013

25

26

27

28

29

30

19/09/2013

31

32

http://www.esdebian.org/wiki/interpretprete-funciones-mediante-arbol-binario-expresiones

33

34

35

36

19/09/2013

37

38

1.2. Acciones Semnticas de un Analizador


Sintctico
Dependiendo del tipo de sentencias,
semnticas pueden agruparse en:

1.2. Acciones Semnticas de un Analizador


Sintctico

39

las

40

acciones

Sentencias de Declaracin: Se utilizan para completar


la seccin de tipos de la Tabla de Smbolos.
Sentencias ejecutables: Se utilizan para realizar
comprobaciones de tipos entre los operandos implicados.

Algunas de estas comprobaciones son:


comprobacin de tipos en sentencias de asignacin
comprobacin de tipos en operaciones aritmtico-lgicas
comprobacin de tipos en las sentencias condicionales
comprobacin de la declaracin de las variables antes de su
uso
comprobacin de unicidad de identificadores
comprobacin del indexado de vectores

Continuacin

41

Funciones y procedimientos: Se utilizan para


comprobar el nmero, orden y tipo de los parmetros
actuales en cada llamada a una funcin o
procedimiento.

42

Identificacin de variables: Se utilizan para


comprobar si un identificador ha sido declarado antes de
utilizarlo.
Etiquetas: comprobar si hay etiquetas repetidas y
validacin.

19/09/2013

Continuacin
Constantes: comprobar que no se utilicen en la parte
izquierda de una asignacin.

43

El mismo identificador se puede referir a diferentes cosas en


diferentes partes del programa.
mbitos diferentes para el mismo nombre no se sobreponen.

Sobrecarga de operadores y funciones: en las


funciones y los procedimientos, se utilizan para detectar
y solventar la autenticidad de los datos.

Un identificador puede tener mbitos restringidos.


Es decir solo es visible en reas particulares del programa

45

La mayora de los lenguajes tienen mbitos estticos.

Pocos lenguajes tiene mbitos dinmicos


Lisp, SNOBOL
El mbito depende de la ejecucin del programa

No todas las clases de identificadores siguen la regla del


anidamiento ms cercano
Por ejemplo las definiciones de clases
Todas son visibles globalmente

Declaracin de campos en Java


Visibles a todos los mtodos en una clase
Y algunas veces a otras clases tambin
Dependiendo si son pblicas o privadas, etc.

Ejemplo de mbito esttico

46

int x; -- variable global o campo esttico


float convert_speed(float y)
{
float x; --una x diferente (variable local)
x=y*1.6
return x;
}
(El uso de x se refiere a la definicin ms cercana )

El mbito slo depende del texto del programa no de la


conducta en tiempo de ejecucin.
Java, C, C++, Pascal, Modula, cool, etc. Tienen mbito
esttico.

mbito en lenguajes OO

44

Consiste en empatar las declaraciones de identificadores con su


uso
El mbito de un identificador es la porcin del programa en la
cual el identificador es accesible.

Conversiones y equivalencias de tipo: realizan la


verificacin de las constantes para que stas sean de un
mismo tipo.

mbitos estticos vs dinmicos

mbitos

47

Ms sobre mbito

48

Los nombres de mtodos y atributos tienen reglas


complejas.
Los nombres de campos son globales dentro de cualquier
clase.
Pero los mtodos y campos no necesitan estar definidos
en la clase en la cual se estn utilizando, pero si en una
clase padre (herencia)
Los mtodos se pueden redefinir (sobreescritura)

19/09/2013

Implementacin de la regla anidada ms


cercana

49

La mayor parte del anlisis semntico se puede expresar


como un recorrido descendente recursivo de un rbol o
AST.

1.3.- Comprobaciones de Tipos en Expresiones

Procesa un nodo n
Procesa los hijos de n
Finaliza procesando el nodo n

50

En cualquier porcin del rbol (contexto en el programa),


necesitamos saber que identificadores estn definidos.

1.3.-Comprobacin de tipos en Expresiones

51

Las comprobaciones de consistencia que se efectan


antes de la ejecucin del programa
fuente, se
denominan comprobaciones estticas.

La comprobacin de tipos es una forma de asegurar que


los identificadores relacionados sean de tipos
compatibles.

Las comprobaciones que se realizan durante


la
ejecucin del programa objeto se denominan
comprobaciones dinmicas.

Dos identificadores son compatibles de acuerdo a lo


siguiente:

La revisin de la sintaxis de un programa fuente es


un ejemplo de comprobacin esttica,

Cuando forman el lado izquierdo y el lado derecho de un operador.


Cuando forman el lado izquierdo y el lado derecho de una proposicin de
asignacin.
Cuando sean parmetros reales y formales.

Tipos
Qu es un tipo?
La nocin vara de lenguaje a lenguaje.

Consenso
Un conjunto de valores
Un conjunto de operadores sobre los valores

52

mientras que la comprobacin de tipos, es un


ejemplo de comprobacin que con frecuencia puede
efectuarse en forma esttica y que en ocasiones
debe realizarse dinmicamente.

53

Tipos y operaciones

54

Ciertas Operaciones son legales para cada tipo


No tiene sentido sumar un apuntador a funcin y un entero en C
Tiene sentido sumar dos enteros
Pero ambos tienen la misma implementacin en lenguaje ensamblador!

Las clases son una instanciacin moderna de la nocin de tipo

19/09/2013

Sistema de tipos
Un sistema de tipos de un lenguaje especifica las operaciones que
son vlidas para cada tipo.

55

56

La mayora de los compiladores son de mltiples pasadas.

La meta de la verificacin de tipos es asegurar que las operaciones


se utilizan con los tipos correctos.

Recorre el AST (rbol de anlisis sintctico) para el anlisis


semntico, verificacin de tipos.
Recorre este otra vez para optimizacin.

Hace cumplir la interpretacin de los valores.


Algunas veces puede realizar conversiones automticas cuando el lenguaje
permite modos mezclados y promocin de tipos.

y generacin de cdigo
.. etc.

El sistema de tipos provee una formalizacin concisa de las reglas


de verificacin semntica.

Compilacin de una pasada


Bajo ciertas circunstancias, es posible construir un
compilador completo de una sola pasada.

Traslacin dirigida por la sintaxis

Verificacin de tipos
57

Existen aspectos a considerar en la verificacin de tipos de un


compilador

58

Procesar las declaraciones y mantener una tabla de smbolos.


Almacenar el tipo de cada identificador en la tabla de
smbolos.

Es posible con ciertas condiciones del lenguaje


Particularmente cuando se declara antes de que se use.

Esto requiere que la traslacin se realice durante un


recorrido del rbol en profundidad.

Realizar la verificacin de tipos y hacer cumplir las reglas


semnticas en expresiones y otros elementos del lenguaje (e.g.
Lista de argumentos, etc.)

La forma en que el analizador sintctico se mueve a travs del


rbol

Buscar el tipo de los identificadores usados.


Inferir los tipos de constantes
Calcular el tipo de los nodos que denotan expresiones.

Verificacin de tipos con aseveraciones


En cada regla declaramos la aseveracin que se debe cumplir si el
programa es vlido.

59

Ejemplo de verificacin de tipos (un ejemplo


similar esta en la Sec. 6.4.4 de Kenneth)

60

ASSERT(condicin) mensaje significa:


La condicin se supone debe cumplirse
Si no es verdadera, imprime mensaje.

Assert (Visual Studio 2012 )


Prueba una asercin de software en tiempo de compilacin. Si la expresin constante
especificada es false, el compilador muestra el mensaje especificado y la compilacin
emite un error; si no, la declaracin no tiene ningn efecto.

static_assert( constant-expression, string-literal );

Puede usarse una macro en C para este propsito


#define ASSERT(x,y) if (!x) printf(line %d: %s\n,lineno, (y))

10

19/09/2013

Verificacin de tipos en Bison

61

Expresiones de Tipos

63

Una expresin de tipo es, o bien un tipo bsico o se


forma aplicando un operador llamado constructor de
tipos a otras expresiones de tipos.
bsicas

Matrices,
Productos,
Registros,
apuntadores y
funciones).

a) Matrices. Si T es una expresin de tipo, entonces array (I, T) es una


expresin de tipo que indica el tipo de una matriz con elementos de
tipo T y conjunto de ndices I, I con frecuencia es un rango de enteros.

Por ejemplo, la declaracin en Pascal


Var A: array[1..10] of integer;
Asocia la expresin de tipo array(1..10, integer) con A.

64

2- Como se puede dar nombre a las expresiones de tipos, el


nombre de un tipo es una expresin de tipo.

3.-Un constructor de tipos aplicado a expresiones de tipos es una


expresin de tipo. Los constructores incluyen:

Se utilizar la siguiente definicin de expresiones de tipos:

62

1. Un tipo bsico es una expresin de tipo. Entre los tipos


bsicos se encuentran bolean, char, integer y real. Un tipo
bsico especial, la funcin error_tipo(), sealar un error
durante la com-probacin de tipos.

El tipo de una construccin de un lenguaje se denotar


mediante una Expresin de tipo.

Los conjuntos de tipos y construcciones


dependen del lenguaje que deba comprobarse.

Verificacin de tipos (Cont.)

65

b) Productos. Si T1 y T2 son expresiones de tipo, entonces su producto


cartesiano T1 x T2 es una expresin de tipo. Se supone que x es
asociativa por la izquierda.

66

c) Registros. La diferencia entre un registro y un producto es que los


campos de un registro tienen nombres. El constructor de tipos
record se aplicar a un conjunto ordenado formado con nombres de
campos y tipos de campos. Por ejemplo, el fragmento de programa
en Pascal:
Type fila = record
Direccin: integer;
Lexema: array [1..15] of char
end;
var tabla: array [1..10] of fila;

11

19/09/2013

Declara que el nombre de tipo fila representa la expresin de tipo.

67

Record (direccin x integer ) x (lexema x array (1..15, char))


Y que la variable tabla es una matriz de registro de este tipo.
d) Apuntadores.- Si T es una funcin de tipo, entonces pointer (T) es
una expresin de tipo que indica el tipo apuntador a un objeto de
T.
Por ejemplo, en Pascal, la declaracin

e) Funciones.- matemticamente una funcin transforma los


elementos de un conjunto, el dominio,
a elementos de otro
conjunto, el rango. Se pueden considerar las funciones dentro de los
lenguajes de programacin como transformaciones de un dominio de
tipo D a un rango tipo R. La expresin tipo D
R indica el tipo de
dicha funcin.

68

Por ejemplo, la funcin predefinida mod de Pascal tiene un dominio


de tipo int x int, es decir, un par de enteros, y rango de tipo int. De
esta forma, se dice que mod tiene el tipo1.
int x int

Var pila: fila

int

Declara que la variable pila tiene tipo pointer (fila)

Con frecuencia existen, por razones de implantacin, limitaciones que


en cuanto al tipo que una funcin puede devolver; por ejemplo,
matrices o funciones.

69

Sin embargo existen lenguajes que permiten que las funciones


devuelvan objetos de tipos arbitrarios, as que se puede definir una
funcin g de tipo
(integer

integer);

(integer

70

Una manera conveniente de representar expresiones de


tipo es utilizando un grafo.

integer)

Con el enfoque de la traduccin dirigida por la sintaxis se


puede construir un rbol o un GDA para una expresin de
tipo, con nodos interiores para los constructores de tipos y
hojas para los tipos bsicos, nombres de tipos, y variables
de tipos.

Es decir, g toma como argumento una funcin que transforma un


entero en un entero y g produce como resultado otra funcin del
mismo tipo.

Por ejemplo, consideremos la siguiente declaracin:


Str : array [0..80] of char;
I : integer;

4.- Las expresiones de tipo pueden contener variables cuyos


valores son expresiones de tipos.

71

A continuacin se presenta un breve ejemplo de cmo introducir las


reglas que permiten la comprobacin de tipos de expresiones
aritmticas.

Estticamente puede que no se cumpla la condicin: 0 <= i <= 80


al utilizar str [i]; es decir, esta comprobacin debe efectuarse
en forma dinmica.

TipoE, TipoT y TipoF, representan el tipo de una expresin,


trminos, etc.; se emplean subndices para distinguir entre varias
ocurrencias de un mismo smbolo no Terminal.

Sin embargo, es posible, por ejemplo, comprobar estticamente si


la asignacin: str [i] := ch; est permitida, o sea, si ambos lados
de la proposicin de asignacin son de tipos compatibles. Para
ello es necesario consultar la tabla de smbolos.

Se usar el siguiente subconjunto de la gramtica G0 con las reglas


correspondientes:

72

12

19/09/2013

(* TipoE := TipoT; *)

E1

E2 + T

(* TipoE1 := ifTipoE2 = integer end


TipoT = integer then integer

T
T1

F
T2 * F

else error_tipo; *)
(* TipoF := buscar_Tipo(x); *)

F
F

y
(E

(* TipoF := buscar_Tipo(y); *)
(* TipoF := TipoE; *)

73

Se debe sealar que no todos los lenguajes de


programacin permiten una comprobacin esttica de tipos
como la que se acaba de exponer, para ello se tiene que
implementar en su diseo, para que pueda ser considerada.

Pila semntica en un ASem


La pila juega un papel fundamental en el desarrollo de cualquier
analizador semntico. Dentro de cada elemento de la pila se
guardan los valores que pueden tener una expresin.

74

Por ejemplo, el tipo de una expresin formada donde se aplica el


operador + a una subexpresin y un trmino, es entero, si el tipo
de la subexpresin y el trmino es entero; en caso contrario ser un
error de tipo.

else error_tipo; *)
(* TipoT := TipoF *)
(* TipoT1 := ifTipoT2 = integer end
TipoF = integer then integer

De esta forma, durante el proceso de anlisis semntico, se


puede determinar donde se requieren cambios forzados de
tipo y qu operadores deben relacionarse (por ejemplo,
multiplicacin entera o de punto flotante).

El procedimiento buscar Tipo(...) se utiliza para determinar el tipo


de un identificador por medio de la revisin de la tabla de smbolos.

La formulacin de reglas para semnticas (tipo Pascal), que


establecen, por ejemplo, que Entero * Real genera un resultado de
tipo Real, es obvia y puede verse cmo se propagar un tipo.

75

1.4.- Pila Semntica en un Analizador Sintctico

76

Admon. Tabla de Smbolos


La tabla de smbolos tambin recibe el nombre de ambiente.
Un ambiente contiene un conjunto de parmetros que slo son
visibles en ese ambiente.
La tabla de smbolos se mantiene durante todo el proceso de
traduccin agregando elementos especficos en cada paso.

13

19/09/2013

Tabla de Smbolos
Tabla de smbolos
Funcionalidades bsicas:

Cmo se agrega la semntica al analizador sintctico?

Inserta(smbolo)
Existe(nombre)

Declaracin TIPO {tipo=obtengo(yytext());} listavar PYC

Se agrega una primitiva ms: Tipo (nombre)

listavar var {inserta(smbolo);} | var {inserta(simbolo);}

El anlisis lxico crea la tabla de smbolos?


No

var ID {simbolo=yytext; smbolo.tipo=tipo; simbolo.amb=ambito;}

Tabla de Smbolos

Exprlog PI exprlog{A=A;} PD |
NOT exprlog {A=A;} |
exprlog {A1=A;} OPLOG exprlog {
A2=A
if(A1==INT && A2==INT)
A=INT;
else
A=ERROR_TIPO;
}

int a;
a = (int) 10.1;

Tabla de Smbolos

Implementacin de la tabla de smbolos


83

Una tabla de smbolos es una estructura de datos empleada


para registrar las declaraciones de identificadores.
Los identificadores se almacenan cuando se declaran
Con atributos
Nombres de clases, mtodos, variables, etc

Y sub-atributos
public, private, integer, float, static, array, etc
Su localizacin en la pila si es variable local

La tabla de smbolos se consulta para cualquier uso.


Verificacin semntica y generacin de cdigo.

84
La estructura es una pila
O una lista ligada que opera como pila

Operaciones
add_symbol(x) inserta x y la informacin asociada, tal como el
tipo, en la pila.
find_symbol(x) busca en la pila, comenzando del tope de la
pila.Regresa el primer x encontrado o NULL si no se encontro.
remove_symbol() saca elemento de la pila

14

19/09/2013

Definicin de clase
Una tabla de smbolos ms elaborada

85
Los nombres de clases se pueden usar antes de que sean
definidos.
Usualmente no se puede verificar esto para los nombres
de clases.

enter_scope()
comenzar un nuevo
mbito anidado
find_symbol(x)
encuentra el x actual
(o null)
add_symbol(x)
agrega un smbolo x
a la tabla
check_scope(x)
verdadero si x esta
definido en el mbito
actual (verificar
declaraciones mltiples)
exit_scope()
salir del mbito
Descartar todos los smbolos del mbito reciente

Usando una tabla de smbolos (compilacin separada?)


O en una pasada (a menos que se requieran prototipos)

Definicin de clase
Solucin usual

86

87

Implementacin de una Tabla de Smbolos


simple

88

Fase 1: Junta todos los nombres de clases (+ otras cosas)


Fase 2: Realiza la verificacin

El anlisis semntico completo requiere varias pasadas.


Probablemente ms de una

La mayora de compiladores en JAVA busca por archivos


de clases previamente compiladas.

Anlisis semntico esttico:


se realiza en tiempo de compilation, no de execution.
1. Cmo vamos a especificar (describir) la estructura semntica
de un lenguaje?

Mediante gramticas de atributos.

2. Cmo vamos a implementar la estructura semntica de un


lenguaje?
A partir de la construccin del rbol de anlisis sintctico, lo recorreremos
en un determinado orden y calcularemos en cada nodo la informacin
semntica necesaria (el valor de una expresin, el tipo de una variable, su
mbito de declaracin, el nmero de argumentos de una funcin, etc).

89

1.5.- Esquemas de Traduccin

90

Los programas de aplicacin, los videojuegos y otras


herramientas que se ejecutan en las computadoras,
generalmente se realizan en lenguajes de alto nivel.
Estos programas escritos en lenguajes de alto nivel necesitan ser traducidos a un lenguaje que sea entendible
por la computadora, este lenguaje es el lenguaje de bajo
nivel.

15

19/09/2013

1.3.- Comprobaciones de Tipos en Expresiones


1.4.- Pila Semntica en un Analizador Sintctico

91

Sistemas de Tipos.

92

El diseo de un comprobador de tipos para un lenguaje se basa en


informacin acerca de las construcciones sintcticas del lenguaje, la
nocin de tipos y las reglas para asignar tipos a las construcciones de
lenguajes.
Los siguientes extractos de Pascal y del manual de referencia de C,
respectivamente, son ejemplos de la informacin con la que el diseador
de un compilador podra verse obligado a comenzar.

Si ambos operandos de los operadores aritmticos de


suma, sustraccin y multiplicacin son de tipo entero,
entonces el resultado es de tipo entero.

93

El resultado del operando unario & es un apuntador hacia


el objeto al que se refiere el operando. Si el tipo del
operando es Un Arreglo, o el tipo del resultado es
apuntador a .
En los anteriores extractos se encuentra implcita la idea
de que cada expresin tiene asociado un tipo.

En los lenguajes Pascal y C, los tipos de datos son


bsicos o construidos. Los tipos bsicos son los tipos
atmicos sin estructura interna por lo que concierne al
programador.
En Pascal, los tipos bsicos son bolean, carcter, integer
y real.
Los tipos de subrango, como 1..10, y los tipos
enumerados, como:

94

(Violeta, azul, verde, amarillo, naranja, rojo)


Se pueden considerar como tipos bsicos.

El lenguaje Pascal admite que un programador construya


tipos a partir de tipos bsicos y otros tipos construidos,
como por ejemplo, las matrices o arreglos (array), los
registros (record) y los conjuntos (set).
Adems, los apuntadores y las funciones tambin pueden
considerarse como tipos construidos.
Estos son algunos ejemplos de tipos de datos construidos
que se pueden realizar con los lenguajes de alto nivel.

95

Todos los programas escritos en lenguajes de alto nivel


deben ser traducidos a lenguaje de mquina mediante un
traductor.

96

La funcin de un traductor de un lenguaje de programacin, es traducir programas escritos en un lenguaje


de alto nivel a programas equivalentes, expresados en
lenguaje mquina.
Despus del proceso de traduccin, los programas pueden
ejecutarse en cualquier computadora a travs de un
intrprete microprogramado

16

19/09/2013

97

98

La siguiente figura muestra el funcionamiento de un traductor


mediante un compilador de cuatro pasos con las dems
actividades que intervienen durante la compilacin de un
programa hasta llegar a convertir el programa escrito en
lenguaje de alto nivel a un programa escrito en lenguaje
ensamblador o lenguaje binario, para que posteriormente se
convierta en programa objeto:

Tipos de Traduccin de lenguajes.

99

Interpretados.- Este tipo de traduccin lee y ejecu-ta


instruccin por instruccin. LIPS, Prolog, Basic y Smalltalk, se
suelen implementar a travs del uso de un interprete .
En esta clase de lenguajes, el traductor no procede cdigo de
mquina para la computadora que s esta utilizando.
En su lugar, el traductor produce alguna forma inter-media
del programa cuya ejecucin es ms fcil que la forma del
programa original, pero que es distinta del cdigo mquina.

Existe otro tipo de traduccin que se realiza directa-mente


por el procesador, esta traduccin se describe a
continuacin:
Ensamblador.-Es un traductor cuyo lenguaje objeto es
tambin alguna variedad de lenguaje mquina para una
computadora real pero cuyo lenguaje fuente, un lenguaje
ensamblador constituye en gran medida una representacin
simblica del cdigo de mquina objeto.
Casi todas las instrucciones en el lenguaje fuente se
traducen una por una a cada instruccin del lenguaje
objeto.

Compilados.- Los lenguajes por lo general como el C,


Pascal, java, son lenguajes que se compilan.
Esto significa que los programas en estos lenguajes se
traducen ordinariamente al lenguaje mquina de la
computadora real que s esta usando antes que inicie la
ejecucin,

100

y la simulacin est confinada a un con-junto de rutinas de


apoyo en tiempos de ejecucin que simulan operaciones
primitivas en el lenguaje fuente para las cuales no existe
un anlogo cercano en el lenguaje mquina.

101

Cargador.- es un traductor cuyo lenguaje objeto es un


cdigo de mquina real y cuyo lenguaje fuente es casi
idntico; y est compuesto por lo general de programas en
lenguaje mquina en forma reubicable junto con tablas de
datos que especifican puntos donde el cdigo reubicable se
debe codificar para volverlo automticamente ejecutable.

102

Preprocesador o Macroprocesador.- es un tra-ductor cuyo


lenguaje fuente es una forma ampliada de un lenguaje de
alto nivel cuyo lenguaje objeto es la forma estndar del
mismo lenguaje.

17

19/09/2013

1.6.- Generacin de la Tabla de Smbolos y


de Direcciones.

104

Una tabla de smbolos es una estructura de datos que contiene una


entrada para cada identificador encontrado en el programa fuente.
Con el objeto de que el compilador pueda llevar un control de la
informacin sobre el mbito y el enlace de los nombres de datos que
intervienen en el progra-ma fuente.
1.6.- Generacin de la Tabla de Smbolos y de Direcciones.

Durante la compilacin de un programa, cada vez que se encuentra un


identificador en la ta-bla de smbolos, se puede realizar lo siguiente:

La tabla puede ser consultada para ver si es necesario dar de alta el nuevo
identificador.

En la tabla se puede completar los atributos faltantes de un identificador ya


existente.

Se pueden recuperar los atributo de un iden-tificador ya existente en la tabla


de smbolos.

103

Los campos de cada entrada en la tabla de sm-bolos corresponden a


los atributos de cada i-dentificador. (Tipo, valor, direccin,
parmetros, etc.).

105

Los dos mecanismos para tablas de smbolos presentadas a


continuacin son listas lineales y tablas de dispersin.

Una lista lineal es lo ms fcil de implantar, pero su rendimiento


es pobre cuando e y n se vuelven ms grandes.
Las tablas de dispersin proporcionan un mayor rendimiento con
esfuerzo algo mayor de programacin y gasto de espacio.

Un mecanismo de tabla de smbolos debe permitir aadir nuevas


entradas y encontrar las entradas existentes de un analizador lxico
eficientemente.

Un compilador debe ser capaz de aumentar dinmicamente la tabla


de smbolos durante la compilacin.
Si la tabla de smbolos tiene tamao fijo al escribir el compilador,
entonces el tamao debe de ser lo suficientemente grande como
para almacenar cualquier programa fuente.
Es muy probable que dicho tamao sea demasiado grande para la
mayora de los programa e inadecuado para algunos.
Para mantener uniformes los registros de la tabla de smbolos, es
conveniente guardar una parte de la informacin de un nombre fuera
de la entrada de la tabla, almacenando en el registro slo un
apuntador a esta infor-macin, para hacer referencia a l.

106

Cada uno de estos mecanismos se evala basn-dose en el tiempo


necesario para aadir n entra-das y realizar e consultas.

Ambos mecanismos pueden adaptarse rpida-mente


funcionar las reglas del anidamiento ms cercano.

107

para

Administracin de la Tabla de Smbolos.

108

Cada entrada de la tabla de smbolos corresponde a la


declaracin de un nombre. El formato de las entradas no tiene
que ser uniforme porque la informacin de un nombre depende
del uso de dicho nombre.
Cada entrada se puede implantar como un registro que conste
de una secuencia de palabras consecutivas de memoria.
No toda la informacin se introduce en la tabla de smbolos.

Las palabras clave se introducen, al inicio. El analizador lxico


busca secuencias de letras y dgitos en la tabla de smbolos para
determinar si se ha encontrado una palabra clave o un nombre.

18

19/09/2013

Las palabras clave deben estar en la tabla de smbolos antes de que


comience el anlisis lxico.

109

Si el analizador lxico reconoce las palabras clave, entonces no


necesitan aparecer en la tabla de smbolos.

110

Si el lenguaje no convierte en palabras reservadas las palabras clave,


entonces es indispensable que las palabras clave se introduzcan en la
tabla de smbolos advirtiendo su posible uso como palabras clave.
La entrada misma de la tabla de smbolos puede establecerse cuando
se aclara el papel de un nombre, y se llenan los valores de los
atributos cuando se dispone de la informacin.

Fig. Una tabla de smbolos separada en dos partes,


utilizando una parte como apuntador a dicha tabla para
hacer referencia a los nombres almacenados en ella.

En algunos casos, el analizador lxico puede iniciar la entrada en


cuanto aparezca un nombre en los datos de entrada.

Se crea el registro en la tabla de smbolos cuando se descubre el


papel sintctico que desempea este nombre.

Un nombre puede indicar varios objetos distintos, quizs incluso en el


mismo bloque o procedimiento.
Por ejemplo, las declaraciones en C.

111

int x;
struct x { float y, z; } ;

Para las declaraciones de la expresin, se crearan dos entradas en


la tabla de smbolos para x; una con x como entero y otra como
estructura.

112

Los atributos de un nombre se introducen en respuesta a las


declaraciones, que pueden ser implcitas.

Utilizan x como entero y como etiqueta de una estructura con dos


campos.

Las etiquetas son identificadores seguidos de dos puntos, as que una


accin asociada con el reconocimiento de dicho identifica-dor puede
ser introducir este hecho en la tabla de smbolos.

En ambos casos, el analizador lxico slo puede devolver al analizador


sintctico el nombre solo (o un apuntador al lexema que forma dicho
nombre), en lugar de un apuntador a la entrada en la tabla de
smbolos.

La sintaxis de las declaraciones de los procedimientos especifican


que algunos identificadores son parmetros formales.

1.7.- Manejo de Errores Semnticos

114

Los errores que puede detectar el Analizador Sintctico


son aquellos que no cumplen las reglas de una gramtica
independiente del contexto.

1.7.- Manejo de Errores Semnticos

113

Una de las caractersticas de un lenguaje de


programacin es que no puede enunciarse con las reglas
independientes del contexto, ya que dependen de l; por
ejemplo, la restriccin de que los identificadores deben
declararse previamente antes de ser utilizados.

19

19/09/2013

Por tanto, los principales errores semnticos son


los siguientes:

115

a).-Identificadores no definidos;
b).-Operadores y operandos incompatibles;

1.

116

Sin embargo, la mayora de los errores semnticos


pueden ser detectados mediante la revisin de la
tabla de smbolos.

Es mucho ms difcil introducir mtodos formales


para la recuperacin de errores semnticos que
para la recuperacin de errores sintcticos, ya que
con frecuencia la recuperacin es ambigua.

117

FUENTES DE INFORMACION

No obstante, puede requerirse que, por lo menos,


el error semntico sea informado al programador,
que se le ignore y que, por tanto, se suprimir la
generacin de cdigo.

FUENTES DE INFORMACION

118

Aho, Sethi, Ullman. Compiladores Principios, tcnicas y herramientas. Ed. Addison Wesley.

2. Lemone Karen A. , Fundamentos de Compiladores Cmo traducir al lenguaje de computadora. Ed.


Compaa Editorial Continental.

10. Beck. Software de Sistemas, Introduccin a la programacin de Sistemas. Ed. Addison-Wesley


Iberoamericana.

3. Kenneth C. Louden. Construccin de compiladores Principios y prctica. Ed. Thomson.

11. Teufel, Schmidt, Teufel. Compiladores Conceptos Fundamentales. Ed. Addison-Wesley Iberoamericana.

4. Martin John, Lenguajes Formales y Teora de la Computacin, ED. Mc Graw Hill.

12. C. Louden, Kenneth. Lenguajes de programacin Principios y prctica. Ed. Thomson.

5. Hopcroft John E., Introduccin a la Teora de Autmatas, Lenguajes y Computacin, ED. Addison Wesley

13. Levine Gutirrez, Guillermo. Computacin y programacin moderna Perspectiva integral de la


informtica. Ed. Pearson Educacin.

6. Guerra Crespo. Hector. Compiladores. Ed. Tecnolgica Didctica.


7. Ronald Mark. Writing Compilers and Interpreters. Ed. Wiley Computer Publishing.

14. Abel, Peter. Lenguaje ensamblador y programacin para PC IBM y compatibles. Ed. Pearson
Educacin.

8. Fischer, LeBlanc. Crafting a compiler with C. Ed. Cummings Publishing Company, Inc.

15. Mak, Ronald. Writing compilers and interpreters. Wiley Computer. Ed. Publishing.

9. Salas Parrilla, Jess. Sistemas Operativos y Compiladores. Ed. McGraw Hill.

16. Pittman, Thomas, Peters, James. The art of compiler design Theory and prctice. Prentice Hall.

Dudas????

119

20

También podría gustarte