Sunday, March 12, 2006

Perfeccionando la primera entrega...

Hola que tal queridos amigos,

Es un placer como siempre, estar por acá, para charlar un rato acerca del proyecto de Compiladores I.
Como han de suponer, esta semana ha sido de mucho trabajo, particularmente en CUP. Pero gracias a Dios y a la potencia que nos brinda el IDE, Netbeans 5.0, esta tarea se nos ha facilitado enormemente.
El primer gran obstáculo al que nos enfrentamos, ya desde hace varias semanas, pero lógicamente con mas intensidad durante ésta, fueron los conflictos shift-reduce y reduce-reduce encontrados en la gramática de micro-C.
En cuanto al conflicto del “else” ambiguo, CUP lo resolvió a favor del shift en relación al “else”, por lo que aquí no hubo mayor problema.
En donde si nos encontramos con un problema un poco grande, fue en las sentencias destinadas a la declaración de variables y funciones. A continuación les mostramos las producciones correspondientes a esas sentencias:
function_def_header --> return_type identifier “(“ parameters_def “)”
function_declaration --> return_type identifier “(“ parameters_decl “)” “;”
variable_declaration --> type identifier_list “;”
return_type --> type “void”
identifier_list --> identifier identifier_list “,” identifier

Las producciones anteriores provocaban que el parser se confundiera al validar si lo que él veía en determinado momento era, ó la declaración de una variable ó la declaración o definición de una función. Por lo que, en sentencias como la definición del main, el parser creía que era la declaración de una variable, y cuando el lexer le devolvía el token “(“, mostraba un error.
Yo me imagino que esto se producía, ya que el parser, como es un analizador sintáctico de gramáticas “botton-up”, él comienza a ver los prefijos viables y como ustedes pueden apreciar existen varios prefijos viables que conducen a diferentes caminos. Pero como les digo, es una opinión muy particular.

La única solución que pudimos encontrar para acabar con este conflicto fue, redefiniendo la gramática que recién les mostramos. No sabemos si la decisión tomada fue correcta o no, pero de no haberlo hecho, creo que todavía estuviéramos tratando de arreglar esta gramática y no hubieramos avanzado en el resto del proyecto. La solución tomada fue, que el tipo de datos de retorno para las funciones, utilizado durante la declaración y la definición de éstas, fuera “INT”, “CHAR” y “void”. Y el tipo de datos para la declaración de variables se quedo tal y como estaba con “char”, “int”.

Si usted amigo lector, tiene la solución a los conflictos antes mencionados sin echar mano a las modificaciones que realice, agradecería que lo hicieran de nuestro conocimiento, sin duda les estaremos muy agradecidos.

Luego de solucionados los conflictos en la gramática, comprender la forma en que realizaba su labor el parser, no fue tarea fácil. A pesar de que ya habíamos estudiado en el curso un poco de teoría acerca de los analizadores LALR, la comprensión del parser no fue nada fácil. Para poder llegar a entender bien, la forma en que funciona el parser, tuvimos que hacer uso del buen debugger que posee Netbeans, al ejecutar nuestro analizador sintáctico sobre un texto de código de micro-C. Una vez asimilado lo anterior, la tarea correspondiente a los ítems a presentar durante esta primera entrega, fue muchísimo mas tranquila.

Muchísimo mas tranquila dentro de lo que cabe, ya que todavía no hemos finalizado; pero el panorama luce más despejado definitivamente.
Entre los ítems que nos faltan, están:
La validación de que todo programa escrito en micro-C, debe poseer una función main. El problema radica, en que, no encontramos en qué parte del código tenemos que hacer esta validación, si al final de la compilación o en el transcurso de la misma. Miramos más viable, la primera opción, ya que no podemos mostrar el mensaje de error sin haber terminado de analizar la totalidad del código fuente. Pero seguiremos pensando en la forma en que lo vamos a hacer.

Bueno, y acá finalizamos por los momentos. Pero estaremos por estos rumbos próximamente.

Que tengan un buen día!

0 Comments:

Post a Comment

<< Home