Vous êtes sur la page 1sur 10

Teora de la Computacin

Proyecto Final

Brandon Avils Hernndez Miguel Flores Gaspar

A01203863 A01204028

Introduccin Es muy bien conocido el programa de la tortuga: un simple programa que mediante una serie de instrucciones sencillas permite al usuario mover una simple tortuga a travs de un espacio delimitado. Basado en esta temtica se enfoca nuestro proyecto. El lenguaje que se generar ser parecido al conocido lenguaje de la tortuga. Se trata de un conjunto de instrucciones simples que permiten a un objeto realizar movimientos sobre un rea en especfico. Gracias a esto el usuario podr determinar a travs de sencillas instrucciones, individuales o combinadas, el recorrido que una tortuga efectuar y que ser representado con una animacin en pantalla. El programa tambin genera un archivo txt donde se almacena toda la informacin recogida durante su ejecucin. En este archivo pueden verse con detalle los procesos que el programa realiza y las acciones que seguir dependiendo de la entrada actual. Las instrucciones que pueden realizarse son: Ir a la derecha Ir a la izquierda Ir hacia arriba Ir hacia abajo

Adems, estas instrucciones pueden englobarse dentro de un ciclo para poder repetirse varias veces y poder realizar diferentes caminos. Un ejemplo grfico de la forma en que funcionara es el siguiente:

En el ejemplo anterior se observa la secuencia de movimientos que puede hacer la tortuga. En este caso es una secuencia de pasos: 1. 2. 3. 4. Ir hacia arriba Ir hacia la derecha Ir hacia abajo Ir hacia la izquierda

En este ejemplo, cada una de las instrucciones quedara de la siguiente forma: 1. 2. 3. 4. nombreT . arriba ( 1 ) nombreT . derecha ( 1 ) nombreT . abajo ( 1 ) nombreT . izquierda ( 1 )

Gramtica La gramtica finalmente queda de la siguiente forma: G: { S -> Instruccion Instruccion -> nombreTortuga . Direccion ( cantidad ) ; Instruccion Instruccion -> por ( cantidad ) { Instruccion } Instruccion -> Direccion -> derecha Direccion -> izquierda Direccion -> arriba Direccion -> abajo }

Dnde:

G es la gramtica en general S es el smbolo inicial Instruccin, Direccin son no terminales nombreT, ., (, cantidad, ), ;, por, {, }, , derecha, izquierda, arriba, abajo son smbolos terminales

De forma reducida la gramtica quedara de la siguiente forma: S -> I I -> nombreT . D ( c ) ; I I -> por ( c ) { I } I -> D -> derecha D -> izquierda D -> arriba D -> abajo

Algunas sentencias vlidas que la gramtica puede analizar de manera correcta son las siguientes:
nombreT . izquierda ( c ) ; nombreT . derecha ( c ) ; nombreT . arriba ( c ) ; nombreT . abajo ( c ) ; por ( c )

por ( c ) { } } nombreT . derecha ( c ) ; por ( c ) { }

por ( c ) { nombreT . derecha ( c ) ; }

por ( c ) { nombreT . abajo ( c ) ; }

por ( c ) { nombreT . arriba ( c ) ; }

por ( c ) { nombreT . izquierda ( c ) ; }

nombreT . izquierda ( c ) ; por ( c ) { }

nombreT . arriba ( c ) ; por ( c ) { }

nombreT . abajo ( c ) ; por ( c ) { }

nombreT . arriba ( c ) ; nombreT . izquierda ( c ) ;

nombreT . izquierda ( c ) ; nombreT . derecha ( c ) ;

nombreT . izquierda ( c ) ; nombreT . izquierda ( c ) ;

nombreT . izquierda ( c ) ; nombreT . arriba ( c ) ;

nombreT . izquierda ( c ) ; nombreT . abajo ( c ) ;

nombreT . arriba ( c ) ; nombreT . derecha ( c ) ;

Los conjuntos de Primeros y Siguientes quedaran de la siguiente forma: Primeros: Prim(S) = Prim(I) = {nombreT, por, } Prim(D) = {derecha, izquierda, arriba, abajo}

Siguientes: Sig(I) = Sig(S) Sig(I) {}}= {$, }} Sig(D) = {(}

Tabla de Anlisis Sintctico


nombreT . ( c ) ; por { } derecha izquierda arriba abajo

SI I nombreT ,D ( c );I

SI I por ( c) { I}

SI I

I D

D derec D izquier D arrib D abaj


ha da a o

Autmata para el reconocimiento de estados


, -> $ , -> S
q1
nombreT, S -> I por, S -> I $, S -> I

>>

q0

q2

q3

nombreT, I -> I, ;, ), c, (, D nombreT

q4 nombreT, nombreT ->

q5

., . ->

q6
Arriba, D -> Arriba Abajo, D -> Abajo

q17

q8

Arriba, Arriba -

(, ( ->

q7

Izquierda, D >Izquierda Derecha, D-> Derecha

}, } ->

q18

q9

c, c ->

q10

), ) ->
q16 q11

q19

), )-> por, por q13

q12

(, ( ->

c, c ->
q14

q15

Uso del programa Para que el programa funcione de manera adecuada, es necesario considerar algunos detalles: El formato de las instrucciones es especfico, de otra manera el programa podra no reconocer las sentencias y por lo tanto marcara como errneas algunas instrucciones que en s estn correctas pero con errores de sintaxis. Algunos ejemplos de sentencias correctas que el analizador podr identificar sin ningn problema son las siguientes:
nombreT . arriba ( c ) ; nombreT . izquierda ( c ) ; por ( c ) { por ( c ) { por ( c ) { } } } nombreT , izquierda ( c ) ; por ( c ) { por ( c ) { } }

Como se podr observar, los espacios son de suma importancia entre cada lexema. Dentro de los parntesis se coloca la cantidad de veces que se desea se repita la instruccin, esto es, denotado por un nmero. Un dato importante que hay que tener en cuenta es que para su ejecucin son necesarios elementos extras. Para el archivo ejecutable es necesario que se encuentre en la misma carpeta del archivo .exe el fichero SDL.dll, o en su defecto que se encuentre en la carpeta raz de system32. Sin este archivo el ejecutable no funcionar. Si se utiliza por otro lado el archivo del proyecto en dev c++ es necesario descargar la librera de SDL. Una vez que se haya descargado e instalado se tiene que ir al men Herramientas, Opciones del compilador, y en el espacio indicado como Aadir estos comandos a la lnea de comandos del linker se debe incluir lo siguiente: -lmingw32 ISDLmain ISDL. De esta forma, sin importar la manera en que se ejecute, el programa funcionar de manera correcta. Las imgenes que se incluyen junto con el proyecto son necesarias para su correcto funcionamiento. Se trata de 4 imgenes para representar las diferentes trayectorias de la tortuga, un fondo blanco y 1 una imagen ms que sirve para poder representar el rastro dejado por la tortuga conforme avanza. Dichas imgenes tienen un formato tipo BMP, por lo que no cualquier imagen puede sustituirlas. Adems, deben estar en la misma ubicacin donde se encuentre el archivo ejecutable, o en su defecto, donde se encuentre el archivo .c.

Transformaciones respecto a la gramtica original En un principio se consider utilizar una gramtica que permitiera usar las 4 operaciones bsicas y mostrar un resultado. Sin embargo, dicha gramtica fue desechada en su totalidad y se opt por utilizar una basada en el programa de la tortuga. Gracias a esto el tema cambi por completo, a la vez que la gramtica sufri grandes cambios y se le agregaron los comandos necesarios para que funcionase de esta manera. De los mayores cambios que se tuvieron se debi al Autmata, el cual constantemente cambio de forma, se modificaron estados, entradas. Regularmente se tuvo que hacer esta modificacin, puesto que omitamos algunos detalles, o algunos otros estaban errneos. Sin embargo, finalmente termin como se mostr anteriormente, funcionando de manera adecuada y conforme a los requisitos del proyecto.

Conclusiones Durante el desarrollo de este proyecto se tuvieron varias complicaciones, sobre todo en cuanto a la parte de la implementacin. En un principio se realizaron cambios menores en la gramtica para evitar complicarla donde no era necesario. Se redujeron algunas derivaciones que no eran necesarias, algunas instrucciones se simplificaron en gran medida para hacerlas ms amigables y finalmente se dej como est sealado anteriormente en este documento. Debido a esto, la implementacin tuvo cambios en cuanto a su estructura. El programa cambio en varios comandos, se corrigieron algunas instrucciones, y se tuvo que modificar el cdigo para que funcionase de manera adecuada. Al momento de su implementacin, uno de los principales problemas que se tuvieron fue la creacin de la tabla del Analizador Sintctico LL(1), puesto que no se llenaba de manera correcta, lo que represent un obstculo para la implementacin del resto del cdigo puesto que era necesario su correcto

funcionamiento para en base a esto tomar las instrucciones adecuadas y permitir as un funcionamiento acorde a lo que se tena planeado. Hasta ahora, el hecho de programar en C resulta ser una complicacin. Aunque ahora se trata de una complicacin menor, nosotros fuimos criados en Java, y aunque son lenguajes muy parecidos, difieren en aspectos muy importantes, los cuales terminan siendo una complicacin al momento de programar y nos toman ms tiempo del necesario. Por otro lado, al momento de implementar el anlisis de las cadenas no se tuvo mayor problema, puesto que una vez hecha la tabla correctamente era sencillo llamar a las instrucciones adecuadas, y de esta manera el Analizador Sintctico LL(1) basado en tabla funcion correctamente. En cuanto a la manera de representar las acciones de manera grfica, se puede decir que fueron muchos los problemas que se tuvieron, puesto que jams habamos hecho esto en C. Buscamos libreras que pudieran ayudarnos, pero no fue sencillo encontrarlas, ni mucho menos posteriormente usarlas. Su instalacin fue complicada y se tuvieron que modificar muchas cosas ya que por su cuenta no funcionaba adecuadamente. Una vez solucionado esto, manejar la librera no fue tan difcil, puesto que es muy parecida a aquellas utilizadas en java para la creacin de videojuegos en 2D. En conclusin, este proyecto signific todo un reto para completar. Se tuvieron muchas dudas, muchos retrasos, problemas al momento de generar autmatas, cdigo, etc., pero afortunadamente dichos problemas pudieron ser corregidos de manera adecuada. Aprendimos mucho, sobre todo en cuanto al uso de un lenguaje de programacin que no estamos acostumbrados a usar y sin embargo es uno de los ms poderosos y reconocidos en el mundo, por lo que las enseanzas que nos llevamos son de gran utilidad y a su vez nos llenan de gran satisfaccin.

Vous aimerez peut-être aussi