Mis proyectos de sistemas en la USAC parte V: Compiladores 2…

Y luego de la trabada que fue Compiladores 1, Estructuras de Datos, y Organización Computacional.  se deja venir el 6to semestre con muchas más trabadas, solo que ésta vez exponenciales… y no tanto por los cursos de sistemas, sino tambien por Investigación de Operaciones… un curso en donde el que sepa llevar la subjetividad de Vinicio Monzón, el ingeniero que dá el curso, hasta en su auxiliar se puede convertir (sino vean a Patricio AKA César Rojas), pero bueno, ya mucho hablar de basura, y vamos a lo que me incumbe, publicar los proyectos del que, para muchos, es el curso más difícil de la carrera (aunque a mi me haya costado mas la investigacion de operaciones), no tanto por su contenido teórico, sino por la extensión y dificultad de sus proyectos de programación. Me refiero a Organización de Lenguajes y Compiladores 2.   Se realizaron 2 proyectos en este curso cuando lo lleve ya hace algunos años, los cuales son:

1. VMW:

Un proyecto de supuesta máquina virtual, el nombre haciendo alución al VMWare y a los autos BMW., que consiste en un generador de analizadores léxicos, junto con un generador de analizadores LALR que además debe evaluar código embebido, en un lenguaje parecido a php, el cual a la vez teníamos que interpretar con un parser hecho por nosotros mismos también, todo esto obviamente en el lenguaje JAVA con el cual la escuela de sistemas se matrimonió desde el 2006… la verdad considero que fue el proyecto más trabajoso de la carrera (dado que el que más me costó fue el 2do de estructuras, el de los grafos), y eso que fue trabajado en parejas (con mr. chucho, el cual se dedico solamente al módulo de generación de analizadores léxicos, y la GUI, de los cuales el codigo no esta disponible por sus licencias restrictivas).  Bueno, el proyecto fue publicado previamente en este blog, y está mejor descrito en el siguiente URL, desde donde se puede bajar tambien:

https://objektblog.wordpress.com/2007/07/10/proyecto-generador-de-analizadores-lalr-en-java/

2.  EvilGCC

Supuestamente las siglas significaban Erik’s Visual Intermediate Language Generator and Compiler Collection (todavia me acuerdo), y consistia en un compilador básico de 3 lenguajes de programación (Java, C++, y Pascal) a código de 3 direcciones, aunque en realidad soportaba un subconjunto muy reducido de las construcciones de éstos.  También hecho en Java bajo NetBeans.  De lo que más me acuerdo es lo asustado que estaba respecto a que también debíamos implementar un optimizador del código de 3 direcciones generado, y que al final, era la parte más facil del proyecto, haciendo verdadero el dicho que dice El que se ahueva pierda…  El código esta aquí

svn checkout http://proyectos-kreig-usac.googlecode.com/svn/trunk/java/COMPI2-PROY2-evilgcc/

Bueno, este fue el curso por los que muchos compañeros se han ido de la carrera, otros han intentado olvidar en el alcohol los traumas psicológicos que le ocasionó tanta gramática…  La verdad el mayor problema que vi yo fue el maldito JLex y Cup… habiendo tantos generadores de analizadores… por qué teniamos que usar lo peor?

PD. Para poder bajarlos, deben instalar el cliente subversion de consola en gnu/linux y ya instalado ejecutar el comando dado en el directorio donde se vaya a bajar. Tambien recomiendo usar el TortoiseSVN si van a bajarlos en Windows

Proyecto, Generador de Analizadores LALR en Java

Bueno señores, a continuación, un post aburridon y geek como cosa rara, pero estoy seguro que le puede servir a muchos estudiantes de Sistemas que van a llevar algun curso de Compiladores. Aqui publico el código fuente de uno de los más grandes y costosos proyectos que me ha tocado hacer en la carrera, un generador de analizadores sintácticos LALR. Este fue realizado para el laboratorio del curso Organización de lenguajes y Compiladores 2, y fue desarrollado en un mes aproximadamente. El proyecto fue hecho en parejas, complicándome yo mismo al elegir la parte más difícil (perdón pero la mejor manera de simplificarme la vida es complicándomela jaja) lo cual consistía en la de la creación de la tabla LR usando el famoso método LALR del famoso libro del dragón, así como también la interpretación del lenguaje de las acciones semánticas, si no entienden algo de lo que a continuación voy a escribir, por favor, ganen compiladores 1 y/o léanse (y entiendanlo que es lo mas difícil) el libro del dragon (Compilers, Principles, Techniques, and Tools. 1986. Aho, Sethi, Ullman ) del capitulo 1 hasta el capitulo 6 jeje.

El proyecto consiste en un compilador de una gramática en formato similar a los archivos de entrada de CUP, el lo compila hacia un paquete .lalr dado, el cual es un archivo binario que contiene toda la información necesaria (tal como la tablas LR(1) de goto y accion, tokens, y acciones semánticas) para poder interpretar cualquier fuente que está descrito con esa gramática, ejecutando las acciones dadas en cada producción.

Para ponerlo mas sencillo vean el sig. ejemplo:

– Tenemos un archivo de gramática para una calculadora con lo siguiente:
/**Definimos terminales y no terminales*/
terminal mas, por, num;

no terminal Inicio, S, E;

/**Definimos la gramática*/
S ::= E:res {:echo $res;:}

E ::= E + E {: RESULT = $e1 + $e2;:}
E ::= E:e1 * E:e2 {: RESULT = $e1 * $e2;:}
E ::= num:n {: RESULT = $n; :}
E ::= apar E:e1 cpar{: RESULT = $e1; :}
– Tenemos tambien un archivo de entrada que cumple con la gramatica anterior con lo siguiente:
1*2+(35*20)
NOTA: posiblemente las entradas dadas anteriormente necesitarán algunas modificaciones para que se puedan ejecutar, ya que no recuerdo muy bien la especificación del lenguaje, y esto lo escribí en base a lo que me recuerdo jeje, además que obvie las partes donde se definen las expresiones regulares y la parte de las funciones definidas por el usuario para su uso en las acciones.

Lo primero que se debe hacer es generar el paquete de la gramática escrita, luego con el paquete ya compilado, se analiza el archivo de entrada que cumpla con la gramatica especificada, e inmediatamente ejecutará las acciones asociadas segun vaya parseando.

El lenguaje que se definió para las acciones semánticas es un subconjunto muy reducido del lenguaje PHP, aceptando expresiones aritméticas y booleanas básicas, sentencias de control if y while, además de funciones. sin embargo, debido al poco tiempo dado para el desarrollo del proyecto, quiza algunas características de la interpretación en PHP no funcionen muy bien (por ejemplo, la verificación de tipos), por lo que estan en toda libertad de modificar el código, si lo logran entender jaja.

La parte del generador léxico se las debo, ya que como el proyecto fue desarrollado en parejas, esta parte le tocó al compañero Chucho, del cual no tengo autorización de publicar su código. Sin embargo esta parte la pueden desarrollar fácilmente al utilizar clases de tipo Tokenizer o incluso métodos de la clase String de java.

Por cierto, el proyecto fue desarrollado en el lenguaje Java bajo el JDK 1.5, se utilizó como herramientas JLex y Cup (aunque a mi parecer hubiera salido más facil con ANTLR, pero las reglas son las reglas), además de desarrollarse en NetBeans 5.5. Si tienen alguna duda o problema con la compilacion, lean primero el javadoc del proyecto, revisen el código fuente, y si no pues, posteen aqui.

El proyecto lo pueden acceder desde esta direccion

O si usan subversion con un simple checkout

svn checkout http://proyectos-kreig-usac.googlecode.com/svn/trunk/java/COMPI2-proy1-vmw/  vmw

Recuerden que están libres de modificarlo y hacer lo que les permita la GPL, mediante me coloquen en los créditos jajaja.