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 & & ( ¶ ) &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:
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:
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:
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:
La empresa M&C, 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 :
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:
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.