You are on page 1of 27

TECNOLGICO NACIONAL DE MXICO

INSTITUTO TECNOLOGICO DE ACAPULCO

Educacin Tecnolgica con compromiso social

Ingeniera En Sistemas Computacionales


Carrera
Lenguajes y autmatas II
Asignatura
Actividades de aprendizaje
Unidad 1. Anlisis semntico
Competencia especfica a desarrollar
Reporte de la manipulacin de la tabla de conversin de smbolos y de direcciones
Profesor: Silvestre Bedolla Solano.
Integrantes del equipo 7
Alumnos:
Jimenez Gonzalez Alam Emmanuel
Hidalgo Snchez Teresita Berenice
Arancibia Garca ngel Andrs
Jimenez Leal Miguel Angel

10320978
11320155
10320918
10320896

Acapulco, Guerrero, 02 de diciembre del 2015

Contenido
Introduccin.......................................................................................................... 2
0

INTRODUCCIN................................................................................................... 3
DESARROLLO...................................................................................................... 3
TIPOS DE ERRORES......................................................................................... 5
TRATAMIENTO DE LOS ERRORES LEXICOS.......................................................6
TRATAMIENTO DE ERRORES SINTCTICOS.......................................................7
IGNORAR EL PROBLEMA (PANICMODE)..........................................................7
RECUPERACIN A NIVEL DE FRASE...............................................................7
REGLAS DE PRODUCCIN ADICIONALES PARA EL CONTROL DE ERRORES....8
CORRECCIN GLOBAL..................................................................................8
TRATAMIENTO ERRORES SEMNTICOS............................................................8
COMPROBACIN DE TIPOS............................................................................8
ASPECTOS GENERALES................................................................................8
ESPECIFICACIN DE UN COMPROBADOR DE TIPOS BSICO..........................9
OTRAS COMPROBACIONES SEMNTICAS Y RECUPERACIN DE ERRORES SEMNTICOS

Manipular la tabla de conversin de smbolos y de direcciones...................................22


CONCLUSIN:.................................................................................................... 29
Bibliografa.......................................................................................................... 30

Introduccin
El proceso de la compilacin se desglosa en dos partes: la parte que depende solo del lenguaje fuente
(etapa inicial o front-end) y la parte que depende solo del lenguaje objeto (etapa final o back-end).
1

La etapa inicial traduce un programa fuente a una representacin intermedia s partir de la cual la etapa
final genera el cdigo objeto. De esta forma, los detalles que tienen que ver con las caractersticas del
lenguaje objeto (cdigo ensamblador, cdigo maquina absoluto o relocalizable,...), la arquitectura de la
maquina (nmero de registros, modos de direccionamiento, tamao de los tipos de datos, memoria
cache,...), el entorno de ejecucin (estructura de registros y memoria de la mquina donde se va a
ejecutar el programa...) y el sistema operativo se engloban en la etapa final y se aslan del resto.
El cdigo intermedio es un cdigo abstracto independiente de la mquina para la que se generar el
cdigo objeto. El cdigo intermedio ha de cumplir dos requisitos importantes: ser fcil de producir a partir
del anlisis sintctico, y ser fcil de traducir al lenguaje objeto.
Con una representacin intermedia bien definida, un compilador para el lenguaje i y la maquina j puede
ser construido combinando el front-end para el lenguaje i con el back-end de la maquina j. De esta
manera se pueden construir m*n compiladores escribiendo nicamente m front-ends y n back-ende.

1._Reporte de la deteccin y recuperacin de errores semnticos


INTRODUCCIN
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.
Objetivos

Informar con claridad, exactitud


Recuperacin rpida
recuperacin no es correccin
2

No debe retrasar el procesamiento de programas sin errores


No generar errores en cascada (ej. eliminar identificador)

Acciones posibles

Detectar errores
Informar de los errores
Recuperar de los errores
Corregir errores

DESARROLLO
A continuacin se muestra un fragmento de cdigo de un mtodo de la clase Errores escrito en C++, para
el tratamiento de errores sintcticos. En el caso que se presenta cada vez que se encuentra un error el
compilador se detiene, y finaliza el proceso.

Una de las funciones ms importantes de un compilador es su respuesta a los errores en un programa


fuente. Los errores pueden ser detectados durante casi cualquier fase de la compilacin. Estos errores
estticos (o de tiempo de compilacin) deben ser notificados por un compilador, y es importante que el
compilador sea capaz de generar mensajes de error significativos y reanudar la compilacin despus de
cada error. Cada fase de un compilador necesitar una clase ligeramente diferente de manejo de errores.
Y, por lo tanto, un manejador de errores debe contener operaciones diferentes, cada una apropiada para
una fase y situacin especfica. Es recomendable estudiar las tcnicas de manejo de errores por cada
fase.
Una definicin de lenguaje por lo general requerir no solamente que los errores estticos sean
detectados por un compilador, sino tambin ciertos errores de ejecucin. Esto requiere que un compilador
genere cdigo extra, el cual realizar pruebas de ejecucin apropiadas para garantizar que todos esos
3

errores provocarn un evento apropiado durante la ejecucin. El ms simple de tales eventos ser
detener la ejecucin del programa. Sin embargo, a menudo esto no es adecuado, y una definicin de
lenguaje puede requerir la presencia de mecanismos para el manejo de excepciones. stos pueden
complicar sustancialmente la administracin de un sistema de ejecucin, especialmente si un programa
puede continuar ejecutndose desde el punto donde ocurri el error.

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 lxicos: Devuelve la secuencia de tokens: id asig id suma nmero ptocoma


Anlisis Sintctico: Orden de los tokens vlido
Anlisis Semntico: Tipo de variables asignadas incorrecta

TIPOS DE ERRORES
Tipos de errores que suelen ocurrir (dependiendo de la fase):
Lxicos: No concuerda con ninguna ER.
Ejemplo: escribir mal una palabra
Sintcticos: La estructura que se ha seguido no es correcta.
Ejemplo: expresin con parntesis no emparejados.
Semnticos: La estructura est bien pero hay errores de significado
Ejemplo: operador y operando incompatibles.
Lgicos: Los comete el programador
Ejemplo: una llamada infinitamente recursiva
4

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 LOS ERRORES LEXICOS
Un traductor debe adoptar alguna estrategia para detectar, informar y recuperarse para seguir analizando
hasta el final.
Las respuestas ante el error pueden ser:
Inaceptables: Provocadas por fallos del traductor, entrada en lazos infinitos, producir resultados
errneos, y detectar slo el primer error y detenerse.
Aceptables: Evitarla avalancha de errores (mala recuperacin) y, aunque ms complejo, informar y
reparar el error de forma automtica. La conducta de un Analizador de Lxico es el de un
Autmata finito o scanner.
Deteccin del error: El analizador de Lxico detecta un error cuando no existe transicin desde el
estado que se encuentra con el smbolo de la entrada. El smbolo en la entrada no es el esperado.
Los errores lxicos se detectan cuando el analizador lxico intenta reconocer componentes lxicos y la
cadena de caracteres de la entrada no encaja con ningn patrn. Son situaciones en las que usa un
carcter invalido (@,$,",>,...), que no pertenece al vocabulario del lenguaje de programacin, al escribir
mal un identificador, palabra reservada u operador.
Errores lxicos tpicos son:
Nombre ilegales de identificadores: un nombre contiene caracteres invlidos.
Nmeros incorrectos: Un numero contiene caracteres invlidos o no est formado correctamente, por
ejemplo 3,14 en vez de 3.14 o 0.3.14.
Errores de ortografa en palabras reservadas: caracteres omitidos, adicionales o cambiados de sitio,
por ejemplo la palabra while en vez de hwile.
Fin de archivo: se detecta un fin de archivo a la mitad de un componente lxico.
Los errores lxicos se deben a descuidos del programador. En general, la recuperacin de errores lxicos
es sencilla y siempre se traduce en la generacin de un error de sintaxis que ser detectado ms tarde
por el analizador sintctico cuando el analizador lxico devuelve un componente lxico que el analizador
sintctico no espera en esa posicin.
Los mtodos de recuperacin de errores lxicos se basan bien en saltarse caracteres en la entrada hasta
que un patrn se ha podido reconocer; o bien usar otros mtodos ms sofisticados que incluyen la
insercin, borrado, sustitucin de un carcter en la entrada o intercambio de dos caracteres consecutivos.
Una buena estrategia para la recuperacin de errores lxicos:
Universidad Nacional del Santa Curso: Teora de Compiladores
Si en el momento de detectar el error ya hemos pasado por algn estado final ejecutamos la
accin correspondiente al ltimo estado final visitado con el lexema formado hasta que salimos
de l; el resto de caracteres ledos se devuelven al flujo de entrada y se vuelve al estado inicial;

Si no hemos pasado por ningn estado final, advertimos que el carcter encontrado no se
esperaba, lo eliminamos y proseguimos con el anlisis.
TRATAMIENTO DE LOS ERRORES SINTACTICOS

TRATAMIENTO DE ERRORES SINTCTICOS


Muchos errores de naturaleza sintctica Recuperacin: Al producirse un error el compilador debe ser
capaz de informar del error y seguir compilando. (Ideal)
El manejo de errores de sintaxis es el ms complicado desde el punto de vista de la creacin de
compiladores. Nos interesa que cuando el compilador encuentre un error, se recupere y siga buscando
errores. Por lo tanto el manejador de errores de un analizador sintctico debe tener como objetivos:

Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su localizacin.
Recuperarse del error, para poder seguir examinando la entrada.
No ralentizar significativamente la compilacin.

Un buen compilador debe hacerse siempre teniendo tambin en mente los errores que se pueden
producir; con ello se consigue:

Simplificar la estructura del compilador.


Mejorar la respuesta ante los errores.

Tenemos varias estrategias para corregir errores, una vez detectados:


IGNORAR EL PROBLEMA (PANICMODE)
Consiste en ignorar el resto de la entrada hasta llegar a una condicin de seguridad.
Una condicin tal se produce cuando nos encontramos un token especial (por ejemplo un ; o un END).
A partir de este punto se sigue analizando normalmente.
RECUPERACIN A NIVEL DE FRASE
Intenta recuperar el error una vez descubierto. En el caso anterior, por ejemplo, podra haber sido lo
suficientemente inteligente como para insertar el token ;. Hay que tener cuidado con este mtodo, pues
puede dar lugar a recuperaciones infinitas.
REGLAS DE PRODUCCIN ADICIONALES PARA EL CONTROL DE ERRORES
La gramtica se puede aumentar con las reglas que reconocen los errores ms comunes. En el caso
anterior, se podra haber puesto algo como:
sent_errne a sent_sin_acabarsentencia_acabada ;
sentencia_acabada sentencia ;
sent_sin_acabar sentencia
Lo cual nos da mayor control en ciertas circunstancias
CORRECCIN GLOBAL
Dada una secuencia completa de tokens a ser reconocida, si hay algn error por el que no se puede
reconocer, consiste en encontrar la secuencia completa ms

Parecida que s se pueda reconocer. Es decir, el analizador sintctico le pide toda la secuencia de tokens
al lxico, y lo que hace es devolver lo ms parecido a la cadena de entrada pero sin errores, as como el
rbol que lo reconoce.

TRATAMIENTO ERRORES SEMNTICOS


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 cambiaren
distintas llamadas a la funcin.
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.
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 operados 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.
7

Solo nos hemos centrado en las comprobaciones de tipo. Las otras son 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.

expresion returns [String type]


| IDENT {root.symbol = (Symbol)symtable[$IDENT.text]; $ty
2._Cuadro sinptico donde se describe el manejo de tipos eninst_asig
las expresiones y el uso de
| literal {$type=$literal.type;}
operadores
@init
{
mentos contenidos en instrucciones de nuestro lenguaje
tambin
debe ser
comprobado
durante la fase de anl
| llamada
{$type=$literal.type;}
FkvmAST
root
=
(FkvmAST)input.LT(1)
;
}
Instrucciones
: ^(ASIGNACION IDENT e1=expresion)
root.expType = $e1.type;

ma forma que el de los identificadores ya que el mecanismo que hemos utilizado para registrar su tipo durante e

Llamadas a funcin
Externa

expresion returns [String type]


| IDENT {
if(symtable.ContainsKey($IDENT.text))
{
root.symbol = (Symbol)symtable[$IDENT.text]; $type=ro
}

3._Lista de las reglas para la conversin de tipos (casting) en expresiones con tres ejemplos por
cada regla

ncillo an que en el caso de los literales ya que nos basaremos directamente en el tipo almacenado en la tabla

Una declaracin de operador de conversin introduce una conversin definida por el usuario que
aumenta las conversiones implcitas y explcitas predefinidas.
Una declaracin de operador de conversin que incluye la palabra clave implicit define una conversin
implcita definida por el usuario. Las conversiones implcitas pueden ocurrir en distintas situaciones,
incluyendo las invocaciones de miembros de funcin, las expresiones de conversin y las asignaciones.

Una declaracin de operador de conversin que incluye la palabra clave explicit define una conversin
explcita definida por el usuario. Las conversiones explcitas pueden ocurrir en las expresiones de
conversin.

Un operador de conversin convierte de un tipo origen, indicado por el tipo del parmetro del operador de
conversin, a un tipo destino, indicado por el tipo del valor devuelto del operador de conversin. Una
clase o estructura puede declarar una conversin de un tipo origen S a un tipo destino T si se cumple
Identificadores
todo lo siguiente:

S y T son tipos diferentes

S o T es el tipo de clase o estructura en el que tiene lugar la declaracin del operador.

Ni S ni T son de tipo object ni un tipo-de-interfaz.

T no es una clase base de S, y S tampoco lo es de T.

De la segunda regla se deriva que un operador de conversin debe convertir a o del tipo de la clase o
estructura en la que se declara el operador. Por ejemplo, es posible que un tipo de clase o de estructura
C defina una conversin de C a int y de int a C, pero no de int a bool.
No es posible volver a definir una conversin predefinida. Por lo tanto, no est permitido utilizar
operadores de conversin para convertir de o a object porque ya existen conversiones implcitas y
explcitas entre object y el resto de tipos. Adems, ni el tipo de origen ni el de destino de una conversin
puede ser un tipo base del otro, porque entonces ya existira una conversin.
Las conversiones definidas por el usuario no pueden convertir de o a tipos-de-interfaz. Esta restriccin
impide, en particular, que se produzcan transformaciones definidas por el usuario cuando se convierte a
un tipo-de-interfaz, y asegura que una conversin a un tipo-de-interfaz se ejecute correctamente slo si el
objeto que se est convirtiendo implementa realmente el tipo-de-interfaz especificado.
La firma de un operador de conversin est formado por el tipo de origen y el tipo de destino (sta es la
nica forma de miembro en la que el tipo de valor devuelto participa en la firma). La clasificacin implicit o
explicit de un operador de conversin no forma parte de la firma del operador. Por lo tanto, una clase o
una estructura no puede declarar a la vez operadores de conversin implicit y explicit con los mismos
tipos de origen y destino.

10

expresion returns [String type]


| literal {$type=$literal.type;}
;l
iteral returns [String +++type]
@init {
$type=;

En general, las conversiones implcitas definidas por el usuario deben disearse para que nunca
produzcan excepciones ni pierdan informacin. Si una conversin definida por el usuario puede dar lugar
a excepciones (por ejemplo, debido a que el argumento de origen est fuera del intervalo) o a prdida de
informacin (como descartar los bits de mayor orden), dicha conversin debera definirse como explcita.
En el ejemplo

usingSystem;
publicstruct Digit
{
byte value;
public Digit(byte value) {
if (value < 0 || value > 9) throw new ArgumentException();
this.value = value;
}
public static implicit operator byte(Digit d) {
returnd.value;
}
public static explicit operator Digit(byte b) {
return new Digit(b);

}
omo consultar
el tipo de token devuelto por el analizador sintctico y asignar directamente un tipo u otro en la
}

11
Literales

La conversin de Digit a byte es implcita porque nunca produce excepciones o pierde informacin, pero
la conversin de byte a Digites explcita ya que Digit slo puede representar un subconjunto de los
posibles valores de un byte.
Conversiones implcitas
La mayora de las conversiones, como la asignacin de un valor a una variable, se producen
automticamente. El tipo de datos de la variable determina el tipo de datos de destino de la conversin de
expresin.
En el ejemplo siguiente se muestra una conversin de datos implcita entre un valor int, un valor String y
un valor double.
vari : int;
var d : double;
var s : String;
i = 5;
s = i; // Widening: the int value 5 coverted to the String "5".
d = i; // Widening: the int value 5 coverted to the double 5.
s = d; // Widening: the double value 5 coverted to the String "5".
El clculo y chequeo de tipos de una expresin.

i = d; // Narrowing: the double value 5 coverted to the int 5.


i = s; // Narrowing: the String value "5" coverted to the int 5.
d = s; // Narrowing: the String value "5" coverted to the double 5.

Cuando se compila este cdigo, pueden aparecer advertencias en tiempo de compilacin para informar
de que las conversiones de restriccin pueden producir errores o ser muy lentas.
Puede ocurrir que las conversiones de restriccin implcitas no funcionen si la conversin requiere una
prdida de informacin. Por ejemplo, las siguientes lneas no funcionarn:
var i : int;
asignar ste a su nodo del rbol.

var f : float;
var s : String;
f = 3.14;

i = f; // Run-time error. The number 3.14 cannot be represented with an int.


s = "apple";
12

El tipo de una expresin

Manejo de tipos en las expresiones y el uso de operadores

i = s; // Run-time error. The string "apple" cannot be converted to an int.

Quizs te hayas preguntado qu pasa cuando escribimos expresiones numricas en las que no todos los
operandos son del mismo tipo. Por ejemplo:
char n;
int a, b, c, d;
float r, s, t;
...
a = 10;
b = 100;
r = 1000;
c = a + b;
s = r + a;
d = r + b;
d = n + a + r;
t = r + a - s + c;
...
En estos casos, cuando los operandos de cada operacin binaria asociados a un operador son de distinto
tipo, el compilador los convierte a un tipo comn. Existen reglas que rigen estas conversiones, y aunque
pueden cambiar ligeramente de un compilador a otro, en general sern ms o menos as:
1.
Cualquier tipo entero pequeo como char o short es convertido a int o unsignedint. En este punto
cualquier pareja de operandos ser int (con o sin signo), long, longlong,double, float o longdouble.
2.

Si un operando es de tipo longdouble, el otro se convertir a longdouble.

3.

Si un operando es de tipo double, el otro se convertir a double.

4.

Si un operando es de tipo float, el otro se convertir a float.

5.

Si un operando es de tipo unsignedlonglong, el otro se convertir a unsignedlonglong.

6.

Si un operando es de tipo longlong, el otro se convertir a longlong.

7.

Si un operando es de tipo unsignedlong, el otro se convertir a unsignedlong.


13

8.

Si un operando es de tipo long, el otro se convertir a long.

9.

Si un operando es de tipo unsignedint, el otro se convertir a unsignedint.

10.

Llegados a este punto ambos operandos son int.

Veamos ahora el ejemplo:


c = a + b; caso 10, ambas son int.
s = r + a; caso 4, a se convierte a float.
d = r + b; caso 4, b se convierte a float.
d = n + a + r; caso 1, n se convierte a int, la operacin resultante corresponde al caso 4, el resultado
(n+a) se convierte a float.
t = r + a - s + c; caso 4, a se convierte a float, caso 4 (r+a) y s son float, caso 4, c se convierte a float.
Tambin se aplica conversin de tipos en las asignaciones, cuando la variable receptora es de distinto
tipo que el resultado de la expresin de la derecha.
En el caso de las asignaciones, cuando la conversin no implica prdida de precisin, se aplican las
mismas reglas que para los operandos, estas conversiones se conocen tambin como promocin de
tipos. Cuando hay prdida de precisin, las conversiones se conocen como democin de tipos. El
compilador normalmente emite un aviso o warning, cuando se hace una democin implcita, es decir
cuando hay una democin automtica.
En el caso de los ejemplos 3 y 4, es eso precisamente lo que ocurre, ya que estamos asignando
expresiones de tipo float a variables de tipo int.

CONVERSIONES A BOOL
En C++ podemos hablar de otro tipo de conversin de tipo implcita, que se realiza cuando se usa
cualquier expresin entera en una condicin, y ms generalmente, cuando se usa cualquier expresin
donde se espera una expresin booleana.
El dominio del tipo bool es muy limitado, ya que slo puede tomar dos valores: true y false. Por convenio
se considera que el valor cero es false, y cualquier otro valor entero es true.
Por lo tanto, hay una conversin implcita entre cualquier entero y el tipo bool, y si aadimos esta regla a
las explicadas antes, cualquier valor double, longdouble, float o cualquiera de los enteros, inclusochar, se
puede convertir a bool.
Esto nos permite usar condiciones abreviadas en sentencias if, for, while o do..while, cuando el valor a
comparar es cero.

14

Por ejemplo, las siguientes expresiones booleanas son equivalentes:


0 == x equivale a !x.
0 != x equivale a x.
En el primer caso, usamos el operador == para comparar el valor de x con cero, pero al aplicar el
operador ! directamente a x obligamos al compilador a reinterpretar su valor como un bool, de modo que
si x vale 0 el valor es false, y !false es true. De forma simtrica, si x es distinto de cero, se interpretar
como true, y !true es false. El resultado es el mismo que usando la expresin 0 == x.
En el segundo caso pasa algo anlogo. Ahora usamos el operador != para comparar el valor de x tambin
con cero, pero ahora interpretamos directamente x como bool, de modo que si x vale 0 el valor es false, y
si x es distinto de cero, se interpretar como true. El resultado es el mismo que usando la expresin 0 !=
x.
No est claro cul de las dos opciones es ms eficaz, a la hora de compilar el programa. Probablemente,
la segunda requiera menos instrucciones del procesador, ya que existen instrucciones de ensamblador
especficas para comparar un entero con cero. Del otro modo estaremos comparando con un valor literal,
y salvo que el compilador optimice este cdigo, generalmente se requerirn ms instrucciones de este
modo.
Aadir que los ejemplos anteriores funcionan aunque el tipo de x no sea un entero. Si se trata de un valor
en coma flotante se realizar una conversin implcita a entero antes de evaluar la expresin.

Conversiones explcitas
Para convertir explcitamente una expresin a un tipo de datos concreto, utilice el identificador de tipo de
datos seguido de la expresin que se va a convertir entre parntesis. Las conversiones explcitas
requieren ms escritura que las implcitas, pero proporcionan ms seguridad con respecto a los
resultados. Adems, las conversiones explcitas pueden controlar conversiones con prdida de
informacin.
En el ejemplo siguiente se muestra una conversin de datos explcita entre un valor int, un valor String y
un valor double.
vari : int;
var d : double;
var s : String;
i = 5;
s = String(i); // Widening: the int value 5 coverted to the String "5".
d = double(i); // Widening: the int value 5 coverted to the double 5.
15

s = String(d); // Widening: the double value 5 coverted to the String "5".


i = int(d);

// Narrowing: the double value 5 coverted to the int 5.

i = int(s);

// Narrowing: the String value "5" coverted to the int 5.

d = double(s); // Narrowing: the String value "5" coverted to the double 5.


Las conversiones de restriccin explcitas suelen funcionar correctamente, aunque la conversin requiera
una prdida de informacin. La conversin explcita no se puede utilizar para convertir tipos de datos
incompatibles. Por ejemplo, no se pueden convertir datos Date a datos RegExp, y viceversa. Adems,
algunos valores no se pueden convertir porque no existe ningn valor razonable al que se puedan
convertir. Por ejemplo, se genera un error si se intenta convertir explcitamente el valor NaN de tipo
double a un valor decimal. Esto es as porque no hay un valor decimal natural que se pueda identificar
con NaN.
En este ejemplo, se convierte un nmero que tiene una parte decimal y una cadena en nmeros enteros:
vari : int;
var d : double;
var s : String;
d = 3.14;
i = int(d);
print(i);
s = "apple";
i = int(s);
print(i);
El resultado es:
3
0
El comportamiento de la conversin explcita depende del tipo de datos originales y del tipo de datos de
destino.

En C++ hay varios tipos diferentes de casting, pero de momento veremos slo el que existe tambin en
C.
Un casting tiene una de las siguientes sintaxis:

16

(<nombre de tipo>)<expresin>
<nombre de tipo>(<expresin>)
Esta ltima es conocida como notacin funcional, ya que tiene la forma de una llamada a funcin.
En el ejemplo anterior, las lneas 3 y 4 quedaran:
d = (int)(r + b);
d = (int)(n + a + r);
O bien:
d = int(r + b);
d = int(n + a + r);
Hacer un casting indica que sabemos que el resultado de estas operaciones no es un int, que la variable
receptora s lo es, y que lo que hacemos lo estamos haciendo a propsito. Veremos ms adelante,
cuando hablemos de punteros, ms situaciones donde tambin es obligatorio el uso de casting.

4._Tabla donde se describe 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

17

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.
Dependiendo del tipo de sentencias, las acciones semnticas pueden agruparse en:
Accin semntica
Sentencias de Declaracin

Descripcin
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.
Comprobar si un identificador ha sido
declarado antes de utilizarlo.

Identificacin de variables

Etiquetas
Constantes

Conversiones y equivalencias de tipo

Sobrecarga de operadores y funciones

Comprobar si hay etiquetas repetidas y


validacin.
Comprobar que no se utilicen en la
parte izquierda de una asignacin.
Verificacin.

Detectar y solventar.

18

5._Reporte de la manipulacin de la tabla de conversin de smbolos y de direcciones

Introduccin

La tabla de smbolos es una componente necesaria de un compilador. Al declarar un identificador


(normalmente una sola vez), este es insertado en la tabla. Cada vez que se utilice el identificador se
realizara una bsqueda en la tabla para obtener la informacin asociada (el valor).
Algunos problemas asociados son:
Bsqueda, dada la clave de un elemento, encontrar su valor.
Insercin, dado un par clave-valor, aadir un elemento nuevo a la tabla.
Cambio de valor, Buscar el elemento y cambiar su valor.
Borrado, eliminar un elemento de la tabla.
En este reporte en global el funcionamiento de la tabla de smbolos y las direcciones as como los
mtodos y unos ejemplos en el lenguaje C.

Manipular la tabla de conversin de smbolos y de direcciones.


Una tabla de smbolos es una estructura de datos que contiene una entrada para cada identificador
encontrado en el programa fuente, se crea durante la fase de anlisis lxico a travs de los componentes
lxicos, pero en el proceso de anlisis sintctico sufren algunas modificaciones.
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 programa fuente.
19

Los campos de cada entrada en la tabla de smbolos corresponden a los atributos de cada identificador.
(Tipo, valor, direccin, parmetros, etc.).
Durante la compilacin de un programa, cada vez que se encuentra un identificador en la tabla 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 puede recuperar los atributos de un identificador ya existente en la tabla de smbolos.

Un mecanismo de tabla de smbolos debe permitir aadir nuevas entradas y encontrar las entradas
existentes de un analizador lxico eficiente.
Los dos mecanismos para tablas de smbolos presentados a continuacin son listas lineales y tablas de
dispersin. Cada uno de estos mecanismos se evala basndose en el tiempo necesario para aadir n
entradas y realizar e consultas.
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.
Ambos mecanismos pueden adaptarse rpidamente para funcionar las reglas del anidamiento ms
cercano.
Un compilador debe ser capaz de aumentar dinmicamente la tabla de simbolos durante la complicacin.
Si la tabla de smbolos tiene tamao fijo al escribir el compilador, entonces el tamao debe ser lo
suficientemente grande como para almacenar cualquier programa fuente.
Es muy probable que dicho tamao sea demasiado grande para la mayora de los programas e
inadecuacin 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, almacenado en el registro solo un apuntador a
esta informacin, para hacer referencia a l.
Administracin de la Tabla de Smbolos.
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.

20

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.

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.
Las palabras clave deben estar en la tabla de smbolos antes de que comience el anlisis lxico.
Si el analizador lxico reconoce las palabras clave, entonces no necesitan aparecer en la tabla de
smbolos.
Si el lenguaje no convierte en palabras reservadas 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.
En algunos casos, el analizador lxico puede iniciar la entrada en cuanto aparezca un nombre en los
datos de entrada.
Operaciones con la Tabla de Smbolos.
En general en la Tabla de smbolos (TS a partir de ahora) se realizan dos operaciones: la insercin y la
bsqueda.
En C la operacin de insercin se realiza cuando se procesa una declaracin.
Hay dos posibilidades: que la TS est ordenada (o sea, nombres de variables por orden alfabtico) o que
no est ordenada.
Si est ordenada, entonces la operacin de insercin llama a un procedimiento de bsqueda para
encontrar el lugar donde colocar los atributos del identificador a insertar, por lo que en este caso la
insercin lleva tanto tiempo como la bsqueda. En cambio, si no est ordenada la TS, la insercin se
simplifica mucho aunque se complica la bsqueda, pues debe examinar toda la tabla.
En la bsqueda, se detectan los identificadores que no hayan sido declarados previamente, emitiendo un
mensaje de error.

ejemplo en lenguaje C: Undefined smbolo 'x', si es una variable que desea usarse pero no se
declar.
21

En la insercin, se detectan identififcadores que ya han sido declarados previamente, emitiendo un


mensaje de error

ejemplo en C: multipledeclarationfor 'x' si x ya estaba en TS.

Un nombre puede indicar varios objetos distintos, quizs incluso en el mismo bloqueo o procedimiento.
Por ejemplo, las declaraciones en C.
Int x;
Struct x ( float y, z;);
Utilizan x como entero y como etiqueta de una estructura con dos campos.
En ambos casos, el analizador lxico solo 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.
Analizador Sintctico(Parser)
Sintaxis: El orden correcto de las palabras
Ej. Programa Fuente: 34:= *x - 640;
Analex: NUM ASIGN POR ID MENOS NUM PTOCOMA
Parser: "Error Sintctico"

El Analizador semntico.
Semntica: Significado de las frases.
Estando una frase del programa fuente ya analizada sintcticamente ("parseada") pasa al analizador
semntico para verificar la intencin del programador con esa frase: "Pas por el parser y no present
errores".
Ejemplo:
22

byte b;
int v[3];
String s;//Error semntico
b = 4000; //out of range
s = 6000; //incompatible type's o "Type mismatch"
v[8]= 12; // out of range

Se crea el registro en la tabla de smbolos cuando se descubre el papel sintctico que desempea este
nombre.
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.
Los atributos de un nombre se introducen en respuesta a las declaraciones, que pueden ser implcitas.
Las etiquetas son identificadores seguidos de dos puntos, asi que una accin asociada con el
reconocimiento de dicho identificador puede ser introducir este hecho en la tabla de smbolos.
La sintaxis de las declaraciones de los procedimientos especifica que algunos identificadores son
parmetros formales.

23

6._Propuesta de proyecto final


Se pretende disear un software que sea capaz de analizar los errores tanto lxicos como sintcticos de
un lenguaje de programacin en especfico, o si mismo tambin tomar en cuenta la creacin de un
alfabeto para disear dicho software.
La implementacin de este dicho software ser diseado en el lenguaje de programacin c++, as
tambin se tomara en cuenta el alfabeto del mismo compilador y de un lenguaje lgico, el cual su nombre
es prolog.
Un compilador es un programa informtico, que se encarga de traducir el cdigo fuente de una aplicacin
que este en desarrollo, es decir convierte un programa hecho en lenguaje de programacin de alto nivel a
un lenguaje de mquina, el cual es conocido como de bajo nivel, de tal forma que sea ms entendible y
mucho ms fcil de procesar en el equipo en el que se est ejecutando.
De igual manera un traductor es el que toma como entrada un texto escrito y da como salida otro texto en
un lenguaje llamado objeto.
Un compilador est basado en distintos bloques los cuales se muestran en la siguiente imagen:

24

Un compilador est formado por dos procesos anlisis y sntesis.


1. Anlisis: El cual se trata de la escritura correcta del cdigo fuente. Esta a su vez comprende varias
fases:
Anlisis lxico: esta fase es la encargada de leer el cdigo fuente y separarlo en lotes para poder ser
ledo por el anlisis sintctico.
Anlisis sintctico: esta fase evala los lotes de cdigo con el fin de que este cumpla con los
requerimientos definidos por el compilador.
Anlisis semntico: en esta fase se busca establecer que el cdigo fuente cumpla con la semntica
solicitada por el compilador, es decir que el cdigo este correctamente escrito para poder ser
interpretado.
2. Sntesis: Despus del proceso de anlisis se procede a generar grupos de los componentes que
conforman el programa, para generar una salida.
Generacin de cdigo intermedio: este cdigo se genera con el fin de mejorar el uso de la memoria con
el fin de optimizar cdigo fuente.
Optimizacin de cdigo: el objeto de esta fase es mejorar el cdigo para que sea ms rpido ejecutarlo.
Generacin de cdigo: Aqu se crea el cdigo final de salida que va a ser interpretado por la mquina.

CONCLUSIN:
Es mucho ms difcil introducir mtodos formales para la recuperacin de errores semnticos que para la
recuperacin de errores sintcticos, ya que a menudo la recuperacin de errores semnticos es ad hoc.
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.
25

Sin embargo, la mayora de los errores semnticos pueden ser detectados mediante la revisin de la
tabla de smbolos, suponiendo un tipo que se base en el contexto donde ocurra o un tipo universal que
permita al identificador ser un operando de cualquier operador del lenguaje. Al hacerlo, evitamos la
produccin de un mensaje de error cada vez que se use la variable no definida. Si el tipo de un operando
no concuerda con los requisitos de tipo del operador, tambin es conveniente reemplazar el operando
con una variable ficticia de tipo universal.

Bibliografa
Cidecame. (s.f.). Errores de compilacion. Obtenido de
http://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro32/autocontenido/autocon/45__errores_se
mnticos.html
compiladores. (2011). Biblioteca uns. Obtenido de
http://biblioteca.uns.edu.pe/saladocentes/archivoz/publicacionez/sesion_v_3u___tratamiento_de_e
rrores.pdf
Louden., K. C. (noviembre de 2013). Construccin de compiladores Principios y prctica. Obtenido de Ed.
Thomson.
Microsoft. (febrero de 2014). Conversion de tipo de datos . Obtenido de https://msdn.microsoft.com/eses/library/vstudio/hdz2a0he(v=vs.100).aspx
Microsoft. (Marzo de 2014). Reconocimiento de datos . Obtenido de https://msdn.microsoft.com/eses/library/aa691370(v=vs.71).aspx

26

You might also like