Você está na página 1de 6

Proyecto 3

Visualizacin del grafo de llamadas de programas en pseudocdigo


(ANTLR)
Grupos: mximo 2 personas
Entrega:
Enviar por correo electrnico a ferestrepoca@unal.edu.co. Se debe entregar en archivo comprimido:
1. Gramtica de ANTLR: archivo.g4
2. Cdigo fuente Java desarrollado: archivos.java (no incluir los archivos *.class)
3. README.txt: integrantes del grupo y consideraciones que consideren oportunas.
Plazo: hasta el mircoles 8 de abril de 2015 (antes de las 11:00 a.m.).
Sustentacin: mircoles 8 de abril de 2015 (en el horario de clase).

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);
}

Carrera 30 No. 45-03, FACULTAD DE INGENIERA, Edificio 453 Oficina 101,


Telefax: Conmutador: (57-1) 316 5000 Ext. 14011 Fax: 14014.
Correo electrnico: depingsi_bog@unal.edu.co / Bogot, Colombia, Sur Amrica

Las caractersticas del lenguaje son las siguientes:


Un programa escrito en UNALang (nombre.un), est compuesto por una serie de declaraciones de
variables globales seguido de una serie de declaraciones de funciones (cualquiera de estas partes
podra estar vaca).
Las declaraciones de variables son similares a lenguaje C. Un tipo de dato seguido de un
identificador, y opcionalmente una expresin de inicializacin. Pueden existir declaraciones de varias
variables del mismo tipo de dato separadas por comas (,). Al final debe haber un punto y coma
(;).
Los tipos de datos pueden ser: entero, real, vacio, cadena.
La declaracin de funciones se hacen de la misma forma que en C. Primero, el tipo de dato de
retorno de la funcin. Despus, el nombre de la funcin. A continuacin, la lista de argumentos
entre parntesis (separados por comas si hay ms de un parmetro). Por ltimo el cuerpo de la
funcin.
El cuerpo es un bloque de sentencias encerrado entre llaves ( { bloque sentencias } ).
Las sentencias pueden ser:
o Bloques de sentencias anidados.
o Declaraciones de variables.
o Condicionales si. Por ejemplo:
si expresion entonces {
bloque_si
}
si_no {
bloque_sino
}

Donde la palabra reservada si_no y el cuerpo de ste son opcionales.


Ciclos:

o
o
o
o

mientras expresion {
bloque_mientras
}
hacer {
bloque_hacer_mientras
} mientras expresion

Sentencias retornar. Por ejemplo: retornar expresion;.


Asignaciones de la forma: expresion = expresion;.
Llamados a funciones. Como sentencia independiente: fact(5);, o como parte de una
expresin: resultado = fact(5)*10;.
Comandos especiales mediante las siguientes palabras reservadas:
leer (uso: leer variable;)
escribir (uso: escribir expresion;)
borrar (no tiene argumentos, sirve para borrar la pantalla).
Carrera 30 No. 45-03, FACULTAD DE INGENIERA, Edificio 453 Oficina 101,
Telefax: Conmutador: (57-1) 316 5000 Ext. 14011 Fax: 14014.
Correo electrnico: depingsi_bog@unal.edu.co / Bogot, Colombia, Sur Amrica

Para construir las expresiones, se tienen en cuenta los siguientes operadores:


o Operador lgico unario: no. Uso: no expresion
o Operadores binarios:
Aritmticos: +, -, *, /, %
Relacionales: ==, !=, <, >, <=, >=
Lgicos: y, o. Ejemplo: expresion y expresion
La asociatividad y precedencia de operadores es igual que en lenguaje C.
Pueden existir expresiones entre parntesis.
Las funciones que se llamen desde otra funcin pueden estar declaradas previa o posteriormente, si
no es el caso, esta situacin corresponder a un error semntico.
Pueden existir cuerpos vacos (bloques sin sentencias).
Cuando un cuerpo est compuesto por una sola sentencia, las llaves que encierran esa sentencia son
opcionales.
No importan: espacios en blanco, tabulaciones, nueva lnea; siempre y cuando, se respete la
estructura del lenguaje.
Pueden existir comentarios de una lnea (// comentario sencillo) o multilnea (/* comentario
multilinea */).
Las palabras reservadas no se podrn utilizar como identificadores.
Caractersticas de los identificadores:
o Estarn compuestos por una serie de letras, dgitos y el guion bajo (_).
o Deben comenzar por una letra
o No podrn acabar con el smbolo de guion bajo, ni tener dos subrayados seguidos.
o Ejemplos de identificadores vlidos:
dato, dato_1, dato_1_a
o Ejemplos de identificadores no vlidos:
_dato, dato_, dato__1
o No se distinguir entre maysculas y minsculas.
Las variables de tipo cadena estarn compuestas por una serie de caracteres delimitados por
comillas simples, por ejemplo: Ejemplo de cadena, Ejemplo de cadena con salto de lnea \n.
Debern permitir la inclusin de la comilla simple utilizando la barra (\), as:
o Ejemplo de cadena con \ comillas\ simples.
Las comillas exteriores no se almacenarn como parte de la cadena.
Las funciones no pueden estar sobrecargadas. Se considera como un error semntico.

Carrera 30 No. 45-03, FACULTAD DE INGENIERA, Edificio 453 Oficina 101,


Telefax: Conmutador: (57-1) 316 5000 Ext. 14011 Fax: 14014.
Correo electrnico: depingsi_bog@unal.edu.co / Bogot, Colombia, Sur Amrica

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.

PARTE 2: Visualizacin de programas UNALang


La segunda parte de este proyecto consiste en crear una visualizacin de los programas escritos en UNALang.
La visualizacin se llama grafo de llamadas. Se trata de un grafo dirigido donde los nodos son cada una de las
funciones declaradas en el programa y los arcos dirigidos corresponden a los llamados a funciones. El objetivo
es construir un generador de grafos de llamadas para el lenguaje UNALang usando la gramtica diseada en
la primera parte del proyecto.
Con el fin de dar una mejor idea del resultado esperado, considere el siguiente programa escrito en UNALang
(ntese que el programa podra tener errores lgicos, de los cuales no nos preocuparemos por el momento):
entero main() {
fact();
a();
}
real fact( entero n ) {
escribir( n );
si ( n==0 ) entonces retornar 1;
retornar n * fact( n-1 );
}
vacio a() {
entero x = b();
si 3==0 entonces {
c();
d();
}
}
vacio
vacio
vacio
vacio

b()
c()
d()
e()

{
{
{
{

c(); }
b(); }
}
}

Carrera 30 No. 45-03, FACULTAD DE INGENIERA, Edificio 453 Oficina 101,


Telefax: Conmutador: (57-1) 316 5000 Ext. 14011 Fax: 14014.
Correo electrnico: depingsi_bog@unal.edu.co / Bogot, Colombia, Sur Amrica

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;
}

Carrera 30 No. 45-03, FACULTAD DE INGENIERA, Edificio 453 Oficina 101,


Telefax: Conmutador: (57-1) 316 5000 Ext. 14011 Fax: 14014.
Correo electrnico: depingsi_bog@unal.edu.co / Bogot, Colombia, Sur Amrica

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.

Carrera 30 No. 45-03, FACULTAD DE INGENIERA, Edificio 453 Oficina 101,


Telefax: Conmutador: (57-1) 316 5000 Ext. 14011 Fax: 14014.
Correo electrnico: depingsi_bog@unal.edu.co / Bogot, Colombia, Sur Amrica