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.