Documente Academic
Documente Profesional
Documente Cultură
ASIGNATURA
Lenguajes y autmatas II
Equipo: 5
1
ndice
INTRODUCCIN ................................................................................................................................... 3
REPORTE DE LA DETECCIN Y RECUPERACIN DE ERRORES SEMNTICOS ....................................... 4
CUADRO SINPTICO DONDE SE DESCRIBA EL MANEJO DE TIPOS EN LAS EXPRESIONES Y EL USO DE
OPERADORES..................................................................................................................................... 10
LISTA DE LAS REGLAS PARA LA CONVERSIN DE TIPOS (CASTING) EN EXPRESIONES, DONDE
EXPLIQUE TRES EJEMPLOS POR CADA REGLA ................................................................................... 12
TABLA DONDE SE DESCRIBAN LAS ACCIONES SEMNTICAS A LA ESTRUCTURA DE LA GRAMTICA 24
REPORTE DE LA MANIPULACIN DE LA TABLA DE CONVERSIN DE SMBOLOS Y DE DIRECCIONES26
PROPUESTA DE PROYECTO FINAL ..................................................................................................... 33
CONCLUSIN DE LA UNIDAD............................................................................................................. 33
BIBLIOGRAFA .................................................................................................................................... 33
2
INTRODUCCIN
El anlisis semntico utiliza como entrada el rbol sintctico detectado por el anlisis
sintctico para comprobar restricciones de tipo y otras limitaciones semnticas y
preparar la generacin de cdigo. En compiladores de un solo paso, las llamadas
a las rutinas semnticas se realizan directamente desde el analizador sintctico y
son dichas rutinas las que llaman al generador de cdigo. El instrumento ms
utilizado para conseguirlo es la gramtica de atributos.
En cualquier caso, las rutinas semnticas suelen hacer uso de una pila (la pila
semntica) que contiene la informacin semntica asociada a los operandos (y a
veces a los operadores) en forma de registros semnticos.
3
REPORTE DE LA DETECCIN Y RECUPERACIN DE ERRORES
SEMNTICOS
INTRODUCCIN
Bueno esto quiere decir que los Errores semnticos son ms que nada errores que
cometen las personas, al momento de trabajar ya que la computadora no tiene
pensamiento propio solo acata las reglas por las que fue diseo y su protocolo. El
computador trabaja revisando la sintaxis y la estructura del programa mas no la
lgica.
4
MARCO TEORICO
5
DESARROLLO
Los errores que puede detectar el analizador sintctico son aquellos que violan las
reglas de una gramtica independiente del contexto. Ya hemos mencionado que
algunas de las caractersticas de un lenguaje de programacin no pueden
enunciarse con reglas independientes del contexto, ya que dependen de l; por
ejemplo, la restriccin de que los identificadores deben declararse previamente. Por
lo tanto, los principales errores semnticos son:
int x;
x = 4.32;
if (x || 5) x = 0;
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.
6
Los errores que puede detectar el analizador sintctico son aquellos que violan las
reglas de una gramtica independiente del contexto. Ya hemos mencionado que
algunas de las caractersticas de un lenguaje de programacin no pueden
enunciarse con reglas independientes del contexto, ya que dependen de l; por
ejemplo, la restriccin de que los identificadores deben declararse previamente. Por
lo tanto, los principales errores semnticos son:
1. Identificadores no definidos;
2. Operadores y operandos incompatibles.
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.
Recuperacin de Emergencia
7
Por ello, adems de generar un mensaje de error, hay que ir saltndose la entrada
hasta llegar a un smbolo de sincronizacin. Esto implica que cada procedimiento
de un analizador sintctico descendente recursivo debe conocer cules son los
smbolos
Comprobacin de tipos
Aspectos generales
8
Especificacin de un comprobador de tipos bsico
CONCLUSIONES
BIBLIOGRAFA
http://ocwus.us.es/didactica-y-organizacion-escolar/procesos-de-ensenanza-
aprendizaje/asigpea/apartados/apartado5-2-2.asp.html/
9
CUADRO SINPTICO DONDE SE DESCRIBA EL MANEJO DE TIPOS EN LAS EXPRESIONES Y EL USO DE
OPERADORES.
Literal
Las expresiones primarias son los
bloques de creacin de expresiones ms this
Expresiones primarias complejas. Son literales, nombres, y :: name
nombres calificados por el operador de name
resolucin de mbito (::).
( expression )
Notacin de operador
Las expresiones de postfijo constan de []
expresiones primarias o expresiones en ()
las que los operadores de postfijo siguen
Expresiones de postfijo. type-name ( )
una expresin primaria. Los operadores
de postfijo se enumeran en la tabla . o >
siguiente. ++
10
Suma +
ARITMETICOS Resta -
Operan sobre valores de tipo entero o real. Multiplicacion *
Division /
Modulo %
Por ejemplo:
ASIGNACION var x,y,z: real;
El operador de asignacin se representa por la begin
secuencia de caracteres := . Permite asignar a x:=12.5;
una variable el valor de una expresin.
y:=-5.7;
z:=2*x+3*y;
OPERADORES
Los operadores son smbolos especiales que por lo
comn se utilizan en expresiones.
Igualdad ==
RELACIONALES
Distinto !=
son operadores binarios en los que los operandos
son ordinales, reales o de cadena. Los dos primeros Menor que <
operadores sirven tambin para operandos de tipo Mayor que >
record y punteros. Todos ellos dan lugar a Menor o igual que <=
resultados de tipo booleano.
Mayor o igual que >=
11
LISTA DE LAS REGLAS PARA LA CONVERSIN DE TIPOS (CASTING) EN
EXPRESIONES, DONDE EXPLIQUE TRES EJEMPLOS POR CADA REGLA
12
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.
En el ejemplo
using System;
public struct 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) {
return d.value;
}
public static explicit operator Digit(byte b) {
return new Digit(b);
}
}
13
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
var i : int;
var d : double;
var s : String;
i = 5;
var i : int;
var f : float;
var s : String;
14
f = 3.14;
s = "apple";
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;
...
15
1. Cualquier tipo entero pequeo como char o short es convertido a int o
unsigned int. En este punto cualquier pareja de operandos ser int (con o sin signo),
long, long long,double, float o long double.
16
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, long double,
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.
Por ejemplo
0 == x equivale a !x.
0 != x equivale a 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.
17
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
var i : int;
var d : double;
var s : String;
i = 5;
18
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:
var i : 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:
En C++ hay varios tipos diferentes de casting, pero de momento veremos slo el
que existe tambin en C.
(<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.
19
d = (int)(r + b);
d = (int)(n + a + r);
O bien:
d = int(r + b);
d = int(n + a + r);
Cdigo
Module Module1
Structure token
Dim expr As String
Dim op As String
Dim num As String
Dim par As String
End Structure
Sub Main()
Dim k As Integer
Dim h As Integer
Dim myString As String = Console.ReadLine
Dim myChar As String
Dim TestLen As Integer = Len(myString)
Dim exp(TestLen) As token
Dim i As Integer
For i = 0 To (TestLen - 1)
20
myChar = myString.Chars(i)
If myChar = "+" Or myChar = "-" Or myChar = "/" Or myChar = "*" Or myChar = "=" Or myChar
= "^" Then
exp(i).op = "op"
Console.WriteLine("<" & exp(i).op & "," & myChar & ">")
ElseIf myChar = "a" Or myChar = "b" Or myChar = "c" Or myChar = "d" Or myChar = "e" Or
myChar = "f" Or myChar = "g" Or myChar = "h" Or myChar = "i" Or myChar = "j" Or myChar = "k" Or myChar
= "l" Or myChar = "m" Or myChar = "n" Or myChar = "o" Or myChar = "p" Or myChar = "q" Or myChar = "r"
Or myChar = "s" Or myChar = "t" Or myChar = "v" Or myChar = "w" Or myChar = "x" Or myChar = "y" Or
myChar = "z" Then
exp(i).expr = "expr"
Console.WriteLine("<" & exp(i).expr & "," & myChar & ">")
ElseIf myChar = "1" Or myChar = "2" Or myChar = "3" Or myChar = "4" Or myChar = "5" Or
myChar = "6" Or myChar = "7" Or myChar = "8" Or myChar = "9" Or myChar = "10" Then
exp(i).num = "num"
Console.WriteLine("<" & exp(i).num & "," & myChar & ">")
'sintactico
k = 0
h = TestLen + 1000
While k <= TestLen - 1
If exp(k).par = "pari" Then
While exp(k).par <> "parf"
k = k + 1
If exp(k).expr = "expr" Then
k = k + 1
If exp(k).par = "parf" Then
Else
If exp(k).op = "op" Then
Else
Console.WriteLine(" Error en la expresin, se esperaba un <op>, no
cumple con la regla 1 o 4")
k = h
End If
End If
Else
Console.WriteLine(" Error en la expresin, se esperaba una <expr>, no cumple
con al regla 1")
k = h
End If
End While
k = k + 1
Else
If exp(k).op = "op" Then
k = k + 1
If exp(k).par = "pari" Then
While exp(k).par <> "parf"
k = k + 1
If exp(k).expr = "expr" Then
k = k + 1
If exp(k).par = "parf" Then
21
Else
If exp(k).op = "op" Then
Else
Console.WriteLine(" Error en la expresin, se esperaba un
<op>, no cumple con la regla 1 o 4 ")
k = h
End If
End If
Else
Console.WriteLine(" Error en la expresin, se esperaba una <expr>, no
cumple con al regla 1")
k = h
End If
End While
k = k + 1
Else
If exp(k).expr = "expr" Then
k = k + 1
Else
Console.WriteLine(" Error en la expresin, se esperaba una <expr>, no
cumple con al regla 1 o 4 ")
k = h
End If
End If
Else
If exp(k).expr = "expr" Then
k = k + 1
Else
Console.WriteLine(" Error en la expresin, se esperaba una <expr>, no cumple
con al regla 1 o 4 ")
k = h
End If
End If
End If
End While
If k > TestLen - 1 And k <> h Then
Console.WriteLine(" Expresin ingresada correctamente ")
End If
End Sub
End Module
22
Resultado Final
23
TABLA DONDE SE DESCRIBAN LAS ACCIONES SEMNTICAS A LA
ESTRUCTURA DE LA GRAMTICA
El valor del atributo se almacena en una variable auxiliar y se calcula en funcin del
valor en la cima de la pila antes del reconocimiento de C.
En Yacc/CUP:
A: B {aux = 2 * B.atr} C
24
Dada una gramtica con atributos, todos
los atributos heredados se pueden
convertir en sintetizados modificando
adecuadamente la gramtica, sin cambiar
Teorema de Knuth el lenguaje. (En la prctica no se utiliza
demasiado, pues puede generar
gramticas y reglas semnticas ms
complejas que las originales.)
25
REPORTE DE LA MANIPULACIN DE LA TABLA DE CONVERSIN DE
SMBOLOS Y DE DIRECCIONES
INTRODUCCIN
Una tabla de smbolos 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.
Una implementacin comn de una tabla de smbolos puede ser una tabla hash, la
cual ser mantenida a lo largo de todas las fases del proceso de compilacin de
tics.
Puede tratarse como una estructura transitoria o voltil, que sea utilizada
nicamente en el proceso de traduccin de un lenguaje de programacin, para luego
ser descartada, o integrada en la salida del proceso de compilacin para una
explotacin posterior, como puede ser, por ejemplo, durante una sesin de
depuracin, o como recurso para obtener un informe de diagnstico durante o
despus la ejecucin de un programa.
La tabla de smbolos forma parte de cada fichero que contiene el cdigo objeto
durante el enlazado o linking de los diferentes ficheros; recae en la responsabilidad
del linker o enlazador resolver cualquier referencia no resuelta.
26
Los smbolos se guardan en la tabla con su nombre y una serie de atributos
opcionales que dependern del lenguaje y de los objetivos del procesador, este
conjunto de atributos almacenados se denomina registro de la tabla de smbolos.
La siguiente representa una serie de atributos que no es necesaria para todos los
compiladores, sin embargo, cada uno de ellos se puede utilizar en la
implementacin de un compilador particular.
Tamao mximo o rango de cada una de las dimensiones de los array, si tiene
dimensin esttica. etc.
Hay dos posibilidades: que la TS est ordenada (o sea, nombres de variables por
orden alfabtico) o que no est ordenada.
Ejemplo en lenguaje C: Undefined smbolo 'x', si es una variable que desea usarse,
pero no se declar.
27
En la insercin, se detectan identificadores que ya han sido declarados previamente,
emitiendo un mensaje de error
El Analizador semntico
28
El cdigo del programa anterior es el siguiente:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <cstring>
using namespace std;
int main()
{
string nombre;
string tipo;
int tamano;
string resp;
do{
cout << "ingrese el nombre de su variable: ";
cin>>nombre;
cout<<"si uso espacios solo se tomara la primer palabra antes del espacio. el nombre de su variable
es: "<<nombre<<"\n";
system("pause");
system("cls");
cout<<"ingrese el tipo de variable: ";
cin>>tipo;
if(tipo=="int"||tipo=="char"||tipo=="float"||tipo=="bool"||tipo=="string"||tipo=="double")
{
cout<<"su tipo de dato es: "<<tipo;
}else{
cout<<"el tipo de dato no es correcto\n";
}
switch(tipo[0])
{
case 'i': tamano = 16; cout<<"\ntamanio= "<<tamano<<" bytes\n";
system("pause");
system("cls");
cout<<"su variable es la siguiente: "<<tipo<<" "<<nombre;
break;
case 'c': tamano = 8; cout<<"\ntamanio= "<<tamano<<" bytes\n";
system("pause");
system("cls");
cout<<"su variable es la siguiente: "<<tipo<<" "<<nombre;
break;
case 'f': tamano = 32; cout<<"\ntamanio= "<<tamano<<" bytes\n";
system("pause");
system("cls");
cout<<"su variable es la siguiente: "<<tipo<<" "<<nombre;
break;
case 'b': tamano = 1; cout<<"\ntamanio= "<<tamano<<" byte\n";
system("pause");
system("cls");
cout<<"su variable es la siguiente: "<<tipo<<" "<<nombre;
break;
case 's': tamano = 65535; cout<<"\ntamanio= "<<tamano<<" caracteres\n";
system("pause");
system("cls");
cout<<"su variable es la siguiente: "<<tipo<<" "<<nombre;
break;
case 'd': tamano = 64; cout<<"\ntamanio= "<<tamano<<" bytes\n";
system("pause");
system("cls");
cout<<"su variable es la siguiente: "<<tipo<<" "<<nombre;
break;
}
cout<<"\n";
system("pause");
system("cls");
29
cout<<"\ndesea quedarse? [s/n]";
cin>>resp;
system("cls");
}while(resp == "s" || resp == "S");
return 0;
}
30
El cdigo del programa anterior es el siguiente:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <cstring>
using namespace std;
int main()
{
int cod;
char car;
char resp;
do
{
cout<<"ingrese el caracter a transformar: ";
cin>>car;
cod=car;
cout<<"el codigo ascii de su caracter es: "<<cod<<"\n";
system("pause");
system("cls");
cout<<"desea continuar? [s/n]";
cin>>resp;
}while(resp=='s'||resp=='S');
return 0;
}
Esto sucede con cada tipo de variable soportado por c++, esto le dar al usuario la
habilidad de declarar variables en la tabla de smbolos sin detectar errores, adems
de que sabr cuanta memoria est utilizando en la declaracin de variables.
El cdigo del programa anterior es el siguiente:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <cstring>
int main()
{
string tipo;
int tamano;
string nombre;
char resp;
do{
cout<<"ingrese el tipo de variable: ";
cin>>tipo;
if(tipo=="int"||tipo=="char"||tipo=="float"||tipo=="bool"||tipo=="string"||tipo=="double")
31
{
switch(tipo[0])
{
case 'i': tamano = 16;
cout<<"\nla declaracion de esta variable es: int 'nombre de la variable' ";
cout<<"\nel tamanio es = "<<tamano<<" bytes\n";
cout<<"rango de operacion de -2147483648 a +2147483647\n";
system("pause");
system("cls");
break;
32
PROPUESTA DE PROYECTO FINAL
CONCLUSIN DE LA UNIDAD
Teniendo conocimientos previos bsicos acerca del funcionamiento de un
compilador se puede apreciar un mejor funcionamiento de parte de este, en
especfico, su analizador semntico. En resumen, podemos decir que un analizador
semntico tiene dos tareas: Una es la de hacer comprobaciones que no se hagan
durante el anlisis lxico o sintctico, y la otra la de crear una representacin
adecuada de sus expresiones para fases posteriores. Un esquema de traduccin
dirigido por la sintaxis aade a las gramticas:
Las acciones deben garantizar que se evalan correctamente los atributos, los
cuales pueden ser heredados y sintetizados.
En fin, como podemos observar el proceso que sigue el analizador semntico no es
muy complicado, simplemente est basado en reglas de sintaxis y comprobaciones
de tokens. Una gran ventaja que se tuvo para comprender el tema fue que tras haber
cursado la materia de Lenguajes y Autmatas 1 se pudo entender mejor cmo
funcionan las reglas sintcticas y los sistemas de smbolos que no slo sirven para
entender las funciones de un compilador, sino para cualquier sistema que se maneja
con alfabetos. (Autmatas)
BIBLIOGRAFA
1. Aho, Sethi, Ullman. Compiladores Principios, tcnicas y herramientasEd.
Addison Wesley.
33