Anda di halaman 1dari 14

Universidad de San Carlos de Guatemala

Facultad de Ingeniería
Organización de Lenguajes y Compiladores 1
Catedráticos:
Ing. Mario Bautista, Ing. Manuel Castillo, Ing. César Batz
Tutores académicos:
Luis Paz, José Soc, Jorge Castañeda

Proyecto 1
Analizador de copias
Objetivos:
 Que el estudiante comprenda a grandes rasgos el funcionamiento de la tabla de
símbolos.
 Que el estudiante comprenda la realización de acciones básicas en la fase de análisis
sintáctico.
 Que el estudiante comprenda el manejo básico de la tabla de símbolos.
 Que el estudiante implemente soluciones con una arquitectura cliente-servidor.
 Que el estudiante desarrolle habilidades en la creación de gramáticas libres del contexto.

Descripción de l p r o b l e m a:
Como parte del avance en la escuela de sistemas de la facultad de Ingeniería de la Universidad de
San Carlos, se pretende crear una herramienta que le permita al tutor académico el análisis del código
fuente de los diferentes proyectos desarrollados por los estudiantes, esto buscando una agilización y
eficiencia en el proceso de búsqueda de copias, dado a que existen clases con una población mayor o
igual a 70 estudiantes.

D e s c r i p c i ón de la s o l u c i ó n:
Se pretende crear un plan piloto para el curso de Org. de Lenguajes y Compiladores 1, utilizando un
analizador de archivos java basado en el método Term Frecuency o frecuencia de aparición de un término,
el cual es la suma de todas las ocurrencias o el número de veces que aparece un término en un documento.

Por lo que es necesario llevar a cabo el análisis y posteriormente crear un reporte por cada análisis
realizado, esto servirá al tutor para demostrar la transparencia en el proceso. Por cuestiones de tiempo y
fin del curso, el plan piloto hará la comparación únicamente entre 2 proyectos a la vez.

Existirá una aplicación de usuario en java a la cual accederá el tutor académico, subirá 2 proyectos para
compararlos. La aplicación enviar la información por sockets al servidor de análisis de java. El servidor de
análisis realizará el proceso de detección de frecuencia de términos la cual devolverá como resultado un
texto en formato json, con el resumen del análisis.

Al recibir el resultado en la aplicación cliente, donde se subieron los proyectos, el tutor académico podrá
realizar un reporte de los datos del análisis y generar una vista html para entrega al encargado de la
unidad de la escuela.
Servidor de Análisis:
Se utilizará Java con flex y cup.

En esta aplicación se analizará código java y tendrá una consola donde reportara errores o eventos del
servidor de análisis, el lenguaje java a analizar contara con las siguientes instrucciones y la sintaxis ya
conocidas de este lenguaje.

1. Imports
Descripción Ejemplo
Importar Clases Java o librerías Import java.util.* ;
Import analsis.AST ;

Tabla No. 1
2. Clases
Descripción Ejemplo
Clases java simples. Visibilidad class clase_ejemplo{
//Sentencias
}

Tabla No. 2
3. Métodos y Funciones
Descripción Ejemplo
Declaración de métodos y funciones. Visibilidad tipo método_funcion(con_o_sin_parametros){
//sentencias
}
Tabla No. 3
4. Declaración de variables
Descripción Ejemplo
Declaración de variables. Visibilidad tipo Lista_de_variables ;

Tabla No. 4
5. Asignaciones
Descripción Ejemplo
La asignación puede ser al momento de Visibilidad tipo Lista_de_variables = expresión ;
declar o después de declarar. O
Lista_de_variables = expresión ;
Tabla No. 5
6. Tipos de datos:
Descripción Ejemplo
Los tipos de datos a utilizar son. Enteros = int
Booleanos = boolean
Cadenas = String
Caracter = char
Decimales = double
Objectos = Object
Donde los objetos son instancias de otras clases.
Tabla No. 6
7. Sentencias de control.
Descripción Ejemplo
Las sentencias de control son son. If ,if else, for, while, do while, switch.

Tabla No. 7
8. Operadores aritméticos
Descripción Ejemplo
Las operadores posibles son Relacionales, lógicos, incremento/decremento,
agrupación.
Tabla No. 8
9. Comentarios
Descripción Ejemplo
Los dos tipos de comentarios, simples y //este es un comentario siemple.
multilinea
/*este
Es multi
linea */
Tabla No. 9
10. Constructor
Descripción Ejemplo
La clase pude tener su contructor donde se Public Nombre_clase(Con_o_Sin_Parametros ){
inicialicen las variables //setencias
}
Tabla No. 10
11. Visibilidad de variables y clases:
Descripción Ejemplo
La visibilidad de las clases y variables. Private, public, protected, final

Tabla No. 11
12. Sentencias de salida.

Descripción Ejemplo
Las dos sentencias de flujo que pueden Break , Return
vernir dentro de un while, for, switch, y
funciones.
Tabla No. 12
13. Llamadas a funciones.
Descripción Ejemplo
Llamadas a métodos y funciones com: Saludar(con_parametros);
Parse(sin_parametros);
Tabla No. 13
NOTA: Se omitirán vectores y matrices, solamente variables sencillas.
Ejemplo Final:
import java.util.*; // comentario simple

import java.sql.base1; // Statement,

public class ejemplo_final


{
private String value; // "T2W 1W5"

private boolean valid;

/** * Comentariooo * multilinea*/

public boolean parse() {


Objeto nuevo_objeto = new Objeto; Saludar("hola
"+(1*3));

public String Saludar(String val) { If(val!=""){


return val; // "T2W 1W5"}
}
}
}

Especificaciones del análisis a realizar en el servidor:


1. Se analizarán los archivos de cada proyecto buscando:
 Variables del mismo tipo y nombre repetidos
 Clases del mismo nombre.
 Métodos y funciones con el mismo nombre, tipo y cantidad de parámetros
 Comparación de comentarios línea y multilínea

2. Se generara un json de respuesta que será interpretado en la aplicación de usuario y en este se


incluirán:

Score
Clases repetidas entre proyectos
o Nombre Clase
Variables repetidas entre proyectos
o Nombre variable
o Tipo variable
o Función padre

Métodos / Funciones repetidos entre proyectos


o Nombre
o Tipo
o Parámetros (nombre y tipo)
Comentarios repetidos entre proyectos
o Texto de comentario

3. El Score resultante se calculara de la siguiente forma:


Comentarios repetidos/ (Sumatoria comentarios proyecto 1 y 2 ) )*0.25 +
Variables repetidas / (sumatoria variables proyecto 1 y 2) * 0.25 +
Métodos repetidos / (sumatoria métodos proyecto 1 y 2)* 0.25+
Clases repetidas / (sumatoria clases en proyecto 1 y 2)* 0.25

Criterios para la repitencia:


Clase repetida
Mismo identificador
Mismos métodos/funciones (por identificador)

Variable repetida
Mismo identificador y tipo

Método/Función repetida
Mismo nombre
Mismos parámetros (variables, nombre y tipo)
Misma cantidad de líneas

Comentario repetido
Mismo texto

Archivo json resultante:


Después de finalizar el análisis, al encontrar clases, variables, comentarios, métodos o funciones iguales se
debe devolver el archivo json a con la siguiente estructura.

{ score: [ 0.75 ],
Clases:[ { Nombre: "clase1", Nombre:"clase2"} ],
Variables:[ { Nombre: "var1", Tipo:"int", función: "funcion1", Clase: "clase1"}, {Nombre:
"var2", Tipo:"int",funcion: "funcion2", Clase: "clase2"} ],
Metodos:[ {Nombre: "metodo1",Tipo:"void" , Paremetros: "2"}, {Nombre: "metodo2",Tipo:"Sting",
Parametros:"0"} ],

Comentarios:[{texto: "hola es un comentario"},{ texto: "otro coment"}]


}

Aplicación de Usuario:
Aplicación (aplicación de escritorio) del sistema para uso exclusivo del tutor académico para él envió de
análisis de proyectos(carpeta con variaos archivos .java) y generación de reportes. Debe de realizarse en java
y comunicarse con el servidor de análisis utilizando sockets. La aplicación deberá contar con un área donde
se podrá crear, editar, etc. Reportes, estos reportes deben ser escritos utilizando lenguaje HTML y
CPReport (este lenguaje se detalla más adelante).
El lenguaje HTML deberá reconocer como mínimo las siguientes etiquetas:
 html
 head
 body
 h1, h2, etc.
 title
 table
 th
 td
 tr
 div
 p
 br
 hr

Nota: Algunas etiquetas pueden venir dentro de otras, por ejemplo: la etiqueta td (Columna o celda de
una tabla) solo puede venir dentro de una etiqueta tr (Fila de una tabla). Si por ejemplo una etiqueta
html está dentro de otra, se deberá reportar error sintáctico.
Dentro de cada una de las etiquetas anteriores se podrán colocar los siguientes atributos:
 color
color del fondo de una etiqueta
Ejemplo: <div color=”azul”> </div>
Posibles valores: rojo, amarillo, azul, verde, gris, anaranjado, morado.
 textcolor
Color del texto que está dentro de la etiqueta
Ejemplo: <h1 textcolor=”rojo”>
Posibles valores: rojo, amarillo, azul, verde, gris, anaranjado, morado.
 align
alineación de los componentes que están dentro de la etiqueta
Ejemplo: <h1 align=”centrado”>
Posibles valores: izquierda, derecha y centrado
 font
Fuente del texto que está dentro de la etiqueta
Ejemplo: <h2 font=”Verdana”> </h2>
Posibles valores: Todos los que soporta html

Nota: Una etiqueta podrá tener ninguno o varios atributos

Para poder incrustar código CPReport se deberá de colocar $$ al inicio y al final esto para que no haya
confusión con el código HTML.

Ejemplo:
<html>
<head>
<title>Proyecto1<title>
</head>
<body>
<h1 textcolor=”azul” align=”centrado”> Score</h1>
<br>
<p color=”amarillo”>
El score resultante es: $$ Print(RESULT.score); $$
</p>
</body>
</html>

Lenguaje de CPReport:
El lenguaje de Reportes es un lenguaje utilizado para la manipulación de los resultados obtenidos en
el análisis y poder así generar salidas en consola y un reporte en lenguaje HTML con los datos
del análisis, el resultado será visualizado en un navegador web luego de la compilación de CPReport
y de que no existan errores léxicos, sintácticos y/o semánticos.

Este proceso se realiza en la aplicación de usuario luego de recibir los resultados de análisis de los
proyectos enviados.

Variables Globales Predeterminadas


ARRAY DE RESULTADO
El json recibido de la aplicación de análisis deberá de convertirse en un objeto al cual esta variable
hará referencia, contendrá todos los atributos analizados de los archivos. Su identificador será
RESULT.

Atributos

o Score: double

Double var = RESULT.score;

o VARIABLES
String var = RESULT.variables[0].nombre;
String var = RESULT.variables;
String var = RESULT.variables.nombre;
String var = RESULT.variables.cantidad;

o METODOS->array
String var = RESULT.metodos[0].nombre;
String var = RESULT.metodos;
String var = RESULT.metodos.nombre;
String var = RESULT.metodos.cantidad;

o CLASES->array
String var = RESULT.clases[0].nombre;
String var = RESULT.clases;
String var = RESULT.clases.nombre;
String var = RESULT.clases.cantidad;
Ejemplo:
$$ String Var1 = "El resultado es igual a " + RESULT.Score; $$

Definición
El lenguaje CPReport permitirá tener su propio entorno de programación, en donde se podrán manipular
las variables del objeto RESULT, y reportar acciones en consola.

1. Identificadores y Variables
Consta de uno o más caracteres
El primer carácter debe ser una letra o el carácter subrayado (_), mientras que, todos los demás pueden
ser letras, dígitos o el carácter subrayado (_). Las letras pueden ser minúsculas o mayúsculas.

2. Tipos de Dato

Los tipos de datos son los siguientes


Tipo Entrada
Entero Número entero: 5,45,948, etc.
Carácter Caracter: ‘3’, ‘a’, ‘ ’, etc.
Decimal Número flotante: 5.6, 9.3
Texto Cadena: “hola es una cadena”
Booleano Booleano: true, false,1, 0
Tabla No. 14

3. Declaración de Variables

Las variables serán declarables de la siguiente forma, las opciones dentro de corchetes son opcionales.

<nombre_del_tipo_de_dato> <nombre_de_la_variable> [ = <expresión> ];

También de la forma

<nombre_del_tipo_de_dato> <nombre_de_la_variable_1> [= <expresión_1>],


<nombre_de_la_variable_2> [= <expresión_2>],
...,
<nombre_de_la_variable_n> [= <expresión_n>];

Ejemplos
int var1;
int var1 = 5+6*5;
char m= ‘a’;
int var1=2,var2=5*6,var3;
boolean band = (x==var1)
4. Asignación

A las variables se les podrán asignar valores mediante la siguiente sintaxis:

<nombre_de_la_variable> = <expresión> ;

Ejemplo
var1 = 5+6*5;
var1=va1+2;
var4=var4*2-(2+var2);
boleano1= 5<var2;

5. Casteo automático

Los resultados de tipos para las operaciones con diferente tipo en cualquier orden son las siguientes. Para
los operandos con tipos iguales se mantiene el tipo.
Esto servirá a la hora de asignar un valor y comparar tipos a la variable a asignar.

Operación Operandos Resultado Aplicación


suma entero+decimal decimla 5+5.04
testo + entero texto “string”+5
texto+decimal texto “string”+(5/3)

resta entero – decimal Decimal 5-5.04


división entero / double Decimal 5/ 6.3.
multiplicación entero*decimal Decimal 6*5.5
módulo entero%decimal Decimal 17%5.1
Tabla No. 15

6. Tipos de operadores

Operadores Aritméticos

Operador Operación Aplicación


+ Suma 5+var2
- Resta Var3-var2
/ división Var3/var2
* multiplicación Var3*var6*5.5
% módulo 5%var
() Agrupación (5+5)*2/(8-7)
Tabla No. 16
Operadores Relacionales

Compara 2 expresiones y devuelve falso o verdadero.

Operador Aplicación
< 5.5<5*var3
> Var1>5*var2
<= 5<=5*var3
>= Var1>=5*var2
== Var2==var3
!= Var15!=var2
Tabla No. 17

Operadores Lógicos

Agruparan a operadores relacionales, el resultado será falso o verdadero.


El NOT tiene un operando y es asociativo a la derecha, el resto tiene asociatividad a la izquierda y
dos operandos.

Operación Operador Aplicación


AND && (5!=var1)&&(5<var3)
OR || (5!=var1)||(5<var3)
NOT ! !(5!=var1)
Tabla No. 18

Operadores de Incremento/Decremento

Se le aplicaran a los valores numéricos únicamente.

Operador Aplicación
++ i++;
-- Var1 = var2--;
Tabla No. 19

Operadores de Asignación

Los operadores de asignación son una forma abreviada de realizar sumas, multiplicaciones y restas de
una expresión con el valor actual de un objeto.
Estos respetaran las mismas reglas que la tabla No. 20

Operador Aplicación
+= Var1 +=var2 +2;
-= Var1 -=var2 +2;
*= Var1 *=var2 +2;
Tabla No. 20
7. Comentarios

 Multilinea
Los comentarios multilinea se escriben entre los caracteres barra-asterisco (</) y asteriscobarra (/>).

Ejemplo
</ Este es un comentario
multilinea />

 Linea
Los comentarios de una línea se escriben con los caracteres ->
Ejemplo
-> Este es un comentario de una línea

8. Función Print

La función print servirá para mostrar en la consola de programador las variables o mensajes que el tutor
desee.

La sintaxis es la siguiente.
Print (<exp>); Ejemplo:
Print((5+3-5)+2+" hola");
Print("variable1:"+var);

9. Consola de programador

Se deberá de contar con un cuadro de texto para mostrar los eventos de impresión que se realicen desde
la función print y los errores de análisis de proyectos.

10. Reporte de Errores


Se reportarán los errores léxicos, semánticos y sintácticos especificando la línea, columna, id y
descripción en una sola tabla distinguiendo el tipo.

Nota: Los lenguajes de la aplicación de usuario NO son Case sensitive,


es decir, html y HtmL significan lo mismo.

Interfaz grafica
El entorno de desarrollo es una aplicación de escritorio que proveerá al usuario final las herramientas
necesarias para escribir el código, editarlo, guardarlo, cargar código rápido previamente escrito y realizar
acciones sobre él.

Debe contar con:


 Archivo: crear, abrir, guardar, eliminar (extensión .cp)
 Cargar proyectos
 Múltiples pestañas
 Consola de salida para errores léxicos y sintácticos

Cada pestaña deberá contar con:


 Numero de cada línea del código
 Posición del cursor

Reportes:
 Reporte de errores léxicos y sintácticos en html (errores del servidor de análisis y de la aplicación
de usuario)
 Árbol del archivo Json generado en el servidor de análisis (Utilizando JTree)

Sugerencia de la interfaz gráfica

Nota: Si existen errores léxicos o sintácticos al momento de analizar los proyectos se deben
mostrar en la consola de la aplicación de análisis.
Sugerencia Aplicación de Análisis

Diagrama de Flujo de la Solución

1 2 4

Arquitectura Cliente –Servidor


1. Proyectos: (carpetas con varios archivos .java) que se cargaran a la aplicación de usuario.
2. Aplicación de usuario: Donde se podrá editar y crear reportes html con el lenguaje CPreport
y manipular los resultados del análisis.
3. Comunicación vía Sockets: La aplicación de usuario y de análisis se comunicarán por medio
de sockets.
4. Servidor de análisis: Donde se llevara a cabo el análisis de los proyectos y se devolverá el
resultado del análisis a la aplicación cliente en un formato json.
Requerimientos mínimos
Servidor de Análisis
 Creación de la estructura Json
 Análisis de: import, clases, método, funciones, declaración de variables y sentencias de
control (if, while, for)
 Errores léxicos y sintácticos

Aplicación de usuario:
 Todo el lenguaje HTML
 Lenguaje CPReport:
Acceso a la variable RESULT
Declaración de variables
Función Print
 Errores léxicos y sintácticos
 Gráfica de la estructura Json con JTree
 Cargar archivos
 Analizar proyectos

Restricciones y Consideraciones

 Se usará flex y cup en java para el análisis de cada aplicación de lo contrario NO SE TENDRÁ
DERECHO A CALIFICACIÓN.
 Copias de código totales o parciales se reportan a escuela de sistemas y se tendrá nota de 0
 Para la comunicación entre las aplicaciones se utiliza sockets.

Entregables
 Aplicaciones Java, El nombre debe tener el siguiente formato: [Compi1]Proyecto1_#carnet.JAR
 Manuales de Usuario y Técnico
 Código Fuente

Fecha de entrega y calificación


- La fecha de entrega está programada para el día viernes 23 de marzo del 2018.
- La fecha y el lugar de la calificación se darán a conocer por el auxiliar de su respectiva sección.

Anda mungkin juga menyukai