Prácticas de Procesadores de Lenguaje

Curso 2007/2008


Enunciado de la convocatoria de septiembre

Objetivo de la Práctica

Nuevas características del lenguaje de programación ALFA

Tipo puntero

Cambios en las estructuras de control de flujo de programa

Funciones

Vectores

Nuevo tipo de dato "conjunto"

1. Todos los elementos son de tipo entero.
2. Los elementos no mantienen una relación de orden.
3. No hay elementos repetidos.
4. Inicialmente un conjunto está vacío (tiene 0 elementos)
5. El tamaño máximo de un conjunto es de 64 elementos.

Nuevas sentencias de entrada / salida

Restricciones semánticas

Comprobaciones semánticas relacionadas con los tipos básicos de datos

Vectores

Conjuntos

Nuevas sentencias de entrada / salida

Evaluación de la práctica

La normativa de evaluación que se aplicará está publicada en la página web del laboratorio de Procesadores de Lenguaje.

Entrega de la práctica

Las normas de entrega de la práctica también se describirán en la página web del laboratorio de Procesadores de Lenguaje.

Sugerencias

Se sugiere al alumno que escriba un fichero compatible con la herramienta make y con el nombre makefile que para el objetivo all genere el ejecutable de nombre alfa.

 

IMPORTANTE: Se sugiere al alumno que implemente un método que garantice que la interrupción de cualquier programa debido a un error "controlado" en tiempo de ejecución gestione de manera correcta la pila eliminando de la misma cualquier residuo antes de terminar la ejecución. Una posible implementación sería declarar una variable en ensamblador ( __esp resd 1) en la cual se almacene el puntero de pila al inicio del programa (mov dword [__esp] ,esp )  y en la etiqueta "final" utilizada como destino de salto de todos los errores controlados en tiempo de ejecución restaurar el puntero de pila que se guardó al inicio del programa (mod dword esp, [__esp]). La variable __esp tiene dos guiones bajos como primeros caracteres (en lugar de uno solo) para evitar el error que se produciría si en un programa ALFA hubiera declarada una variable de nombre "esp".

 

Gramática del Lenguaje de Programación ALFA

1:

<programa>

::=

INICIO <declaraciones> <sentencias> FIN

2:

<declaraciones>

::=

<declaracion>

3:

 

|

<declaracion> <declaraciones>

4:

<declaracion>

::=

<clase> <identificadores> ;

5:

<clase>

::=

<clase_escalar>

7:

 

|

<clase_vector>

8:

|

<clase_conjunto>

9:

<tipo>

::=

ENTERO

10:

 

|

LOGICO

11:

<clase_escalar>

::=

<tipo>

12:

<clase_conjunto>

::=

CONJUNTO DE <constante_entera>

13:

<clase_vector>

::=

VECTOR <tipo> DE <constante_entera>

14:

 

|

VECTOR <tipo> DE <constante_entera> POR <constante_entera>

15:

|

VECTOR <tipo> DE <constante_entera> POR <constante_entera> POR <constante_entera>

16:

<identificadores>

::=

<identificador>

17:

 

|

<identificador> , <identificadores>

18:

<sentencias>

::=

<sentencia>

19:

 

|

<sentencia> ; <sentencias>

20:

<sentencia>

::=

<asignacion>

21:

 

|

<condicional>

22:

 

|

<bucle>

23:

 

|

<lectura_escritura>

24:

|

<operacion_vector>

25:

|

<operacion_conjunto>

26:

<asignacion>

::=

<identificador> = <exp>

27:

 

|

<elemento_vector> = <exp>

28:

<elemento_vector>

::=

<identificador> [ <exp> ]

29:

 

|

<identificador> [ <exp> , <exp> ]

30:

|

<identificador> [ <exp> , <exp> , <exp> ]

31:

<condicional>

::=

SI <exp> ENTONCES <sentencias> FIN

32:

 

|

SI <exp> ENTONCES <sentencias> SINO <sentencias> FIN

33:

<bucle>

::=

MIENTRAS <exp> HACER <sentencias> FIN

34:

<lectura_escritura>

::=

LEER <identificador>

35:

 

|

LEER <elemento_vector>

36:

 

|

ESCRIBIR <exp>

37:

|

ESCRIBIRN <identificador>

38:

<operacion_vector>

::=

SUMA(<identificador>, <identificador>, <identificador>)

39: |

POR(<identificador>, <identificador>, <identificador>)

40: |

COPIA( <identificador>, <identificador>)

41:

<operacion_conjunto>

::=

UNION(<identificador>, <identificador>, <identificador>)

42:

|

INTERSECCION(<identificador>, <identificador>, <identificador>)

43:

|

INSERCION( <exp>, <identificador>)

44:

|

VACIAR( <identificador>)

45:

<exp>

::=

<exp> + <exp>

46:

 

|

<exp> - <exp>

47: | <exp> / <exp>

48:

 

|

<exp> * <exp>

49:

 

|

- <exp>

50:

 

|

<exp> Y <exp>

51:

 

|

<exp> O <exp>

52:

 

|

NO <exp>

53:

 

|

<identificador>

54:

 

|

<constante>

55:

 

|

( <exp> )

56:

 

|

( <comparacion> )

57:

 

|

<elemento_vector>

58:

|

TAMANIO(<identificador>)

59:

|

PERTENECE(<exp>, <identificador>)

60:

<comparacion>

::=

<exp> == <exp>

61:

 

|

<exp> != <exp>

62:

 

|

<exp> <= <exp>

63:

 

|

<exp> >= <exp>

64:

 

|

<exp> < <exp>

65:

 

|

<exp> > <exp>

66:

<constante>

::=

<constante_logica>

67:

 

|

<constante_entera>

68:

<constante_logica>

::=

VERDADERO

69:

 

|

FALSO

70:

<constante_entera>

::=

<numero>

71:

<numero>

::=

<digito>

72:

 

|

<numero> <digito>

73:

<identificador>

::=

<letra>

74:

 

|

<letra> <cola_identificador>

75:

<cola_identificador>

::=

<alfanumerico>

76:

 

|

<alfanumerico> <cola_identificador>

77:

<alfanumerico>

::=

<letra>

78:

 

|

<digito>

79:

<letra>

::=

a | b | ... | z | A | B |...| Z

90:

<digito>

::=

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9