lunes, 25 de diciembre de 2017

Practica PL1 (2017-2018): Parte 2 - Analizador sintáctico (IV)

Tras una pequeña pausa (entre otras cosas por un problema con Eclipse) retomo la resolucion de la practica. Ahora tocan las definiciones de procedimientos.

Aqui tenemos una de las partes que se diferencia entre ambos grupos de la practica, asi como mi enfoque de hacer TODA la especificacion.

Además, la documentacion está mal diseñada e incompleta, con lo que es necesario recurrir a los casos de prueba para realizar el diseño.

Veamos una serie de ejemplos validos de la primera linea de la declaracion de un procedimiento:

PROCEDURE proc0;
PROCEDURE proc1(var1,var2:INTEGER;var3:BOOLEAN);
PROCEDURE proc2(var1,var2:INTEGER;var3:BOOLEAN): BOOLEAN;
PROCEDURE proc3(VAR var1,var2:INTEGER; VAR var3:BOOLEAN):INTEGER;
PROCEDURE proc4:INTEGER;
PROCEDURE proc5:tipoCompuesto;
PROCEDURE proc6(VAR var1, var2: INTEGER; var3:BOOLEAN): tipoCompuesto;

Todos estos son validos o no, dependiendo del grupo al que se pertenezca, y el ultimo no es valido en ninguno de los grupos, pero si en mi especificacion.

A esta primera linea la voy a denominar "cabecera", y voy a seguir definiendo.

declaracionProcedimientos::=declaracionProcedimiento declaracionProcedimientos|/*epsilon*/;
declaracionProcedimiento::= cabecera declaraciones BEGIN sentencias END IDENTIFICADOR PUNTOYCOMA;

Esto es basicamente una copia de la descripcion del programa que lo contiene, e incluye la posibilidad de anidar procedimientos.

Vamos ahora a la cabecera y a cada uno de sus campos.

declaracionProcedimiento::= PROCEDURE IDENTIFICADOR argumentos tipoSalida PUNTOYCOMA;

argumentos::= /*epsilon*/|ABRIR_PARENTESIS listaArgumentos CERRAR_PARENTESIS;

listaArgumentos::= listaIdentificadores DOSPUNTOS tipoPrimitivo
      |listaIdentificadores DOSPUNTOS IDENTIFICADOR
      |listaIdentificadores DOSPUNTOS tipoPrimitivo PUNTOYCOMA listaArgumentos
      |listaIdentificadores DOSPUNTOS IDENTIFICADOR PUNTOYCOMA listaArgumentos;

listaIdentificadores::=listaIdentificadoresValor|listaIdentificadoresReferencia;
listaIdentificadoresValor::=IDENTIFICADOR listaIdentificadoresValor|IDENTIFICADOR;
listaIdentificadoresReferencia::=VAR listaIdentificadoresValor;

Y en principio esto es todo por hoy. Todavía tengo que probarlo, porque no lo haré hasta el final, pero debería funcionar.

Un saludo.

No hay comentarios:

Publicar un comentario