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.

13 comentarios

  1. Manox buena ondax ojala pueda entender tus abstracciones ,jajajaj

  2. Que de ahuevo que estes ayudando a la comunidad que le gusta programar, cabe decir que NO PERTENEZCO a esa comunidad, jejeje, pero siempre hace huevos…

  3. el archivo baja con errores.. y no lo puedo ver…
    te lo recomiendoo..

  4. porque usas jdesktop? y no swing?… Al parecer falta en ,la estructura algun file

  5. porque usas jdesktop? y no swing?… Al parecer falta en ,la estructura algun file

  6. Como que las cosas cambian un poco, a un año de este post en el curso compiladores 2 este proyecto solo ha sido parte de una practica de laboratorio en forma individual usando c++ con entorno gráfico creado en Qt bajo el sistema operativo Linux, lo que antes fue proyecto ahora fue menos de la mitad de una practica simple sin mucha ponderacion de puntos. Ahora de primer proyecto tocara hacer un diseñador 3D…

  7. estaba leyendo todo eso q escribiste acerca de Usac y lo de la escuela de sistemas, hey yo soy carnet 2005 y llevo compi2 y archivos; pues tienes razon un poco en lo que dices, pero no en todo pues, en archivos tenemos que simular una base de datos en c y c++ en linux, y en compi nos dejaron unapractica en c y c++ del ll1 lalr. Bueno la verdad uno aprende lo que le dejan, la verdad para mi es nuevo c y c++ como lo fue java Aunque me tarde mas de un semestre en aprenderlo bien NI MODO

  8. I read some of the posts and I think it is a great site. I want to improve my principal filter Wanna good joke? Why does Santa have 3 gardens? So he can ho-ho-ho.

  9. donde esta el ejecutable o como le hago para que funcione

  10. como le hago para guardarlo en mi pc o usb

  11. solo podrias contestar lo que se te pregunta lo demas no te interesa

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: