Anda di halaman 1dari 19

TECNOLOGICO NACIONAL DE MEXICO

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


Disear mediante el uso de rboles de expresiones dirigidas por la sintaxis un analizador
semntico para una meta-compilador.

Profesor: Silvestre Bedolla Solano.

ELIDA CARLOS MOLINA 12320007

ISAAC MANZO SOLIS 11320602

MIGUEL ANGEL ARCINIEGA RODRIGUEZ 11320503

DAVID RADILLA MIRANDA 11320634

ADIEL BENITEZ FLORES 11320517

Acapulco, Guerrero, Septiembre 2015

1
ndice

Introduccin.3

Actividad 1...4

Actividad 2...6

Actividad 3..9

Actividad 4..10

Actividad 5..15

Actividad 6..17

Conclusin..19

Bibliografa.....20

2
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).

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-ends.

3
ACTIVIDAD 1

Reporte de la deteccin y recuperacin de errores semnticos.

Error semntico.

Los errores semnticos corresponden a la semntica del lenguaje de


programacin, la cual normalmente no est descrita por la gramtica. Los errores
semnticos ms comunes son la omisin de declaraciones.

Utiliza el rbol sintctico y la formacin en la tabla de smbolos para comprobar la


consistencia semntica del programa fuente con la definicin del lenguaje.

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.

Ejemplos de errores semnticos:

Identificadores no definidos.
4
Operadores y operandos no compatibles.
Se declar X antes de usarlo?
Se declar X pero no se usa?
La referencia a una posicin en un array est dentro de sus lmites?
Estrategias para la recuperacin de errores.

Modo pnico.

El AS desecha componentes lxicos hasta encontrar un carcter de


sincronizacin.

Nivel de frase.

Utiliza una correccin de caracteres adyacentes, ya sea por insercin, eliminacin


o intercambio.

Producciones de error.

Se pueden generar gramticas para generar producciones de error y as de esta


forma seguir con el proceso.

Correccin global.

Sera recomendable que un traductor hiciera el mnimo de cambios para procesar


una entrada invlida.

Conclusin.

Un comprobador de tipos debe informar de la naturaleza y posicin del error


y recuperarse.
Es ms difcil introducir mtodos para la recuperacin de errores
semnticos.
El tipo de error ms obvio es el sintctico, en cambio los errores semnticos
son ms sutiles.

Ejemplo:
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

5
Figura 1.2 Ejemplo de los errores semnticos que podemos encontrar

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

Implementacin en c++ de errores semnticos

6
ACTIVIDAD 2

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


el uso de operandos

Operadores y expresiones

Una expresin es cualquier sentencia del programa que puede ser evaluada y
devuelve un valor.
Un operador es un carcter o una secuencia de caracteres. Definen las
operaciones que van a realizarse con los datos u operandos.
Lista de operadores segn su tipo:

Operadores aritmticos:
+ Suma
- Resta
* Producto
/ Divisin: entera para escalares, real para reales
% Mdulo: retorna el resto de una divisin entre enteros
-(unario) Cambio de signo
+(unario) No hace nada
Operadores de incremento y decremento:
++ Incremento en uno.
-- decremento en uno.
Estos operadores pueden ser prefijos o postfijos. Si son prefijos el operando se
incrementa (decremento) antes de ser evaluado en una expresin, si son postfijos
el operando se incrementa (decremento) despus de la evaluacin.

Operadores relacionales:
> Mayor
< Menor
>= Mayor o igual
<= Menor o igual
== Igual
!= Distinto

Operadores lgicos:

&& AND lgico


|| OR lgico
! NOT lgico
Toman expresiones como operandos, retornando verdadero o falso como en los
operadores relacionales

Operadores de bit:
& Producto binario de bits (AND).
| Suma binaria de bits (OR).

7
^ Suma binaria exclusiva de bits (XOR).
<< Desplazamiento hacia la izquierda del primer operando tantos bits como
indique el segundo operando.
<< Desplazamiento hacia la derecha del primer operando tantos bits como indique
el segundo operando.
~ (unario) Complemento a uno (cambia unos por ceros).
- (unario) Complemento a dos (cambio de signo).
Estos operadores tratan los operandos como palabras de tantos bits como tenga
su tipo, su tipo slo puede ser entero (char, short, int, long).

Operadores de asignacin:
= Asignacin de la expresin de la derecha al operando de la izquierda.
Si delante del operador de asignacin colocamos cualquiera de los siguientes
operadores asignaremos al lado izquierdo el resultado de aplicar el operador al
lado izquierdo como primer operando y el lado derecho como segundo operando:
+ - * / % << >> & ^ |

Operador de evaluacin:
Sirve para evaluar distintas expresiones seguidas, pero slo se queda con el
resultado de la ltima.
Ejemplo:
int i = (1, 2, 3); // i toma el valor 3

Operador de campo:
:: Visto en el punto de las variables, tambin se usa en las clases

Operadores de indireccin:
* Indireccin
& Direccin (referencia)
-> Puntero selector de miembro o campo
. Selector de miembro o campo
[] Subndice
->* Puntero selector de puntero a miembro
.* Selector de puntero a miembro

Operador condicional:
?: Expresin condicional
Este operador es equivalente a una expresin condicional, lo que hacemos es
evaluar el primer operando y si es cierto retornamos el segundo operando, en
caso contrario retornamos el tercer operando.
Ejemplo:
max = (a>b) ? a : b; // si a es mayor que b max vale a, sino max vale b

Operadores sizeof:
sizeof var Nos da el tamao de una variable
sizeof (tipo) Nos da el tamao de un tipo de datos
Estos operadores nos devuelven el tamao en bytes.
8
Ejemplo de expresiones:

- c=a+b
Una expresin es
cualquier sentencia - if(valor>mayor){
mayor=valor}
del programa que
puede ser evaluada - u=r*t+d(e-1)
y devuelve un valor.
EXPRESIONES Y OPERANDOS

Operadores aritmticos

Operadores relacionales

Operadores lgicos

Operadores de bit

Operadores de asignacin
Un operador es un
carcter o una
Operador de evaluacin
secuencia de
caracteres. Definen
Operador de campo
las operaciones que
van a realizarse con
Operadores de indireccin
los datos u operandos.
Operador condicional

Operadores sizeof

9
Las expresiones se evalan de acuerdo con la precedencia de los operadores.
Ante una secuencia de operadores de igual precedencia, la evaluacin se realiza
segn el orden de escritura, de izquierda a derecha. El orden de evaluacin puede
modificarse usando parntesis.

Figura 2.1 Ejemplo de uso de expresiones.

Figura 2.2 Uso de operadores, se muestra su implementacin en c++

10
ACTIVIDAD 3

Lista de reglas para la conversin de tipos (casting) en expresiones, donde


explique tres ejemplos por cada regla.

Un claro ejemplo es este programa en java que realiza una divisin si se puede
observar nos marca error si ponemos que una variable sea flotante y otra sea
entera como no los dice la actividad anteriormente.

Figura 3.1 Nos muestra los errores que tenemos en el cdigo

Figura 3.2 Ahora observamos ya corregido el problema no nos marca error.

11
ACTIVIDAD 4

Tabla donde se describen 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.
En Pascal, el signo + sirve para sumar enteros y reales, concatenar cadenas de
caracteres y unir conjuntos.

ACCIN SEMANTICA DESCRIPCIN

Sentencias de Declaracin Completar la seccin de tipos de la


Tabla de Smbolos.

Realizar comprobaciones de tipos entre


Sentencias ejecutables: los operandos implicados.

Funciones y procedimientos Comprobar el nmero, orden y tipo de


los parmetros actuales en cada
llamada a una funcin o procedimiento.

Identificacin de variables Comprobar si un 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.

Sobrecarga de operadores y funciones Detectar y solventar

12
En nuestro ejemplo, quedara:

#include <stdio.h>
#include <conio.h>
#include "analex.h"
#include "anasint.h"
extern int yylex(); /* Esta es la funcin que desarrolla el
anlisis lxico */
extern void yyerror(const char* s); /* Esta es la funcin de error
sintctico */
int nextToken; /* Token de preanlisis */
int yyparse()

{
nextToken = yylex();
//if( parseLista() != 0){ yyerror("Fichero INCORRECTO"); return 1;
}
if( nextToken != EOF){ yyerror("Fichero INCORRECTO"); return 1; }
return 0;
}
int Reconocer(int tk)
{
char msg[100];
if( tk != nextToken )
{
sprintf(msg,Encontrado %d; se esperaba %d \n, nextToken, tk);
yyerror(msg);
return 1;
}
nextToken = yylex();
return 0;
}

13
Figura 5 Cdigo fuente Analizador sintctico con estructura semntica
ACTIVIDAD 5

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


direcciones.

La tabla de smbolos se crea durante la fase de anlisis lxico a travs de los


componentes lxicos, pero en el proceso de anlisis sintctico sufren algunas
modificaciones. Generalmente se agregan valores de tipo y significado para el
anlisis sintctico.

Es una estructura de datos que usa el proceso de traduccin de un lenguaje de


programacin, por un compilador o un intrprete, donde cada smbolo en el cdigo
fuente de un programa est asociado con informacin tal como la ubicacin, el tipo
de datos, y el mbito de cada variable, constante o procedimiento.

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.

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.

En la insercin, se detectan identificadores que ya han sido declarados


previamente, emitiendo un mensaje de error

ejemplo en C: mltiple declaracin for 'x' si x ya estaba en TS.

Analizador Sintctico
Sintaxis: El orden correcto de las palabras

Ej. Programa Fuente: 34:= *x - 640;


Analex: NUM ASIGN POR ID MENOS NUM PTOCOMA
Parser: "Error Sintctico"

Ejemplo:
byte b;
int v[3];
String s;//Error semntico

14
b = 4000; //out of range
s = 6000; //incompatible type's o "Type mismatch"
v[8]= 12; // out of range

En esta imagen se muestra como manipula el resultado, en nuestro caso hacemos


una multiplicacin de metros y si el resultado es mayor a 999 entonces nos dar el
resultado en kilmetros como se observa en la siguiente imagen.

Figura 6 La imagen muestra como manipular la conversin de diferentes smbolos

15
ACTIVIDAD 6

Propuesta de proyecto final (en equipo) consiste en desarrollar software de


base: traductor, interprete o compilador.

La fase de anlisis semntico de un procesador de lenguaje es aquella que


computa la informacin adicional necesaria para el procesamiento de un lenguaje,
una vez que la estructura sintctica de un programa haya sido obtenida. Es por
tanto la fase posterior a la de anlisis sintctico y la ltima dentro del proceso de
sntesis de un lenguaje de programacin.
La sintaxis de un lenguaje de programacin es el conjunto de reglas formales que
especifican la estructura de los programas pertenecientes a dicho lenguaje.
Semntica de un lenguaje de programacin es el conjunto de reglas que
especifican el significado de cualquier sentencia sintcticamente valida.
Por lo tanto, el anlisis semntico de un procesador de lenguaje es la fase
encargada de detectar la validez de las sentencias aceptada por el analizador
sintctico.

Capturista de informacin:
Debe de tener en claro todo lo que tenga que utilizar para la realizacin del
analizador.

palabras reservadas: if, while, do, . . .


identicadores: asociados a variables, nombres de funciones, tipos
definidos por el usuario, etiquetas,... Por ejemplo:
Atributo nombre: string con la secuencia de caracteres que forma
elidentificador en maysculas. Ej. A, B1, C3D
operadores: = * + - / == > < &! = . . .
smbolos especiales: ; ( ) [ ] f g ...
constantes numricas: literales que representan valores enteros, en
comaflotante, etc, 982, 0xF678, -83.2E+2,...
Forma: secuencia de dgitos que puede empezar con el signo
menos y puede contener un punto. Ej. 10, -3, 15.4, -54.276, .10
Atributo valor: Double con el valor numrico.
Precisin: entero o real.
constantes de caracteres: literales que representan cadenas
concretas de.

Programador
Debe ser capaz de programar con todo lo que capturista de informacin
analizo previamente. Para llegar a dicho resultado (El analizador).

16
Figura 7 ejemplo de los componentes de un analizador

Figura 7.1 Se muestran todos los componentes del analizador ya terminado.

Analista en sistemas:
Debe corroborar que el analizador funcione correctamente, haciendo las
pruebas e interacciones necesarias con el programa.

17
Conclusin:

Los errores semnticos son ms tiles. Un error semntico se produce cuando la


sintaxis del cdigo es correcta, pero la semntica o significado no es el que se
pretenda. La construccin obedece las reglas del lenguaje, y por ello el
compilador o intrprete solo se ocupan de la estructura del cdigo que se escribe,
y no de su significado. Un error semntico puede hacer que el programa termine
de forma anormal, con o sin un mensaje de error.

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.

En estas actividades damos algunos ejemplos claves e importantes de la gramtica


o mejor dicho semntica de los lenguajes.
El anlisis se refiere a los aspectos del significado, sentido o interpretacin de el
mismo de un determinado elemento, smbolo, palabra, expresin o representacin
formal determina el tipo de resultados intermedios y que si los argumentos que
tiene un operador pertenece al conjunto de los operadores posibles y revisa si el
significado de lo que se va leyendo es vlido, el resultado de la fase de anlisis
semntico viene siendo lo que se conoce como "rbol semntico"

18
Bibliografa

(s.f.). Obtenido de https://prezi.com/phj_bj7_venc/lenguajes-y-automatas-ii/

automatas. (s.f.). Obtenido de http://www.di-mare.com/adolfo/cursos/2008-1/pp-


GenCodInterMed.pdf

Gramatica lenguaje automata. (s.f.). Obtenido de


http://www.monografias.com/trabajos62/teoria-gramatica-lenguaje-
automata/teoria-gramatica-lenguaje-automata2.shtml

Interpretes. (s.f.). Obtenido de http://di002.edv.uniovi.es/~labra/FTP/Interpretes.pdf

John E. Hopcrof, R. M. (s.f.). Teoria de automatas , Lenguaje de Computacion . Tercera


Edicion .

19

Anda mungkin juga menyukai