You are on page 1of 28

Instituto Tecnolgico de Acapulco

Ingeniera en Sistemas Computacionales

Lenguajes Y Autmatas II
Actividades de la unidad 1: Anlisis semntico
Competencia especfica a desarrollar:

Disear mediante el uso de rboles de


expresiones dirigida por la sintaxis un
analizador semntico para un meta-compilador

Fecha de entrega: 08 de Septiembre del 2015


Docente:
Bedolla Solano Silvestre

Integrantes de equipo:
OLIVARES SOLIS RICARDO JACOB
OZUNA PERZ MARTN ALBERTO
RODRIGUEZ RAYO EDUARDO

12320802
12320806
12320825

Enero - Junio
2015
----------------------

0 12 - 13 Hrs.
AULA: 7SA
---------------------

INDICE
INTRODUCCION Pg. 2
REPORTE DE LA
SEMNTICOS
CUADRO
SINPTICO
EXPRESIONES.

DETECCIN

SOBRE

LISTA
DE
REGLAS
PARA
EXPRECIONES
TABLA
DONDE
SE
SEMNTICAS..

RECUPERACIN

MANEJO

LA

DE

CONVERSIN

DESCRIBEN

DE

ERRORES Pg. 3

TIPOS

EN

LAS Pg. 8

DE

TIPOS

EN Pg. 9

LAS

ACCIONES Pg. 14

REPORTE DE LA MANIPULACIN DE LA TABLA DE CONVERSIN DE Pg. 15


SIMBOLOS.
PROPUESTA DE PROYECTO..

Pg. 20

CONCLUSIN.

Pg. 21

BIBLIOGRAFA.

Pg. 22

INTRODUCCIN
Los compiladores son programas de computadora que traducen un lenguaje a otro. Un
compilador toma como su entrada un programa escrito en su lenguaje fuente y produce
un programa equivalente escrito en su lenguaje objetivo. Por lo regular, el lenguaje fuente
es un lenguaje de alto nivel, tal como C o C++, mientras que el lenguaje objetivo es cdigo
objeto (tambin llamado en ocasiones cdigo de mquina) para la mquina objetivo, es
decir, cdigo escrito en las instrucciones de mquina correspondientes a la computadora
en la cual se ejecutar. Podemos visualizar este proceso de manera esquemtica como
sigue:

En este trabajo se espera cumplir con las actividades principales que se necesitan para el
entendimiento de cmo funciona un compilador internamente y una de las cosas que
realiza es la deteccin de errores semnticos, la construccin de tabla de smbolos, el uso
de tokens y la correccin de errores. Algunos de estos temas se hablaran en este trabajo.

DESARROLLO

Reporte de la deteccin y recuperacin de errores semnticos

Los errores encontrados en las distintas fases de anlisis se envan a un mdulo denominado
manejo de errores. En el caso ms sencillo puede ser un subprograma al que se le invoca
envindole el cdigo de error, y que se encarga de escribir un mensaje con el error
correspondiente, y el nmero de lnea donde se ha producido, as como de cortar el proceso de
traduccin. Si se desea construir un tratamiento de errores ms completo, por ejemplo
detectando todos los errores del programa fuente, el mdulo se complica dado que los
analizadores deben proseguir su trabajo con falta de datos.
Ejemplo
VAR
ch : CHAR; (* Un identificador no se puede utilizar si *)
ent: INTEGER; (* previamente no se ha definido. *)
...
ch := ent + 1; (* En Pascal no es vlido, en C s. *)
Anlisis Semntico: Tipo de variables asignadas incorrecta.
En los errores semnticos: La estructura est bien pero hay errores de significado. Ejemplo:
operador y operandos incompatibles.
Algunos errores se pueden detectar en compilacin otros solo en ejecucin. El tratamiento de
errores es una parte importante que se suele descuidar.
Tratamiento de errores semnticos
COMPROBACIN DE TIPOS
1. 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 cambiaren distintas llamadas a la funcin.

2. Especificacin de un comprobador de tipos bsico


Bsicamente se debern realizar dos tareas:
a) Asignacin de tipos: en las declaraciones.
b) Evaluacin y comprobacin de tipos: En las expresiones y en las funciones, as como en las
sentencias.
Sea la gramtica:

Primer paso: Asignacin de tipo.

Segundo paso: Comprobacin de tipo en expresiones.

Tercer paso: Comprobacin de tipo en sentencia.

3. Otras comprobaciones semnticas y recuperacin de errores semnticos


Dentro de las comprobaciones estticas (en el momento de la compilacin), tenemos la deteccin
e informacin de errores como:
Comprobaciones de tipos: operadores aplicados a operandos incompatibles, asignacin de tipos
incompatibles, llamadas a funciones con tipos no adecuados, etc.
Comprobaciones de flujo de control: las sentencias que hacen que el flujo de control abandone
una construccin debe tener algn lugar a donde transmitir el control. Por ejemplo: Unbreak debe
estar dentro de una proposicin while, for o switch en C.
Comprobaciones de unicidad: situaciones en las que solo se puede definir un objeto una vez
exactamente. Por ejemplo: Un identificador, las etiquetas case dentro de un switch.
Solo nos hemos centrado en las comprobaciones de tipo. Las otras son en cierto modo rutinarias y
se pueden realizar fcilmente insertando acciones intercaladas en el cdigo para realizarlas, por
eje. Cuando se introduce un identificador en la Tabla de Smbolos.

Ejemplo de deteccin y recuperacin de errores semnticos:


1)

En esta imagen podemos observar un error semntico bsico, el cual consta de realizar una suma
entre dos variables, que aunque sean del mismo tipo una de ellas no tiene un valor asignado o
declarado, por lo cual la operacin no puede realizarse.
El compilador detecta el error al instante y nos da una forma de recuperacin al notificarnos con
un icono (

) el cual nos informa del tipo de error que es colocando el cursor sobre este mismo:

Cuadro sinptico donde se describa el manejo de tipos en las expresiones y el uso de operadores

- Una expresin es una combinacin de operadores y operandos. Los datos u operandos pueden
ser constantes, variables y llamadas a funciones.
- Expresiones
- Subexpresiones

- Asignacin

Manejo de tipos

- Aritmticos

- Encerradas entre parntesis. Ejemplo: 2x (b + 2).

- El operador de asignacin se representa por la secuencia de caracteres :=.


Permite asignar a una variable el valor de una expresin. Por ejemplo: Var X = 5.

- Los operadores aritmticos


operan sobre valores de tipo
entero o real.

- Suma +, resta -, multiplicacin *,


divisin / y mdulo %.

- Operadores
- Lgicos

- Los operadores lgicos o boolenos realizan operaciones con


operandos de tipo lgico o booleano y tiene como resultado
un dato tambin del mismo tipo.

- Relacin

- Los operadores de relacin son


operadores binarios en los que los
operandos son ordinales, reales o
de cadena

- AND, NOT, OR, XOR,


etc.

- Igual que =, distinto que <>, menor


que <, mayor que >, menor o igual que
<= y mayor o igual que >=.

Lista de las reglas para la conversin de tipos (casting) en expresiones.

En ciencias de la computacin la conversin de tipos (type casting en ingls) se


refiere a la transformacin de un tipo de dato en otro. Esto se hace para tomar las
ventajas que pueda ofrecer el tipo a que se va a convertir. Por ejemplo, los valores
de un conjunto ms limitado, como nmeros enteros, se pueden almacenar en un
formato ms compacto y ms tarde convertidos a un formato diferente que permita
las operaciones que anteriormente no eran posibles, tales como la divisin con
decimales.
Tipos de conversin
En la implcita se convierte un tipo de dato de menor rango a un supertipo (tipo de
dato de mayor rango); este tipo de conversin lo realiza el compilador, ya que no
hay prdida de datos si, por ejemplo, se pasa un int (tipo entero) a long.
En la conversin explcita, el compilador no es capaz de realizarla por s solo y por
ello debe definirse explcitamente en el programa.
Existen varios tipos de conversin explcita:

Controlada: antes de realizar la conversin se controla en tiempo de ejecucin


si el tipo de destino puede tener el valor de origen, y si no se produce un error.

No controlada: no se realiza ningn control, si el tipo de dato destino no puede


contener al de origen el resultado es indefinido (generalmente se produce
un desbordamiento de bfer y en algunos casos como en java el cambio se
produce sin mayores consecuencias).

Patrn de bits: La representacin de bits en bruto de la fuente es una copia


literal, y se reinterpreta de acuerdo con el tipo de destino. Esto tambin puede
lograrse a travs de aliasing.

Conversiones de tipos en C#
Dado que a C# se le asignan tipos estticos en tiempo de compilacin, despus
de declarar una variable, no se puede volver a declarar ni tampoco utilizar para
almacenar valores de otro tipo, a menos que dicho tipo pueda convertirse en el
tipo de la variable. Por ejemplo, no existe conversin de un entero a una cadena
arbitraria cualquiera. Por lo tanto, despus de declarar i como entero, no puede
asignarle la cadena "Hello", como se muestra en el cdigo siguiente.

int i;
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"
10

Sin embargo, en ocasiones puede que sea necesario copiar un valor en un


parmetro de mtodo o variable de otro tipo. Por ejemplo, puede que tenga una
variable de tipo entero que deba pasar a un mtodo cuyo parmetro es de tipo
double. Estos tipos de operaciones se denominan conversiones de tipos. En C#,
puede realizar los siguientes tipos de conversiones:

Conversiones implcitas: no se requiere una sintaxis especial porque la


conversin se realiza con seguridad de tipos y no se perdern datos. Entre
los ejemplos se incluyen las conversiones de tipos enteros de menor a
mayor y las conversiones de clases derivadas en clases base.

Conversiones explcitas (conversiones de tipos): las conversiones


explcitas requieren un operador de conversin. Las variables de origen y
destino son compatibles, pero existe el riesgo de perder datos debido a que
el tipo de la variable de destino es ms pequeo que (o es una clase base
de) la variable de origen.

Conversiones definidas por el usuario: las conversiones definidas por el


usuario se realizan a travs de mtodos especiales que puede definir para
habilitar las conversiones explcitas e implcitas entre tipos personalizados
que no tienen una relacin de clase base-clase derivada. Para obtener ms
informacin, vea Operadores de conversin (Gua de programacin de C#).

Conversiones con clases auxiliares: para realizar conversiones entre tipos


no compatibles, como los enteros y los objetos System..::.DateTime, o bien
cadenas hexadecimales y matrices de bytes, puede utilizar la clase
System..::.BitConverter, la clase System..::.Convert y los mtodos Parse de los
tipos numricos integrados, como Int32..::.Parse..

Conversiones implcitas
En los tipos numricos integrados, puede realizarse una conversin implcita
cuando el valor que se va a almacenar puede ajustarse a la variable sin necesidad
de truncamiento o redondeo. Por ejemplo, una variable de tipo longlong
(Referencia de C#) (entero de 8 bytes) puede almacenar cualquier valor que
pueda almacenar a su vez un elemento intint (Referencia de C#) (4 bytes en un
equipo de 32 bits). En el ejemplo siguiente, el compilador convierte implcitamente
el valor de la derecha en un tipo long antes de asignarlo a bigNum.
// Implicit conversion. num long can
// hold any value an int can hold, and more!
11

int num = 2147483647;


long bigNum = num;
Tabla de conversiones numricas implcitas
La tabla siguiente muestra las conversiones numricas implcitas predefinidas. Las
conversiones implcitas se pueden dar en muchas ocasiones, incluidas la
invocacin a mtodos y las instrucciones de asignacin.
De

sbyte

short, int, long, float, double o decimal

byte

short, ushort, int, uint, long, ulong, float, double o decimal

short

int, long, float, double o decimal

ushort

int, uint, long, ulong, float, double o decimal

int

long, float, double o decimal

uint

long, ulong, float, double o decimal

long

float, double o decimal

char

ushort, int, uint, long, ulong, float, double o decimal

float

double

ulong

float, double o decimal

Comentarios
Las conversiones de int, uint o long a float y de long a double pueden
causar una prdida de precisin, pero no una prdida de magnitud.

No existen conversiones implcitas al tipo char.

No hay ninguna conversin implcita entre los tipos de punto flotante y el


tipo decimal.

Una expresin constante de tipo int se puede convertir a sbyte, byte,


short, ushort, uint o ulong, siempre que el valor de la expresin constante
quede dentro del intervalo del tipo de destino.

Conversiones explcitas
Sin embargo, si no se puede realizar una conversin sin riesgo de perder
informacin, el compilador requiere que se realice una conversin explcita,
12

denominada conversin de tipo. Una conversin de tipo es una manera de


informar al compilador de forma explcita de que pretende realizar la conversin y
que est al tanto de que puede producirse una prdida de datos. Para realizar una
conversin de tipo, especifique entre parntesis el tipo al que se va a aplicar dicha
conversin delante del valor o la variable que se va a convertir. El programa no se
compilar sin el operador de conversin de tipo.
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
Tabla de conversiones numricas explcitas (Referencia de C#)
Las conversiones numricas explcitas se utilizan para convertir cualquier tipo
numrico a cualquier otro tipo numrico, para el que no existe conversin implcita,
mediante una expresin que utilice el operador de conversin explcita. La
siguiente tabla muestra estas conversiones.
De

Para

sbyte

byte, ushort, uint, ulong o char

byte

Sbyte o char

short

sbyte, byte, ushort, uint, ulong o char

ushort sbyte, byte, short o char


int

sbyte, byte, short, ushort, uint, ulongo char

uint

sbyte, byte, short, ushort, int o char

long

sbyte, byte, short, ushort, int, uint, ulong o char

ulong

sbyte, byte, short, ushort, int, uint, long o char

char

sbyte, byte o short

float

sbyte, byte, short, ushort, int, uint, long, ulong, charo decimal

13

double sbyte, byte, short, ushort, int, uint, long, ulong, char, floato decimal
decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float o double
Comentarios
Las conversiones numricas explcitas pueden producir prdida de
precisin o provocar excepciones.

Cuando se convierte un valor decimal en un tipo integral, este valor se


redondea hacia cero al valor entero ms prximo. Si el valor entero
resultante queda fuera del intervalo del tipo de destino, se produce una
excepcin OverflowException.

Cuando se convierte un valor double o float en un tipo integral, el valor se


trunca. Si el valor entero resultante queda fuera del intervalo del valor de
destino, el resultado depende del contexto de comprobacin de
desbordamiento. En un contexto comprobado, se produce una excepcin
OverflowException, mientras que en un contexto no comprobado, el
resultado es un valor no especificado del tipo de destino.

Cuando se convierte double en float, el valor double se redondea al valor


float ms prximo. Si el valor de tipo double es demasiado pequeo o
demasiado grande para ajustarse al tipo de destino, el resultado ser cero o
infinito.

Cuando se convierte float o double en decimal, el valor de origen se


convierte en una representacin decimal y se redondea al nmero ms
prximo despus de la vigsimo octava posicin decimal si es necesario.
Segn el valor de origen, se puede producir uno de los siguientes
resultados:

Si el valor de origen es demasiado pequeo para representarlo como


decimal, el resultado se convierte en cero.

Si el valor de origen es NaN (no es un nmero), infinito o demasiado


grande para ser representado como decimal, se produce una
excepcin OverflowException.

Cuando se convierte decimal en float o double, el valor decimal se


redondea al valor double o float ms prximo.

14

LITERALES
ENTEROS
El tipo de un literal entero se determina como sigue:

Si el literal no tiene sufijo, su tipo es el primero de los tipos en los cuales se


puede representar su valor: int, uint, long, ulong.
Si el literal tiene el sufijo U o u, su tipo es el primero de los tipos en los
cuales se puede representar su valor: uint, ulong.
Si el literal tiene el sufijo L o l, su tipo es el primero de los tipos en los
cuales se puede representar su valor: long, ulong.
Si el literal tiene el sufijo UL, Ul, uL, ul, LU, Lu, lU o lu, es de tipo ulong.

REALES
Si no se especifica el sufijo de tipo real, el tipo del literal real es double. De lo
contrario, el sufijo de tipo real determina el tipo del literal real, como sigue:
Un literal real con el sufijo F o f es de tipo float. Por ejemplo, los literales 1f,
1.5f, 1e10f y 123.456F son de tipo float.
Un literal real con el sufijo D o d es de tipo double. Por ejemplo, los literales
1d, 1.5d, 1e10d y 123.456D son de tipo double.
Un literal real con el sufijo M o m es de tipo decimal. Por ejemplo, los
literales 1m, 1.5m, 1e10m y 123.456M son de tipo decimal. Este literal se
convierte en un valor decimal tomando el valor exacto y, si es necesario,
redondeando al valor ms cercano que se pueda representar mediante el
redondeo de banca (Seccin 4.1.7). Cualquier escala que se detecte en el
literal se conserva, salvo que el valor est redondeado o sea cero (en este
caso, el signo y la escala son 0). Por lo tanto, el anlisis del literal 2.900m
forma un decimal con signo 0, coeficiente 2900 y escala 3.
Si el literal especificado no puede representarse en el tipo indicado, se produce un
error en tiempo de compilacin.
El valor de un literal real de tipo float o double se determina mediante el uso del
modo "redondeo al ms cercano" de IEEE.
Tenga en cuenta que, en un literal real, siempre son necesarios dgitos decimales
tras el punto decimal. Por ejemplo, 1.3F es un literal real, pero no as 1.F.
Convert (Clase)
Convierte un tipo de datos base en otro tipo de datos base.

15

Espacio de nombres: System


Comentarios
Esta clase devuelve un tipo cuyo valor es equivalente al valor de un tipo
especificado. Los tipos base que se admiten son Boolean, Char, SByte, Byte,
Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Decimal, DateTime y
String.
Existe un mtodo de conversin para convertir todos y cada uno de los tipos base
en los dems tipos base. Sin embargo, la llamada real a un mtodo de conversin
determinado puede generar uno de cuatro resultados, dependiendo del valor del
tipo base en tiempo de ejecucin y el tipo base de destino. Estos cuatro resultados
son:

Ninguna conversin. Esto sucede cuando se intenta convertir un tipo en s


mismo (por ejemplo, llamando a Convert..::.ToInt32(Int32) con un
argumento de tipo Int32). En este caso, el mtodo devuelve una instancia
del tipo original.

Objeto InvalidCastException. Esto sucede cuando no se admite una


conversin determinada. Se produce una InvalidCastException para las
conversiones siguientes:

Conversiones de Char a Boolean, Single, Double, Decimal o DateTime.

Conversiones de Boolean, Single, Double, Decimal o DateTime a Char.

Conversiones de DateTime en cualquier otro tipo excepto String.

Conversiones de cualquier otro tipo, excepto String en DateTime.

Una conversin correcta. Para las conversiones entre dos tipos base
diferentes no mostradas en los resultados anteriores, todas las
conversiones de ampliacin y todas las conversiones de restriccin que no
producen una prdida de datos sern correctas y el mtodo devolver un
valor del tipo base concreto.

Objeto OverflowException. Esto sucede cuando una conversin de


restriccin produce una prdida de datos. Por ejemplo, al intentar convertir
una instancia Int32 cuyo valor es 10000 en un tipo Byte se produce una
16

OverflowException porque 10000 est fuera del intervalo del tipo de datos
Byte.

No se producir una excepcin si la conversin de un tipo numrico produce una


prdida de precisin, es decir, la prdida de algunos de los dgitos menos
significativos. Sin embargo, la excepcin se producir si el resultado es mayor que
lo que puede representar el tipo de valor devuelto del mtodo de conversin.
Por ejemplo, cuando un tipo Double se convierte en un tipo Single, se puede
producir una prdida de precisin pero no se produce ninguna excepcin. Sin
embargo, si la magnitud del tipo Double es demasiado grande para que un tipo
Single lo represente, se produce una excepcin de desbordamiento.

17

Tabla donde se describan las acciones semnticas a la estructura de la gramtica

El anlisis semntico se realiza despus del sintctico y es ms difcil de formalizar que ste. Se
trata de determinar el tipo de los resultados intermedios, comprobar que los argumentos que
tiene un operador pertenecen al conjunto de los operadores posibles, y si son compatibles entre
s, es decir, comprobar que el significado de lo que se va leyendo es vlido.
El anlisis semntico utiliza como entrada el rbol sintctico detectado para comprobar
restricciones de tipo y otras limitaciones semnticas y preparar la generacin de cdigo.
La salida terica de la fase de anlisis semntico sera un rbol semntico. Consiste en un rbol
sintctico en el que cada una de sus ramas ha adquirido el significado que debe tener. En el caso
de los operadores polimrficos (un nico smbolo con varios significados), el anlisis semntico
determina cul es el aplicable. Por ejemplo, consideremos la siguiente sentencia de asignacin:
A := B + C
En Pascal, el signo + sirve para sumar enteros y reales, concatenar cadenas de caracteres y unir
conjuntos. El anlisis semntico debe comprobar que B y C sean de un tipo comn o compatible y
que se les pueda aplicar dicho operador. Si B y C son enteros o reales los sumar, si son cadenas
las concatenar y si son conjuntos calcular su unin.
Acciones semnticas
Dependiendo del tipo de sentencias
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 llamadaa una funcin o
procedimiento.

Identificacin de variables

Comprobar si el 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 de dichos procesos.

Sobrecarga de operadores y funciones

Detectar y solventar.

18

Reporte de la manipulacin de la tabla de conversin de smbolos y de


direcciones.

COMO SE LLEVA A CABO LA CREACION DE LA TABLA DE SIMBOLOS Y DE DIRECCIONES

FUNCION
CARACTERISTICAS
CONTENIDO
ESTRUCTURA
OPERACIONES

RESUMEN
Una tabla de smbolos es la estructura de datos que permite almacenar informacin semntica, es
decir en ella se encuentra el significado asociado a las estructuras formales (sintaxis) del lenguaje.
Su objetivo es delimitar el contexto de un conjunto de frases o instrucciones de un lenguaje libre
de contexto, es decir que los lenguajes representados por las variables se describen
recursivamente en trminos de otros lenguajes o de smbolos primitivos llamados terminales y las
reglas que describen el lenguaje asociado con cada variable se llaman producciones.
Algunas de las utilidades de la tabla de smbolos son:
- Simplifica el anlisis sintctico
- Ayudan en las comprobaciones semnticas
- Y en la generacin de cdigo.
El contenido de 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 dependen a nivel
general si:
* Del tipo de gestin de memoria
* El lenguaje esta, o no, estructurado en bloques
* El smbolo es, o no, parmetros de un procedimiento o funcin
CONSTRUCCION DE LA TABLA DE SIMBOLOS
1.

El analizador lxico deber:

- Insertar los smbolos 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.
19

OPERACIONES SOBRE LA TABLA DE SIMBOLOS


1.
2.
3.

Insertar
Consultar
Modificar (aadir atributos nuevos).

Lenguaje con declaraciones de variables est conformado por dos tipos: explicitas e implcitas, en
la primera est compuesta por declaraciones de tipo operacin de insertar y de referencia donde
solo se puede consultar; y en las implcitas contiene las operaciones de consulta si no est ya
incluida e inserta en caso contrario y adems tiene lenguajes con estructura de bloque, es decir
crea subtablas.
En la implementacin de la tabla de smbolos, la distribucin de la informacin depender de las
caractersticas del lenguaje y de las restricciones establecidas para los smbolos. Est conformado
por campos:
Campo para el smbolo que a su vez se divide en formato fijo y variable respecto al primero como
su nombre lo dice establece un lmite en el nmero de caracteres que forman los smbolos. En el
segundo se dispone de la TS de un rea auxiliar en donde se introducen los smbolos de un modo
consecutivo.
Campo de direccin: este se divide en dos lenguajes sin y con estructura de bloques en esta ltima
se necesitan dos campos nmero y direccin de bloque.
Campo tipo: este se introduce cuando se identifica una declaracin explcita o implcita de una
variable. Y se utiliza para determinar la memoria de almacenamiento y la comprobacin de tipos.
Campo nm. de dimensiones / nm. de parmetros: la realiza el analizador semntico y sirve
para delimitar el tamao de memoria necesaria para representar el smbolo.
Campo 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 TS
Esta se subdivide en dos fases:
1- Lenguaje SIN estructura de bloque: es por medio de una lista est dividida por ordenada y
no ordenada en la primera se representa por medio de rboles binarios y tablas hash.
2- Lenguajes CON estructura de bloque: una tabla para cada bloque con estructura de PILA. La
estructura consta de una PILA + INDICE.

20

GRAMATICA 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. Los atributos a mencionar son dos:
1) ATRIBUTO HEREDADO: si b est asociado con algn smbolo de .
Las reglas de evaluacin se realizan cuando se aplican reducciones en el anlisis sintctico. Dentro
de los requisitos de evaluacin los atributos deben definirse en funcin de los atributos asociados
con los smbolos gramaticales a su derecha y realizar un anlisis ascendente.
2) ATRIBUTO SINTETIZADO: si b est asociado con el smbolo no terminal A.
Su evaluacin depende de los atributos asociados con los smbolos precedentes en la derivacin.
Como requisito es realizar un anlisis descendente.
GRAFOS DE DEPENDENCIA
Cuando aparecen definidos atributos sintetizados y heredados, es necesario establecer un ORDEN
DE EVALUACION DE LOS ATRIBUTOS, para ello se utilizan los grafos de dependencia estos estn
construidos por nodos y arcos, cada uno de ellos tiene algn mtodo de evaluacin de las reglas
semnticas; por ejemplo el nodo est compuesto por uno mtodo de evaluacin que es rbol de
anlisis dice que para cada entrada se construye el rbol sintctico. Y en arco basado en reglas
semnticas dependiendo de estas (atributos heredados o sintetizados) se establece el orden de
evaluacin.

COMPROBACIONES SEMANTICAS
ESTATICAS: las comprobaciones sintcticas y semnticas.
DINAMICAS: realizadas en tiempo de ejecucin.
SEMANTICAS:
-

De tipo: operandos en las expresiones


De flujo de control: puntos de salida y entrada.
De unicidad: verifica la presencia de smbolos de forma nica.
Relacin de nombres. Un mismo nombre puede aparecer ms de una vez.

EXPRESIONES DE TIPOS

Tipos bsicos: boolean, char, integer, real,.


Nombre de tipos
21

CONSTRUCTORES DE TIPOS:
* Matrices
* Producto
* Registro
* Apuntadores
* Funciones
EQUIVALENCIA ESTRUCTURAL
Modo de determinar si dos expresiones de tipos son equivalentes:
- Aplicando GDA
- Algoritmo de anlisis de los constructores
1) EQUIVALENCIA DE NOMBRE: cuando las expresiones son nombradas, entonces dos
expresiones de tipos son equivalentes de nombre si y solo si ambas expresiones son idnticas.
2)

ESPECIFICACION DE UN COMPROBADOR DE TIPOS ELEMENTAL

Un comprobador de tipos ha de dispones 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

TOPICOS EN LA COMPROBACION DE TIPOS


1)

Conversin de tipos (Coercin).

- Implcita: se realiza automticamente por medio del compilador


- Explicita: se explicita por parte del programador la conversin
2)

Sobrecarga de funciones y operadores

+,-, son smbolos sobrecargados ya que su significado depender del contexto.


(,), Pueden estar sobrecargadas (ADA, FORTRAN), ya que se usan como referencia de elementos de
matrices y como funciones.

22

Ejemplos:

Ejemplo de una tabla de smbolos tpica.

Los atributos que se manejan en la tabla anterior y que se describen enseguida, no son
estrictamente necesarios para todos los compiladores; sin embargo, cada uno de tales atributos
deber ser considerado para la implementacin de un compilador de un compilador en particular.
Nombre de la variable.
Direccin del cdigo objeto.
Tipo.
Valor (o nmero de parmetros para uno procedimiento).
Nmero de lnea fuente donde fue declarada la variable.
Nmeros de lnea fuente donde se hace referencia a la variable.
Liga. Campo cuyos valores sirven para listar las variables en orden alfabtico.

23

Tabla de smbolos del compilador STL


Al inicio del anlisis se genera un archivo de texto de salida, con extensin .sym, en el que se
traduce el flujo de smbolos en entrada en un archivo con los indicadores de cada smbolo
terminal. Cuando se encuentran coincidencias de la entrada con respecto a la tabla de smbolos, se
lee el smbolo (quinta columna) de la tabl y se guarda en el archivo de salida. Al final de este paso
se obtiene un archivo de texto con los smbolos correspondientes a cada componente lxico de
entrada, el cual es ms fcil de interpretar por los analizadores sintctico y semntico. Cuando el
analizador encuentra una palabra no definida en la tabla, ste la incluye al final de la tabla de
smbolos, le asigna el siguiente smbolo disponible (ndice numrico) y guarda el smbolo en el
archivo de salida.

24

Propuesta de proyecto

El compilador es un programa que se encarga de leer un archivo de determinado lenguaje de


programacin y "traducirlo" al lenguaje mquina que es el conjunto de instrucciones (en el caso de
las computadoras, el lenguaje binario) que la computadora soporte o "interpreta".
Al leerse nuestro cdigo fuente, el compilador comienza 3 procesos de anlisis:
Lxico
Sintctico
Semntico
A continuacin explico con ejemplos lo que realizar cada uno de stos anlisis:
1. Anlisis Lxico: Supongamos que mi sistema o programa es para automatizar la ventilacin de
una habitacin; algo sencillo. Las acciones del ducto de ventilacin son: abrir y cerrar. No se puede
decir slo abrir o cerrar ya que la ventilacin (en ste caso) incluye un aire acondicionado
(dejmoslo en ventilador) que debe encenderse o apagarse independientemente de si nuestra
ventilacin est abierta o cerrada. Nuestras "palabras reservadas", que son nicamente las
palabras que entiende nuestro compilador sern: abrir, cerrar, encender, apagar, ventilador y
ventilacin. El anlisis lxico buscar entonces que esas palabras estn dentro de nuestro "cdigo
fuente". Si queremos crear una estructura para el cdigo fuente, como en HTML o cualquier
lenguaje, el programa debe determinar si la estructura se cumple. En caso contrario, no compilar.
Analizador Lxico programado en Java y reconoce: identificadores (variable), palabras reservadas,
nmeros, operadores, separadores, letra y dgito, y se crea con la intencin de en un futuro poder
desarrollar un compilador.
El analizador lxico deber proporciona una manera rpida de Imprimir el tipo de la expresin y
cuantos son.
Nos permitir hacer las operaciones de evaluacin de nuestras expresiones

25

CONCLUSIN
Durante la elaboracin de este trabajo aprendimos que uno de los 3 tipos de
errores de un compilador, el semntico, es importante, ya que ayuda a crear un cdigo
fuente correcto y libre de errores, pero cabe destacar que esto ltimo no sera posible sin
la deteccin de los otros dos tipos de errores.
La mayora de los compiladores detectan los errores semnticos durante la escritura del
cdigo, y nos muestra una pequea notificacin de en donde se encuentra el error y ya es
problema del programador corregirlo, pero durante la compilacin si se nos llega a pasar
un error este es nuevamente detectado y ahora s es necesario corregirlo para poder
seguir con la compilacin y terminar con la ejecucin del cdigo.
De manera no visible al usuario, durante la compilacin se van creando tablas de smbolo
y direcciones, estas son las que almacenan los valores de las variables, las expresiones y
todo lo que ocurre durante el proceso de anlisis.
Como punto final hemos decidido crear una propuesta de proyecto, el cual trata de crear
un analizador lxico en el lenguaje de programacin JAVA, esperando que este sea de
agrado y as poder llevarlo a cabo.

26

BIBLIOGRAFA

2013. AngelFire. [En lnea] 20 de Junio de 2013. [Citado el: 07 de Septiembre de 2015.]
http://www.angelfire.com/planet/ispr/Unidad3/3.4.htm.
Daniel. 2011. Compiladores. [En lnea] 18 de Mayo de 2011. [Citado el: 07 de Septiembre de
2015.] http://compiladoresasignatura.blogspot.mx/2011/05/unidad-vii-manejo-de-errores.html.
GianBros. 2011. Puras Lneas. [En lnea] 11 de Agosto de 2011. [Citado el: 07 de Septiembre de
2015.] http://puraslineas.com/2011/08/11/analizador-lexico/.
Louden, Kennet. Construccin de compiladores - Principios y prcticas. Primera. Mxico : s.n.
Meza, Marisela. 2013. Manejo de errores semnticos. [En lnea] 30 de Septiembre de 2013.
[Citado el: 07 de Septiembre de 2015.] https://prezi.com/jmntejze1wxf/manejo-de-erroressemanticos/.
Ullman, Sethi. Compiladores - Principios, tcnicas y herramientas. s.l. : Pearson Educacin.
Vela, Vargas. 2007. Visin Electrnica. [En lnea] 07 de Enero de 2007. [Citado el: 07 de
Septiembre de 2015.] http://revistas.udistrital.edu.co/ojs/index.php/visele/article/view/246/356.

27

You might also like