Vous êtes sur la page 1sur 22

Segundo PROYECTO

UNIVERSIDAD DE SAN C ARLOS D E GUATEMALA







O R G A N I Z A C I N D E L E N G U A J E S Y C O M P I L A D O R E S 1
Secciones A, B y C






Primer Semestre 2014



1 OB JE T I VO S


1 . 1 O B JE T I V O S G E N ER A L E S

Que el estudiante aplique los conocimientos aprendidos en el curso de Compiladores 1.
Que el estudiante implemente las fases de un compilador en el anlisis lxico y anlisis
sintctico.



1 . 2 O B JE T I V O S E S P E C F I C O S

Aplicar el concepto de compiladores como alternativa de solucin de problemas.
Que el estudiante realice una aplicacin interactiva que trabaje conjuntamente con el
analizador.
Que el estudiante sea capaz de crear gramticas y programar las acciones correspondientes para dar
solucin a un problema.


2 D E S C R I P C I N D E L PR O B L E MA

La empresa Royal S.A, posee una gran cantidad de empleados y cada uno maneja
informacin bastante confidencial. Para comunicarse entre ellos la empresa Royal S.A
utiliza actualmente un sistema de correos electrnicos, pero ha tenido diversas fallas con el
control del envo y recepcin de mensajes, as como que no estn seguros que la
informacin viaje segura, o que el proveedor actual de correo electrnico pueda tener
acceso a la informacin, as mismo las bsquedas sobre los mensajes enviados por correo
electrnico no se pueden hacer sobre todas las cuentas registradas.


Debido a la creciente demanda de la empresa Royal S.A. y sus polticas de seguridad, ha
propuesto desarrollar un sistema de mensajera exclusivo de la empresa que funcionara
con clientes en C++ y un servidor programado en Java. El sistema tendr las opciones de
crear una nueva cuenta, poder acceder a la aplicacin con un login, enviar mensajes, recibir
mensajes, adems que todo esto se har a travs protocolo de comunicacin exclusivo de
la empresa para asegurar la integridad de la informacin.


Antes de implementar la solucin, se ha solicitado realizar un conjunto de pruebas de
estrs, para lo cual se desarrollara una aplicacin de escritorio programable, que ser
capaz de enviar varios mensajes de forma concurrente al servidor, con el objetivo de
simular la gran demanda que tendr la aplicacin en un futuro y su buen funcionamiento.
Luego este programa ser usado para campaas de mercadeo masivas.


As mismo el servidor de mensajes guardara cada menaje enviado, para luego hacer
bsquedas sobre los datos, y poder dar el seguimiento adecuado a un cliente que ha sido
atendido por varios trabajadores de la empresa.
Diseo de la solucin
















































































































Socket Client





Cliente (C++)


Socket Client





Cliente (C++)
Socket Client
Servidor de mensajes
(JAVA) Server Soket













Programa para pruebas de estrs,
y marketing
C++

Servidor de mensajes
Server Socket (C++)
Aplicacin Cliente



Tendr las siguientes funcionalidades:
Crear cuenta nueva.
Login
Envo y recepcin de mensajes.
Agregar amigo.
Contestar solicitud de amigo.
Obtener lista de amigos.
Logout
Consola de programador.



Creacin de cuenta nueva:
Un usuario podr solicitar una cuenta nueva de mensajera, para crear una nueva cuenta solo
ser necesario enviar el usuario y el password de la nueva cuenta segn el siguiente formato
de cdigo:

(cuenta){
(usuario){
MiUsuario

}
(password){
paSS123

}

}

Antes de enviar a crear la cuenta se debe verificar que el password contenga al menos
una letra mayscula y un nmero.


El servidor responder de la siguiente forma:


(cuenta){
(usuario){
MiUsuario

}
(resulatado){
OK
}


}

Si la creacin de la cuenta diera un error porque la cuenta ya existe el servidor responder:
(cuenta){
(usuario){
MiUsuario

}
(resulatado){
(Error){

La cuenta ya existe.

}

}

}

La aplicacin debe mostrar el error.
Login
Un usuario con cuenta creada, entrar a la aplicacin para poder ver sus contactos, y enviar o
recibir mensajes. Para poder entrar a la aplicacin se utilizara el siguiente protocolo, para
comunicarse con el servidor de mensajes:

(login){

(usuario){
MiUsuario
}
(password){
paSS123

}

}

El servidor responder el mensaje de Login de la siguiente forma:
(login){

(usuario){
MiUsuario
}


(inicio){

OK

}

}

Si la respuesta fuera porque los datos de contrasea o usuario son incorrectos, el servidor
responder de la siguiente forma:
(login){
(usuario){
MiUsuario

}
(inicio){
(error){

Usuario o password incorrecto.

}

}

}

La aplicacin debe mostrar el error.



Envi de mensajes:


El envio de mensajes se realizara bajo el siguiente protocolo:


(mensaje){
(emisor){
MiUsuario

}
(receptor){
(cuenta) Usuario1
(cuenta) Usuario2

(cuenta) Usuario3

}

(fecha){

19/12/2013 12:00:00

}
(texto){
Hola mundo!

}

}



Dentro del texto se utilizaran los siguientes caracteres de escape, para reconocer todo
tipo de cadena de entrada:
Carcter Carcter de escape
{ &llavea
} &llaveC
& &amp
( &para
) &parC

El mensaje debe ser mostrado al usuario con los caracteres correctos, en vez de ver los
caracteres de escape en pantalla.


Cuando se envan los mensajes el servidor repondr de la siguiente forma, si todos los
destinatarios existen:
(mensaje){
enviado
}


Si alguna de las cuentas ingresadas no existen, el servidor responder de la siguiente
forma:
(mensaje){
(error){
(cuenta){
Usuario2

}
(cuenta){
Usuario3

}


}
}


La aplicacin debe mostrar a los destinatarios a los cuales el mensaje no llego porque no
existen.

Recepcin de mensajes:


El servidor de mensajera una vez reciba el mensaje enviado, enviara el mensaje al usuario
correspondiente, siempre y cuando este en lnea. Si el receptor no se encuentra en lnea
este se ir a una lista de pendientes en el servidor de mensajes y cuando el usuario se
conecte el mensaje ser enviado.


El mensaje llegara en el siguiente formato:
(mensaje){
(emisor){
MiUsuario

}

(fecha){

19/12/2013 12:00:00

} (texto){
Hola mundo!

}

}

Agregar amigo:


Un usuario podr agregar a otro a su lista de contactos de siguiente forma:


(agregar){
(emisor){
MiUsuario

}

(receptor){

(cuenta) Usuario1
(cuenta) Usuario2
(cuenta) Usuario3
}




}






Una vez enviadas las solicitudes este deber esperar a que el otro usuario la acepte para
que pueda ver al usuario en su lista de contactos. Al agregar un amigo ambos se tendrn en
sus respectivas listas de amigos.


El servidor responder de la siguiente forma si todas las cuentas existen:

(agregar){
enviado
}


Si alguna de las cuentas ingresadas no existen, el servidor responder de la siguiente
forma (pero de igual forma enviara la solicitud a las cuentas que si existan):
(agregar){
(error){
(cuenta){
Usuario2

}
(cuenta){
Usuario3

}


}
}



Aceptar Amigo:


Al enviar una solicitud de amistad el servidor enviara automtica la solicitud al remitente, si
este no se encuentra conectado se ir a una lista de pendientes, y la enviara cuando este
conecte.


Al usuario que se agregado como amigo, se le mostrara un mensaje con el siguiente texto:
El usuario MiUsuario quiere ser tu amigo, lo aceptas?
SI NO


El servidor enviara la peticin de amistad de la siguiente forma:


(peticion){


(emisor){

MiUsuario

}
(receptor){
(cuenta) Usuario1

}
}
Dependiendo de la respuesta del usuario, responder al servidor de menajes de las
siguientes formas:



(aceptar){
(emisor){
Usuario1

}
(receptor){
(cuenta)MiUsuario

}
(respuesta){
(si)
}




}

Si la respuesta es negativa:


(aceptar){

(emisor){
Usuario1
}

(receptor){
(cuenta)MiUsuario
}
(respuesta){
(no)
}

}

Segn sea el caso si acepta la peticin o no.



Obtener lista de amigos
Para obtener la lista de amigos de un usuario este la podr solicitar de la siguiente forma:
(lista){
(usuario){
MiUsuario
}
}
El servidor de mensajes repondr con una lista de los amigos del emisor, en el siguiente
formato:
(lista){



}


(usuario){
Usuario1
(usuario){


}


Usuario2


}



Logout:
Cerrar la conexin con el servidor enviara el siguiente mensaje al servidor de mensajera
para cerrar el socket:


(logout){

(usuario){
MiUsuario
}

}


Este mensaje no tiene respuesta.

Consola de programador:



No es obligatorio tener una interfaz grfica creada, pero si una consola de programador, para
probar el protocolo de envi de mensajes. En la consola se pondrn ingresar los cdigos
anteriores y ver la respuesta de cada uno de ellos, se pueden hacer uso de mensajes de alerta
para dar los mensajes de respuesta del servidor.




Servidor de mensajera

El servidor de mensajera tendr disponibles las siguientes operaciones:
Crear Cuenta.
Login
Enviar mensaje.
Enviar solicitud de amistad
Aceptar solicitud de amistad
Enviar lista de amigos

Crear cuenta:
Al crear una cuenta desde en un cliente, el servidor recibir el siguiente mensaje:

(cuenta){
(usuario){
MiUsuario

}
(password){
paSS123

}

}

Dicha informacin la almacenara en un archivo de texto con el siguiente nombre
CUENTAS.ROY siguiente estructura:

<cuenta>(

usuario= MiUsuario;

password = paSS123;

)

<cuenta>(

usuario= Usuario1;

password = paS456;

)

El servidor debe buscar primero si la cuenta no existe dentro del archivo para poder crearla.
El servidor responder al dispositivo si la cuenta se cre o no en el formato explicado
anteriormente.


Login
El servidor recibir el siguiente mensaje de un cliente que desea iniciar sesin:

(login){

(usuario){
MiUsuario
}

(password){

paSS123

}

}

El servidor deber buscar en el archivo CUENTAS.ROY, si los datos son validos y responder al
cliente en el formato en el formato explicado anteriormente.




Envi de mensajes:


El servidor recibir el siguiente mensaje cuando un cliente envie un mensaje:


(mensaje){
(emisor){
MiUsuario

}
(receptor){
(cuenta) Usuario1
(cuenta) Usuario2
(cuenta) Usuario3
}

(texto){

Hola mundo!

}

}

Al momento de recibir del mensaje si el usuario est activo enviara el mensaje
automticamente de lo contrario se ir a una cola de pendientes. Y cuando este inicie
sesin enviara el mensaje.


Una vez el servidor reciba el mensaje tambin lo almacenara en el archivo MENSAJES.ROY,
para dejar constancia que el mensaje fue recibido por el servidor y enviado a los destinarios
correctos. La forma en que se almacenara la informacin en el archivo ser la siguiente:


<mensaje>(

emisor= MiUsuario;
receptor = Usuario1;
receptor = Usuario2;
receptor = Usuario3;
fecha=19/12/2013 12:00:00;

<contenido>(

Hola mundo!

)

)

<mensaje>(

emisor= MiUsuario; receptor
= Usuario1;
fecha=19/12/2013 12:00:00;
<contenido>(

La empresa M&ampC, no posee buena liquedez &parANo
compres acciones&parC.

)
)

Enviar solicitud de amistad:
Cuando el servidor reciba de un cliente una solicitud de amistad lo har de la siguiente forma:

(agregar){
(emisor){
MiUsuario

}
(receptor){
(cuenta) Usuario1

(cuenta) Usuario2
(cuenta) Usuario3
}

}

Si los usuarios no se encuentran conectados la solicitud se ir a una Cola de pendientes, y
hasta que el usuario inicie sesin ser enviada la solicitud, la solicitud se enva al receptor en
el formato explicado anteriormente.

Aceptar solicitud de amistad:


Cuando un cliente, acepta una solicitud de amistad el servidor recibir el siguiente
mensaje:


(aceptar){
(emisor){
Usuario1

}
(receptor){
(cuenta)MiUsuario

}
(respuesta){
(si)
}
}

Si la respuesta es positiva se almacenara la informacin en el archivo CONTACTOS.ROY,
con la siguiente informacin :


<contactos>(
<cuenta>MiUsuario
<contacto>Usuario1
<contacto>Usuario2
)
<contactos>(
<cuenta>Usuario1
<contacto>MiUsuario
)
<contactos>(
<cuenta>Usuario2
<contacto>MiUsuario
)


Tomar en cuenta que cuando se acepta una solicitud de amistad, los usuarios se agregan
simultneamente a sus respectivas listas.
Enviar lista de amigos:


El servidor de mensajera recibir un mensaje como el siguiente de un cliente:

(lista){
(usuario){
MiUsuario
}
}

Luego el servidor buscara en el archivo: CONTACTOS.ROY, la lista de amigos del contacto. Y la
retornara en el formato explicado anteriormente.




Programa para pruebas de estrs, y
marketing

Sera una aplicacin de escritorio, con un lenguaje de programacin especfico para enviar
mensajes masivos a los remitentes.

Comentarios:
Tipo Ejemplo
Varias lneas /*Comentario
De varias lneas
*/
Una lnea //comentario de una lnea


Tipos de variables:
Se podrn tener nicamente dos tipos de variables numricas enteras, cadenas de texto, y
variable booleanas, para instanciarlas se podr hacer de la siguiente forma:




Tipo Ejemplo
Cadena Correo1,correo2 es cadena;
Mensaje 3 es cadena;
Entera Contador1 es entero;
Contador2, contador3 es entero;
Bool Bandera es Bool;


Asignacion:
Sirve para introducir una asignacin de variable, primero viene el valor y luego la variable a
la que se asignara. Ejemplo:

"MiUsuario " := Correo1;

3+5 * (4-3) := Contador1,contador, numero;

true := bandera1;

false := bandera2,bandera3;

Colas:
Solo sern de tipo cadena, y funcionaran como una cola de envio de mensajes, tienen las
operaciones ingresar, obtener, vacia ejemplo:

mensajes es cola;
mensajes.ingresar(Correo1);
mensajes.obtener() := correo2;
mensajes.vacia():= bandera; //devuelve verdadero si la cola esta vaca.

Listas:
Se podrn declarar listas siempre sern de tipo cadena, y podrn ser accedidas por un ndice:
Mensajes es lista;
Mensajes.tamao() := correo1; //retorna el tamao de la lista

Mensajes.obtener(1) :=correo2;

Operadores aritmticos:
Se tendrn disponibles nicamente los operadores de suma, resta, multiplicacin y divisin, el
operador suma podr concatenar cadenas, o sumar nmeros. Si una variable es cadena y otra
numero el valor ser de tipo cadena.

Operador Precedencia
() 2
X 1
/ 1
+ 0
- 0


Las operaciones que retornen un valor decimal por el operador de divisin sern truncadas en
sus decimales y pasadas a enteros.

Operadores lgicos:
Sern validos dentro de un ciclo while, los nicos validos sern:

> Mayor que
< Menor que
<= Mayor o igual
>= Menor o igual
!= Diferente (compara cadenas y enteros)
== Igual (compara cadenas y enteros)
AND Multiplicacion lgica
OR Suma lgica
NOT Negacion (operador unario)
Recordar usar la precedencia adecuada.

Sentencias de control:
Se tendrn las siguientes sentencias:
Sentencia Ejemplo
Mientras mientras(contador2<3){
//sentencias
}
Para para(contador2 to 4){
//sentencias
}
Esperar espera(3);
//Esperara 3 segundos para continuar con la
ejecucin.
Si-Sino Si(contador2 ==3){
//sentencias
}sino{
//sentencias
}


Operacin de envo de mensaje:
Sera la operacin que enviara el mensaje al servidor de mensajera en el mismo formato que
un usuario, los mensajes que se enven con esta funcin siempre tendrn en el lugar del
emisor ROYAL. Esta funcin tiene por parmetro una cadena y el correo al que se enva el
mensaje:

Enviar(mensaje,correo1);
Enviar("Prueba",correos.obtener());



Ejemplo de archivo de entrada



Mensaje es cadena;
Contador es entero;
Contador2 es entero;
Estado_cola es bool;
correos es cola;
"Enviando mensaje numero " := Mensaje;

0 := Contador2, Contador;
false := Estado_cola;
para(contador2 to 4){

correos.ingresar("Usuario"+contador2);
contador2 + 1 := contador2 ;

/*

La sentencia para, termina cuando contador2 es igual 4

*/

}

tiempo es entero;

contador2 + 3 := tiempo;

while(contador< 4 AND NOT Estado_cola){

/*

Tomar en cuenta que pueden venir uno o ms operadores lgicos.

*/

enviar(Mensaje + contador, correos.obtener());

si(contador==2){

espera(tiempo);

}

sino{

espera(3);

}

contador + 1 :=contador;

correos.vacia := Estado_cola;

//dentro de una Sentencia puede venir cualquier otra sentencia

}





Consideraciones especiales



MANEJO DE ERRORES


La aplicacin debe ser capaza de recuperarse de errores, sintcticos y semnticos.
Se debe mostrar un reporte que contenga dicha informacin, puede ser un
HTML o alguna otra forma grfica de mostrarlos:
Error Tipo Lnea Columna
*#? Lxico 1 2
mensaje: Sintctico 5 2

Para el programa de pruebas de estrs se deben mostrar adems errores semnticos
(de estos errores el compilador no se recupera). Los errores semnticos nicamente
incluirn comprobacin de tipos, cuando se asigne una variable de un tipo a otra que
no es del mismo tipo.

Error Tipo Lnea Columna
Contador es de
tipo nmero y se
asign una cadena
Semntico 6 4
Contador2 es de
tipo nmero y se
asign una cadena
Semntico 5 2




Archivos de la aplicacin

Los archivos CUENTAS.ROY y CONTACTOS.ROY, sern modificados durante la calificacin,
con el objetivo de saber que los archivos son parseados. El archivo MENSAJES.ROY solo
debe ser escrito por el servidor, como constancia de que recibi y mando el mensaje a los
clientes.



Interfaz Grafica

Los dos clientes (la aplicacin cliente, el programa de carga masiva), adems del servidor
de mensajera, pueden ser simples consolas, o cuadros de texto con botones, no se
pedir una interfaz grfica detallada.
















Forma de entrega

El proyecto debe ser realizado con en el QT con las herramientas Flex o Lex y
Bison, en caso contrario no tendrn derecho a calificacin.

La realizacin del proyecto es individual, copias de proyecto tendrn un valor de
0(cero) y sern reportadas al Ingeniero y a la Escuela de Sistemas.
La comunicacin entre los programas debe ser con Sockets.

El CD a de entregar debe contener:

o Todo lo que respecta a la gramtica (Archivos .lex y .bison)
o Aplicaciones C++, el nombre de la aplicacin debe contener el
siguiente formato Proyecto1_<numero_carnet>.
O Archivos de Entrada, que sean reconocibles por su aplicacin.
o Manuales de Usuario y Tcnico.
La entrega ser el martes 6 de mayo (06/05/2014), el horario de entrega y de
calificacin se estar informando ms adelante. No habr ningn tipo de prrroga.

Aclaraciones importantes:
Si la letra de la palabra reservada tamao no la reconoce el analizar pueden utilizar
tamano.
Los lenguajes no distinguen entre maysculas y minsculas es decir es lo mismo escribir
MENSAJE, o mensaje, o Mensaje, o MenSaJE (no son keysensitive).
Se deben desarrollar 3 aplicaciones, una para el cliente de correo (a esta aplicacin le
llegan los mensajes y permite crear una cuenta o hacer login), la otra para el servidor
(es quien recibir los mensajes y los enviara al destinatario correcto), y la ultima es una
aplicacin de sobre carga con un lenguaje para el envi de correos automtico.
Puesto que son 3 aplicaciones distintas cada aplicacin tendr un parser distinto con
acciones distintas.

Vous aimerez peut-être aussi