Escolar Documentos
Profissional Documentos
Cultura Documentos
Objetivo:
Este proyecto consta de dos partes principales. La primera consiste en disear una gramtica para un
lenguaje de programacin simple (tipo pseudocdigo) llamado UNALang (con extensin *.un); con esta
gramtica se desarrollar un reconocedor de UNALang utilizando ANTLR v4. La segunda parte del proyecto
consiste en desarrollar una aplicacin real de procesamiento de este lenguaje. Dicha aplicacin busca analizar
el cdigo fuente de programas escritos en UNALang y generar una representacin visual de ste.
PARTE 1
Lenguaje UNALang
UNALang es un lenguaje de programacin simple, no orientado a objetos, que es similar a un subconjunto de
lenguaje C pero en pseudocdigo. Disear una gramtica para este lenguaje servir como un buen ejercicio
prctico para que quienes estn interesados puedan desarrollar nuevos lenguajes (ms completos).
A continuacin se presenta un ejemplo de un programa escrito en UNALang:
// Ejemplo en UNALang
entero g = 9; // variable global
entero fact(entero x) { // funcin factorial
si x==0 entonces {
retornar 1;
}
retornar x * fact(x-1);
}
o
o
o
o
mientras expresion {
bloque_mientras
}
hacer {
bloque_hacer_mientras
} mientras expresion
Reconocedor de UNALang
Una vez haya sido diseada la gramtica de UNALang, se debe utilizar ANTLR4 para generar un reconocedor
de este lenguaje. Debe realizar un manejo de errores adecuado: tipo de error (lxico, sintctico y semntico),
localizacin del error (lnea y columna), descripcin detallada.
b()
c()
d()
e()
{
{
{
{
c(); }
b(); }
}
}
El grafo de llamadas correspondiente al programa anterior es la siguiente (la salida esperada de nuestro
generador):
La ventaja de usar visualizaciones que el ojo humano puede captar el funcionamiento del programa y
posibles problemas con slo un vistazo al grafo de llamadas. Por ejemplo, el nodo e() es hurfano, lo cual
quiere decir que nadie lo llama nunca, y por lo tanto, puede ser considerado como cdigo muerto.
Posiblemente podramos deshacernos de dicho nodo. De igual forma, se puede detectar la recursin
fcilmente, mirando los ciclos existentes en el grafo, como por ejemplo: fact() fact(), y b() c() b().
Para visualizar el grafo de llamadas, necesitamos analizar los programas UNALang y generar un
archivo DOT (y posteriormente visualizarlo usando graphviz). Por ejemplo, aqu est el archivo DOT
generado en el ejemplo anterior:
digraph G {
ranksep=.25;
edge [arrowsize=.5]
node [shape=circle, fontname="Arial",
fontsize=9, fixedsize=true, height=.45];
main; fact; a; b; c; d; e;
main -> fact;
main -> a;
fact -> escribir;
fact -> fact;
a -> b;
a -> c;
a -> d;
b -> c;
c -> b;
}
Una vez haya instalado graphviz y configurado la variable de entorno PATH adecuadamente, si se desea
crear una imagen png o un archivo pdf del grafo generado (suponiendo que la salida generada en el paso
anterior se guarda en el archivo salida.dot), simplemente debemos ejecutar los siguientes comandos:
dot -Tpng salida.dot -o grafo.png
dot -Tpdf salida.dot -o grafo.pdf
Se crear la imagen grafo.png y el archivo vectorial grafo.pdf.
Recomendaciones:
Utilizar los Listeners de ANTLR4. Se simplifica la tarea de la parte 2 del proyecto enormemente.
Leer la documentacin del lenguaje DOT.
La visualizacin del grafo de llamadas puede ser mejorada para dar ms informacin al usuario. Por
ejemplo, se recomienda que el tamao de cada nodo dependa de la mtrica de nmero de lneas
(fsicas o lgicas) de cdigo del mismo (sloc y lloc). As, el nodo que representa un mtodo que
ocupa muchas lneas de cdigo ser ms grande que otro que ocupe tan slo un par de lneas de
cdigo. Use su creatividad.