Análisis Semántico - CVC

Anuncio
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: [email protected]. 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
Descargar