Está en la página 1de 28

ITESM Campus Quertaro Teora de la Computacin Prof.

Carlos Ramrez Alejandro Fernndez Vilchis A00889204 Melissa Zellhuber Martnez A00889353 Trabajo Final 2 de diciembre 2011

Introduccin El objetivo del proyecto ser desarrollar un Sistema de Parseo para movimiento sobre el programa SHDRLU creado por Terry Winograd en el MIT entre los aos 1968 y 1970. El problema se basa en la teora del Procesamiento Natural del Lenguaje. El sistema permite interactuar mediante frases simples el cmo mover objetos de un entorno o mundo pequeo. Este entorno se compone de lo siguiente: (objetos, caractersticas, posiciones). Algunos de los elementos que se utilizan son: Nombre: Cono, pirmide, bloque Verbos: Toma, mueve, deja Adjetivos: Pequeo, grande, rojo El lenguaje generado en esta propuesta permite que todas las combinaciones permitan realizar lo que el usuario ordene. Dado el conocimiento del mundo pequeo se pueden descartar ambigedades lingsticas como el ejemplo que se expone a continuacin:

Si se recibe la cadena de entrada: Coloca la pirmide en el bloque en el bloque azul Las interpretaciones posibles seran las siguientes

Coloca la pirmide en el bloque en el bloque azul Coloca la pirmide en el bloque en el bloque azul Para el caso de la imagen en el primer caso tomara la pirmide del bloque rojo y la colocara encima del bloque azul. En el caso de la segunda imagen no hara nada ya que a partir del universo y las interpretaciones no se puede hacer ninguna operacin en el universo. El tipo de cadenas que recibir el intrprete ser: Coloca el bloque en la pirmide Coloca la pirmide entre el bloque azul y el bloque rojo Coloca el bloque en el bloque verde en el bloque azul Toma un bloque rojo La estructura de una frase es la siguiente: Frase = Determinante Sustantivo Adjetivo Los lexemas del lenguaje y sus AFDs. Diccionario Toma = a Coloca = b Muevelo = c cm = d veces = e en = f entre = g determinante = h sustantivo = i adjetivo = j y=k

numero = l $=$

//Si regresa 0 = TRUE //Si regresa -1 = no pertenece al lenguaje

/* Automata Toma

*/ int tomaA(char *token, int tamano){ int estado = 0; char car; int length = strlen(token); int i; int bandera = -1; for(i=0; i< tamano; i++){ switch(estado){ case 0: if(token[i] == 'T' || token[i] == 't'){ estado = 1; }else{ return -1; } break;

case 1: if(token[i] == 'o'){ estado = 2; }else{ return -1; } break; case 2: if(token[i] == 'm'){ estado = 3; }else{ return -1; } break; case 3: if(token[i] == 'a'){ return 0; }else{ return -1; } break; } } }

/* Automata Coloca

*/ int colocaA(char *token, int tamano){ int estado = 0; char car; int length = strlen(token); int i; int bandera = -1; for(i=0; i< tamano; i++){ switch(estado){ case 0: if(token[i] == 'C' || token[i] == 'c'){ estado = 1; }else{ return -1; } break; case 1: if(token[i] == 'o'){ estado = 2; }else{ return -1; }

break; case 2: if(token[i] == 'l'){ estado = 3; }else{ return -1; } break; case 3: if(token[i] == 'o'){ estado = 4; }else{ return -1; } break; case 4: if(token[i] == 'c'){ estado = 5; }else{ return -1; } break; case 5: if(token[i] == 'a'){ return 0;

}else{ return -1; } break; } } }

/* Automata determinante */

int determinanteA(char *token, int tamano){ int estado = 0; char car; int length = strlen(token); int i; int bandera = -1; for(i=0; i< tamano; i++){ switch(estado){ case 0: if(token[i] == 'e'){ estado = 1; }else if(token[i] == 'l'){ estado = 2;

}else{ return -1; } break; case 1: if(token[i] == 'l'){ return 0; }else{ return -1; } break; case 2: if(token[i] == 'a'){ return 0; }else{ return -1; } break; } } }

/* Automata adjetivos */

int adjetivosA(char *token, int tamano){ int estado = 0; char car; int length = strlen(token); int i; int bandera = -1; if((strcmp(token, "azul")) == 0){ return 0; } if((strcmp(token, "verde")) == 0){ return 0; } if((strcmp(token, "rojo")) == 0){ return 0; } if((strcmp(token, "amarillo")) == 0){ return 0; } if((strcmp(token, "naranja")) == 0){ return 0; } if((strcmp(token, "morado")) == 0){ return 0; }

return -1; }

/* Automata sustantivos */

int sustantivosA(char *token, int tamano){ int estado = 0; char car; int length = strlen(token); int i; int bandera = -1; for(i=0; i< tamano; i++){ switch(estado){ case 0: if((token [i]>= 65 && token [i] <= 90) || (token [i]>= 97 && token [i] <= 122)){ estado = 0; }else{ return -1; } break; } }

return 0; }

/* Automata Muevelo */

int mueveloA(char *token, int tamano){ int estado = 0; char car; int length = strlen(token); int i; for(i=0; i< tamano; i++){ switch(estado){ case 0: if(token[i] == 'M' || token[i] == 'm'){ estado = 1; }else{ return -1; } break; case 1: if(token[i] == 'u'){ estado = 2; }else{

return -1; } break; case 2: if(token[i] == 'e'){ estado = 3; }else{ return -1; } break; case 3: if(token[i] == 'v'){ estado = 4; }else{ return -1; } break; case 4: if(token[i] == 'e'){ estado = 5; }else{ return -1; } break; case 5:

if(token[i] == 'l'){ estado = 6; }else{ return -1; } break; case 6: if(token[i] == 'o'){ return 0; }else{ return -1; } break; } } return 0; }

/* Automata cm */

int cmA(char *token, int tamano){ int estado = 0; char car;

int length = strlen(token); int i; for(i=0; i< tamano; i++){ switch(estado){ case 0: if(token[i] == 'c'){ estado = 1; }else{ return -1; } break; case 1: if(token[i] == 'm'){ return 0; }else{ return -1; } break; } } }

/* Automata en */

int enA(char *token, int tamano){ int estado = 0; char car; int length = strlen(token); int i; for(i=0; i< tamano; i++){ switch(estado){ case 0: if(token[i] == 'e'){ estado = 1; }else{ return -1; } break; case 1: if(token[i] == 'n'){ return 0; }else{ return -1; } break; } } }

/* Automata entre */

int betweenA(char *token, int tamano){ int estado = 0; char car; int length = strlen(token); int i; for(i=0; i< tamano; i++){ switch(estado){ case 0: if(token[i] == 'e'){ estado = 1; }else{ return -1; } break; case 1: if(token[i] == 'n'){ estado = 2; }else{ return -1; }

break; case 2: if(token[i] == 't'){ estado = 3; }else{ return -1; } break; case 3: if(token[i] == 'r'){ estado = 4; }else{ return -1; } break; case 4: if(token[i] == 'e'){ return 0; }else{ return -1; } break; } } }

/* Automata Numero */

int numeroA(char *token, int tamano){ int estado = 0; char car; int length = strlen(token); int i; for(i=0; i< tamano; i++){ switch(estado){ case 0: if((token[i] >= 48) && (token[i] <=57)){ estado == 1; }else{ return -1; } break; } } }

Para el tercer parcial, realizamos un analizador sintctico SLR(1), el cual debe de estar en el lenguaje de programacin C y deber analizar la gramtica que nosotros mismos creamos que es = G(V, , R, S)

V= { Toma Coloca muevelo cm veces en entre adjetivo y numero $ S X C H K D Y Z = { Toma Coloca muevelo adjetivo y numero $ } S=S
R= { 1. S->Toma X 2. S-> CH 3. C->Coloca X K 4. H-> muevelo D cm D veces 5. K-> en X 6. K-> entre Y 7. X-> Determinante Z 8. Z-> Sustantivo A 9. A-> Adjetivo 10.Y-> Determinante W 11.W-> Sustantivo A y M 12.M-> Determinante N 13.N-> Sustantivo A 14.D-> Numero

determinante sustantivo A W M N} determinante sustantivo

cm

veces

en

entre

} REGLAS: 1.S->a X 2.S->C H 3.C->b X K 4.H->c D d D e

5.K->f X 6.K->g Y 7.X->h Z 8.Z->i A 9.A->j 10.Y->h W 11.W->i A k M 12.M->h N 13.N->i A 14.D->l Los colores que aceptar la aplicacin sern: azul, verde, rojo, amarillo, naranja y morado. Conjuntos Primeros P(S) ={toma, Coloca} P(C)= {Coloca} P(H) = {muevelo} P(K)= {en , entre} P(X)= {determinante} P(Z)= {sustantivo} P(A)= {adjetivo} P(Y)= { determinante} P(W)= {Sustantivo} P(M)= {Determinante} P(N)= {Sustantivo} P(D)= {Numero}

Conjuntos Siguientes S(S)= {$, determinante, muevelo} S(C)= {muevelo} S(H)= {numero} S(K)= {muevelo} S(X)= {$, determinante, muevelo, en , entre} S(Z)= {$, determinante, muevelo, en , entre} S(A)= {$, determinante, muevelo, en , entre} S(Y)= {muevelo} S(W)= {muevelo} S(M)= {muevelo} S(N) = {muevelo} S(D)= {cm, veces} Estados y tabla completa de Anlisis Sintctico SLR(1) E0= S->yS S->yToma X S->yCH C->yColoca X K E1=Ir_a (E0, S) S->Sy E2=Ir_a(E0, Toma) S->Toma y X X-> yDeterminante Z E3=Ir_a(E0, C) S->CyH H->ymuevelo D cm D veces E4=Ir_a(E0, Coloca) C->Coloca y X K X-> yDeterminante Z e6

E5= Ir_a(E2, X) S-> Toma Xy E6= Ir_a(E2, Determinante) X-> Determinante yZ Z->ySustantivo A E7= Ir_a (E3, H) S-> C Hy E8= Ir_a (E3, muevelo) H-> muevelo yD cm D veces D-> ynumero E9= Ir_a(E4, X) C-> Coloca X yK K-> yen X K->y entre Y E10=Ir_a(E6, Z) X->Determinante Zy E11= Ir_a(E6, Sustantivo) Z-> Sustantivo yA A->yAdjetivo E12= Ir_a(E8, D) H->muevelo D ycm D veces E13=Ir_a (E8, numero) D->numero y E14= Ir_a(E9, K) C->Coloca X Ky E15= Ir_a(E9, en) K-> en yX X->yDeterminante Z e6 E16= Ir_a (E9, entre) K-> entre yY Y->yDeterminante W

E17= Ir_a(E11, A) Z-> Sustantivo A y E18= Ir_a(E11, Adjetivo) A-> Adjetivo y E19= Ir_a(E12,cm) H-> muevelo D cm yD veces D->ynumero e13 E20= Ir_a(E15, X) K-> en X y E21= Ir_a(E16, Y) K-> entre Y y E22= Ir_a(E16, Determinante) Y-> Determinante yW W-> ySustantivo A y M E23= Ir_a(E19, D) H-> muevelo D cm D yveces E24= Ir_a(E22,W) Y->Determinante W y E25=Ir_a(E22, Sustantivo) W-> Sustantivo yA y M A->yAdjetivo e18 E26= Ir_a(E23, veces) H->muevelo D cm D vecesy E27= Ir_a(E25, A) W-> Sustantivo A yy M E28= Ir_a(E25, y) W->Sustantivo A y yM M-> yDeterminante N E29=Ir_a(E28, M) W-> Sustantivo A y My E30= Ir_a(E28, Determinante) M->Determinante yN

N->y Sustantivo A E31= Ir_a(E30, N) M-> Determinante Ny E32= Ir_a(E30, Sustantivo) N->Sustantivo yA A-> yAdjetivo e18 E33= Ir_a(E32, A) N->Sustantivo Ay Tabla SLR(1) ***LA TABLA DE ANLISIS SLR(1) SE ANEXA EN UNA HOJA AL FINAL DEL DOCUMENTO Utilizacin del programa : Cmo se utiliza el programa (datos o archivos requeridos, parmetros en la linea de comandos, etc.). El programa se ejecutara con la orden ./shrdlu Para esto se requiere que el programa haya sido previamente compilado. Se requieres todos los archivos que estan dentro de la carpeta Final. Transformaciones a la gramtica original La gramtica original era realmente una gramtica regular, por lo que hubo que cambiarla para que cumpliera los requisitos necesarios para ser una gramtica libre de contexto. Esta era la gramtica que tenamos en un principio: G={V, , R, S} S=S

V = {S, X, Z, A, F, Y, W, M, N, Toma, Coloca, en, entre, determinante, sustantivos, adjetivo}

= {Toma, Coloca, en, determinante, sustantivos, adjetivo}

R={ S-> Toma X S -> Coloca X en X S-> Coloca X entre Y X -> Determinante Z Z->Sustantivo A Z-> Sustantivo A F A->Adjetivo F -> en X Y -> Determinante W W -> Sustantivo A y M M -> Determinante N N -> Sustantivo A }

Ya modificada, quedo de la siguiente manera: G(V, , R, S) V= { Toma Coloca muevelo cm veces en entre adjetivo y numero $ S X C H K D Y Z = { Toma Coloca muevelo adjetivo y numero $ } S=S
R= { 1. S->Toma X 2. S-> CH

determinante sustantivo A W M N} determinante sustantivo

cm

veces

en

entre

3. C->Coloca X K 4. H-> muevelo D cm D veces 5. K-> en X 6. K-> entre Y 7. X-> Determinante Z 8. Z-> Sustantivo A 9. A-> Adjetivo 10.Y-> Determinante W 11.W-> Sustantivo A y M 12.M-> Determinante N 13.N-> Sustantivo A 14.D-> Numero

} Bitcora de problemas y soluciones A continuacin, se presenta una lista de problemas y soluciones que se presentaron a lo largo de la elaboracin de nuestro proyecto.

Problema Hacer la gramtica libre de contexto

Solucin En un principio, nuestra gramtica era regular, por lo que hubo que hacer modificaciones para que fuera libre de contexto. Cuando modificamos la gramtica, haba 2 producciones que nos generaban ambigedad, se modific la gramtica de nuevo para eliminar este problema y que no hubiera conflictos en la tabla.

Eliminar la ambigedad en la gramtica

Llenado de la matriz desde un archivo Cuando se quera llenar la matriz, no se guardaba en la estructura. De igual manera, cuando quisimos guardar los datos en celdas diferentes, se hacan saltos y no lea de la manera en la que queramos. Para resolverlo definimos otra estructura que se llenara desde la matriz. Ejecucin de la lectura Al momento de querer comparar la matriz con lo que se reciba, la fila de lectura nos marca Segmentation Fault.

Conclusiones y objetivos alcanzados Con la elaboracin de este proyecto se complementaron los conocimientos que adquirimos durante todo el parcial en la clase de Teora de la Computacin. Reforzando los temas de Gramticas Libres de Contexto, Ambigedad en Gramticas Libres de Contexto, Gramticas Equivalentes, Derivaciones por la Izquierda, Transformacin de Gramticas, Forma Normal de Chomsky, Anlisis Sintctico Descendente, Eliminacin de Recursividad, Lenguajes SLR(1), Conjuntos Primeros y Siguientes, y el Algoritmo para la construccin de la Tabla SLR(1). Creamos nuestra propia gramtica libre de contexto, teniendo en cuenta aspectos importantes como lo son: que no fuera ambigua, que no tuviera recursividad izquierda y que cumpliera con todas las caractersticas necesarias para ser una gramtica SLR (1). Al momento de programar el proyecto, pusimos en prctica conocimientos que fueron adquiridos en la clase de Programacin Avanzada, como lo son lectura escritura de archivos en un ambiente UNIX, adems de funciones complementarias para poder manejar estos archivos. El objetivo que tenamos con la realizacin de este proyecto era crear un analizador sintctico, que fuera funcional para la gramtica que creamos, haciendo posible el anlisis lxico y semntico para las cadenas que se proporcionen. Bibliografa Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2007). Compilers: Principles, Techniques, & Tools. Boston: Pearson Education. Hopcroft, J. E., Motwani, R., & Ullman, D. J. (2000). Introduction to Automata Theory, Languages and Computation. New York: Addison-Wesley.