Análisis Semántico Jorge Bernal Prassanna Ravishankar 13 de noviembre de 2013 Gemma Sánchez Capı́tulo 1 Introducción Este documento sirve de guı́a para enfocar la segunda práctica de la asignatura Compiladors I: Análisis Semántico. Los objetivos de esta práctica son: Afianzamiento de los conceptos presentados en las clases de teorı́a acerca del análisis semántico. Planteamiento del impacto que tienen las ampliaciones de LS en cuanto al análisis semántico, las cuales tendrán que ser implementados en CoSeL en la siguiente entrega. 1 Capı́tulo 2 Análisis Semántico 2.1. Objetivo de la práctica El objetivo del análisis sintáctico se podrı́a resumir a grosso modo en definir, mediante la gramática, qué expresiones podrán aparecer en nuestros programas. Una vez que dicho objetivo se ha cumplido, en esta práctica damos un paso más. Mediante el análisis semántico entraremos ya a analizar el contenido de las diferentes instrucciones del programa con el fin de comprobar tanto que dichas instrucciones se puedan ejecutar como que los diferentes operandos o elementos que intervienen pertenezcan a los tipos de datos que se supone asıcomo que los resultados de las diferentes expresiones se aprovechen cuando ası́ se requiere. El objetivo final de la práctica es que los alumnos añadan todo lo relacionado con las reglas que amplán nuestra gramática LS, por tanto, los alumnos deberán añadir al análisis semántico de LS ya explicado en clase de teorı́a (y proporcionado en la práctica) reglas relacionados con los añadidos de LS+. 2.2. Consideraciones relacionadas con el análisis semántico de LS+ Una vez presentada la gramática del Lenguaje Simple (LS) la propuesta es añadir nuevas funcionalidades a esta gramática. La nueva gramática LS+ generada a partir de LOOS deberá contemplar los siguientes casos: 1. LS contempla sólo cuatro operaciones aritméticas: suma, resta, multiplicación y división. El lenguaje LS+ deberá también incluir las operaciones módulo (mod) y división entera (div) y la potencia (**). Semántico: Los alumnos tendrán que realizar las comprobaciones necesarias entre los operandos de las operaciones añadidas, incluyendo comprobaciones relacionadas con los tipos de datos 2 2. El lenguaje LS permite sólamente una declaración de variable por vez, del estilo var a:integer; . Se propone que la gramática de LS+ permita declarar varias variables de un mismo tipo a la vez, del estilo: var a, b, c:integer; Semántico: Los alumnos tendrán que vigilar, por ejemplo, que los nombres no estén repetidos y que se introduzcan correctamente en la tabla de sı́mbolos con el tipo adecuado. 3. En el caso de las variables también se permitirá inicializar las variables a la vez que se declaran. Un ejemplo serı́a el siguiente: var a,b: integer = 20; Semántico: En este caso las declaraciones con inicialización han de ser coherentes con los tipos de datos que se están tratando y, en el caso de los records, tener en cuenta el orden y tipo de los campos. 4. Relacionado con los parámetros, además de su tipo se tendrá que indicar si son de entrada o de salida siguiendo el ejemplo siguiente: function compra(in precio: real, out total: integer); Semántico: Los alumnos tendrán que asegurarse de que el tipo de parámetro sea introducido correctamente en la Tabla de Sı́mbolos y tener en cuenta para la implementación en código si el tipo de expresión resultante es compatible. 5. Del mismo modo también se permitirá la declaración de varios parámetros del mismo tipo a la vez: function compra(precio,unidades:integer,nombre:real); Semántico: Como en el caso de las variables, los alumnos tendrán que vigilar, por ejemplo, que los nombres de los parámetros no estén repetidos o que se introduzcan correctamente en la tabla de sı́mbolos con el tipo adecuado. 3 6. En el caso de los arrays, permitiremos la creación y el acceso a arrays multidimensionales, del estilo de var a:array[5,5] of integer; Semántico: En este caso aunque creemos los arrays de la manera especificada, hemos de tratarlos como si fuesen del estilo array [5] of array[5] of integer. 7. Aunque ya tenemos instrucciones de bucles como el while, incluiremos la instrucción for que en este caso está inspirada en el de C. En este caso el objetivo es tener instrucciones del tipo: var a,x:integer; x = 5; for (a = 3; a < x; a++) Semántico: Habrá que comprobar el tipo de resultado que develve cada una de las expresiones que hay dentro del bucle for. Asimismo es clave tener en cuenta si las variables que se utilizan en el generador del bucle - en el ejemplo a y x - están declaradas en la TS y pertenecen al ámbito correcto. 8. Incluimos la instrucción switch implementado de la siguiente manera: var a = 3; switch (a) { case 2: cout.println("Es un dos"); case a: cout.println("Es un literal"); otherwise cout.println("Es otra cosa"); }; Semántico: Habrá que comprobar coincidencia de tipos entre la expresión que espera el selector y el que se devuelve realmente. Asimismo se hará una comprobación similar dentro de cada caso. 9. Relacionado con los records, permitiremos la creación e inicialización de records de la siguiente manera: Type r1:record n1:integer; n2: integer; end; Var a:r1(10,5); a = r1(10,5); 4 Semántico: Habrá que comprobar que los campos que se quieran añadir sean válidos. 10. Finalmente añadiremos la instrucción with do para inicializar los campos de los records: Type r1:record n1:integer; n2: integer; end; Var a:r1; with a do { n1 = 10; n2 = 20; } Semántico: Las comprobaciones necesarias para el with do serán las siguientes: 1) Comprobar que el elemento con el cual queremos trabajar sea tipo record; 2) Comprobar que los campos que se quieren inicializar sean en efecto campos del record con el que estamos trabajando y 3) Comprobaciones de tipo entre los valores de inicialización y los campos del record. Además de las tareas presentadas, los alumnos deberán también tener en cuenta lo siguiente: Comprobaciones semánticas necesarias a la hora de inicializar estructuras complejas tales como arrays o records, es decir, tener en cuenta las comprobaciones necesarias para instrucciones como var a:array[2,2] of integer = [[4,5],[2,3]] . Comprobaciones de tipos en las operaciones aritméticas: ¿ Cuál es el tipo de retorno de una división entera? ¿ Y de una potencia? Al declarar listas de variables, parámetros o campos de un record tendremos que vigilar que los identificadores de cada uno no estén repetidos e introducirlos en la tabla de sı́mbolos de manera correcta con el tipo correspondiente. Del mismo modo se aconseja asegurarse de que el orden de los campos o variables sea el que toca en cada caso. 5 Capı́tulo 3 Entregables 3.1. Sesión Seguimiento La evaluación relacionada con la entrega referida a la sesión de seguimiento tendrá lugar durante la semana del 11 de Noviembre y se llevará a cabo mediante el aplicativo PSG (neptu.uab.es). La entrega del fichero correspondiente a la entrega tiene como fecha y hora lı́mite el 12 de Noviembre a las 23h59. Dicha entrega consistirá en: Un informe (sin máximo de páginas) donde se planteará la solución para el análisis semántico de cada una de las 10 ampliaciones de la gramática de LS. Se sugiere a los alumnos que sigan el formato que se indica a continuación: Ejemplo: <DecVar> :: = Identificador @R1: <tipus(t)> @R2; R1: Comprobacion de si el identificador esta duplicado. R2: Introduccion en la tabla de simbolos de la variable de nombre identificador con tipo t Aparte de lo mencionado en el apartado anterior, los alumnos tendrán que responder a las siguientes cuestiones: 1. ¿Cómo realizamos las comprobaciones de tipo al inicializar arrays? 2. ¿Cómo se realizan las comprobaciones de tipo al inicializar un record? 3. ¿Cómo calculamos el tipo del resultado de la potencia? 4. Dentro del with do, ¿Cómo solucionarı́ais un posible problema derivado de declarar variables con el mismo nombre que campos del record? 6 Type r1:record n1:integer; n2: integer; end; Var a:r1; with a do { var n1; n1 = 10; n2 = 20; } Se recomienda asimismo a los alumnos que realicen esta práctica sobre la gramática final del análisis sintáctico, es decir, sobre el fichero que se entregó en el PSG la semana del 28 de Octubre . Dicho informe se podrá hacer mediante cualquier procesador de texto (Word, LaTeX) y deberá constar, además de las respuestas a la práctica ya mencionadas, de secciones fijas de planteamiento del problema, recopilación de problemas encontrados durante la resolución de la práctica y, si ha sido el caso, una recopilación de las fuentes bibliográficas empleadas durante la resolución de la misma. La evaluación de la sesión de seguimiento será individual durante la sesión más la nota derivada de la corrección del informe. Las notas de la sesión de seguimiento se colgarán en la web de la asignatura durante la semana siguiente a la entrega. 3.2. Sesión Evaluación La entrega final del Análisis Semántico tendrá lugar dos semanas después de la sesión de seguimiento, es decir, la semana del 25 de Noviembre. En este caso la entrega consistirá en subir al PSG el fichero .csl con el análisis semántico realizado. Los alumnos deberán tener en cuenta lo siguiente: Para que la práctica sea corregida el fichero NO ha de contener errores que impidan su carga correcta. En el caso de que no se pueda cargar el archivo, los alumnos tendrán que corregir dicho error y entregarlo como práctica de recuperación ANTES de la sesión de seguimiento de la práctica siguiente. La práctica de los alumnos deberá pasar los test del autotest proporcionado en el fichero semantic.csl (se colgará la versión definitiva la semana del 11 de Noviembre). Si añadı́s algún test propio, aseguráos de que sigue pasando los test que os proporcionamos. En la plantilla se deberá sustituir los valores de NIA y nombre y apellidos de los alumnos por los valores de los componentes del grupo. 7 Capı́tulo 4 Material disponible El material disponible (en la web de la asignatura) para realizar esta práctica es el siguiente: 1. Enunciado de la práctica de Análisis Semántico. 2. Transparencias de teorı́a. 3. CrossVisions 2.3. 4. Fichero Com.csm y semantic.csl (A partir del 11 de Noviembre). El horario de tutorı́as del profesor de prácticas es el siguiente: Martes de 12 a 13h y de 15 a 16h en despacho QC1024. Tambien se puede usar la siguiente dirección de correo electrónica para dudas: jbernal@cvc.uab.es. Se recomienda a los alumnos indicar en el asunto del correo [CP1] e intentar en la medida de lo posible no mandar dudas muy especı́ficas de código. 8