<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-10418455</id><updated>2011-10-02T12:52:22.517-06:00</updated><title type='text'>Tecnopatico</title><subtitle type='html'>Filosofar, una manera de redescubrir lo que ya sabemos pero que no nos hemos dado cuenta</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10418455.post-113375475501422919</id><published>2005-12-04T21:45:00.000-06:00</published><updated>2005-12-04T21:52:35.033-06:00</updated><title type='text'>El extremo de atrás</title><content type='html'>Una de las etapas que requieren más cuidado, es la comprbación de tipos. Se requiere ser bastante meticuloso y analizar la gramática para tener presente dónde y cuándo hecer las verificaciones. Un descubrimiento agradable fue el encontrar que si se tiende a ser estricto y no permitor conversiones implícitas, la comprobación de tipos es capaz de alertar al mismo tiempo de ciertos errores menos perceptibles. Por ejemplo, si se utiliza el tipo "void" como tipo de retorno de una sentencia(statement) o de un procedimiento, aunque este tipo no esté disponible para el usuario, el uso de un procedimiento donde se espera una función o viceversa, se puede detectar como un error de tipos. A pesar de ello, una comprobación intencionalmete diseñada para capturar tal falla puede ser una mejor estrategia si se desea reportar con mensajes más explicativos.&lt;br /&gt;&lt;br /&gt;Después de la etapa de comprobación de tipos, queda la generación del código intermedio. En este proyecto se pueden aplicar ciertas simplificaciones que son de mucha utilidad; tal como el asumir que todo error que se pueda capturar en la etapa de parseo, se capturará ahi, de manera que el código intermedio quedará de una vez, limpio y libre de errores.&lt;br /&gt;&lt;br /&gt;Tal como su nombre lo indica, este producto representa el punto limítrofe entre la parte frontal y la posterior del compilador. Es interesante notar, que la representación intermedia es por sí misma, un lenguaje, y como tal es lejanamente factible escribir código de programación directamente en una representación "neutral". En teoría, cualquier lenguaje fuente puede traducirse a un determinado código intermedio, y un codigo intermedio puede traducirse a código fuente de otro lenguaje, ensamblador o código objeto(binario) de cualquier máquina. El código intermedio es, de todas formas, casi tan confuso de entender como el propio ensamblador, y varía demasiado, pues, a pesar de existir ciertos patrones de diseño, queda a conveniencia de autor del compilador utilizar la técnica que mejor se ajuste a la orientación que se adopte para el compilador.&lt;br /&gt;&lt;br /&gt;Lo anterior me lleva a concluir que seguramente, cuando se traduce de código intermedio hacia cualquier otro, se debe asumir que fué generado por la parte frontal de un compilador y que por lo tanto, está libre de errores, ya que sería un desperdicio de recursos el hacer verificaciones en esta etapa intermedia. En el caso de este proyecto, resulta mucho más cómodo y seguro, producir el código intermedio como una estructura de datos y trabajar "en memoria", para evitar el tenr que pasar por un archivo, como es el caso de muchos compiladores profesionales. Queda claro, que ese archivo se utiliza bien por limitaciones técnicas, o por razones tales como el enlace de código escrito en varios archivos fuente distintos(probablemente en distintos lenguajes).&lt;br /&gt;&lt;br /&gt;Otra conclusión importante, es que el uso de la tabla de símbolos es tan necesario y provechoso tanto en la etapa frontal como en la posterior; asimismo la libertad de diseño que permiten las herramientas modernas tales como el lenguaje JAVA y las computadoras de (por ahora)alta capacidad, como las actuales, facilitan sobremanera la realización de un compilador, ya que se eliminan muchas de las restricciones de espacio en memoria, algunos de los problemas de rendimiento(cuando se trate de compiladores pequeños a medianos) y el tamaño del código del compilador propiamente dicho. Aparentemente, de esta ventaja se a abusado en plataformas tales como .NET (joke?).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:180%;" &gt;&lt;span style="font-weight: bold;"&gt;Implementacion de la representación intermedia.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Hay dos formas casi diferentes de implementar el código intermedio. La que he preferido es la de construir un arbol de sintaxis abstracta linealizado, utilizando una estructura de ArrayList, donde se guardan estructuras que hacen el papel de Cuads. Estas estructuras constan de un operador, dos operandos, y un resultado. Dependiendo del operador se evaluan los operandos, pudiendo éstos representar valores inmediatos, como en las hojas del árbol, o bien cursores a otras casillas en el mismo ArrayList, como en el caso de los nodos interiores. Los operandos pueden también representar índices de la Tabla de símbolos.&lt;br /&gt;&lt;br /&gt;En este proyecto, el Arbol de sintaxis abstracta se construye de forma que siempre, al momento de crear un nodo que tiene hijos, éstos han sido previamente creados. Por otra parte, cada vez que se crea un nodo(u hoja), se inserta en la lista, y se retorna el índice en el cual sucedió la inserción, incrementando en uno el índice con cada inserción. Estos índices se hacen circular a través de la gramática como atributos sintetizados, permitiendo la fácil creacion de nuevos árboles a partir de los ya existentes. Esta forma de trabajo permite garantizar que para cualquier nodo con hijos, se cumple que el índice de los hijos es siempre menor que el índice del padre.&lt;br /&gt;&lt;br /&gt;Este detalle se puede aprovechar de la siguiente manera:&lt;br /&gt;El miembro "resultado" de los cuads se deja vacío al momento de la creación inicial del AST. El AST se recorre de acuerdo al índice de los nodos; siempre se visitará primero a los hijos, por lo cual, se puede asignar correctmente a "resultado" el valor conveniente, ya que cuando el padre de dicho nodo lo requiera, está garantizado que tal valor ya ha sido asignado.&lt;br /&gt;&lt;br /&gt;Lo más importante de esta estrategia, es que permite la fácil asignación de registros a las expresiones en el momento del paso de la representación intermedia a ensamblador. Los registros asignados a los hijos se pueden liberar cuando se calcula el valor del padre.&lt;br /&gt;&lt;br /&gt;Por otra parte, el asignar el resultado de los operadores binarios a uno de los registros de los operandos reduce el numero de registros necesarios para ciertos cálculos: por ejemplo para 3 + 4, en lugar de&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;add $t2, $t0, $t1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;se puede hacer asi:&lt;br /&gt;&lt;br /&gt;add $t0, $t0, $t1&lt;br /&gt;&lt;br /&gt;de esta forma, se evita el tener que buscar un registro libre para el resultado, y se evita la operacion de liberar uno de los registros.&lt;br /&gt;&lt;br /&gt;La parte referenta a los stack frames, resulta severamente difícil de entender, sin embargo no es igual de programar, ya que se trata en realidad de un segmento de código que es constante, al menos parcialmente. Claro, que esto ayudado en gran medida por la simplificación de usar palabras tanto para enteros como caracteres. Aun queda por resolver la temática de los arreglos, no obstante, parece sensato comprobar primero que las variables de tamaño constante son correctamente procesadas para despues comenzar con los arreglos. Con esto en mente, es recomendable calcular los despazamientos(offset) de manera incremental y no multiplicativa, ya que arreglos de cualquier tamaño pueden declararse entre variables de tamaño constante, por lo que simplemente multiplicar el numero de orden de declaración por el ancho de palabra es un tanto contraproducente.&lt;br /&gt;&lt;br /&gt;En un comentario final, las estructuras de control ofrecen también un reto de estudio, pues, dado que el asembler se ejecuta secuencialmente, se debe analizar bien la colocación de los saltos y bifurcaiones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-113375475501422919?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/113375475501422919/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=113375475501422919' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113375475501422919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113375475501422919'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/12/el-extremo-de-atrs.html' title='El extremo de atrás'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-113315081540779133</id><published>2005-11-27T22:02:00.000-06:00</published><updated>2005-11-27T22:10:04.306-06:00</updated><title type='text'>Convenciones de llamada y parametros variantes</title><content type='html'>Aunque debo admitir, que no investigué mucho, las principales diferencias entre MIPS e INTEL, al menos las que puedo señalar empiricamente, es, por supuesto, que INTEL pasa parámetros via stack, mientras que MIPS dispone de cuatro registros especiales para ello. Aunque Tambien es cierto que en MIPS podría hacerse todo el paso de parametros por medio del stack. No se para que, pero alguien podría estar usando esos cuatro registros para otra cosa.&lt;br /&gt;&lt;br /&gt;Fuera de eso, lo más que sé al respecto, es que, MIPS es arquitectura RISC, mientras INTEL es CISC. Eso significa que MIPS posee un juego de Instrucciones reducido, mientras que Intel, tiene uno extendido. En lo que a mi respecta, eso significa que Intel tiene instrucciones equivalente a la secuencia de Varias instrucciones, lo cual por ejemplo, permite que lo que MIPS hace en dos o más instrucciones, INTEL lo puede hacer en una sola instruccion atómica.&lt;br /&gt;&lt;br /&gt;En Realidad, el tema RISC vrs CISC es sumamente extenso, dado que se trata de filosofías de diseño, y como tales, tienen ventajas y desventajas...&lt;br /&gt;&lt;br /&gt;En cuanto a la segunda pregunta, pues, si, en efecto hice el programa, pero solo fue "un vil copy-paste" de un ejemplo que encontre en MSDN.&lt;br /&gt;&lt;br /&gt;De modo que decidí hacer algo parecido, pero escarbando un poquito, usando direcciones de memoria para ver algunas cosas...&lt;br /&gt;&lt;br /&gt;Lo primero que hice, es ver la direccion de memoria de los parámetros, para constatar sus posiciones relativas en la menmoria. Pude confirmar, que C, introduce primero el último parámetro, dejando el primero más cerca del tope del stack. En el ejemplo que proporciono se puede ver como second está en la direccion de memoria siguiente a first.&lt;br /&gt;&lt;br /&gt;Eso me indujo a mi siguiente experimento. Dado el procedimiento cuyos parámetros son todos de tipo int, es posible declarar un int*, y asignarle la direccion del primer parámetro. El resultado, si se tiene:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int * ptr = &amp;primerParam&lt;/span&gt;&lt;br /&gt;Entonces se puede decir:&lt;br /&gt;ptr[0] = ///&lt;br /&gt;ptr[1] = ///&lt;br /&gt;/// = ptr[n],&lt;br /&gt;donde ptr[n] es el (n+1)-ésimo parámetro.&lt;br /&gt;&lt;br /&gt;En mi experimento, pude accesar todos los parámetros, indistintamente si éstos eran fijos o variantes.&lt;br /&gt;&lt;br /&gt;ABRE-PARENTESIS&lt;br /&gt;&lt;br /&gt;No hay manera de saber cuantos parámetros se han enviado, al menos desde el lado del callee, si no se utiliza algun terminador, bandera, valor especial, ... etc. ni siquiera mediante las macros va_start, va_arg, o va_end (que no se que hace por cierto), y esto, aun en las versiones ansi y unix.&lt;br /&gt;&lt;br /&gt;Solamente el caller "sabe exactamente" cuantos argumentos utilizó en la llamada.&lt;br /&gt;&lt;br /&gt;Aqui entra en juego el asunto de las CALLING_CONVENTIONS.&lt;br /&gt;En las lecturas que hice, encontré lo siguiente:&lt;br /&gt;&lt;br /&gt;hay basicamente tres: __stdcall, __cdecl, y __fastcall.&lt;br /&gt;&lt;br /&gt;En realidad no encontré una diferencia entre las dos primeras, excepto que en __cdecl, el caller es el responsable de sacar los parametros del stack una vez que la llamada retorna; no así en __stdcall, donde es el callee el encargado.&lt;br /&gt;&lt;br /&gt;En cuanto al orden de los parámetros en la pila, experimenté con __stdcall y con __cdecl, en ambas obtuve las mismas direcciones relativas entre parámetros, i.e. no vi ningun cambio, el primer argumento está siempre mas cerca del tope de la pila que los demás.&lt;br /&gt;&lt;br /&gt;De hecho, eso también lo leí por ahi en mis averiguatos.&lt;br /&gt;&lt;br /&gt;En lo que más relevancia encontre que la diferenciacion era importante, es en el tema ya de enlace de símbolos (linking), donde tienen mucho que estudiar los que desarrollan DLL, (Dynamic Link Libraries). Aqui lo importante es que, si hay una disparidad entre convenciones de llamada, (que un lado utilice __stdcall y el otro __cdecl) la pila se ve destruida, pues bien, o nadie hace "pop", o ambos lo harán, ( y la máquina hace "puff" y uno queda con "cara de what?").&lt;br /&gt;&lt;br /&gt;En un comantario sin importancia, hasta ahora sé porque hay que ponerle __stdcall a las funciones que uno usa en una DLL, jeje, por cierto, eso de #define, es mala manía, porque en las DLL uno usa DLLIMPORT, pero al final, #define DLLIMPORT __stdcall. (Ni los mareros usan tanto alias...)&lt;br /&gt;&lt;br /&gt;La consistencia entre convenciones de llamada es también crucial en los casos en que una aplicación se desarrolla desde varios lenguajes.&lt;br /&gt;&lt;br /&gt;en cuanto a __fastcall, basicamente utiliza registros para pasar parámetros, pero como no todos los registros estarán disponibles, a fin de cuentas el compilador terminará decidiendo cuales poner y cuales no...&lt;br /&gt;&lt;br /&gt;El otro punto a que encontré, concerniente a convenciones, tiene tambien que ver con linking, esta vez con los nombres decorados o "mangling", que es cuando los editores de enlace (equivalente de linkers) cambian los nombres de las funciones, "decorandolos" con simbologías que indican tipo de convencion de llamada, tipo y/o numero de parametros, etc. El "name mangling" depende del diseño del linker.&lt;br /&gt;&lt;br /&gt;CIERRA-PARENTESIS&lt;br /&gt;&lt;br /&gt;Tambien quise ver las variables locales, y constaté que se menten en la pila en el orden en que se declaran, y despues que los argumentos, es decir asi:&lt;br /&gt;&lt;br /&gt;(direcciones bajas/tope)&lt;br /&gt;...&lt;br /&gt;variables locales&lt;br /&gt;8 Bytes que no se que son&lt;br /&gt;arg1&lt;br /&gt;arg2&lt;br /&gt;...&lt;br /&gt;argn&lt;br /&gt;...&lt;br /&gt;(direcciones altas/fondo de pila)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Codigo Usado en el experimento final:&lt;br /&gt;&lt;br /&gt;____________________________________________&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;#include &lt;cstdlib&gt;&lt;/cstdlib&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#include &lt;cstdio&gt;&lt;/cstdio&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#include &lt;stdarg.h&gt;&lt;/stdarg.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int recorre4(int first, int second, int third...){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("&amp;first =%i\n&amp;amp;second=%i\n&amp;third =%i\n",&amp;amp;first, &amp;second, &amp;amp;amp;amp;third);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   int a,b,c,d;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   a = 1;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   b = 2;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   c = 3;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   d = 4;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("\n&amp;a=%i\n&amp;amp;b=%i\n&amp;c=%i\n&amp;amp;d=%i\n",&amp;a,&amp;amp;amp;amp;b,&amp;c,&amp;amp;d);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   int* ptr; ptr = &amp;first;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("&amp;p=%i\n",&amp;amp;amp;amp;ptr);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   int x,y,z;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("\n&amp;x=%i\n&amp;amp;y=%i\n&amp;z=%i\n",&amp;amp;amp;amp;x,&amp;y,&amp;amp;z);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("ptr:[%i][%i][%i][%i][%i][%i]\n",ptr[0],ptr[1],ptr[2],ptr[3],ptr[4],ptr[5]);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("ptr[7] = = = :%i\n", ptr[7]);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("ptr[6] = = = :%i\n", ptr[6]);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("arriba^5 de a:%i\n", *(&amp;a+5)); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("arriba^4 de a:%i\n", *(&amp;a+4)); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("arriba^3 de a:%i\n", *(&amp;a+3)); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("arriba^2 de a:%i\n", *(&amp;a+2));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("arriba   de a:%i\n", *(&amp;a+1));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("arriba   de b:%i\n", *(&amp;b+1));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("arriba   de c:%i\n", *(&amp;c+1));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("exactamente c:%i\n", *(&amp;c));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("debajo   de c:%i\n", *(&amp;c-1));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("debajo^2 de c:%i\n", *(&amp;c-2));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("debajo^3 de c:%i\n", *(&amp;c-3));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //return 224;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int __stdcall normal(int m, int n, int o){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   int s, t, u;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("&amp;m := %i\n", &amp;amp;amp;amp;m);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("&amp;n := %i\n", &amp;amp;amp;amp;n);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("&amp;o := %i\n", &amp;amp;amp;amp;o);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("&amp;s := %i\n", &amp;amp;s);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("&amp;t := %i\n", &amp;amp;amp;amp;t);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("&amp;u := %i\n", &amp;amp;amp;amp;u);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;int main(){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   int r1 = recorre4(2,5,6,7,8,0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("   retorna %i\n", r1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   int r2 = recorre4(2,5,6,7,8,0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("   retorna %i\n", r2);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   printf("\n");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   system("pause");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   normal(1,2,3);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   system("pause");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   return 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;____________________________________________&lt;br /&gt;&lt;br /&gt;SALIDA&lt;br /&gt;____________________________________________&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;first =37814056&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;second=37814060&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;third =37814064&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;a=37814044&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;b=37814040&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;c=37814036&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;d=37814032&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;p=37814028&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;x=37814024&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;y=37814020&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;z=37814016&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ptr:[2][5][6][7][8][0]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ptr[7] = = = :4200443&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ptr[6] = = = :37814112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba^5 de a:6&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba^4 de a:5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba^3 de a:2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba^2 de a:4200463&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba   de a:37814112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba   de b:1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba   de c:2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exactamente c:3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;debajo   de c:4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;debajo^2 de c:37814056&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;debajo^3 de c:4200624&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   retorna 22&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;first =37814056&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;second=37814060&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;third =37814064&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;a=37814044&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;b=37814040&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;c=37814036&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;d=37814032&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;p=37814028&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;x=37814024&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;y=37814020&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;z=37814016&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ptr:[2][5][6][7][8][0]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ptr[7] = = = :4200443&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ptr[6] = = = :37814112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba^5 de a:6&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba^4 de a:5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba^3 de a:2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba^2 de a:4200511&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba   de a:37814112&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba   de b:1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;arriba   de c:2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;exactamente c:3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;debajo   de c:4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;debajo^2 de c:37814056&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;debajo^3 de c:2147332096&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   retorna 25&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Press any key to continue . . .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;m := 37814072&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;n := 37814076&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;o := 37814080&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;s := 37814060&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;t := 37814056&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;amp;u := 37814052&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Press any key to continue . . .&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;____________________________________________&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-113315081540779133?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/113315081540779133/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=113315081540779133' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113315081540779133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113315081540779133'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/11/convenciones-de-llamada-y-parametros.html' title='Convenciones de llamada y parametros variantes'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-113195126957637308</id><published>2005-11-14T00:52:00.000-06:00</published><updated>2005-11-14T00:59:16.070-06:00</updated><title type='text'>Uso de atributos heredados en CUP(parte 2)</title><content type='html'>Confirmada mi sospecha, usar el código raro... funciona.&lt;br /&gt;Esta vez utilicé una gramatica similar a la declaración de tipos en C/C++;&lt;br /&gt;la cual es:&lt;br /&gt;&lt;br /&gt;dec -&gt; dec tipo lista ';'&lt;br /&gt;dec -&gt; tipo lista ';'&lt;br /&gt;tipo -&gt; entero&lt;br /&gt;tipo -&gt; real&lt;br /&gt;lista -&gt; lista ',' ID&lt;br /&gt;lista -&gt; ID&lt;br /&gt;&lt;br /&gt;Las reglas semanticas embebidas en la gramatica, originalmente quedan:&lt;br /&gt;&lt;br /&gt;dec -&gt; dec tipo {lista.t = tipo.t} lista ';'&lt;br /&gt;dec -&gt; tipo {lista.t = tipo.t} lista ';'&lt;br /&gt;tipo -&gt; entero {tipo.t = entero}&lt;br /&gt;tipo -&gt; real {tipo.t = real}&lt;br /&gt;lista -&gt; {lista1.t = lista.t} lista ',' ID {declare(ID.lexema, lista.t);}&lt;br /&gt;lista -&gt; ID{declare(ID.lexema, lista.t);}&lt;br /&gt;&lt;br /&gt;por la regla de copia, se sustituyen las referencias al atr.heredado por referencias al&lt;br /&gt;&lt;br /&gt;atributo sintetizado del símbolo de orígen, por lo tanto, las producciones de lista&lt;br /&gt;&lt;br /&gt;quedan:&lt;br /&gt;&lt;br /&gt;lista -&gt; lista ',' ID {declare(ID.lexema, lista.t);} // usando atr[top-3]&lt;br /&gt;lista -&gt; ID{declare(ID.lexema, lista.t);} // usando atr[top-1]&lt;br /&gt;&lt;br /&gt;aca pueden ver el código de cup.&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;package EjemploH1;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.io.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java_cup.runtime.*;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;parser code {:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    public static void main(String args[]) throws Exception {    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      try{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         //FileReader fis = new FileReader("dec.txt"); // se construye el File reader&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         parser paspar = new parser(new Yylex(System.in));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         paspar.parse(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         System.out.println("Proceso terminado");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         System.exit(0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      }catch(FileNotFoundException e){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         System.out.println("Imposible abrir el erchivo especificado");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         System.exit(1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;action code {:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   private void settype(String id, String tipo){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      System.out.println("declare(" + id + ", tipo " + tipo + ");");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;terminal ENTERO, REAL, COMA, PUNTOYCOMA;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;terminal String ID;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;non terminal cSimbolo dec, tipo, lista;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dec ::= dec tipo lista PUNTOYCOMA;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dec ::= tipo lista PUNTOYCOMA;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;tipo ::= ENTERO {:RESULT = new cSimbolo("entero"); :};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;tipo ::= REAL {:RESULT = new cSimbolo("real"); :};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;lista ::= lista COMA ID:i{:settype(i,((cSimbolo)((java_cup.runtime.Symbol) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CUP$parser$stack.elementAt(CUP$parser$top-3)).value).tipo);:};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;lista ::= ID:i {:settype(i,((cSimbolo)((java_cup.runtime.Symbol) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CUP$parser$stack.elementAt(CUP$parser$top-1)).value).tipo);:};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Aqui un ejemplo de corrida:&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;entero lunes, martes, miercoles; real madrid, fantasia, cuento;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;declare(lunes, tipo entero);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;declare(martes, tipo entero);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;declare(miercoles, tipo entero);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;declare(madrid, tipo real);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;declare(fantasia, tipo real);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;declare(cuento, tipo real);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;^Z&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Proceso terminado&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Press any key to continue...&lt;/span&gt;&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;y por si las dudas, el código de jFlex:&lt;br /&gt;----------------------------------------------------------------&lt;br /&gt;&lt;span style="font-size:85%;"&gt;package EjemploH1;&lt;br /&gt;&lt;br /&gt;import java_cup.runtime.Symbol;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Class YyLex, creada mediante jFlex a partir de minimal.&amp;nbsplex.&lt;br /&gt;* @author Gerson Lara&lt;br /&gt;* @URL http://www2.cs.tum.edu/projects/cup/minimal.tar.gz&lt;br /&gt;*/&lt;br /&gt;%%&lt;br /&gt;%cup&lt;br /&gt;%ignorecase&lt;br /&gt;%%&lt;br /&gt;";" { return new Symbol(sym.PUNTOYCOMA); }&lt;br /&gt;"entero" { return new Symbol(sym.ENTERO); }&lt;br /&gt;"real" { return new Symbol(sym.REAL); }&lt;br /&gt;"," { return new Symbol(sym.COMA); }&lt;br /&gt;[A-Za-z]+ { return new Symbol(sym.ID, yytext()); }&lt;br /&gt;[ \t\r\n\f] { /* ignore white space. */ }&lt;br /&gt;. { System.err.println("Illegal character: "+yytext()); }&lt;/span&gt;&lt;br /&gt;----------------------------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-113195126957637308?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/113195126957637308/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=113195126957637308' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113195126957637308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113195126957637308'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/11/uso-de-atributos-heredados-en-cupparte.html' title='Uso de atributos heredados en CUP(parte 2)'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-113194373230428903</id><published>2005-11-13T22:20:00.000-06:00</published><updated>2005-11-13T22:48:52.316-06:00</updated><title type='text'>Cambios en la carrera.</title><content type='html'>Recientemente {asist ( í | imos ) } a una reunión para informarnos a cerca de los cambios que se avecinan en el plan de estudios de la Carrera de Sistemas en Unitec.&lt;br /&gt;&lt;br /&gt;Lo que queiro mencionar aquí es mi satisfacción por el hecho de que ahora se va a considerar la falla (ya mencionada antes) de la gente de sistemas para trabajar en grupos multidisciplinarios.&lt;br /&gt;&lt;br /&gt;Me permito recordar que si bien es cierto, la carrera es eminenetemente técnica, eventualmete nos corresponderá fungir como administradores de algun departamento o empresa, deseablemente relativa al tema computacional. Y esto lo digo no con ánimos de insistir, sino de apoyar esa decisión en particular de la jefatura de la carrera.&lt;br /&gt;&lt;br /&gt;En mi posición particular, el software administrativo, no me agrada (aunque quizá sea el que más venda), prefiero verme como parte de un equipo de desarrollo o investigación sobre nuevas tecnologías, o apoyar proyectos de investigación científica o algo así. Aquí inserto mi frase de "La computación por sí sola no sirve para nada". Digo esto porque (no lo tomen a mal pero,) un autómata ahi solito, sólo sirve para quebrarse la cabeza. Ahora, asocie ese autómata con um problema real, y al resolver el autómata, debería tener la solución del problema original. Suena obvio, y creo que lo es, sin embargo, al trasladar esto un poco más a flote, La gente de Sistemas tiende a pensar que con saber de Sistemas y computadores, bits y bytes, y si se queire cables y frecuencias basta. Pero y a la hora de desarrollar un proyecto que integre personas y tecnología? quién sabe de personas? De alumnos un docente, de pacientes el doctor, de empleados el de Recursos Humanos que con suerte es Psicólogo... La computación sirve cuando se le combina adecuadamente con otra ciencia, arte, deporte, empleo etc... El caso es que, con suerte( no se si buena o mala) me corresponderá algún día, liderar o administrar un grupo como esos, donde cada quien piensa que su propio gremio es lo máximo. ¿Cómo ponerlos de acuerdo?&lt;br /&gt;&lt;br /&gt;Por eso creo que le viene bien a Sistemas de Unitec, la carrera "donde se enseña cómo hacer y no cómo usar..." , que le incluyan un par de clases y talleres de liderazgo, para aprender a quitarnos eso de  "Porque si, porque yo se de computadoras y (vos | usted | etc ) no!" (Que aunque no lo decimos, lo pensamos)&lt;br /&gt;&lt;br /&gt;Una de las últimas clases que incluye el plan 2002 para sistemas, donde se puede trabajar en grupos multidisciplinarios, es Generación de Empresas I, clase que en lo personal, opino que es un desastre; vayan a ver a los de Sistemas, Todos Juntos!!!! Parece que le tienen miedo a los de Publicidad y por eso no se juntan con ellos, como si les fueran a robar los poderes divinos o algo.&lt;br /&gt;&lt;br /&gt;Finalmente, comento que alguien me dijo, que en su caso, cuando estudió, era requisito, que en cada período, debía inscribir una clase al menos, no relacionada con el área, es decir, Finanzas, Biología, Arte, ... Unitec podría hacer eso, aunque copiar comportamientos nunca es bueno, eso si los iba a enojar, en lugar de eso, ahi colocaron unos talleres no más, asi que ¡Enhorabuena por los cambios!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-113194373230428903?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/113194373230428903/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=113194373230428903' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113194373230428903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113194373230428903'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/11/cambios-en-la-carrera.html' title='Cambios en la carrera.'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-113194175985253953</id><published>2005-11-13T21:57:00.000-06:00</published><updated>2005-11-13T22:16:50.366-06:00</updated><title type='text'>Uso de Atributos heredados en CUP (parte 1)</title><content type='html'>Lo primero que se me ocurrió fue usar una porción de codigo copiada del código generado. había visto antes eso de top-x, y cuando se hizo la pregunta, yo creí conocer la respuesta.&lt;br /&gt;La verdad solamente había vista la punta de in iceberg.&lt;br /&gt;Al intentar colocar acciones enmbebidas en la gramática se genera una cantidad alta de conflictos shift/reduce; el insertar los marcadores manualmente, procuce (al menos en mis pruebas) exactamente los mismos conflictos.&lt;br /&gt;El mayor problema con esos conflictos, es que , aunque CUP tiene una políitica establecida para resolverlos, también aborta la generación de código, por lo cual, nunca pude probar si mi especulación era correcta.&lt;br /&gt;&lt;br /&gt;El código que pensaba emplear eran las respectivas versiones de algo como esto:&lt;br /&gt;cSimbolo E = (cSimbolo)((java_cup.runtime.Symbol) CUP$parser$stack.elementAt(CUP$parser$top-2)).value;&lt;br /&gt;Pero el problema no fue escribir eso, sino hacer que CUP generase el código.&lt;br /&gt;&lt;br /&gt;De modo que sigo con la interrogante a cuestas.&lt;br /&gt;&lt;br /&gt;Por cierto, aun me queda otra duda:&lt;br /&gt;&lt;br /&gt;Si en A -&gt; XYZ, o mejor en S -&gt; XYZ, donde S es el START SYMBOL o uno similar, ¿Cómo puede utilizarse un atributo de S en los hijos de S? ¿No ha reducido ni se ha metido en la pila, entonces de donde toma su valor? y ya que estamos, fuera de ese caso, ¿Para cualquier necesidad de un valor de atributo de Y por parte de un hijo de Y, debe sustituirse por el correspondiente atributo del símbolo del cual hereda el atributo? o hay casos donde no es posible ?(Sólo en L-atribuidas)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-113194175985253953?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/113194175985253953/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=113194175985253953' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113194175985253953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113194175985253953'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/11/uso-de-atributos-heredados-en-cup.html' title='Uso de Atributos heredados en CUP (parte 1)'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-113134305874655982</id><published>2005-11-06T23:50:00.000-06:00</published><updated>2005-11-07T00:47:48.296-06:00</updated><title type='text'>Tarea</title><content type='html'>Gramatica para ejerc 6.3  &lt;br /&gt;&lt;span style="font-family:courier new;"&gt;P -&gt; D;E    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;D -&gt; D;D    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;D -&gt; id:T    { declare(id.nombre, T.tipo) }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;T -&gt; char    { T.tipo = char }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;T -&gt; integer    { T.tipo = integer }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;T -&gt; list of T1    { T.tipo = tipo_lista(T1.tipo) }    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;E -&gt; literal    { E.tipo = char }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;E -&gt; num    { E.tipo = integer }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;E -&gt; id    { E.tipo = tipode(id.nombre) }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;E -&gt; ( L )    { E.tipo = L.tipo }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;L -&gt; E,L1    { L.tipo = si( E.tipo==(L1.tipo).tipo, tipo_lista(E.tipo, L1.tipo), error_tipo) }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;L -&gt; E    { L.tipo = E.tipo }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Notas: asuma que: declare() graba a la TDS, tipode() busca en la TDS y retorna el tipo y si() es una funcion que toma un valor booleano y dos expresiones, si el valor es true, retorna el valor de la primera expresion, sino el de la segunda.&lt;br /&gt;&lt;br /&gt;EJERCICIO 6.5a (interprete lo que está entre llaves como las "decoraciones del arbol". El árbol está dibujado como en el "treeview" de windows.)&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;P&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+-D&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| +-D {declara(id.lexema, T.tipo)}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| | +-id {id.lexema = "c"}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| | | +-c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| | +-:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| | +-T {T.tipo = char}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| |   +-char&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| +-;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| +-D {declara(id.lexema, T.tipo)}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|   +-id {id.lexema = "i"}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|   | +-i&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|   +-:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|   +-T {T.tipo = integer}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|     +-integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+-;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+-E {E1.tipo==char &amp;&amp;amp; E2.tipo==integer entornces error_tipo}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  +-E1 {E1.tipo = tipode(id.lexema)//char}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  | +-id {id.lexema="c"}        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  |   +-c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  +-mod&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  +-E2 {E3.tipo==integer &amp;&amp;amp; E4.tipo==integer entonces integer}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    +-E3 {E3.tipo=tipode(id.lexema)//integer}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    | +-id {id.lexema="i"}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    |   +-i&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    +-mod        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    +-E4 {E.tipo = integer}        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      +-num    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        +-3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;TDS:[id,tipo]&lt;br /&gt;[c,char]&lt;br /&gt;[i,ineger]&lt;br /&gt;&lt;br /&gt;EJERCICIO 6.5b&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;P&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+-D&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| +-D { declare(id.lexema, T1.tipo) }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| | +-id {id.lexema="p"}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| | | +-p&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| | +-:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| | +-T1 {T1.tipo = pointer(integer)} &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| |   +-^&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| |   +-integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| +-;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;| +-D {declare(id.lexema,T3.tipo)}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|   +-id {id.lexema = "a"}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|   | +-a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|   +-:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|   +-T3 {T3.tipo = array(num.val, T2.tipo)}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|     +-array&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|     +-[&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|     +-num {num.val = 10}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|     | +-10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|     +-]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|     +-of&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|     +-T2 {T2.tipo = integer}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;|       +-integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+-;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+-E {E.tipo = E3.tipo == integer &amp;&amp;amp; E1.tipo == array(s,t) entonces t //integer}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  +-E1 {E1.tipo = tipode(id.lexema)//array(10,integer)}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  | +-id {id.lexema = "a"}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  |   +-a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  +-[&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  +-E3 {E3.tipo = E2.tipo==pointer(t1) entonces t1 //integer}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  | +-E2 {E2.tipo = tipode(id.lexema)//pointer(integer)}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  | | +-id {id.lexema = "p"}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  | |   +-p&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  | +-^&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  +-]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;TDS:[id,tipo]&lt;br /&gt;[p:pointer(integer)]&lt;br /&gt;[a:array(10,integer)]&lt;br /&gt;&lt;br /&gt;EJERCICIO 6.5C&lt;br /&gt;Asumiendo que existe&lt;br /&gt;E -&gt; E(E)&lt;br /&gt;P -&gt; D;S&lt;br /&gt;S -&gt; id := E&lt;br /&gt;S -&gt; if E then S1&lt;br /&gt;S -&gt; while E do S1&lt;br /&gt;S -&gt; S1;S2&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;P&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;+-D&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| +-D {declare (id.lexema,T3.tipo)}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| | +-id {id.lexema="f"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| | +-:&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| | +-T3 {T3.tipo = (T1.tipo-&gt;T2.tipo)//(integer-&gt;boolean)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| |   +-T1 {T1.tipo = integer}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| |   | +-integer&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| |   +-'-&gt;'&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| |   +-T2 {T2.tipo = boolean}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| |     +-boolean&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| +-;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;| +-D&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|   +-D {declare(id.lexema,T4.tipo)}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|   | +-id {id.lexema = "i"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|   | +-:&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|   | +-T4 {T4.tipo = integer}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|   |   +-integer&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|   +-;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|   +-D&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|     +-D&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|     | +-id {id.lexema="j"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|     | +-T5 {T5.tipo=ingeter}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|     |   +-integer&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|     +-;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|     +-D {declare(id.lexema,T6.tipo)}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|       +-id {id.lexema="k"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|       +-:&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|       +-T6 {T6.tipo=integer} &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;|         +-integer&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;+-;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;+-S6 {S6.tipo = E3.tipo==boolean entonces S5.tipo //vacio}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  +-while&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  +-E3 {E3.tipo = E2.tipo==integer &amp;&amp;amp; E1.tipo=(integer-&gt;boolean) entonces boolean}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  | +-E1 {E1.tipo = tipode(id.lexema)//(integer-&gt;boolean)}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  | | +-id {id.lexema="f"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  | +-(&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  | +-E2 {E2.tipo=tipode(id.lexema)//integer}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  | | +-id {id.lexema="i"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  | +-)&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  +-do&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;  +-S5 {S5.tipo = S1.tipo == vacio &amp;&amp;amp; S4.tipo == vacio entonces vacio}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    +-S1 {S1.tipo = tipode(id.lexema)== E4.tipo entonces vacio;}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    | +-id {id.lexema="k"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    | +-:=&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    | +-E4 {E4.tipo=tipode(id.lexema)//integer}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    |   +-id {id.lexema="i"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    +-;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;    +-S4 {S4.tipo = S2.tipo == vacio &amp;&amp;amp; S3.tipo == vacio entonces vacio}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      +-S2 {S2.tipo = tipode(id.lexema)== E7.tipo entonces vacio}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      | +-id {id.lexema="i"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      | +-:=&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      | +-E7 {E7 = E5.tipo ==integer &amp;&amp;amp; E6.tipo ==integer entonces integer}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      |   +-E5 {E5.tipo = tipode(id.lexema)//integer}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      |   | +-id {id.lexema="j"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      |   +-mod&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      |   +-E6 {E6.tipo = tipode(id.lexema)//integer}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      |     +-id {id.lexema="i"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      +-;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      +-S3 {S3.tipo = tipode(id.lexema)==E8.tipo entonces vacio}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        +-id {id.lexema="j"}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        +-:=&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;        +-E8 {E8.tipo=tipode(id.lexema)//integer}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;          +-id {id.lexema="k"}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;TDS:[id,tipo]&lt;br /&gt;[f,integer-&gt;boolean]&lt;br /&gt;[i,integer]&lt;br /&gt;[j,integer]&lt;br /&gt;[k,integer]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-113134305874655982?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/113134305874655982/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=113134305874655982' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113134305874655982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113134305874655982'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/11/tarea.html' title='Tarea'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-113073109057149531</id><published>2005-10-30T21:34:00.000-06:00</published><updated>2005-11-07T00:48:40.856-06:00</updated><title type='text'>El primer disque compilador de mi existencia</title><content type='html'>Primer experimento generando código, gran cosa no es, pero emociona... es como decir que estas construyendo un carro y ver juntas por primera vez las cuatro ruedas(pegadas al chasis, correctamente), aunque haga falta todo el resto, ya tienes una plataforma que se mueve...&lt;br /&gt;&lt;br /&gt;Asi se siente poner en marcha un pequeno compilador de sumas para mips. bueno, spim... (ni es lo mismo ni es igual)&lt;br /&gt;&lt;br /&gt;Eso me recuerda que cuando inicie mis estudios, mi papá me preguntó que como era que los ceros y unos se convertian en un programa, y como era que la computadora los hace funcionar.&lt;br /&gt;Hasta ahora, cuatro años después podría decirle una respuesta...&lt;br /&gt;&lt;br /&gt;Para iniciar,  recuerdan el ejemplo minimal? pues, bien, utilicé el archivo minimal.lex, y modifiqué minimal.cup.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;package Ejemplos;&lt;br /&gt;&lt;br /&gt;import java_cup.runtime.*;&lt;br /&gt;import java.util.LinkedList;&lt;br /&gt;&lt;br /&gt;parser code {:&lt;br /&gt;   public static void main(String args[]) throws Exception {&lt;br /&gt;       new parser(new Yylex(System.in)).parse();&lt;br /&gt;   }&lt;br /&gt;:}&lt;br /&gt;&lt;br /&gt;action code {:&lt;br /&gt;&lt;br /&gt;  private boolean[] usoReg = new boolean[8];&lt;br /&gt;&lt;br /&gt;  private String getFreeReg(){&lt;br /&gt;for(int i = 0; i &lt; i =" (int)(reg.charAt(2)" nreg =" getFreeReg();" result =" new" reg =" nReg;" result =" new" reg =" T.reg;" nreg =" getFreeReg();" result =" new" reg =" nReg;" result =" new" reg =" F.reg;" nreg =" getFreeReg();" result =" new" reg =" nReg;"  style="font-family:georgia;"&gt;&lt;span style="font-family:georgia;"&gt;La parte de la gramática es igual que el ejemplo en clase, salvo unas pequeñas modificaciones.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;aca lo interesante es la funciopn para tomar un registro y para liberarlo. No son nada del otro mundo vdd?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Dado este código de cup, generando, compilando y corriendo, se abre la consola, donde hay que escribir la cadena de sumas y multiplicaciones, terminados con puntoycoma, aqui pueden ver el ejemplo de corrida:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;----------------------------&lt;br /&gt;2+3*8+6*9*5;&lt;br /&gt;li $t0 , 2&lt;br /&gt;li $t1 , 3&lt;br /&gt;li $t2 , 8&lt;br /&gt;mul $t3 , $t1 , $t2&lt;br /&gt;#queda libre $t1(1&lt;br /&gt;#queda libre $t2(2&lt;br /&gt;add $t1 , $t0 , $t3&lt;br /&gt;#queda libre $t0(0&lt;br /&gt;#queda libre $t3(3&lt;br /&gt;li $t0 , 6&lt;br /&gt;li $t2 , 9&lt;br /&gt;mul $t3 , $t0 , $t2&lt;br /&gt;#queda libre $t0(0&lt;br /&gt;#queda libre $t2(2&lt;br /&gt;li $t0 , 5&lt;br /&gt;mul $t2 , $t3 , $t0&lt;br /&gt;#queda libre $t3(3&lt;br /&gt;#queda libre $t0(0&lt;br /&gt;add $t0 , $t1 , $t2&lt;br /&gt;#queda libre $t1(1&lt;br /&gt;#queda libre $t2(2&lt;br /&gt;#se escribe el resultado&lt;br /&gt;li $v0, 1&lt;br /&gt;add $a0, $zero, $t0&lt;br /&gt;syscall&lt;br /&gt;terminamos?&lt;br /&gt;------------------------ '&lt;br /&gt;otro ejemplo:&lt;br /&gt;------------------------&lt;br /&gt;3*9*2*4*5;&lt;br /&gt;li $t0 , 3&lt;br /&gt;li $t1 , 9&lt;br /&gt;mul $t2 , $t0 , $t1&lt;br /&gt;#queda libre $t0(0&lt;br /&gt;#queda libre $t1(1&lt;br /&gt;li $t0 , 2&lt;br /&gt;mul $t1 , $t2 , $t0&lt;br /&gt;#queda libre $t2(2&lt;br /&gt;#queda libre $t0(0&lt;br /&gt;li $t0 , 4&lt;br /&gt;mul $t2 , $t1 , $t0&lt;br /&gt;#queda libre $t1(1&lt;br /&gt;#queda libre $t0(0&lt;br /&gt;li $t0 , 5&lt;br /&gt;mul $t1 , $t2 , $t0&lt;br /&gt;#queda libre $t2(2&lt;br /&gt;#queda libre $t0(0&lt;br /&gt;#se escribe el resultado&lt;br /&gt;li $v0, 1&lt;br /&gt;add $a0, $zero, $t1&lt;br /&gt;syscall&lt;br /&gt;#terminamos?&lt;br /&gt;&lt;br /&gt;----------------------&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;Como es obvio, falta la parte de las directivas y todo ese rollo... por los momentos mis pruebas las hice mediante copy-paste. Con ver que el resultado correcto se desplegara en la consola, me bastaba.&lt;br /&gt;&lt;br /&gt;Claro, que no salio a la primera, en varios intentos, mi codogo salia escrito con errores de sintaxis, pero eso es naturalmente debido a la falta de práctica con MIPS.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-113073109057149531?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/113073109057149531/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=113073109057149531' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113073109057149531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113073109057149531'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/10/el-primer-disque-compilador-de-mi.html' title='El primer disque compilador de mi existencia'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-113072921156775017</id><published>2005-10-30T21:11:00.000-06:00</published><updated>2005-10-30T21:26:51.616-06:00</updated><title type='text'>Una Hashtable con múltiples objetos bajo la misma llave</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5986/804/1600/MultivalueHash.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/5986/804/320/MultivalueHash.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;En mi proyecto, la tabla de símbolos está implementada mediante una tabla hash que contiene objetos entre cuyos campos están el nombre y el ámbito. La llave de dichos objetos se calcula entonces concatenando el valor del ámbito, cuatro puntos (&lt;/span&gt;&lt;b style=""&gt;&lt;span style=";font-family:&amp;quot;;" &gt;“::”&lt;/span&gt;&lt;/b&gt;&lt;span lang="ES-HN"&gt;) y el valor del nombre.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="ES-HN"&gt;Esto tiene la ventaja de que rápidamente se puede averiguar si existe ya un identificador con un nombre dado en el ámbito especificado, pues basta con calcular la llave y preguntarle a la &lt;/span&gt;&lt;b style=""&gt;&lt;span style=";font-family:&amp;quot;;" &gt;Hashtable&lt;/span&gt;&lt;/b&gt;&lt;span lang="ES-HN"&gt; mediante el método &lt;/span&gt;&lt;b style=""&gt;&lt;span style=";font-family:&amp;quot;;" &gt;containsKey&lt;/span&gt;&lt;/b&gt;&lt;span lang="ES-HN"&gt;. La dificultad que esto me propuso, era el problema de cómo recuperar TODOS los identificadores dado un ámbito, i.e. dado el nombre de una función o procedimiento, recuperar tanto parámetros como variables locales.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="ES-HN"&gt;Primero, y para no hacer un recorrido estilo Programación 1 en busca de todas las instancias cuyo campo ámbito correspondiera, quise averiguar si hay una forma de que la tabla hash pudiese mapear una sola llave a varios objetos. Aun no se si se puede, pero javadoc dice que “el nuevo valor asociado reemplaza al valor anterior”. Busqué dentro del mismo javadoc a ver si existe otra estructura capaz de hacer el trabajo; la búsqueda fue infructuosa. Ya sin ideas, pregunté a compañeros y profesores. La mayoría me sugiere que cree mi propia clase, y un compañero me sugirió que usara una tabla hash por ámbito en la cual guardase tablas hash por nombre.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="ES-HN"&gt;Lo primero es: combinar esas dos sugerencias. Creo que funcionaría, pero me complicaría los procedimientos de inserción y búsqueda de símbolos, que ya está programada y probada.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="ES-HN"&gt;Decidí hacer lo siguiente: 1) Mantener mi tabla de símbolos tal y como está hasta ahora. 2) Agregar una segunda tabla hash, donde las llaves son ámbitos y los valores son &lt;/span&gt;&lt;b style=""&gt;&lt;span style=";font-family:&amp;quot;;" &gt;LinkedList&lt;/span&gt;&lt;/b&gt;&lt;span lang="ES-HN"&gt; que apuntan a los mismos objetos que están en la tabla original.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="ES-HN"&gt;De esa forma, la lista de los identificadores pertenecientes a un ámbito está “siempre lista y servida para llevar”.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="ES-HN"&gt;Ya realicé los primeros ensayos. La inserción en ambas tablas se hace sin problemas, y aunque para terminar de hacer útil esa segunda tabla de símbolos hace falta un par de adiciones, ya se ve que cumple los objetivos.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="ES-HN"&gt;El principal uso que pretendo darle es principalmente para comprobar los tipos de los parámetros en las llamadas a funciones, Aunque aun no estoy 100% seguro de cómo hacer eso... jeje.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-113072921156775017?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/113072921156775017/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=113072921156775017' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113072921156775017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113072921156775017'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/10/una-hashtable-con-mltiples-objetos.html' title='Una Hashtable con múltiples objetos bajo la misma llave'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-113022253597770795</id><published>2005-10-25T00:20:00.000-06:00</published><updated>2005-10-25T00:42:15.983-06:00</updated><title type='text'>Assembler en MIPS</title><content type='html'>Primero que nada, mis disculpas por la entrega tardía. La excusa la dejo a la imaginación.&lt;br /&gt;&lt;br /&gt;Comentarios generales:&lt;br /&gt;&lt;br /&gt;El laboratorio fue fácil de hacer,  las dificultades, como siempre aparecen haciendo más interesante el rollo.&lt;br /&gt;&lt;br /&gt;Instalé la versión que venia en el CD que encontré en el parqueo, eso no dio problemas.&lt;br /&gt;&lt;br /&gt;Luego, copiar el codigo del ejemplo de suma, pues valla! esta vez copié bien!!!. La carga se hizo bien, probé y funcionó.&lt;br /&gt;&lt;br /&gt;Hasta aquí todo bien, el problema fue que suspendi el laboratorio y lo retome hasta el lunes en la noche.&lt;br /&gt;&lt;br /&gt;Para ser honestos, mejor ví algunos blogs de los compañeros, y lógico, mi codigo no salio tan diferente, asi que solo voy a relatar algunas cosas que por lo menos no estaban en los blogs que YO VI.&lt;br /&gt;&lt;br /&gt;1. para ahorrarme el error de escribir mal $zero,  aprendi a usar la y move. tambien escribo menos .&lt;br /&gt;&lt;br /&gt;2. aprendi a usar jal, porque mi programa ejecutava en ciertas ocasiones "tanto el if como el else", entonces decidi usar jal para tirar la ejecucion hasta despues del "cuerpo del else".&lt;br /&gt;&lt;br /&gt;3. Quise usar las cadenas directamente en la instruccion, sin usar cadn, pero no halle el modo, si es que existe.&lt;br /&gt;&lt;br /&gt;4. No se como funciona el modo de ejecucion por pasos, ya que le coloco cualquier numero de  pasos en la caja correspondiente pero no veo que pase nada, no veo que cambien los registros, asi que, me conformé con verlos mientras el programita "esperaba el entero"&lt;br /&gt;&lt;br /&gt;Comentarios finales&lt;br /&gt;&lt;br /&gt;El Assembler de MIPS es para mí {mucho}* más fácil que el de Intel. Con sólo ver el codigo de suma, sabía por donde "iba la cosa". Me dió por revisar uno de los viejos ejemplos de cuando cursé "Organizacion de Computadoras" o "Diseño Lógico Digital"(no recuerdo cual es cual, deberían llamarse las dos del mismo modo, con I y II como todas las demás), y no se que dice ahi. (asembler de intel...)&lt;br /&gt;&lt;br /&gt;Hacerle las modificaciones al código no fue difícil, excepto por que si se comete un error el simulador no lo informa como solemos estar acustumbrados, y hay que rebuscar un poquito pero "eso se lima con el uso".&lt;br /&gt;&lt;br /&gt;Una vez más, lamento lo escueto del contenido de la clase antes mencionada, ya que el asunto del ensamblador es sumamente interesante, no tanto a nivel de programaciónes sencillas, sino a nivel de análisis como en las llamadas de procedimientos(que no he visto en detalle pero se que estan en "el apendice", y habría sido &lt;span style="font-style: italic;"&gt;macanudo&lt;/span&gt; tener una clase &lt;span style="font-style: italic;"&gt;en hondureño&lt;/span&gt; al respecto. Eso lo digo porqeu siempre que busco algo en Internet , me pierdo y termino averiguando otra cosa que nada tiene relacionado con lo que incialmente buscaba.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-113022253597770795?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/113022253597770795/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=113022253597770795' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113022253597770795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/113022253597770795'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/10/assembler-en-mips.html' title='Assembler en MIPS'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112952453104178907</id><published>2005-10-16T22:09:00.000-06:00</published><updated>2005-10-16T22:56:16.896-06:00</updated><title type='text'>Electivas?</title><content type='html'>En respuetsta a la pregunta ¿Qué curso optativo me gustaría recibir en la carrera de Ingeniería de Sistemas y por qué?...&lt;br /&gt;Se me hace una pregunta difícil, pues en lo personal creo en la diversificación del conocimiento como un arma sumamente poderosa, especialmente en un mundo globalizado, donde se requiere no solo de una amplia gama de conocimientos, sino también de la capacidad para relacionarlos en formas nuevas para lograr el avance, y sacar de su estancamiento a países como el nuestro.&lt;br /&gt;Por otro lado, también creo en el autoaprendizaje, sobre todo como principal fuente de diversidad de conocimientos.&lt;br /&gt;En ese sentido, es mi opinión, que un curso electivo debe tener una relación no obvia con la carrera, pero no puede en definitiva ser un tópico aislado totalmente. Creo que debe ser una tipo de conocimiento práctico relacionado con el desempeño real que un graduado de la carrera de Sistemas Computacionales de Unitec debería tener dentro del sector laboral-industrial hondureño.&lt;br /&gt;Todo esto, para concluir, que me agradaría incuir como parte de mi formación en Unitec, una clase en la que se nos enseñe a formar parte de, y a dirigir grupos de personal multidisciplinario, y convertirlos en auténticos equipos de trabajo. No sé como podría llamarse una clase como esa, y si llegase a existir en Unitec, espero que no le pongan un nombre indecente ni demasiado "inflado".&lt;br /&gt;Tal preferencia surge de la observación más inquietante que he realizado desde que formo parte del conjunto cuasimisterioso, elitista, todopoderoso de estudiantes de Sistemas, la tremenda incapacidad que tenemos "los de sistemas" para comunicarnos entre nosotros, y con "los demás"; y solemos decir "los demás en un tono casi despectivo, como si nadie más en el mundo tiene conocimientos específicos de SU carrera de los cuales la gran mayoría son ignorantes, lo cual porsupuesto, nos incluye también a "nosotros".&lt;br /&gt;Esa forma elitista de ver el mundo de la cual pecamos la mayoría de los estudiantes de sistemas (para no mencionar a los docentes y profesionales del área) es una fuerte barrera que en muchos casos impide aprovechar de manera óptima el conocimiento y habilidades de las personas cuya preparación es distinta de la nusestra. Debo aclarar que no me refiero solamente a la preparación académica, pues "no hay mejor escuela que la experiencia", y de allí que en el mundo de los negocios haya triunfado tanto "analfabeta".&lt;br /&gt;Existe una fuerte tendencia del alumno de sistemas de reinventar la rueda,especialmente a la hora de llevar a cabo proyectos que simulan software empresarial, donde "nos toca inventar como hacerlo" porque "no entendemos lo que nos ha dicho el cliente".&lt;br /&gt;Es por eso que mi eleccion sería en definitiva, un curso en el cual se nos preparase la mente para aprender "como llevarnos con los demás" en el sentido productivo de la frase, porque, en conformidad con la idea de "profesionales capaces de desarrollar y transformar empresas", podría ser que sea la carrera de sistemas la más débil, porque a diferencia de Mercadotecnia, Publicidad o Turismo, de las cuales en casos hasta nos atrevemos a hecer burla, y a quienes se les ha enseñado por concepto a estudiar a la gente como fuente de negocios, a nosotros se nos ha enseñado a estudiar las ciencias de la computación en uno de los sentidos más mecanicistas, casi olvidando que el propósito de la máquina es el hombre, no al revés.&lt;br /&gt;Digo todo esto, porque e las clases de la carrera en las que que habla de la gente, del cliente -que dicho sea de paso son pocas- , se trata al "usuario" como si se tratase de un ser disminuido en capacidades, y encontrando incluso textos formales que hacen referencia al usuario como si fuese un tonto de cuyas faltas es necesario protegerse, olvidando a veces por completo la naturaleza humana que caracteriza todas y cada una de nuestras obras.&lt;br /&gt;En resumen, y luego de esta crítica que aseguro, está basada en mí mismo y en mis más cercanos compañeros, reitero que me gustaría que tratásemos en curso formal y bastante de cerca, la psicología, el comportamiento humano, la comunicación y las relaciones interpersonales, a fin de lograr el mejor provecho de las personas que han optado por una rama del conocimiento distinta, para saber como colaborar con ellos, para poder interactuar mejor con y como gerentes de empresas.&lt;br /&gt;Y solo para sellar, y no quedar en contradicho con mi afirmación a cerca del autoaprendizaje, me permito recordar, que si bien esas ramas de conocimiento arriba mencionadas, pueden fácilmente buscarse y encontrarse en lecturas abundantes, son también áreas de conocimiento bastante extensas, y que un curso debe tener la intención de mostrarnos qué aprender, para no perder el norte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112952453104178907?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112952453104178907/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112952453104178907' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112952453104178907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112952453104178907'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/10/electivas.html' title='Electivas?'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112767224474687837</id><published>2005-09-25T12:15:00.000-06:00</published><updated>2005-09-25T12:17:24.753-06:00</updated><title type='text'>Ejemplo de main</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;   public static void main(String args[]) throws Exception {   &lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      System.out.println("Bienvenido a Comodo");&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      FileReader fis = new FileReader("uno.pas"); // se construye el File reader&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      // una versión mas sofisticada no coloca fijo el nombre, sino que puede leerlo de std in&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      // o tomarlo del array de argumentos args[]&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      parser paspar = new parser(new Yylex(fis));&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      // el constructor de parser toma un Yylex, cuyo constructor toma el fileReader&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      paspar.parse();  // esta es la llamada importante.&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      // este codigo se puede colocar en parser code {: :} dentro de cup&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;      // o dentro de otra clase que tenga acceso tanto a parser como a Yylex.&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;   }&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112767224474687837?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112767224474687837/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112767224474687837' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112767224474687837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112767224474687837'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/09/ejemplo-de-main.html' title='Ejemplo de main'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112589292387962082</id><published>2005-09-04T21:17:00.000-06:00</published><updated>2005-09-04T22:02:03.890-06:00</updated><title type='text'>Otra aplicación típica para JFlex</title><content type='html'>&lt;h1&gt;Soy uno solo&lt;/h1&gt;&lt;br /&gt;¿Quién no ha querido en ocasiones convertirse en varios a la vez? Esta semana no he podido avanzar con el complilador, tuve que entregarle mi tiempo a documentar un diseño que ya tengo un poco avanzado.&lt;br /&gt;&lt;br /&gt;Pero siempre hay tiempo para "jugar" un poco y como tengo un programa pendiente, el cual ya varios amigos me han dicho que está interesante, un "commander" que reconoce comandos creados por el usuario para correr programas o abrir archivos específicos mediante pequeñas abreviaturas.&lt;br /&gt;&lt;br /&gt;Una de las mejoras es naturalmente implentarle tecnología de compiladores a ese programa, para mejorar el reconocimiento de comandos.&lt;br /&gt;&lt;br /&gt;La idea con ese programa es escribir lo menos posible, de modo que su uso acelere la productividad. Por lo tanto, una mejora sustancial, es que el programa detecte que comando llamar, con ver solamente el parámetro. Es decir, provéele solamente www.loquesea.tu, y el solo abrirá Iexplore, dile C:\Mis Polainas y automáticamente se abriria una ventana del Explorador de archivos, apuntando a esa carpeta.&lt;br /&gt;&lt;br /&gt;Esto es muy sencillo de lograr, utilizando un analizador léxico.&lt;br /&gt;&lt;br /&gt;Aqui les presento un ensayo, totalmente autónomo, realizado en JFLEX. Con Autónomo me refiero a que no utilicé absolutamente nada más que jflex.&lt;br /&gt;&lt;br /&gt;El ensayo toma uno o varios archivos, o la entrada estandar,  y reconoce ciertos tipos de cadenas comunes. Este ensayo podría ser útil también, para entender como es que Word convierte automáticament en Links, cuando uno escribe una direccione de correo, o de internet.&lt;br /&gt;&lt;br /&gt;--------- empieza JFlex -------------&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Class YyLex, creada mediante jFlex a partir de minimal.&amp;nbsplex.&lt;br /&gt; * @author Gerson Lara&lt;br /&gt; * @URL http://www2.cs.tum.edu/projects/cup/minimal.tar.gz&lt;br /&gt; */&lt;br /&gt;%%&lt;br /&gt;%class Liner&lt;br /&gt;%type int&lt;br /&gt;%full&lt;br /&gt;//%cup&lt;br /&gt;%{&lt;br /&gt;&lt;br /&gt;   static void print(String s){ System.out.print(s); }&lt;br /&gt;   void sout(String s){ System.out.print(s + ": " + yytext() + "\n"); }&lt;br /&gt;    &lt;br /&gt;   public static void main(String args[])  throws Exception {&lt;br /&gt;  &lt;br /&gt;      print("Bienvenido a line detector\n");&lt;br /&gt;      System.out.println("Argumentos: " + args.length);&lt;br /&gt;      for(int i = 0; i &lt; args.length; i++){&lt;br /&gt;         System.out.println("Leyendo desde archivo: " + args[i]);&lt;br /&gt;         FileReader fr = new FileReader(args[i]);&lt;br /&gt;         Liner cuente = new Liner(fr);&lt;br /&gt;         cuente.funcione();&lt;br /&gt;      }&lt;br /&gt;     &lt;br /&gt;      if(args.length == 0){&lt;br /&gt;         System.out.println("Leyendo desde System.in");&lt;br /&gt;         Liner cuente = new Liner(System.in);&lt;br /&gt;         cuente.funcione();&lt;br /&gt;      }  &lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   public void funcione()  throws Exception {&lt;br /&gt;      yylex();&lt;br /&gt;      print("\n");&lt;br /&gt;   }&lt;br /&gt;%}&lt;br /&gt;LETRA=[A-Za-z_~]&lt;br /&gt;DIGITO=[0-9]&lt;br /&gt;PUNTUAC=[!#?]&lt;br /&gt;TRESD={DIGITO}({DIGITO}{DIGITO}?)?&lt;br /&gt;NOMBRE={LETRA}+(" "{LETRA}+)*&lt;br /&gt;%%&lt;br /&gt;[\t\f\n|\r] { /* ignore white space*/ }&lt;br /&gt;{LETRA}+"://"{LETRA}+("."{LETRA}+)*("/"({LETRA}+|"."|{PUNTUAC})+)* { sout("URL");}&lt;br /&gt;{LETRA}+"."{LETRA}+("."{LETRA}+)* { sout("Direccion de internet");}&lt;br /&gt;{LETRA}+@{LETRA}+"."{LETRA}+ {  sout("Direccion de correo-e");}&lt;br /&gt;{LETRA}: {sout("Unidad de disco");}&lt;br /&gt;{LETRA}":"("\\"{NOMBRE}("."{NOMBRE})*)* { sout("Directorio");}&lt;br /&gt;{LETRA}+ {   sout("Palabra");}&lt;br /&gt;{TRESD}"."{TRESD}"."{TRESD}"."{TRESD} {sout("Direccion IP");}&lt;br /&gt;&lt;&lt;eof&gt;&gt; { return 0;}&lt;br /&gt;. { sout("Expresion no reconocida"); }&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;----------- termina JFlex --------------&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Aqui un par de ejemplos de corrida. El primero fue lanzado directamente desde el IDE, y el segundo fue utilizando linea de comandos y alimentándolo con dos archivos de texto.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;---------- empiezan ejemplos ------------&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Bienvenido a line detector&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Argumentos: 0&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Leyendo desde System.in&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;www.unitec.edu&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Direccion de internet: www.unitec.edu&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;efutch@gmail.com&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Direccion de correo-e: efutch@gmail.com&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;dir&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Palabra: dir&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;c:&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Unidad de disco: c:&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;c:\cmpl&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Directorio: c:\cmpl&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;192.167.0.1&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Direccion IP: 192.167.0.1&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;^Z&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Press any key to continue...&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;-------------------------------------------------------------&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Microsoft Windows XP [Version 5.1.2600]&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;(C) Copyright 1985-2001 Microsoft Corp.&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;C:\Program Files\Comendador&gt;cd C:\cmpl\src\WrdCnt\Liner&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;C:\cmpl\src\WrdCnt\Liner&gt;java Liner correos.txt rev.txt&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Bienvenido a line detector&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Argumentos: 2&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Leyendo desde archivo: correos.txt&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Direccion de correo-e: glaraf@unitec.edu&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Direccion de correo-e: iguana@tierra.mia&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Leyendo desde archivo: rev.txt&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Direccion de internet: www.huevos.revueltos.com&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;Directorio: C:\yuca&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;span style="font-family: courier new;"&gt;C:\cmpl\src\WrdCnt\Liner&gt;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family: verdana;"&gt;---------- terminan ejemplos ------------&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;Espero que con esto se les ocurran más ideas de lo que pueden hacer con JFlex y similares. A mi se me ocurre hacer un "Find &amp;amp; Replace" más poderoso que los normales. Creo que ese será el siguiente "Juguete".&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112589292387962082?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112589292387962082/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112589292387962082' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112589292387962082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112589292387962082'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/09/otra-aplicacin-tpica-para-jflex.html' title='Otra aplicación típica para JFlex'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112529431869983458</id><published>2005-08-28T22:53:00.000-06:00</published><updated>2005-08-28T23:53:19.793-06:00</updated><title type='text'>Integración Total y los Cuarenta Tokens</title><content type='html'>En la recién pasada semana tuvimos la oportunidad de trabajar en grupo, con lo cual nos compartimos algunas ideas, y, aunque ya se dijo que no hay que perder mucho tiempo con el IDE, sucede ser que tengo esa manía.&lt;br /&gt;Entre otras actividades no muy productivas relacionadas con el compilador, comento que es bastante cómodo tener sintaxis coloreada en los archivos de cup y flex. En jCreator 2.00 es bastante fácil, pues entre las configuraciones del editor, uno puede escoger bajo el nodo Editor/Default, un archivo de sintaxis.&lt;br /&gt;Debo decir que me resulto muy fácil crear un nuevo archivo.syn para la versión 2.00, que usa un simple archivo de texto, no obstante la versión 3.50 de jCreator, usa un archivo en formato xml, el cual no quise indagar.&lt;br /&gt;El siguiente paso sería escoger que colores desea usar.&lt;br /&gt;Por alguna razón insisto bastante con los colores, siempre paso un tiempo considerable con ello, como dije antes, esa es [una de mis tantas] manía[s].&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Integración Total&lt;/h1&gt;&lt;br /&gt;Muchos me han preguntado como generar el Javadoc usando jCreator. Ignoro como se hace en otras versiones, pero la versión 2.00 no tiene el comando a la vista entre los menús.&lt;br /&gt;La idea que me vino a la mente, no es osa del otro mundo: Si configuré dos herramientas para generar código, como fue el caso de los archivos.bat que mencioné en el blog anterior, ¿Cuál es la diferencia con Javadoc? Sólo dos: No se usa un .bat, sino un .exe y no se genera código de java, sino de HTML.&lt;br /&gt;Asi es, los pasos son los mismos, solo hay que fijarse un poco con los comandos:&lt;br /&gt;primero, al elegir el nuevo programa, dirigirse a la carpeta donde estan los programas de la JVM, en mi caso esto era:&lt;br /&gt;C:\j2sdk1.4.2_04\bin&lt;br /&gt;Después al configurar la herramienta, usar los siguientes campos:&lt;br /&gt;Commands = C:\j2sdk1.4.2_04\bin\javadoc.exe -d doc -private&lt;br /&gt;Arguments = $[JavaFiles]&lt;br /&gt;Initial Directory = $[PrjDir]&lt;br /&gt;&lt;br /&gt;La opción -d permite especificar un directorio de salida, en mi caso -d doc usará una carpeta llamada doc, la cual creé previamente en la carpeta del proyecto ($[PrjDir]), esto para evitar que los elementos del Javadoc se mezclen y/o confundan con mis archivos de código fuente.&lt;br /&gt;La opción -private hace que se incluyan las clases privadas. Sin esta opción, no me documentaba la clase Yylex. (Agradecemos la colaboración de Osman Santos en la averiguación de este pequeño detalle)&lt;br /&gt;&lt;br /&gt;Para el campo Arguments, recomiendo utilizar el boton que despliega el menu, y utilizar la opción Project Java Files, y en Initial Directory, la opción Project Directory.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Los Cuarenta Tokens&lt;/h1&gt;&lt;br /&gt;Lo admito: ¡me encanta jFlex!&lt;br /&gt;Comparándolo con los recuerdos de mi experiencia con ANTLR, puedo afirmar que me siento mucho más confiado con JFLEX.&lt;br /&gt;Aunque al principio no me gustó la documentación, hay que reconocer, que para todo se requiere paciencia, asi que puse esta trillada frase en práctica y leí una buena porción.&lt;br /&gt;Encontré de gran ayuda el ejemplo en el cual especifican parte de la sintaxis de Java, del cual tomé varias ideas, en especial para reconocer strings y secuencias de escape. En realidad no estoy muy seguro de si aplican las secuencias de escape en Pascal, pero por motivos de práctica, intenté hacer que funcionara como en C.&lt;br /&gt;&lt;br /&gt;En general, para el lexer, mi estrategia se basa en dos ideas:&lt;br /&gt;&lt;br /&gt;1) Los errores deben estar bajo mi control, no bajo el de Yylex, asi los puedo reportar de manera conveniente. y&lt;br /&gt;&lt;br /&gt;2) Hay que hacer reglas para aceptar tokens correctos, y reglas para capturar errores.&lt;br /&gt;&lt;br /&gt;Lo segundo se debe a algo muy sencillo: si el token está correcto, no hay problema, Yylex lo reconocerá y lo retornará al parser. Pero si el token está mal escrito, Yylex nos dará un extenso y casi ininteligible mensaje de error, ya que el error ocurirá internamente en Yylex, no el el código fuente que estemos analizando.&lt;br /&gt;Además: en algunos puntos es más fácil (con JFlex) hacer las reglas para capturar errores, que hacer expresiones regulares perfectas.&lt;br /&gt;Por ejemplo para los comentarios: es más facil irse a un estado aparte, y tirar el error de anidamiento si encontramos una apertura de comentario, que hecer la expresión regular que admita comentarios sin anidamiento. Aparte, si la ER no reconoce comentarios con anidamiento, el error "lo reportará Yylex", en lugar de "reportarlo yo"&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;El huevo y la gallina&lt;/h1&gt;&lt;br /&gt;Para probar el Lexer usé esto:&lt;br /&gt;-------- empieza código -------------&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;package Jahaz;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java_cup.runtime.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.io.*;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Clas Comodo, calache para probar el Yylex solo.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;@autor Gerson Lara&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public class Comodo{&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;public static void main(String args[]) throws Exception {&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;      System.out.println("Bienvenido a Comodo");&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;      //Yylex alex = new Yylex(System.in);&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;      FileReader fis = new FileReader("hola.pas");&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;      Yylex alex = new Yylex(fis);&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;      int a = 0;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;      while(a &lt; 1000){&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;          alex.next_token();&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;          //System.out.print("&lt;tok&gt;");&lt;/tok&gt;&lt;/span&gt;&lt;br /&gt;  &lt;span style="font-family:courier new;"&gt;          a++;&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:courier new;"&gt;}    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;---------- fin de código --------------&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Con esto puedo especificar un archivo en el cual coloco una serie de Tokens, que no tienen porque estar en orden gramatical, unos de ellos bien escritos, pero la mayoria de ellos con errores, así me cercioro de que mi lexer captura los errores y los reporta adecuadamente.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Si ese era el huevo, ahora la gallina:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;para que el lexer pueda retornar todos los tipos de token, hay que declararlos como terminales en el archivo de CUP y generar y compilar ese codigo, para que la clase sym esté disponible.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 style="font-family: verdana;"&gt;Notas sobre los nombres&lt;/h3&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Mi compilador se llama Comodo ( no es Cómodo, no lleva el acento en la primera o) y como se lo han de imaginar, se debe al Dragón de Comodo, por ser un dragón real que existe hoy en dia.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;El lexer se llama Alex por que es un &lt;/span&gt;&lt;span style="font-weight: bold; font-family: verdana;"&gt;A&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;nalizador &lt;/span&gt;&lt;span style="font-weight: bold; font-family: verdana;"&gt;LEX&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;ico&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Este compilador será algo así como "El Show de Alex, Parseo y Semita"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Parseo suena como a Perseo, algo griego, pero no se qué. Y Semita por &lt;/span&gt;&lt;span style="font-weight: bold; font-family: verdana;"&gt;SEM&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;ántico.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Si no les da risa, lo entiendo, de por sí, es sabido que no soy bueno para los chistes, y peor a la hora de este post.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;Hasta la próxima, ¡y no dejen de buscar al &lt;/span&gt;&lt;span style="font-weight: bold; font-family: verdana;"&gt;IDE&lt;/span&gt;&lt;span style="font-family: verdana;"&gt;al!!!&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112529431869983458?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112529431869983458/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112529431869983458' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112529431869983458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112529431869983458'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/08/integracin-total-y-los-cuarenta-tokens.html' title='Integración Total y los Cuarenta Tokens'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112474690760960517</id><published>2005-08-22T15:35:00.000-06:00</published><updated>2005-08-22T15:41:47.633-06:00</updated><title type='text'>jFlex &amp; CUP con jCreator</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;Usando: jCreator 2.00 LE Build 008&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;Debido a que ya algunos perdimos bastante tiempo con Eclipse, aquí coloco mi forma de configurar jCreator para trabajar con jFlex y CUP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;Notras Previas: &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;Los pasos que aquí detallo son una muestra particular de la manera en que yo realicé la prueba. Este documento fue escrito paralelamente con la realización de la prueba, intentando el máximo de detalle.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;Cualquier consulta me la pueden hacer a gerson.lara con la arroba ,gmail el punto y el com, o a mi Telefono de casa(si lo tienen).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;OS: Windows XP home en Inglés, versión 2002 con Service pack 2 (instalado desde windows update)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;JVM:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;C: java -version&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;java version "1.4.2_04"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_04-b05)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;Java HotSpot(TM) Client VM (build 1.4.2_04-b05, mixed mode)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;Computadora: HP con procesador Intel Celeron.&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;Observación: en las líneas siguientes hago referencia al directorio cmpl, éste es el directorio Complilers_home, o cualquier otro en el cual haya extraído los archivos de jFlex y CUP, y realizado los primeros pasos del Laboratorio #1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;ul style="margin-top: 0cm;" type="disc"&gt; &lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;Crear El      directorio&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;      C:\cmpl\src&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="ES-HN"&gt;Abrir sesión      en jCreator&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Ir a File/New... , &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul style="margin-top: 0cm;" type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Seleccione Workspace/Empty workspace, &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Workspace Name = &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;Inicio&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Location = &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;C:\cmpl\src&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul style="margin-top: 0cm;" type="square"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;El IDE crea una carpeta nueva: &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;C:\cmpl\src\Inicio&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Ir      a File/New...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul style="margin-top: 0cm;" type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Seleccione Projects/Empty Project&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Project name = tDragon, &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;El       campo Location debe apuntar a la carpeta del workspace&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Asegúrese       que esta seleccionada la opción “Add to Current Workspace”&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul style="margin-top: 0cm;" type="square"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;El IDE crea una carpeta nueva: &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;C:\cmpl\src\Inicio\tDragon&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Ir      a File/New... &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul style="margin-top: 0cm;" type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Seleccione       Files/Text File&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Filename       = tDragon.lex. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Deje       el campo Location como está, &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;La       opción Add to Project en true, y en el combo de abajo el proyecto tDragon       (por ahora el único)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Escriba      la especificación léxica (Nota: yo pegué el contenido de &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;minimal.lex&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Repita      pasos similares para el archivo punto-cup.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Configuración      de User Tools parte I: jFlex&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul style="margin-top: 0cm;" type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Ubique       el archivo jflex.bat, (en mi caso: &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;C:\cmpl\JFlex\bin\jflex.bat&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;),       vea más abajo el contenido de este archivo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Ir       al menú Configure/Options, elija Tools (ojo, ¡no JDK Tools!). En el lado       derecho presione NEW / Program y a continuación diríjase a la ubicación       del archivo&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt; jflex.bat&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt; y selecciónelo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Aparecerá       en el TreeView un nuevo hijo de Tools con el nombre jFlex, selecciónelo       para configurar la nueva herramienta.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;En       el campo commands debe aparecer de nuevo la ruta y nombre del archivo &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;jflex.bat&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;.       Si no es su caso, presione el botón rotulado con los tres puntos y repita       la selección del archivo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;En       el campo Arguments elija, mediante el menú que aparece al presionar el       botón rotulado con un triángulo, el parámetro&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt; “File name”&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;De       manera similar Elija&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt; “Project Directory”&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt; en el campo       Initial Directory&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;En       el recuadro inferior “Tool Options” elija según su conveniencia,       recomiendo usar “Save all documents first”&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Si       no tiene visible la Barra de Herramientas “Tools”, actívelo en       View/Toolbars/Tools&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Ahora       una de los botones con icono en forma de llave de tuerca corresponde con       jFlex, si ésta era la primera herramienta que configura, será la primera       llave.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Asegúrese       de que el editor tiene activo el documento&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt; tDragon.lex&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;       y pruebe la primera herramienta.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Revise       el directorio del Proyecto (&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;C:\cmpl\src\Inicio\tDragon\&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;),       debe haber aparecido el archivo&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt; Yylex.java&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;,       agréguelo al proyecto. &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;(Menú Project/Add       files)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Configuración      de User Tools parte II: Java_cup&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul style="margin-top: 0cm;" type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Será       necesario crear un nuevo archivo punto-bat en &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;C:\cmpl&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;.       (en mi caso &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;C:\cmpl\jcup.bat&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;). Vea más abajo el       contenido de este archivo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Configure       la segunda herramienta igual que en el caso anterior, seleccionando &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;jcup.bat&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;       (o su equivalente), los argumentos y directorio inicial, son los mismos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Asegúrese       de que el editor tiene activo el documento &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;tDragon.cup&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;       y pruebe la segunda herramienta.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Revise       nuevamente el directorio del proyecto y compruebe que existen lso nuevos       archivos &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;parser.java&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt; y &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;sym.java&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;.       Agréguelos al aproyecto.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;Diríjase a Project/Project Settings,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;ul style="margin-top: 0cm;" type="circle"&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Vaya       a Required Libraries y presione NEW.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Presione       Add/Package, y Elija el archivo jflex.jar, que se encuentra en &lt;/span&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;C:\cmpl\JFlex\lib\&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;,       en el campo name coloque jFlexJar&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Cuando       regrese al diálogo Project Settings, asegúrese que la nueva librería está       seleccionada(Marcada con Check)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;"&gt;Compile      el Proyecto (F7) y córralo(F5);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;En mi caso, me compilo sin problemas y me corrío lo mismo que en el laboratorio en la parte que se hace en command Line. Aún así, salen errores al compilar los archivos individuales desde jCreator, hay que compilar todo el proyecto.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt;"&gt;Contenido de los archivos punto-bat&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt;"&gt;----- inicio de batch: jFlex.bat ---------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;@echo off&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;REM Edite los path JFLEX_HOME y JAVA_HOME para sus necesidades&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;REM (No agregue backslashes al final de los paths)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;rem set JFLEX_HOME=C:\Compiladores\JFlex&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;REM only needed for JDK 1.1.x:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;rem set JAVA_HOME="C:\Program Files\Java\j2sdk1.4.2"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;REM ------------------------------------------------------------------- &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;set CLPATH=C:\j2sdk1.4.2_04\bin\lib\classes.zip;C:\cmpl\JFlex\lib\JFlex.jar&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;REM for JDK 1.2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;java -Xmx128m -jar C:\cmpl\JFlex\lib\JFlex.jar %1 %2 %3 %4 %5 %6 %7 %8 %9&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt;"&gt;---------- fin de batch ------------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;span style="font-size: 8pt;"&gt;---- inicio de batch: jcup.bat ---------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;REM @echo off&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;REM Creado por Gerson Lara&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;rem Con el proposito de correr java_cup&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;REM Usando la misma idea que con jFlex.bat&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;REM ------------------------------------------------------------------- &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;set CMPL_HOME=C:\cmpl&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;set JAVA_HOME=C:\j2sdk1.4.2_04\bin&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;set CLASSPATH=%CMPL_HOME%\Java_cup;%CLASSPATH%&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 10pt; font-family: &amp;quot;Courier New&amp;quot;;"&gt;java java_cup.Main %1 %2 %3 %4 %5 %6 %7 %8 %9&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-size: 8pt;"&gt;---------- fin de batch ------------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112474690760960517?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112474690760960517/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112474690760960517' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112474690760960517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112474690760960517'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/08/jflex-cup-con-jcreator.html' title='jFlex &amp; CUP con jCreator'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112408532645805061</id><published>2005-08-14T23:49:00.000-06:00</published><updated>2005-08-14T23:55:26.523-06:00</updated><title type='text'>Un lexer hecho a mano</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5986/804/1600/Automata2.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/5986/804/320/Automata2.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;  &lt;/h1&gt; &lt;span lang="ES-HN"&gt;EL proyecto de “Turbo Dragon” está en peligro de extinción.&lt;/span&gt;  &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;Aún sigo sin poder conectar efectivamente las herramientas de generación de código con Eclipse. La situación resulta bastante frustrante, para una estudiante de la carrera donde “todo se puede”. Es por esto que he tomado una decisión, de ninguna manera me voy a dejar “ECLIPSAR” por un IDE superconfigurable, así que si mr. E. sigue rebelde, doña Consola, que no me defrauda, me será más que suficiente para hacer un compilador.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;span lang="ES-HN"&gt;En efecto, no he tenido problemas modificando los meta código-fuentes y construyendo mis ensayos desde la línea de comandos.&lt;/span&gt;&lt;/p&gt;   &lt;h1&gt;&lt;span lang="ES-HN"&gt;Convencerme que no soy yo el problema.&lt;/span&gt;&lt;/h1&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Si bien, lo admito, tiene que haber “una forma”, no la encuentro, así que con el propósito de convencerme que por lo menos aún soy capaz de pensar (bien), he realizado un brevísimo ensayo, en el cual construyo un lexer, casi totalmente a mano.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Pido disculpas por el “gol publicitario” pues s’e que muchos de los colegas no son precisamente aficionados a Microsoft®, pero mis auxiliares en este ensayo han sido los tan odiados como necesarios Word® y Excell®.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;El ensayo está basado en el último ejemplo visto en clase(hasta ahora) de un autómata para reconocer operadores relacionales.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;He construido mi propio autómata para reconocer operadores aritméticos, enteros positivos y paréntesis.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Recuerden que este es un lexer, así que no sabe NADA a cerca del orden en que estos elementos deben aparecer.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;La primera fase, fue pensar los tipos de token a usar:&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;num = digito+&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;oper = [+-*/]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;lpar = ‘(’&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;rpar = ‘)’&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;donde:&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="xl26" style="border: medium none ; margin: 0cm 0cm 0.0001pt;"&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;digito = [0123456789]&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Con esto en mano (cabeza y necesariamente papel), procedí a crear el autómata. Importante notar, que el autómata debe ser determinista, ya que para este ensayo no disponía de ninguna herramienta para reducir un grafo cualquiera a DFA.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p style="font-style: italic;" class="MsoBodyText2"&gt;&lt;span lang="ES-HN"&gt;“Por favor disculpen lo burdo de este modelo, no tuve tiempo de hacerlo a escala” –Dr. Emmet Brown, Volver al Futuro.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt;&lt;br /&gt;&lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;span lang="ES-HN"&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;  &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Recuerden que un asterisco significa que se devuelve un caracter al input.&lt;/span&gt;&lt;/p&gt;     &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;En este caso, el retorno de caracteres al input no parece congruente, lastimosamente, esto se debe a un detalle de la implementación, ya que mi autómata consume un caracter del input imediatamente que “llega” a un estado, para luego tomar la decisión a cerca de la siguiente transición. En este caso, supongamos que viene un ‘)’, el estado cero lee un caracter, luego internamente se da cuenta qué es y toma la transición al estado cuatro.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;el estado cuatro lee inmediatamente un caracter, antes de saber que hará con él.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Pregunta clave en todo esto&lt;/span&gt;&lt;/p&gt;   &lt;h2&gt;&lt;span lang="ES-HN"&gt;¿Cómo programar el autómata?&lt;/span&gt;&lt;/h2&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Lo que procede es crear una tabla similar a la siguiente:&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;table style="width: 460pt; border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="613"&gt;   &lt;tbody&gt;&lt;tr style="height: 12.75pt;"&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; width: 75pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="100"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;Estado/Simbolo&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 20pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="27"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;(&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 20pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="27"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 17pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="23"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;+&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 17pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="23"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;-&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 17pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="23"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;*&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;/&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;3&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;5&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;6&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;7&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;9&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;' '&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; background: rgb(255, 204, 0) none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; width: 18pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="24"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;b&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;$&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; width: 60pt; height: 12.75pt;" nowrap="nowrap" valign="bottom" width="80"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;TOKEN&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 12.75pt;"&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="border: 0.5pt solid windowtext; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,6&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,5&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: solid solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:windowtext windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;e&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;NINGUNO&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 12.75pt;"&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;t,1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;t,2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;r,*&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;NUMERO&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 12.75pt;"&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;NUMERO&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 12.75pt;"&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;3&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;NUMERO&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 12.75pt;"&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;OPER&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 12.75pt;"&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;5&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;RPAR&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="height: 12.75pt;"&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal" style="text-align: center;" align="center"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;6&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="EN-US" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td  style="border-style: none solid solid none; padding: 0.5pt 0.5pt 0cm; height: 12.75pt;color:-moz-use-text-color windowtext windowtext -moz-use-text-color;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;*r&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td style="padding: 0.5pt 0.5pt 0cm; height: 12.75pt;" nowrap="nowrap" valign="bottom"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:Arial;font-size:10;"  lang="ES-HN" &gt;LPAR&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Donde cada estado puede tomar una transición a un estado (t,4 significa transición al estado cuatro), o puede retornar un token. Si hay un asterisco significa devolver un caracter al input.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Noten que cada estado puede retornar como máximo un tipo de token, si aplica(estados finales). una tercera posibilidad, es que se dé un error, como en la casilla (0,$), (estado cero, símbolo $), que en este caso significa que en el estado cero, cualquier caracter que no sea &lt;/span&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;[()+-*/0123456789]&lt;/span&gt;&lt;span lang="ES-HN"&gt; ó &lt;/span&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;SPACE&lt;/span&gt;&lt;span lang="ES-HN"&gt; será rechazado.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Cada vez que el autómata alcanza un e. final, regresa al estado cero.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;La tabla anterior la programé como un arreglo bidimensional de casillas especialmente diseñadas (&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;struct&lt;/span&gt;&lt;span lang="ES-HN"&gt;) que contienen un parámetro para saber si se trata de una transición, un retorno, o un error, el estado siguiente, en caso de transición, y si debe o no hacer &lt;/span&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;unget()&lt;/span&gt;&lt;span lang="ES-HN"&gt;.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;El arreglo lo llené a mano, pero para ello me auxilié de Word, Excel, y muchos “&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;find &amp; replace&lt;/span&gt;&lt;span lang="ES-HN"&gt;”, con lo que generé un lote de asignaciones que completan la tabla.&lt;/span&gt;&lt;/p&gt;   &lt;p class="xl26" style="border: medium none ; margin: 0cm 0cm 0.0001pt;"&gt;&lt;span  lang="ES-HN" style="font-family:Tahoma;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Para ver el auxilio en Excel, siga &lt;a href="http://www.geocities.com/jahazhn/Libro1.xls"&gt;este enlace&lt;/a&gt;, vea la Hoja 2.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;La idea de cómo trabaja el Autómata ya programado, finalmente, es la siguiente:&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;1)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;     &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;Se inicia en el estado cero.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;2)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;     &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;Se lee un caracter del input&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;3)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;     &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;se evalúa la casilla correspondiente al caracter para el estado actual.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;3.1)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;          &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;si hay que hacer unget() se hace&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;3.2)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;          &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;Se decide que sigue:&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-left: 90pt; text-indent: -45pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;3.2.1)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;Si es transición, se cambia de estado&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-left: 90pt; text-indent: -45pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;3.2.2)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;Si es retorno, se retorna el token correspondiente al estado(considere la última columna de la tabla como un arreglo que contiene el tipo de retorno para cada estado.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-left: 90pt; text-indent: -45pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;3.2.3)&lt;span style=";font-family:&amp;quot;;font-size:7;"  &gt;         &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;Si es error, se reporta.&lt;/span&gt;&lt;/p&gt;   &lt;p class="xl26" style="border: medium none ; margin: 0cm 0cm 0.0001pt;"&gt;&lt;span  lang="ES-HN" style="font-family:Tahoma;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Estos pasos se toman en un ciclo hasta que se consuma la totalidad del input.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Nota: en este ensayo, el símbolo $ significa “desconocido” cualquier letra no reconocida en las primeras columnas de la tabla, mapean a $ para efectos de escoger la casilla a tomar en cuenta.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Pueden seguir &lt;a href="http://www.geocities.com/jahazhn/ensayo.cpp.txt"&gt;este enlace&lt;/a&gt; para ver el código fuente.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Puede compilar este código en un compilador de C/C++. &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Yo utilicé Dev-C++ 4.01.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Para probarlo proporcione el input que conste de: Paréntesis, operadores &lt;/span&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;[+-*/]&lt;/span&gt;&lt;span lang="ES-HN"&gt; y enteros positivos: &lt;/span&gt;&lt;span style=";font-family:&amp;quot;;"  lang="ES-HN"&gt;[0-9]+&lt;/span&gt;&lt;span lang="ES-HN"&gt;.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;La salida es una simulación de un stream de tokens, similar a lo que constituye el output de un lexer(input de un parser). Recuerde que el Lexer no sabe nada a cerca del orden de los tokens.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Lo importante de este ensayo:&lt;/span&gt;&lt;/p&gt;   &lt;h2&gt;&lt;span lang="ES-HN"&gt;Conclusiones.&lt;/span&gt;&lt;/h2&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Fue relativamente fácil realizar este ensayo, tomó aproximadamente 2 horas, pero esto se debe a lo limitado del input para el cual fue diseñado, cuatro tipos de tokens. Un lexer para muchos más tipos, consume más tiempo.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;El autómata ha de hacerse a mano(cerebralmente), y reducirse a determinista, o pensarse determinista desde el principio. y luego traducirlo a la tabla.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Una vez resuelto el problema de cómo llenar la tabla(en el código), la programación del autómata es sencilla, toma poco tiempo, y es constante, es decir, un cambio en el léxico, sólo requiere un cambio a la tabla, ya que el algoritmo para recorrer el grafo es siempre el mismo.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;La modificación de esa tabla, sin embargo, es muy delicada.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Otra observación que considero muy importante, es el hecho de que las expresiones regulares que definen los tipos de palabra, finalmente quedan en la tabla( representación en código fuente del lexer para el autómata). de donde es mucho más difícil leerlas de regreso, por lo cual, no se puede entender que tipo de tokens lee el lexer con solo ver el código.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Finalmente, Las tablas de análisis léxico para un lenguaje real, suelen ser muy grandes para manejarlas fácilmente, aún en Excel.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;En resumen, existe una razón por la cual se ha creado la cantidad tan extensa de generadores de analizadores léxicos, la complejidad es alta, pero rutinaria. Recuerde el algoritmo para reducir un Autómata No Determinista a uno Determinista.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Una aproximación básica a la creación de un “creador de lexers” comprendería la programación necesaria para leer las expresiones regulares que definen los tipos de token, y traducirlos a la tabla final, pasando por el autómata determinista, a lo cual, habrá solamente que adosarle el código del algoritmo para recorrer el autómata y las funcionalidades para recuperar los tokens desde un parser u otro programa.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;h2&gt;&lt;span lang="ES-HN"&gt;Notas&lt;/span&gt;&lt;/h2&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;La tabla que presento aquí, es parte de un tópico que se trata más adelante en el curso, sin embargo, debo aclarar que la terminología y técnicas usadas no son las mismas que en el Libro principal del curso, ya que adapté algunas partes para facilitarme la realización en corto tiempo. También el llamar Transición o Retorno a las casillas de la tabla, como más adelante se verá, es en realidad lo que se conoce como “Shift/Reduce”.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112408532645805061?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112408532645805061/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112408532645805061' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112408532645805061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112408532645805061'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/08/un-lexer-hecho-mano.html' title='Un lexer hecho a mano'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112351344322249623</id><published>2005-08-08T09:03:00.000-06:00</published><updated>2005-08-08T09:04:03.233-06:00</updated><title type='text'>Reporte de Laboratorio Sección C:</title><content type='html'>&lt;h1&gt;&lt;span lang="ES-HN"&gt;Reporte de Laboratorio Sección C:&lt;/span&gt;&lt;/h1&gt;   &lt;h2&gt;&lt;span lang="ES-HN"&gt;Creación de un proyecto básico que incluya jFlex y CUP&lt;/span&gt;&lt;/h2&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;h3&gt;&lt;span lang="ES-HN"&gt;Primero: Pegar Eclipse con jFlex&lt;/span&gt;&lt;/h3&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Este primer paso se logró configurando como Builder el archivo por lotes que se encuentra en &lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;C:\cmpl\JFlex\bin\jflex.bat&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;especificando como directorio de trabajo:&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;${workspace_loc:/jFlexPrueba}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;que es el directorio del proyecto creado en Eclipse, y finalmente, dando como argumento el nombre del archivo léxico:&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;${resource_name:/jFlexPrueba/experimental.lex}&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Notas: Esto después de muchos intentos, ya que las instrucciones mencionan “como tipo External Tool”, tipo que no encontré, solamente vi disponibles &lt;/span&gt;&lt;span style=""&gt;«&lt;/span&gt;&lt;span lang="ES-HN"&gt;Ant Build&lt;/span&gt;&lt;span style=""&gt;»&lt;/span&gt;&lt;span lang="ES-HN"&gt; y &lt;/span&gt;&lt;span style=""&gt;«&lt;/span&gt;&lt;span lang="ES-HN"&gt;Program&lt;/span&gt;&lt;span style=""&gt;»&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Inicialmente intenté con &lt;/span&gt;&lt;span style=""&gt;«&lt;/span&gt;&lt;span style=""&gt;Ant Build&lt;/span&gt;&lt;span style=""&gt;»&lt;/span&gt;&lt;span style=""&gt;. &lt;/span&gt;&lt;span lang="ES-HN"&gt;“Ahí fue donde la mula botó a Genaro”, ya que me vi nuevamente ante una avalancha de configuraciones y parámetros...&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Después recordé que para ejecutar jFlex hay dos opciones: una que implica el .jar, y otra que se hace desde el .bat. De modo que eliminé ese builder y agregué otro, esta vez de tipo &lt;/span&gt;&lt;span style=""&gt;«&lt;/span&gt;&lt;span lang="ES-HN"&gt;Program&lt;/span&gt;&lt;span style=""&gt;».&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Utilicé primeramente el archivo .bat sin argumentos, y tuve que lidiar con el cuadro de diálogo de jFlex cada vez que a Eclipse se le ocurría hacer un Build. Por eso me demoré lo menos posible en colocarlos argumentos que indiqué al principio.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;h3&gt;&lt;span style=""&gt;Observaciones uno&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h3&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;Una vez trazada la línea primera, logré hacer que Eclipse genere a &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;Yylex.java&lt;/span&gt;&lt;span style="" lang="ES-HN"&gt;, al examinar el código generado pude constatar que no difiere notablemente (al ojo humano) del que se generó en la parte anterior de la práctica, ya que &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;experimental.lex&lt;/span&gt;&lt;span style="" lang="ES-HN"&gt; es en realidad el mismo que &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;minimal.lex&lt;/span&gt;&lt;span style="" lang="ES-HN"&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;h3&gt;&lt;span lang="ES-HN"&gt;Segundo: Pegar java_cup con Eclipse&lt;/span&gt;&lt;/h3&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;De inicio, java_cup no tiene un .bat o un .jar entre sus directorios, sólo una cantidad considerablemente grande de archivos fuente, por lo cual intenté agregando el directorio de los mismos al &lt;/span&gt;&lt;span style=""&gt;«&lt;/span&gt;&lt;span lang="ES-HN"&gt; Build Path&lt;/span&gt;&lt;span style=""&gt; », sin resultados.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;span style="font-size: 12pt; font-family: Tahoma;"&gt;Luego, intenté implementar el mismo enfoque, crear un .bat que realizara la ejecución de java_cup, hasta el momento, sin resultados.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112351344322249623?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112351344322249623/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112351344322249623' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112351344322249623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112351344322249623'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/08/reporte-de-laboratorio-seccin-c.html' title='Reporte de Laboratorio Sección C:'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112348240143833667</id><published>2005-08-07T23:55:00.000-06:00</published><updated>2005-08-08T00:26:41.450-06:00</updated><title type='text'>Otros Comentarios sobre el Laboratorio</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;Primeramente debo aclarar, éste laboratorio fue mucho más interesante que el relacionado con ANTLR en el semestre pasado&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;Antes que lo olvide... aquí esta la &lt;a href="http://www.geocities.com/jahazhn/cmpl/lab1.doc"&gt;versión en word&lt;/a&gt; del post anterior.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;Aunque aun quedé un tanto confundido porque algunos de los problemas “se arreglaron solos” (Las computadoras a veces parecen no deterministas), fue un reto el tener que luchar contra herramientas desconocidas, lo cual no sucedió con ANTLR.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;Hubo muchas dudas en lo referente a las líneas de comandos, ya que en comunicaciones entre compañeros, esas eran las preguntas más frecuentes.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;Lo más extraño que maquinas muy similares, con la misma versión de JVM, sistema Operativo, Service Pack, etc. En unas funciona, y en otras no.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;A mi me parece un MITO esa portabilidad que predica java, porque de una versión a la siguiente de la JVM hay que cambiar el código o hacer algún arreglo. Y ya entre plataformas distintas... no digamos.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;"&gt;Por cierto, en el post anterior hay una línea que dice:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;La descarga y/o copia de los archivos requeridos se realizó son problemas.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;Debe leerse:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;La descarga y/o copia de los archivos requeridos se realizó sin problemas.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;“Otro desafortunado efecto del hambre”&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;Debo agregar, que por mucho que me haya gustado el laboratorio, sentí muy confusas las instrucciones, y creo que no hablo (escribo) sólo por mí, ya que muchos compañeros me llamaron, preguntando...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;La documentación de jFlex también me pareció confusa, [ y extensa ]. Una compañera utilizó el término &lt;/span&gt;&lt;span style="font-family: Arial; color: rgb(204, 51, 204);" lang="ES-HN"&gt;“blurry”&lt;/span&gt;&lt;span style="font-family: Arial; color: black;" lang="ES-HN"&gt;. En rosado y todo!!! (si alguien me lo traduce...)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Arial; color: black;" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Arial; color: black;" lang="ES-HN"&gt;En fin... el uso de los Paths en este laboratorio resultó algo inesperadamente dificultoso. Creo que el problema se debió a que no se captaba el concepto general de lo que se estaba haciendo con los .bat.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Arial; color: black;" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Arial; color: black;" lang="ES-HN"&gt;De hecho, uno de los compañeros, terminó escribiendo a mando los paths directamente en la consola, ya que los .bat no le resultaron.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Arial; color: black;" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Arial; color: black;" lang="ES-HN"&gt;En mi caso, quise elaborar un .bat para regenerar en un solo paso todos los archivos, tan sencillo como esto:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Arial; color: black;" lang="ES-HN"&gt;------------------------------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;jflex minimal.lex&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;java java_cup.Main minimal.cup&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;javac -d . parser.java sym.java Yylex.java&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="EN-US"&gt;----------------------------&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;Pero al parecer, las dos últimas líneas se metían como parámetros del primer programa, por lo cual sólo éste de ejecutaba, así que tuve que optar por aprovechar el buffer de instrucciones recientes del CMD.exe. (la tecla de flecha hacia arriba).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: Tahoma;" lang="ES-HN"&gt;Al fin y al cabo... el que persevera alcanza, y ¡caballo que alcanza, gana!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112348240143833667?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112348240143833667/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112348240143833667' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112348240143833667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112348240143833667'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/08/otros-comentarios-sobre-el-laboratorio.html' title='Otros Comentarios sobre el Laboratorio'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112348025944116041</id><published>2005-08-07T23:50:00.000-06:00</published><updated>2005-08-07T23:50:59.466-06:00</updated><title type='text'>Laboratorio 1</title><content type='html'>&lt;h1&gt;&lt;span lang="ES-HN"&gt;A: Instalación del entorno Eclipse&lt;/span&gt;&lt;/h1&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;h2 style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;1)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;Instalar en la carpeta c:\Eclipse&lt;/span&gt;&lt;/h2&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;No hay observaciones relevantes.&lt;/span&gt;&lt;/p&gt;   &lt;h2 style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;2)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;Ejecución por primera vez&lt;/span&gt;&lt;/h2&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;No hay observaciones relevantes.&lt;/span&gt;&lt;/p&gt;   &lt;h2 style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span lang="ES-HN"&gt;3)&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ES-HN"&gt;Familiarizarse con los menús&lt;/span&gt;&lt;/h2&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;Los menús de eclipse son muy diferentes a los de otros IDEs que he utilizado, por lo cual, familiarizarse no es una tarea trivial. Sin embargo creo que un poco de dedicación y práctica lo resuelven.&lt;/span&gt;&lt;/p&gt;   &lt;h1&gt;&lt;span lang="ES-HN"&gt;B: Creación de un proyecto Java&lt;/span&gt;&lt;/h1&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;El nuevo proyecto fue creado, compilado y ejecutado sin observaciones relevantes.&lt;/span&gt;&lt;/p&gt;   &lt;h1&gt;&lt;span lang="ES-HN"&gt;C: instalación básica de jFlex y CUP&lt;/span&gt;&lt;/h1&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;La descarga y/o copia de los archivos requeridos se realizó son problemas.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;Sin embargo se encontró dificultades más adelante.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;La primera observación es que en el .bat que se encuentra entre los binarios de jFlex existia un error en dos de los path, a los cuales les hacia falta una sub cadena “\lib” para funcionar correctamente. La corrección se hizo luego de notar que la ruta especificada no correspondía con la estructura de directorios creada por la extracción de los archivos de jFlex.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;Luego de esto, la compilación de los archivos de jFlex &amp; CUP, se realizó en una sola sesión, sin observaciones relevantes. Seguidamente la creación del código autogenerado al procesar los archivos minimal.lex &amp;amp; minimal.cup también se realizó de manera satisfactoria al primer intento, notando los avisos de cada programa respecto a los autómatas creados, estados, etc.; la subsiguiente re-generación en cada cambio realizado al archivo .lex se realizó igualmente en forma satisfactoria encada intento.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;Más adelante, al compilar juntos los archivos Autogenerados, no se reporta ningún error.&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;La sección que más problemas causó, fue el intento de correr el resultado de la compilación antes mencionada, la cual siguió siendo problemática aún después de considerar las erratas respecto a la línea de comandos. En este caso la perseverancia, y el intento repetido lograron finalmente sacar a flote el Example.parser.&lt;/span&gt;&lt;/p&gt;   &lt;h3&gt;&lt;span class="MsoHyperlink"&gt;&lt;span style="font-size: 12pt; color: black; font-weight: normal; text-decoration: none;" lang="ES-HN"&gt;Ver la sesión del&lt;/span&gt;&lt;/span&gt;&lt;span class="MsoHyperlink"&gt;&lt;span style="font-size: 12pt; font-weight: normal;" lang="ES-HN"&gt; &lt;a href="http://www.geocities.com/jahazhn/cmpl/log_cmd.exe.txt"&gt;CMD.exe&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;   &lt;p class="MsoNormal"&gt;&lt;span lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span lang="ES-HN"&gt;En la Etapa concerniente a la limitación de los números menores que 64, la opción fue colocar el siguiente código:&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;{ if( Integer.parseInt(yytext()) &gt;= 64 ){System.out.println("Numero demasiado grande: " + yytext());}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span style="" lang="ES-HN"&gt;Esto como es de esperar, en la especificación para los tokens de tipo number.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span style="" lang="ES-HN"&gt;Aunque esta era desde un principio la idea, tuve problemas al intentarla, pero, todos ellos se debían a la falta de práctica con java. Finalmente recordé que existe el &lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="ES-HN"&gt;.parseInt&lt;/span&gt;&lt;span style="" lang="ES-HN"&gt; y con eso bastó.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoBodyText"&gt;&lt;span style="" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;Si están interesados en ver mis errores: &lt;a href="http://www.geocities.com/jahazhn/cmpl/log_cmd.exe.2.txt"&gt;CMD.exe&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;Podrán notar también, hacia el final del texto, que está hecha la modificación para que el resultado sea desplegado al presionar &lt;&lt;enter&gt;&gt;. Lo notarán en que no hay un punto y coma después de la expresión.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;Esta solución, a mi parecer, debía hacerse en el parser, pero en el afán de seguir las instrucciones, se me ocurrió la idea más sencilla:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="ES-HN"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Convertir esto:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;";" { return new Symbol(sym.SEMI); }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;en esto:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;;" lang="EN-US"&gt;"\n" { return new Symbol(sym.SEMI); }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-US"&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Funciona, es todo lo que puedo decir.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Versión final de &lt;a href="http://www.geocities.com/jahazhn/cmpl/minimal.lex.txt"&gt;minimal.lex&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;h1&gt;&lt;span style=""&gt;Traba-doc&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;La herramienta javadoc... no me puedo quejar. ¿o si?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Leí el contenido de &lt;a href="http://java.sun.com/j2se/javadoc/writingdoccomments/index.html"&gt;esta página&lt;/a&gt;. Hice mis intentos, y funcionó...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Con un archivo sí, y con otro no ( ¡oh, tronó! ).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Y pues bueno, luchando por tratar de entender cual fue la diferencia... si hice copy-paste, perdí mi tiempo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Hice varios intentos, desde Eclipse, desde jCreator, y desde el CMD.exe. Siempre o mismo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;El archivo &lt;a href="http://www.geocities.com/jahazhn/cmpl/Test.java"&gt;test.java&lt;/a&gt;, utilizado en la parte inicial del laboratorio si pudo ser documentado, al menos, se pudo comprobar que javadoc funciona.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Sin embargo, para el caso de minimal.lex, no se tuvo éxito. Incluso modificando directamente el archivo generado Yylex.java, no se obtuvo resultados satisfactorios.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Aquí muestro el último intento, desde la consola &lt;a href="http://www.geocities.com/jahazhn/cmpl/log_cmd.exe.error.javadoc.txt"&gt;CMD.exe&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Pueden notar como el primer archivo funciona bien, pero el segundo... no.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;En cuanto a la parte referente a Trabajar conjuntamente con Eclipse, jFlex, y CUP, aquí es donde entra una excusa en escena. Esto, lastimosamente, quedará para después.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;h1&gt;&lt;span style=""&gt;Comentarios Finales.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/h1&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Me sigo quejando a cerca de Eclipse. Por alguna razón que desconozco, no logro familiarizarme con este IDE. En comparación con jCreator, al cual le logro configurar más rápidamente. Debo hacer notar, que ninguno de los tres IDEs he usado por mucho tiempo, mi experiencia con java es realmente escasa.( Los Tres Amigos: Eclipse, NetBeans, jCreator ).&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;En cuanto a javadoc, me parece realmente interesante. Me dan ganas de probar que pasa si le pongo a trabajar con mis archivos de C++.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;Los generadores de código: No tuve mucha oportunidad de tratar con ellos, pero pude notar que el código que generan no es tan claro como el de ANTLR.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal"&gt;&lt;span style=""&gt;&lt;!--[if !supportEmptyParas]--&gt; &lt;!--[endif]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112348025944116041?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112348025944116041/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112348025944116041' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112348025944116041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112348025944116041'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/08/laboratorio-1.html' title='Laboratorio 1'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112206954168506292</id><published>2005-07-22T15:20:00.000-06:00</published><updated>2005-07-22T15:59:01.700-06:00</updated><title type='text'>¿Ingeniero en Sistemas? ¿Qué es eso?</title><content type='html'>Pregunta filosófica, ¿Que es para mí un ingeniero en sistemas?&lt;br /&gt;&lt;br /&gt;Primero intento contestar: ¿Que es para mí un ingeniero?&lt;br /&gt;&lt;br /&gt;Bien intentando una definicion "estilo diccionario", un ingeniero es una persona capaz de analizar problemas y proponer, diseñar, implementar y mejorar soluciones apropiadas a esos problemas.&lt;br /&gt;&lt;br /&gt;Como solía decir un proferor en mi colegio: "Muchachos, ustedes han de ser 'solucionólogos', no 'problemóloos'"&lt;br /&gt;&lt;br /&gt;Recordemos la etimología de &lt;span style="font-style: italic;"&gt;logos&lt;/span&gt;: estudiar.&lt;br /&gt;&lt;br /&gt;Queda claro entonces el mensaje que quería transmitir el profesor, que yo traduzco de esta manera:&lt;br /&gt;- Hay que perder más tiempo pensando en la solucion que en el problema. (Para que te quede más tiempo para llevar a cabo la solucion)&lt;br /&gt;&lt;br /&gt;Esa es la idea que tengo de un "Ingeniero", pero a esto le debo agregar la idea que proviene de la similitud con la palabra "Ingenio", es decir que ese &lt;span style="font-style: italic;"&gt;solucionólogo&lt;/span&gt; debe, en más de una ocasión, &lt;span style="font-weight: bold;"&gt;crear una nueva solución&lt;/span&gt;., porque lo más seguro es que ese problema no haya sido resuelto antes, y si lo fue, seguro no todas las condiciones eran iguales, por lo que en todo caso, hay que "ingeniar" la manera de que una solución que se ha usado antes, funcione ahora.&lt;br /&gt;&lt;br /&gt;Claro ejemplo encuentro en la contruccion de un puente; contruir un puente ya se ha hecho, pero ¿que tal construir un puente en un lugar específico? El terreno no será igual, ni la longitud, o la altura, lo que hay debajo... etc.&lt;br /&gt;&lt;br /&gt;La labor de un ingeniero empieza de hecho, desde que surge el problema: "Hay que ir de aqui para allá", uego viene el análisis: ¿sirve un puente, o un simple relleno, o mejor pasamos por otro lado? Y asi continuamos... hasta encontrar el mejor modo, luego diseñar y llevar a cabo la Solución.&lt;br /&gt;&lt;br /&gt;Bien, la pregunta original era ¿Que es para mí un ingeniero en sistemas?.&lt;br /&gt;&lt;br /&gt;Pues todo lo anterior, con la peculiaridad de que las soluciones que el/ella debe realizar, son de naturaleza computacional, y por lo general, implican una o más computadoras de algún tipo (lo más seguro es que trabajando en conjunto, interconectadas, etc.)&lt;br /&gt;&lt;br /&gt;De nuevo: Un ingeniero es una persona capaz de analizar problemas y proponer, diseñar, implementar y mejorar soluciones apropiadas a esos problemas.&lt;br /&gt;&lt;br /&gt;Creo que la parte más importante es "soluciones apropiadas", porque como decía otro de mis profesores "Los recursos son escasos". No podemos gastar más que lo que vamos a resolver, ¿o acaso...?&lt;br /&gt;&lt;br /&gt;Y algo más que creo que debo recalcar es "una persona capaz", porque un título, un cartón o un documento, poco a nada importan si a la hora del té, la persona no es capaz. Esto, haciendo énfasis en que la "escolaridad" no le hace a uno ingeniero, (Solo le pone el prefijo al Nombre), por eso creo que un señor que conozco, que es jefe de un taller donde hacen "de todo" es más ingeniero que uno que solo aplica fórmulas... pero, para polemicas no estamos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;INGENIERIA: &lt;/span&gt;Ciencia y arte de aplicar lo conocimientos científicos a la invención, perfeccionamiento o utilización de la técica industrial e todas sus facetas. [Segun el diccionario]&lt;br /&gt;&lt;br /&gt;Pro cierto, existe la palabra Ingeniatura,y tambien hubo un señor llmado José de Ingenieros.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112206954168506292?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112206954168506292/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112206954168506292' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112206954168506292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112206954168506292'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/07/ingeniero-en-sistemas-qu-es-eso.html' title='¿Ingeniero en Sistemas? ¿Qué es eso?'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-112206691904919486</id><published>2005-07-22T15:15:00.000-06:00</published><updated>2005-07-22T15:15:19.063-06:00</updated><title type='text'>Probando desde el correo</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Hola de nuevo!&lt;br&gt; &lt;/span&gt;Este blog haia estado abandonado... claro, lo escribia solamente por cuestiones de Compiladores !, y dado que la fallé, dejé de escribir.&lt;br&gt; &lt;br&gt; Estoy en el segundo round, decidido a no volver a fallar. Claro, esta vez espero no tener otra clase que me robe 20 horas al dia.&lt;br&gt; &lt;br&gt; Por cierto, esta publicacion la estoy haciendo via correo, es decir, que los del blogger proveen una dirección de correo que al enviar algo, resulta en un post.&lt;br&gt; &lt;br&gt; Vamos a ver si es cierto&lt;br&gt; &lt;span style="font-weight: bold;"&gt;&lt;/span&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-112206691904919486?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/112206691904919486/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=112206691904919486' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112206691904919486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/112206691904919486'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/07/probando-desde-el-correo.html' title='Probando desde el correo'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-110955766997975315</id><published>2005-02-27T20:18:00.000-06:00</published><updated>2005-02-27T20:27:49.986-06:00</updated><title type='text'>Un mar de configuraciones</title><content type='html'>&lt;span style="font-family:arial;"&gt;Ates: link a la version en MSWord de este blog:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.geocities.com/jahazhn/cmpl/un_mar_de_configuraciones.doc"&gt;http://www.geocities.com/jahazhn/cmpl/un_mar_de_configuraciones.doc&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;La plataforma eclipse puede ser un poco confusa. Son muy agradables toda la gama de posibilidades y facilidades que posee, sin embargo, por ser un IDE muy apartado de lo común requiere bastante tiempo para adaptarse a él.&lt;br /&gt;Uno de los prejuicios más grandes que tengo, es por no tener obvio el comando “compilar”, eso es lo que opina un fanático de DEV C++ 4, donde en el centro de la barra de herramientas aparecen los tres botones: “Compilar”, “Correr”, o para ir de un solo al mandado, “Compilar y correr”.&lt;br /&gt;Hasta hace unos días encontré el comando “Construir” (Build).&lt;br /&gt;El otro detalle que me ha llevado hasta el borde de la desesperación, es el casi infinito mar de configuraciones, un cuadro de diálogo tras otro, y en cada cuadro , “ene” posibilidades... hablando concretamente, en las configuraciones para el comando “Run...”, olvidé ese paso, por eso, no importaba cuantas veces creara un nuevo proyecto, o incluso un nuevo espacio de trabajo, el dichoso IDE seguía buscando el método main de la primera cosa que hice con eclipse, de modo que nunca encontraba los nuevos archivos.&lt;br /&gt;Ese es el tipo de cosas que deja la sensación de no saber si el de ‘la falla’ es el usuario o el que diseñó el programa. Por convención, suele ser el usuario,  ¿verdad?.&lt;br /&gt;&lt;br /&gt;Una vez superadas esas dificultades con el IDE, el proyecto se pone en marcha luego de un poco de observación de la gramática en la definición de micro-C.&lt;br /&gt;&lt;br /&gt;Aquí muestro el código del lexer&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class lexico extends Lexer;&lt;br /&gt;options{   k=4;   }&lt;br /&gt;&lt;br /&gt;TOK_IF: "if";&lt;br /&gt;TOK_ELSE: "else";&lt;br /&gt;TOK_RETURN: "return";&lt;br /&gt;TOK_WHILE: "while";&lt;br /&gt;TOK_BREAK: "break";&lt;br /&gt;TOK_CONTINUE: "continue";&lt;br /&gt;TOK_TYPE_INT: "int";&lt;br /&gt;TOK_TYPE_CHAR: "char" ;&lt;br /&gt;TOK_VOID: "void";&lt;br /&gt;&lt;br /&gt;ASSIGN:('=');&lt;br /&gt;&lt;br /&gt;ADD_OP:('+''-');&lt;br /&gt;&lt;br /&gt;MUL_OP:('*''/');&lt;br /&gt;&lt;br /&gt;EQ_OP:("==""!=");&lt;br /&gt;&lt;br /&gt;REL_OP:("&lt;=""&gt;=");&lt;br /&gt;&lt;br /&gt;REL_OP2:("&lt;""&gt;");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OPEN_PAR:('(');&lt;br /&gt;&lt;br /&gt;CLOSE_PAR: (')');&lt;br /&gt;&lt;br /&gt;OPEN_BRACE:('{');&lt;br /&gt;&lt;br /&gt;CLOSE_BRACE: ('}');&lt;br /&gt;&lt;br /&gt;COMMA: (',');&lt;br /&gt;&lt;br /&gt;SEMICOLON: (';');&lt;br /&gt;&lt;br /&gt;SUSPENSIVE: "...";&lt;br /&gt;&lt;br /&gt;SPACE: (' ''\r''\n'){$setType(Token.SKIP); }      ;&lt;br /&gt;&lt;br /&gt;IDENTIFIER:&lt;br /&gt;    (LETTER)(LETTERDIGIT)*&lt;br /&gt;    ;&lt;br /&gt;&lt;br /&gt;INTEGER_CONSTANT:&lt;br /&gt;      (ZERO)(NONZERO)(DIGIT)*&lt;br /&gt;      ;&lt;br /&gt;&lt;br /&gt;protected ZERO:'0';&lt;br /&gt;protected NONZERO:('1'..'9');&lt;br /&gt;protected DIGIT:(ZERONONZERO);&lt;br /&gt;&lt;br /&gt;protected LETTER:('a'..'z''A'..'Z''_')      ;&lt;br /&gt;&lt;br /&gt;CHAR_CONSTANT: ('\'')(LETTERDIGIT)('\''); //aun falta&lt;br /&gt;&lt;br /&gt;STRING_CONSTANT: ('\"')()('\"'); //aun falta&lt;br /&gt;&lt;br /&gt;protected COMMENT: "/*"()"*/";&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Las definiciones de los operadores y palabras reservadas no dan mayor problema, solamente hay que fijarse de definirlas antes que los identificadores, para que el “no-determinismo” no sea una dificultad extra.&lt;br /&gt;&lt;br /&gt;Los elementos más complejos han resultado ser la constante de caracter y la constate de cadena. En realidad, solamente se trata de analizar con calma elcaso en particular.&lt;br /&gt;&lt;br /&gt;Continuamos con el Parser&lt;br /&gt;El parser es sin duda la parte más emocionante d este proyecto, hasta ahora. Resulta sorprendente que la “Teoría de la computación” sirva para algo, (al cursar esa clase, esa es la interrogante más popular, pero la única que el maestro no contesta... ¿porqué nos hace eso? ).&lt;br /&gt;Al definir la gramática del lenguaje a nivel de tokens, se logra ver con toda claridad la estructura del programa, y como es de esperar, hay que tener ciertas delicadezas con esa gramática.&lt;br /&gt;El primer problema que se detecta al introducir una gramática y compilar el código de ANTLR para el parser es el de “Infinite recursion...”. La recursión izquierda, como la conocemos en español, es el primer detalle a tratar.&lt;br /&gt;&lt;br /&gt;Eliminando recursión izquierda&lt;br /&gt;A continuación muestro las transformaciones que realicé a algunas de las producciones de la gramática provista por el profesor:&lt;br /&gt;( léase el signo ‘&amp;’ como ‘lamda’)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;translation_unit -&gt; external_declaration  translation_unit external_declaration&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;translation_unit -&gt; external_declaration translation_item&lt;br /&gt;translation_item -&gt; external_declaration translation_item  &amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;parameter_def_list -&gt; type identifier  parameter_def_list "," type identifier;&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;parameter_def_list -&gt; type identifier parameter_item&lt;br /&gt;parameter_item -&gt;  "," type identifier parameter_item  &amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;declarations -&gt; declarations declaration  &amp;&lt;br /&gt;---------------------------------------------&lt;br /&gt;declarations -&gt;  declarative&lt;br /&gt;declarative -&gt; declaration declarative   &amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;parameter_decl_list -&gt; parameter_decl_list "," parameter_decl_spec  parameter_decl_spec&lt;br /&gt;----------------------------------------------------------------------------------------&lt;br /&gt;parameter_decl_list -&gt; parameter_decl_spec parameter_declarative&lt;br /&gt;parameter_declarative -&gt; "," parameter_decl_spec parameter_declarative  &amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;statement_list -&gt; statement_list statement  statement&lt;br /&gt;------------------------------------------------------&lt;br /&gt;statement_list -&gt; statement statement_item&lt;br /&gt;statement_item -&gt; statement statement_item  &amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;simple_expression -&gt; simple_expression add_op term  term&lt;br /&gt;---------------------------------------------------------&lt;br /&gt;simple_expression -&gt; term simple_expression_&lt;br /&gt;simple_expression_ -&gt; add_op term simple_expression_  &amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;term -&gt; term mul_op factor  factor&lt;br /&gt;-----------------------------------&lt;br /&gt;term -&gt; factor term_&lt;br /&gt;term_ -&gt; mul_op factor term_  &amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;expression_list -&gt; expression_list "," expression  expression&lt;br /&gt;--------------------------------------------------------------&lt;br /&gt;expression_list -&gt; expression expression_list_&lt;br /&gt;expression_list_ -&gt; "," expression expression_list_  &amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;identifier_list -&gt; identifier_list "," identifier  identifier&lt;br /&gt;---------------------------------------------------------------&lt;br /&gt;identifier_list -&gt; identifier identifier_list_&lt;br /&gt;identifier_list_ -&gt; "," identifier identifier_list_  &amp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Este procedimiento resulta relativamente sencillo, ya que la transformación implica solamente aplicar una fórmula de dos pasos.&lt;br /&gt;&lt;br /&gt;Producciones no deterministas&lt;br /&gt;Un segundo problema resulta el no-determinismo de algunas de las producciones, generalmente las de la forma A -&gt; B  BC. En algunos casos, no basta para ANTLR aplicar factorización izquierda, por ejemplo, si hacemos A -&gt; BH, H -&gt; C  ‘lambda’, ANTLR reportará no-determinismo en la producción H.&lt;br /&gt;Todavía no he encontrado la manera de solucionar este problema; mencionando que para estos casos estoy utilizando el operador ‘?’, que significa “cero o una vez”, es decir H -&gt; C?.&lt;br /&gt;&lt;br /&gt;A continuación muestro la gramática para el Parser, en formato de ANTLR, encontrará marcadas con un ‘!!’ al inicio d la línea, aquellas producciones en las cuales he encontrado el problema arriba descrito.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class parsico extends Parser;&lt;br /&gt;&lt;br /&gt;startRule:  translation_unit;&lt;br /&gt;&lt;br /&gt;translation_unit : external_declaration translation_item;&lt;br /&gt;&lt;br /&gt;translation_item : (external_declaration translation_item)?;&lt;br /&gt;&lt;br /&gt;!!external_declaration : function_definition  declaration;&lt;br /&gt;&lt;br /&gt;function_definition : function_def_header function_body;&lt;br /&gt;&lt;br /&gt;function_def_header : return_type IDENTIFIER (OPEN_PAR) parameters_def (CLOSE_PAR);&lt;br /&gt;&lt;br /&gt;return_type : type  (TOK_VOID);&lt;br /&gt;&lt;br /&gt;parameters_def : parameter_def_list  (TOK_VOID);&lt;br /&gt;&lt;br /&gt;parameter_def_list : type IDENTIFIER parameter_item;&lt;br /&gt;&lt;br /&gt;parameter_item :  ((COMMA) type IDENTIFIER parameter_item)?;&lt;br /&gt;&lt;br /&gt;function_body : (OPEN_BRACE) declarations statement_list (CLOSE_BRACE);&lt;br /&gt;&lt;br /&gt;declarations : declarative;&lt;br /&gt;&lt;br /&gt;declarative : (declaration declarative)?;&lt;br /&gt;&lt;br /&gt;!!declaration : variable_declaration  function_declaration;&lt;br /&gt;&lt;br /&gt;variable_declaration : type identifier_list (SEMICOLON);&lt;br /&gt;&lt;br /&gt;function_declaration : return_type IDENTIFIER (OPEN_PAR)&lt;br /&gt;&lt;br /&gt;!!parameters_decl (CLOSE_PAR) (SEMICOLON);&lt;br /&gt;&lt;br /&gt;parameters_decl : parameter_decl_list  parameter_decl_list (COMMA) (SUSPENSIVE)  (TOK_VOID);&lt;br /&gt;&lt;br /&gt;parameter_decl_list : parameter_decl_spec parameter_declarative;&lt;br /&gt;&lt;br /&gt;!!parameter_declarative : (COMMA parameter_decl_spec parameter_declarative)?;&lt;br /&gt;&lt;br /&gt;parameter_decl_spec : type IDENTIFIER;&lt;br /&gt;&lt;br /&gt;statement_list : statement statement_item;&lt;br /&gt;&lt;br /&gt;statement_item : (statement statement_item)?;&lt;br /&gt;&lt;br /&gt;!!statement : expression (SEMICOLON)&lt;br /&gt; (TOK_RETURN) statement_&lt;br /&gt; (TOK_WHILE) (OPEN_PAR) expression (CLOSE_PAR) statement&lt;br /&gt; (TOK_IF) (OPEN_PAR) expression (CLOSE_PAR) statement //else_statement&lt;br /&gt; (TOK_IF) (OPEN_PAR) expression (CLOSE_PAR) statement (TOK_ELSE) statement&lt;br /&gt; (OPEN_BRACE) statement_list (CLOSE_BRACE)&lt;br /&gt;// (TOK_RETURN) (SEMICOLON)&lt;br /&gt; (TOK_BREAK) (SEMICOLON)&lt;br /&gt; (TOK_CONTINUE) (SEMICOLON);&lt;br /&gt;&lt;br /&gt;statement_: expression SEMICOLON  SEMICOLON;&lt;br /&gt;&lt;br /&gt;//else_statement : (TOK_ELSE statement)?;&lt;br /&gt;&lt;br /&gt;expression : equality_expression ((ASSIGN) equality_expression)?;&lt;br /&gt;&lt;br /&gt;equality_expression : relational_expression ((EQ_OP) relational_expression)?;&lt;br /&gt;&lt;br /&gt;relational_expression : simple_expression ((REL_OP) simple_expression)?;&lt;br /&gt;&lt;br /&gt;simple_expression : term simple_expression_;&lt;br /&gt;&lt;br /&gt;simple_expression_ : ((ADD_OP) term simple_expression_)?;&lt;br /&gt;&lt;br /&gt;term : factor term_;&lt;br /&gt;&lt;br /&gt;term_ : (MUL_OP factor term_)?;&lt;br /&gt;&lt;br /&gt;factor :&lt;br /&gt;constant&lt;br /&gt; (ADD_OP) factor &lt;br /&gt; IDENTIFIER ((OPEN_PAR) factor_)?&lt;br /&gt; (OPEN_PAR) expression (CLOSE_PAR);&lt;br /&gt;&lt;br /&gt;factor_ : (CLOSE_PAR) expression_list (CLOSE_PAR);&lt;br /&gt;&lt;br /&gt;constant : STRING_CONSTANT  numeric_constant  CHAR_CONSTANT;&lt;br /&gt;&lt;br /&gt;numeric_constant : INTEGER_CONSTANT;&lt;br /&gt;&lt;br /&gt;expression_list : expression expression_list_;&lt;br /&gt;&lt;br /&gt;expression_list_ : ((COMMA) expression expression_list_)?;&lt;br /&gt;&lt;br /&gt;identifier_list : IDENTIFIER identifier_list_;&lt;br /&gt;&lt;br /&gt;identifier_list_ : ((COMMA) IDENTIFIER identifier_list_)?;&lt;br /&gt;&lt;br /&gt;type : (TOK_TYPE_INT)  (TOK_TYPE_CHAR);&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;La mente se consuela con un clásico “un poco más de análisis bastará para hallar la solución...”&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Este es el contenido de uno de los archivos que he probado con el “compilador”:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;int uno(int x, char c){&lt;br /&gt;   int y, z, w;&lt;br /&gt;   char r, c;&lt;br /&gt;   if(c == c){break;}&lt;br /&gt;   return x + 3;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;A estas alturas del proyecto, me siento más realizado si el código generado “acepta” el input, que si le encuentra errores, porque mientras no corrija el no-determinismo de la gramática, no se logra reconocer código válido, como en:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if(c == c){break;}else{continue;}.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Este tipo de input no es aceptada aún por la gramática expuesta más arriba.&lt;br /&gt;&lt;br /&gt;Ahora viene la etapa de reportar errores. Aquí es donde “la mula botó a Genaro”.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-110955766997975315?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/110955766997975315/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=110955766997975315' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/110955766997975315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/110955766997975315'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/02/un-mar-de-configuraciones.html' title='Un mar de configuraciones'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-110800939506214095</id><published>2005-02-09T21:35:00.001-06:00</published><updated>2005-02-09T22:23:15.063-06:00</updated><title type='text'>Un reconocedor de expresiones a la brava( continuacion )</title><content type='html'>En la publicación anterior, olvidé comentar otros problemas que tuve con ese reconocedor.&lt;br /&gt;La primera de ellas es que para respetar el orden estándar de operaciones, la cadena re recorre al revés, por ejemplo en 1 + 2 + 3, si se recorre al revés, el primer operador reconocido es el ‘+’ que se encuentra entre el ‘2’ y el ‘3’.&lt;br /&gt;Esa fue la única solución que se me ocurrió para que esa operación quedase mas profunda en el árbol construido.&lt;br /&gt;Otra observación ( si no han compilado el código) es que tuve que utilizar un treeview, así que necesitarán el código del .vbp para que VB sepa que tiene que incluir el OCX adecuado.&lt;br /&gt;Aquí les va el texto. Igual que antes: Copy &amp; Paste, salvar con editor de texto plano con CualquierNombre.vbp.&lt;br /&gt;Al abrirlo, asegurarse que el archivo incluido es el que hayan salvado de la publicación anterior, y prueben a correrlo.&lt;br /&gt;Lamento tener que poner el texto aquí en el blog, ya se que es mas difícil leerlo asi, pero estoy teniendo problemas de log in con la página web a la cual pude haber subido todo en un simple .zip. [ cookies rejected ]&lt;br /&gt;------------- archivo: Proyecto.vbp ---------------------&lt;br /&gt;Type=Exe&lt;br /&gt;Form=Pharser01.frm&lt;br /&gt;Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\WINDOWS\System32\stdole2.tlb#OLE Automation&lt;br /&gt;Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; MSCOMCTL.OCX&lt;br /&gt;IconForm="Pharser01"&lt;br /&gt;Startup="Pharser01"&lt;br /&gt;HelpFile=""&lt;br /&gt;Command32=""&lt;br /&gt;Name="Pharser"&lt;br /&gt;HelpContextID="0"&lt;br /&gt;CompatibleMode="0"&lt;br /&gt;MajorVer=1&lt;br /&gt;MinorVer=0&lt;br /&gt;RevisionVer=0&lt;br /&gt;AutoIncrementVer=0&lt;br /&gt;ServerSupportFiles=0&lt;br /&gt;VersionCompanyName="Familia Lara"&lt;br /&gt;CompilationType=0&lt;br /&gt;OptimizationType=0&lt;br /&gt;FavorPentiumPro(tm)=0&lt;br /&gt;CodeViewDebugInfo=0&lt;br /&gt;NoAliasing=0&lt;br /&gt;BoundsCheck=0&lt;br /&gt;OverflowCheck=0&lt;br /&gt;FlPointCheck=0&lt;br /&gt;FDIVCheck=0&lt;br /&gt;UnroundedFP=0&lt;br /&gt;StartMode=0&lt;br /&gt;Unattended=0&lt;br /&gt;Retained=0&lt;br /&gt;ThreadPerObject=0&lt;br /&gt;MaxNumberOfThreads=1&lt;br /&gt;&lt;br /&gt;[MS Transaction Server]&lt;br /&gt;AutoRefresh=1&lt;br /&gt;------------------------ fin de archivo --------------------&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-110800939506214095?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/110800939506214095/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=110800939506214095' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/110800939506214095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/110800939506214095'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/02/un-reconocedor-de-expresiones-la-brava_09.html' title='Un reconocedor de expresiones a la brava( continuacion )'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-110800847483946029</id><published>2005-02-09T21:35:00.000-06:00</published><updated>2005-02-09T22:07:54.840-06:00</updated><title type='text'>Un reconocedor de expresiones a la brava</title><content type='html'>Uno de mis intereses desde que aprendi a programar ha sido el de generar gráficas de funciones matemáticas. Esa parte es sencilla, si la función a graficar se coloca en el Código fuente. Por supuesto, una mejor implementación permitirá al usuario introducir la ecuación que desee. La primera solución que se viene a la mente – si no se tiene conocimiento sobre compiladores - es crear una estructura fija, que el usuario pueda llenar, evitando al máximo la cantidad de errores de input. Esto limita la capacidad del programa, y requiere un cambio de la interfase se desea ampliar la funcionalidad del programa.&lt;br /&gt;La mejor alternativa: que el usuario pueda introducir la expresión tal y como se escribe en notación matemática. Aquí es donde viene la parte interesante.&lt;br /&gt;Como construir un reconocedor reexpresiones matemáticas sin conocimiento de herramientas para crear compiladores, y aún sin saber aplicar la teoría de autómatas?Aquí presento un primer intento. Un programa en Visual Basic.&lt;br /&gt;&lt;br /&gt;La idea básica para reconocer era: Dado que la mayoría de las expresiones matemáticas son binarias, encontrar un operador, subdividir el input (cadena de entrada) en tres partes, izquierda, operador, derecha.&lt;br /&gt;El operador se convierte en la raíz de un árbol, y se llama recursivamente este procedimiento para poblar los hijos de este arbol.&lt;br /&gt;Las dificultades relativas a la precedencia se resolvieron haciendo un exceso d pasadas, ya que en una primera pasada se buscan los operadores con mayor precedencia, como la exponenciación, en una segunda los ‘por’ y ‘entre’, y en otra más, los operadores de suma y resta, y considerando la recursión, la cadena completa se recorre hasta tres veces por cada operador.&lt;br /&gt;La precedencia con los paréntesis se resolvía “bloqueando” el encuentro de operadores si se estaba en un nivel de paréntesis distinto de cero, y enviando luego la cadena entre paréntesis (removiendo los mismos) al procedimiento antes descrito.&lt;br /&gt;He aquí el código para examinarlo y si lo desea, compilarlo. Fue creado usando VB 6.0.&lt;br /&gt;Por favor disculpar el “abuso” con el nombre, en ese entonces no sabía exactamente de que se trataba...&lt;br /&gt;Instrucciones: Copy &amp; Paste en cualquier editor de texto plano, salvar como Pharser01.frm, crear un nuevo proyecto de VB, e incluir este formulario en el.&lt;br /&gt;“Hay que caerse antes de aprender a caminar”&lt;br /&gt;---------------------- Archivo: pharser01.frm -------------------&lt;br /&gt;VERSION 5.00&lt;br /&gt;Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX"&lt;br /&gt;Begin VB.Form Pharser01&lt;br /&gt;   BorderStyle     =   1  'Fixed Single&lt;br /&gt;   Caption         =   "Pharser01"&lt;br /&gt;   ClientHeight    =   7335&lt;br /&gt;   ClientLeft      =   45&lt;br /&gt;   ClientTop       =   435&lt;br /&gt;   ClientWidth     =   10470&lt;br /&gt;   BeginProperty Font&lt;br /&gt;      Name            =   "MS Sans Serif"&lt;br /&gt;      Size            =   12&lt;br /&gt;      Charset         =   0&lt;br /&gt;      Weight          =   700&lt;br /&gt;      Underline       =   0   'False&lt;br /&gt;      Italic          =   0   'False&lt;br /&gt;      Strikethrough   =   0   'False&lt;br /&gt;   EndProperty&lt;br /&gt;   LinkTopic       =   "Form1"&lt;br /&gt;   MaxButton       =   0   'False&lt;br /&gt;   MinButton       =   0   'False&lt;br /&gt;   ScaleHeight     =   7335&lt;br /&gt;   ScaleWidth      =   10470&lt;br /&gt;   StartUpPosition =   3  'Windows Default&lt;br /&gt;   Begin VB.ListBox varList&lt;br /&gt;      Height          =   5760&lt;br /&gt;      Left            =   7560&lt;br /&gt;      Sorted          =   -1  'True&lt;br /&gt;      TabIndex        =   6&lt;br /&gt;      Top             =   840&lt;br /&gt;      Width           =   2655&lt;br /&gt;   End&lt;br /&gt;   Begin VB.CommandButton btnSolve&lt;br /&gt;      Caption         =   "&amp;Solve"&lt;br /&gt;      Height          =   375&lt;br /&gt;      Left            =   8880&lt;br /&gt;      TabIndex        =   5&lt;br /&gt;      Top             =   0&lt;br /&gt;      Width           =   1335&lt;br /&gt;   End&lt;br /&gt;   Begin MSComctlLib.TreeView Tree&lt;br /&gt;      Height          =   5895&lt;br /&gt;      Left            =   0&lt;br /&gt;      TabIndex        =   2&lt;br /&gt;      Top             =   840&lt;br /&gt;      Width           =   7530&lt;br /&gt;      _ExtentX        =   13282&lt;br /&gt;      _ExtentY        =   10398&lt;br /&gt;      _Version        =   393217&lt;br /&gt;      HideSelection   =   0   'False&lt;br /&gt;      Indentation     =   706&lt;br /&gt;      LabelEdit       =   1&lt;br /&gt;      LineStyle       =   1&lt;br /&gt;      Style           =   4&lt;br /&gt;      Appearance      =   1&lt;br /&gt;   End&lt;br /&gt;   Begin VB.CommandButton btnProccess&lt;br /&gt;      Caption         =   "&amp;Proccess"&lt;br /&gt;      Height          =   375&lt;br /&gt;      Left            =   7560&lt;br /&gt;      TabIndex        =   1&lt;br /&gt;      Top             =   0&lt;br /&gt;      Width           =   1335&lt;br /&gt;   End&lt;br /&gt;   Begin VB.TextBox txtPharse&lt;br /&gt;      Height          =   420&lt;br /&gt;      Left            =   0&lt;br /&gt;      TabIndex        =   0&lt;br /&gt;      Top             =   0&lt;br /&gt;      Width           =   7575&lt;br /&gt;   End&lt;br /&gt;   Begin VB.Label Label3&lt;br /&gt;      Caption         =   "Variables:"&lt;br /&gt;      Height          =   255&lt;br /&gt;      Left            =   7560&lt;br /&gt;      TabIndex        =   7&lt;br /&gt;      Top             =   600&lt;br /&gt;      Width           =   2655&lt;br /&gt;   End&lt;br /&gt;   Begin VB.Label Label2&lt;br /&gt;      BorderStyle     =   1  'Fixed Single&lt;br /&gt;      Height          =   615&lt;br /&gt;      Left            =   0&lt;br /&gt;      TabIndex        =   4&lt;br /&gt;      Top             =   6720&lt;br /&gt;      Width           =   10455&lt;br /&gt;   End&lt;br /&gt;   Begin VB.Label Label1&lt;br /&gt;      Caption         =   "Arbol de expresión:"&lt;br /&gt;      Height          =   255&lt;br /&gt;      Left            =   0&lt;br /&gt;      TabIndex        =   3&lt;br /&gt;      Top             =   600&lt;br /&gt;      Width           =   4095&lt;br /&gt;   End&lt;br /&gt;End&lt;br /&gt;Attribute VB_Name = "Pharser01"&lt;br /&gt;Attribute VB_GlobalNameSpace = False&lt;br /&gt;Attribute VB_Creatable = False&lt;br /&gt;Attribute VB_PredeclaredId = True&lt;br /&gt;Attribute VB_Exposed = False&lt;br /&gt;Option Explicit&lt;br /&gt;Private Function MenosUnario(Expre As String, i As Integer) As Boolean&lt;br /&gt;If i = 1 Then MenosUnario = True: Exit Function&lt;br /&gt;If esOper(Mid(Expre, i - 1, 1)) Then MenosUnario = True: Exit Function&lt;br /&gt;'if i &gt; 2 and esOper(Mid(Expre, i - 2, 2)) Then MenosUnario = True: Exit Function&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Sub Arbol(Expre As String, Optional index As Integer)&lt;br /&gt;If Expre = "" Then Exit Sub&lt;br /&gt;Dim aux As Node&lt;br /&gt;Dim i As Integer, par As Integer: par = 0&lt;br /&gt;Dim ParMid As Boolean&lt;br /&gt;'si la cadena empieza y termina en parentesis, y no hay parentesis intermedios&lt;br /&gt;'removemos los extremos.&lt;br /&gt;For i = 2 To Len(Expre) - 1&lt;br /&gt;   If Mid(Expre, i, 1) = "(" Or Mid(Expre, i, 1) = ")" Then ParMid = True: Exit For&lt;br /&gt;Next&lt;br /&gt;If Not ParMid Then&lt;br /&gt;   If Mid(Expre, 1, 1) = "(" And Mid(Expre, Len(Expre), 1) = ")" Then Expre = Mid(Expre, 2, Len(Expre) - 2)&lt;br /&gt;End If&lt;br /&gt;If Len(Expre) = 0 Then Exit Sub&lt;br /&gt;'Operadores Logicos( &amp;: AND, : OR, !:NOT, ?:XOR&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp;amp; Expre: Exit Sub&lt;br /&gt;If Mid(Expre, i, 1) = "&amp;" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&amp;")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&amp;")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "")&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "")&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   End If&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "!" And par = 0 Then&lt;br /&gt;   If i = 1 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "!")&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "!")&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   End If&lt;br /&gt;   Exit Sub&lt;br /&gt;   End If&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "?" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "?")&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "?")&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   End If&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;Next&lt;br /&gt;'Signos de Comparacion&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp; Expre: Exit Sub&lt;br /&gt;If i &gt; 1 Then&lt;br /&gt;If Mid(Expre, i - 1, 2) = "&gt;=" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&gt;=")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&gt;=")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 2), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i - 1, 2) = "&lt;=" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&lt;=")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&lt;=")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 2), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "=" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "=")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "=")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "&gt;" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&gt;")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&gt;")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "&lt;" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&lt;")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&lt;")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;Next&lt;br /&gt;'signos de suma ( +, -)&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp; Expre: Exit Sub&lt;br /&gt;If Mid(Expre, i, 1) = "+" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "+")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "+")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "-" And par = 0 Then&lt;br /&gt;   If Not MenosUnario(Expre, i) Then&lt;br /&gt;      If index = 0 Then&lt;br /&gt;         Set aux = Tree.Nodes.Add(, , , "-")&lt;br /&gt;         Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;         Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;      Else&lt;br /&gt;         Set aux = Tree.Nodes.Add(index, tvwChild, , "-")&lt;br /&gt;         Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;         Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;      End If&lt;br /&gt;      Exit Sub&lt;br /&gt;   Else 'menos unario&lt;br /&gt;      If i = 1 Then&lt;br /&gt;      If index = 0 Then&lt;br /&gt;         Set aux = Tree.Nodes.Add(, , , "_")&lt;br /&gt;         Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;      Else&lt;br /&gt;         Set aux = Tree.Nodes.Add(index, tvwChild, , "_")&lt;br /&gt;         Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;      End If&lt;br /&gt;      Exit Sub&lt;br /&gt;      End If&lt;br /&gt;   End If&lt;br /&gt;End If&lt;br /&gt;Next&lt;br /&gt;'Signos de multiplicacion ( /, *)&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp; Expre: Exit Sub&lt;br /&gt;If Mid(Expre, i, 1) = "*" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "*")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "*")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "/" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "/")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "/")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;Next&lt;br /&gt;'Signo de exponenciacion&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp; Expre: Exit Sub&lt;br /&gt;If Mid(Expre, i, 1) = "^" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "^")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "^")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;Next&lt;br /&gt;'si no habia signos en la cadena:&lt;br /&gt;If index = 0 Then&lt;br /&gt;   Tree.Nodes.Add , , , Expre&lt;br /&gt;Else&lt;br /&gt;   Tree.Nodes.Add index, tvwChild, , Expre&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;br /&gt;Sub Arbol2(Expre As String, Tree As TreeView, Optional index As Integer)&lt;br /&gt;If Expre = "" Then Exit Sub&lt;br /&gt;Dim aux As Node&lt;br /&gt;Dim i As Integer, par As Integer: par = 0&lt;br /&gt;Dim ParMid As Boolean&lt;br /&gt;'si la cadena empieza y termina en parentesis, y no hay parentesis intermedios&lt;br /&gt;'removemos los extremos.&lt;br /&gt;For i = 2 To Len(Expre) - 1&lt;br /&gt;   If Mid(Expre, i, 1) = "(" Or Mid(Expre, i, 1) = ")" Then ParMid = True: Exit For&lt;br /&gt;Next&lt;br /&gt;If Not ParMid Then&lt;br /&gt;   If Mid(Expre, 1, 1) = "(" And Mid(Expre, Len(Expre), 1) = ")" Then Expre = Mid(Expre, 2, Len(Expre) - 2)&lt;br /&gt;End If&lt;br /&gt;If Len(Expre) = 0 Then Exit Sub&lt;br /&gt;'Operadores Logicos( &amp;: AND, : OR, !:NOT, ?:XOR&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp;amp; Expre: Exit Sub&lt;br /&gt;If Mid(Expre, i, 1) = "&amp;" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&amp;")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&amp;")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "")&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "")&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   End If&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "!" And par = 0 Then&lt;br /&gt;   If i = 1 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "!")&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "!")&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   End If&lt;br /&gt;   Exit Sub&lt;br /&gt;   End If&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "?" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "?")&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "?")&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   End If&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;Next&lt;br /&gt;'Signos de Comparacion&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp; Expre: Exit Sub&lt;br /&gt;If i &gt; 1 Then&lt;br /&gt;If Mid(Expre, i - 1, 2) = "&gt;=" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&gt;=")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&gt;=")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 2), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i - 1, 2) = "&lt;=" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&lt;=")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&lt;=")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 2), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "=" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "=")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "=")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "&gt;" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&gt;")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&gt;")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "&lt;" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "&lt;")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "&lt;")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;Next&lt;br /&gt;'signos de suma ( +, -)&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp; Expre: Exit Sub&lt;br /&gt;If Mid(Expre, i, 1) = "+" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "+")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "+")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "-" And par = 0 Then&lt;br /&gt;   If Not MenosUnario(Expre, i) Then&lt;br /&gt;      If index = 0 Then&lt;br /&gt;         Set aux = Tree.Nodes.Add(, , , "-")&lt;br /&gt;         Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;         Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;      Else&lt;br /&gt;         Set aux = Tree.Nodes.Add(index, tvwChild, , "-")&lt;br /&gt;         Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;         Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;      End If&lt;br /&gt;      Exit Sub&lt;br /&gt;   Else 'menos unario&lt;br /&gt;      If i = 1 Then&lt;br /&gt;      If index = 0 Then&lt;br /&gt;         Set aux = Tree.Nodes.Add(, , , "_")&lt;br /&gt;         Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;      Else&lt;br /&gt;         Set aux = Tree.Nodes.Add(index, tvwChild, , "_")&lt;br /&gt;         Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;      End If&lt;br /&gt;      Exit Sub&lt;br /&gt;      End If&lt;br /&gt;   End If&lt;br /&gt;End If&lt;br /&gt;Next&lt;br /&gt;'Signos de multiplicacion ( /, *)&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp; Expre: Exit Sub&lt;br /&gt;If Mid(Expre, i, 1) = "*" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "*")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "*")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;If Mid(Expre, i, 1) = "/" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "/")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "/")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;Next&lt;br /&gt;'Signo de exponenciacion&lt;br /&gt;For i = Len(Expre) To 1 Step -1&lt;br /&gt;If Mid(Expre, i, 1) = "(" Then par = par + 1&lt;br /&gt;If Mid(Expre, i, 1) = ")" Then par = par - 1&lt;br /&gt;If par &gt; 0 Then Label2.Caption = "error de parentesis: " &amp; Expre: Exit Sub&lt;br /&gt;If Mid(Expre, i, 1) = "^" And par = 0 Then&lt;br /&gt;   If index = 0 Then&lt;br /&gt;      Set aux = Tree.Nodes.Add(, , , "^")&lt;br /&gt;   Else&lt;br /&gt;      Set aux = Tree.Nodes.Add(index, tvwChild, , "^")&lt;br /&gt;   End If&lt;br /&gt;      Arbol Mid(Expre, 1, i - 1), aux.index&lt;br /&gt;      Arbol Mid(Expre, i + 1, Len(Expre) - i), aux.index&lt;br /&gt;   Exit Sub&lt;br /&gt;End If&lt;br /&gt;Next&lt;br /&gt;'si no habia signos en la cadena:&lt;br /&gt;If index = 0 Then&lt;br /&gt;   Tree.Nodes.Add , , , Expre&lt;br /&gt;Else&lt;br /&gt;   Tree.Nodes.Add index, tvwChild, , Expre&lt;br /&gt;End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Function esOper(str As String) As Boolean&lt;br /&gt;Select Case str&lt;br /&gt;Case "+": esOper = True: Exit Function&lt;br /&gt;Case "-": esOper = True: Exit Function&lt;br /&gt;Case "_": esOper = True: Exit Function&lt;br /&gt;Case "*": esOper = True: Exit Function&lt;br /&gt;Case "/": esOper = True: Exit Function&lt;br /&gt;Case "^": esOper = True: Exit Function&lt;br /&gt;&lt;br /&gt;Case "=": esOper = True: Exit Function&lt;br /&gt;Case "&gt;": esOper = True: Exit Function&lt;br /&gt;Case "&lt;": esOper = True: Exit Function&lt;br /&gt;Case "&gt;=": esOper = True: Exit Function&lt;br /&gt;Case "&lt;=": esOper = True: Exit Function&lt;br /&gt;&lt;br /&gt;Case "&amp;": esOper = True: Exit Function&lt;br /&gt;Case "": esOper = True: Exit Function&lt;br /&gt;Case "!": esOper = True: Exit Function&lt;br /&gt;Case "?": esOper = True: Exit Function&lt;br /&gt;End Select&lt;br /&gt;esOper = False&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Function palabra(signo As String) As String&lt;br /&gt;Select Case palabra&lt;br /&gt;   Case "+": signo = "MAS"&lt;br /&gt;   Case "-": signo = "MENOS"&lt;br /&gt;   Case "_": signo = "NEG"&lt;br /&gt;   Case "*": signo = "POR"&lt;br /&gt;   Case "/": signo = "ENTRE"&lt;br /&gt;   Case "^": signo = "ELEVADO A"&lt;br /&gt;   Case "=": signo = "IGUAL A"&lt;br /&gt;   Case "&gt;": signo = "MAYOR QUE"&lt;br /&gt;   Case "&lt;": signo = "MENOR QUE"&lt;br /&gt;   Case "&gt;=": signo = "MAYOR O IGUAL QUE"&lt;br /&gt;   Case "&lt;=": signo = "MENOR O IGUAL QUE"&lt;br /&gt;   Case "&amp;": esOper = "AND"&lt;br /&gt;   Case "": esOper = "OR"&lt;br /&gt;   Case "!": esOper = "NOT"&lt;br /&gt;   Case "?": esOper = "XOR"&lt;br /&gt;   End Select&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Function Simetrical(Tree As TreeView) As String&lt;br /&gt;Dim temp As String&lt;br /&gt;If Tree.Nodes.Count = 0 Then&lt;br /&gt;   Simetrical = "NULL"&lt;br /&gt;   Exit Function&lt;br /&gt;Else&lt;br /&gt;   Simetrical = SimOrder(Tree.Nodes(1))&lt;br /&gt;End If&lt;br /&gt;End Function&lt;br /&gt;Function SimOrder(NODO As Node) As String&lt;br /&gt;If NODO.Children = 0 Then&lt;br /&gt;   SimOrder = " " &amp; NODO.Text &amp;amp; " "&lt;br /&gt;Else&lt;br /&gt;   If NODO.Children = 2 Then&lt;br /&gt;      SimOrder = "(" &amp; SimOrder(NODO.Child) &amp;amp; NODO.Text &amp; SimOrder(NODO.Child.Next) &amp;amp; ")"&lt;br /&gt;   Else&lt;br /&gt;      SimOrder = "(" &amp; NODO.Text &amp;amp; SimOrder(NODO.Child) &amp; ")"&lt;br /&gt;   End If&lt;br /&gt;End If&lt;br /&gt;End Function&lt;br /&gt;Function Solve(NODO As Node) As Double&lt;br /&gt;If NODO.Children = 0 Then&lt;br /&gt;   If IsNumeric(NODO.Text) Then&lt;br /&gt;      Solve = CDbl(NODO.Text)&lt;br /&gt;   Else&lt;br /&gt;      Solve = Variable(NODO.Text)&lt;br /&gt;   End If&lt;br /&gt;Else&lt;br /&gt;   Select Case NODO.Text&lt;br /&gt;   Case "+": Solve = Solve(NODO.Child) + Solve(NODO.Child.Next)&lt;br /&gt;   Case "-": Solve = Solve(NODO.Child) - Solve(NODO.Child.Next)&lt;br /&gt;   Case "_": Solve = -Solve(NODO.Child)&lt;br /&gt;   Case "*": Solve = Solve(NODO.Child) * Solve(NODO.Child.Next)&lt;br /&gt;   Case "/": Solve = Solve(NODO.Child) / Solve(NODO.Child.Next)&lt;br /&gt;   Case "^": Solve = Solve(NODO.Child) ^ Solve(NODO.Child.Next)&lt;br /&gt;   Case "=":&lt;br /&gt;      If Solve(NODO.Child) = Solve(NODO.Child.Next) Then&lt;br /&gt;         Solve = 1&lt;br /&gt;      Else&lt;br /&gt;         Solve = 0&lt;br /&gt;      End If&lt;br /&gt;   Case "&gt;":&lt;br /&gt;      If Solve(NODO.Child) &gt; Solve(NODO.Child.Next) Then&lt;br /&gt;         Solve = 1&lt;br /&gt;      Else&lt;br /&gt;         Solve = 0&lt;br /&gt;      End If&lt;br /&gt;   Case "&lt;":&lt;br /&gt;      If Solve(NODO.Child) &lt; Solve(NODO.Child.Next) Then&lt;br /&gt;         Solve = 1&lt;br /&gt;      Else&lt;br /&gt;         Solve = 0&lt;br /&gt;      End If&lt;br /&gt;   Case "&gt;=":&lt;br /&gt;      If Solve(NODO.Child) &gt;= Solve(NODO.Child.Next) Then&lt;br /&gt;         Solve = 1&lt;br /&gt;      Else&lt;br /&gt;         Solve = 0&lt;br /&gt;      End If&lt;br /&gt;   Case "&lt;=":&lt;br /&gt;      If Solve(NODO.Child) &lt;= Solve(NODO.Child.Next) Then&lt;br /&gt;         Solve = 1&lt;br /&gt;      Else&lt;br /&gt;         Solve = 0&lt;br /&gt;      End If&lt;br /&gt;   Case "&amp;":&lt;br /&gt;      If Solve(NODO.Child) And Solve(NODO.Child.Next) Then&lt;br /&gt;         Solve = 1&lt;br /&gt;      Else&lt;br /&gt;         Solve = 0&lt;br /&gt;      End If&lt;br /&gt;   Case "":&lt;br /&gt;      If Solve(NODO.Child) Or Solve(NODO.Child.Next) Then&lt;br /&gt;         Solve = 1&lt;br /&gt;      Else&lt;br /&gt;         Solve = 0&lt;br /&gt;      End If&lt;br /&gt;   Case "!":&lt;br /&gt;      If Solve(NODO.Child) = 0 Then&lt;br /&gt;         Solve = 1&lt;br /&gt;      Else&lt;br /&gt;         Solve = 0&lt;br /&gt;      End If&lt;br /&gt;   Case "?": 'XOR&lt;br /&gt;      If Solve(NODO.Child) Xor Solve(NODO.Child.Next) Then&lt;br /&gt;         Solve = 1&lt;br /&gt;      Else&lt;br /&gt;         Solve = 0&lt;br /&gt;      End If&lt;br /&gt;   End Select&lt;br /&gt;End If&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Function VarDefn(var As String) As Boolean&lt;br /&gt;'Averigua si una cadena corresponde con una variable ya definida&lt;br /&gt;Dim i As Integer&lt;br /&gt;For i = 0 To varList.ListCount - 1&lt;br /&gt;   If InStr(1, varList.List(i), var) &lt;&gt; 0 Then VarDefn = True: Exit Function&lt;br /&gt;Next&lt;br /&gt;VarDefn = False&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Function Variable(var As String) As Double&lt;br /&gt;'Busca en la lista de variables la definición y devuelve el valor asociado&lt;br /&gt;Dim i As Integer&lt;br /&gt;For i = 0 To varList.ListCount - 1&lt;br /&gt;   If InStr(1, varList.List(i), var) &lt;&gt; 0 Then&lt;br /&gt;      Variable = CDbl(Right(varList.List(i), Len(varList.List(i)) - InStr(1, varList.List(i), "=", vbTextCompare)))&lt;br /&gt;      Exit Function&lt;br /&gt;   End If&lt;br /&gt;Next&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Sub btnProccess_Click()&lt;br /&gt;'Preproceso de la expresión&lt;br /&gt;'Construir el arbol de expresión&lt;br /&gt;If txtPharse.Text &lt;&gt; "" Then Tree.Nodes.Clear: Arbol2 txtPharse.Text, Tree&lt;br /&gt;'Revisa el arbol:&lt;br /&gt;Dim i As Integer&lt;br /&gt;For i = 1 To Tree.Nodes.Count&lt;br /&gt;Tree.Nodes(i).Expanded = True 'Expande todos los nodos para hacerlos visibles&lt;br /&gt;Tree.Nodes(i).Text = Trim(Tree.Nodes(i).Text) 'Elimina los espacios antes y despues de la cadena&lt;br /&gt;'Si un nodo contiene texto no numérico, no es operador ni variable definida, entonces:&lt;br /&gt;If Not IsNumeric(Tree.Nodes(i).Text) And Not esOper(Tree.Nodes(i).Text) And Not VarDefn(Tree.Nodes(i).Text) Then&lt;br /&gt;'Define la variable con el valor por defecto 0.0&lt;br /&gt;varList.AddItem Tree.Nodes(i).Text &amp; " = 0.0"&lt;br /&gt;End If&lt;br /&gt;Next&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub btnSolve_Click()&lt;br /&gt;'Muestra la expresión que fue reconocida y la solución de la misma&lt;br /&gt;Label2.Caption = Simetrical(Tree) &amp; " = " &amp;amp; CStr(Solve(Tree.Nodes(1)))&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub txtPharse_KeyDown(KeyCode As Integer, Shift As Integer)&lt;br /&gt;'Reacciona a la tecla &lt;&lt;enter&gt;&gt;&lt;br /&gt;If KeyCode = vbKeyReturn Then btnProccess_Click&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Sub varList_DblClick()&lt;br /&gt;'Edicion de variable&lt;br /&gt;Dim str As String, igual As Integer&lt;br /&gt;str = varList.List(varList.ListIndex)&lt;br /&gt;igual = InStr(1, str, "=", vbTextCompare)&lt;br /&gt;str = Mid(str, 1, igual) &amp; " " &amp;amp; InputBox("Definir variable" &amp; vbNewLine &amp;amp; Mid(str, 1, igual), , Mid(str, igual + 1, Len(str) - igual))&lt;br /&gt;If IsNumeric(Mid(str, igual + 1, Len(str) - igual)) Then varList.List(varList.ListIndex) = str&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;---------------- fin de archivo ---------------------------&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-110800847483946029?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/110800847483946029/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=110800847483946029' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/110800847483946029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/110800847483946029'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/02/un-reconocedor-de-expresiones-la-brava.html' title='Un reconocedor de expresiones a la brava'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10418455.post-110676786213794501</id><published>2005-01-26T13:02:00.000-06:00</published><updated>2005-01-26T13:31:02.136-06:00</updated><title type='text'>Instalacion de Eclipse y Plug-ins</title><content type='html'>Respecto a la plataforma Eclipse, no puedo estar mas feliz, NO SE REQUIERE INSTALACION, solamente hay que colocar una copia de la carpeta en un lugar adecuado, y comenzar a trabajar.&lt;br /&gt;En cuanto a los Plug Ins, el modo de agregarlos parece confusa al principio, y tambien, por hacer caso de una recomendacion de "instalar todo", la descarga de los mismos se demoro al rededor de cinco horas. Los plug-ins de ANTRL por el contrario son de dimensiones reducidas y se descargan en aproximados 2 minutos. Todo lo anterior, refiriendose al enlace que proporciona la Universidad en el area de cafereria.&lt;br /&gt;&lt;br /&gt;Los experimentos iniciales han resultado exitosos, y los resultados han sido positivos. La mayor de las dificultades estiba en el hecho de tener que adaptarse a una nueva interfase, familiarizarse con los nuevos comandos, tarea que realmente resulta de poco esfuerzo.&lt;br /&gt;&lt;br /&gt;En lo referente a JavaDoc, esto es lo que resulta mas confuso, por tratarse de comandos poco comunes, no les encuentro parecido con HTML , RTF u otros tipos de texto autoformateado, por lo que se me dificulta un poco mas la creacion de los comentarios.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10418455-110676786213794501?l=tecnopatico.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tecnopatico.blogspot.com/feeds/110676786213794501/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10418455&amp;postID=110676786213794501' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/110676786213794501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10418455/posts/default/110676786213794501'/><link rel='alternate' type='text/html' href='http://tecnopatico.blogspot.com/2005/01/instalacion-de-eclipse-y-plug-ins.html' title='Instalacion de Eclipse y Plug-ins'/><author><name>Jahaz</name><uri>http://www.blogger.com/profile/03385223825334862767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
