|
![]() |
|
![]() |
Práctica 1: análisis léxico y sintáctico |
![]() |
|
El objetivo de esta sesión es desarrollar un analizador léxico y un analizador sintáctico de acuerdo con la especificación que se presenta más adelante. Dichos analizadores recibirán como entrada un fichero de texto que contiene el programa fuente y en el caso de que no haya errores léxicos ni sintácticos producirán como resultado un objeto Java que represente el programa fuente en forma de árbol. Si hay errores léxicos o sintácticos se levantará una excepción. En este documento se presenta una descripción general del programa fuente que se utilizará en la práctica. Se debe notar que ciertas partes de dicha descripción no se van a utilizar en la práctica 1. Tutoriales Antes de empezar a realizar la práctica se recomienda consultar los manuales de CUP y JLex disponibles a través de Aula Global o bien estos pequeños resúmenes de CUP y JLex |
|
Descripción general del lenguaje de programación fuente PF2025 Empecemos con un pequeño programa de ejemplo: state_machine states s1, s2, s3; final states s4; inputs a, b, c; outputs sal; starts with s1; sal:='0'; begin transition(s1,a,s2); transition(s2,c,s1); transition(s2,b,s3); transition(s3, c, s4); behaviour sal:='1'; generate output; transition(s3, a, s2); transition(s3, b, s1); end Un programa en el lenguaje fuente consta de las siguientes partes:
La siguiente figura representa gráficamente la máquina de estados definida por el programa anterior. Debe tenerse en cuenta que, para aquellas transiciones que no se han definido se supone que por defecto se permanece en el mismo estado. ![]() Especificación del analizador léxico El analizador léxico JLex a desarrollar debe reconocer los siguientes tokens:
El lenguaje distingue mayúsculas y minúsculas; por lo tanto mientras begin es una palabra clave, Begin es un identificador y BEGIN es otro identificador distinto del anterior. Recuerde que también tiene que especificar en el fichero JLex que se deben reconocer y consumir (sin generar token) los espacios en blanco, tabuladores, saltos de línea y retornos de carro. Para desarrollar el analizador léxico pedido lo único que hay que hacer es completar este esqueleto de fichero JLex en el que lo único que falta es definir para cada token a reconocer, la expresión regular asociada y la acción asociada. A modo de ejemplo, se proporciona ya definido el token para la palabra clave and. Como puede observarse en la definición de la regla para la palabra clave and, lo que hay que hacer es:
El analizador léxico deberá lanzar una excepción de tipo LexerException, que se proporciona, cuando se detecte un error léxico. Definición de la sintaxis del lenguaje de programación fuente A continuación vamos a dar la definición de la sintaxis del lenguaje fuente por medio de una gramática independiente del contexto (excepto para las expresiones, que se van a definir en lenguaje natural). La gramática que define la sintaxis del lenguaje de programación fuente es la siguiente:
Expresiones en el lenguaje de programación fuente Las expresiones lógicas del lenguaje de programación fuente (identificadas en la gramática por el símbolo no terminal <ExpLog>) deben de ajustarse a lo siguiente:
Reglas de precedencia La precedencia de los operadores es, de menor a mayor:
Todos los operadores asocian por la derecha. |
|
Para la prueba del analizador léxico y el analizador sintáctico, se utilizara la clase Main que se proporciona. La ejecución de dicha clase se realizará de acuerdo con lo siguiente: java Main <nombre_fichero> Donde <nombre_fichero> es el nombre del fichero (con el path si es necesario) del programa fuente a analizar. El programa deberá de levantar una excepción que no deberá de ser capturada en el caso de que el programa fuente tenga algún error de sintaxis. Los mensajes emitidos por excepciones producidas por errores en la fase de análisis sintáctico deberán indicar una línea del programa orientativa del lugar en el que se ha producido el error. Asímismo, el programa deberá de levantar una excepción de tipo LexerException, que no deberá de ser capturada en el caso de que el programa fuente tenga algún error léxico. Obligatoriamente las clases generadas por CUP deberán pertenecer a un paquete llamado Parser y la clase generada por JLex deberá pertenecer a un paquete llamado Lexer. Orden de compilación Antes de entregar la práctica deberá cerciorarse de que su práctica puede compilarse correctamente con javac siguiendo el siguiente orden:
Aquellas prácticas que no se puedan compilar en este orden serán calificadas con 0. |
|
Se proporciona un juego de tests con el que probar la práctica. De entre ellos solamente deberían de producir un error de sintaxis los tests en carpetas cuyo nombre comienza por ErrSint y error léxico los tests en carpetas cuyo nombre comienza por ErrLex. Puede ocurrir que alguno de los ejemplos ErrLex de error de sintaxis (y no léxico). Se advierte que se realizarán tests adicionales a los proporcionados a las prácticas recibidas, por lo que se recomienda a los alumnos que planifiquen tests complementarios a su práctica. |
|
Se deberán entregar exclusivamente los siguientes ficheros:
|
|