Prácticas de Procesadores de Lenguaje

Curso 2007/2008


Práctica 1: Analizador Léxico

Objetivo de la Práctica

Desarrollo de la Práctica

Estudio de la Gramática

Codificación de una Especificación para flex

Codificación de un Programa de Prueba

Descripción del Fichero de Entrada

Funcionalidad del Programa

Descripción del Fichero de Salida

Ejemplos

// Programa que eleva un número entero al cuadrado 

INICIO
   ENTERO x, resultado;

   LEER x;
   resultado=x*x;
   ESCRIBIR resultado
FIN

TOKEN_KEY    

1             

INICIO

TOKEN_KEY

3             

ENTERO

TOKEN_ID

100         

x

TOKEN_KEY

25  

,

TOKEN_ID

100         

resultado

TOKEN_KEY

23          

;

TOKEN_KEY

15           

LEER

TOKEN_ID

100         

x

TOKEN_KEY

23           

;

TOKEN_ID

100         

resultado

TOKEN_KEY

26           

=

TOKEN_ID

100         

x

TOKEN_KEY

33           

*

TOKEN_ID

100         

x

TOKEN_KEY

23           

;

TOKEN_KEY

16           

ESCRIBIR

TOKEN_ID

100         

resultado

TOKEN_KEY

2             

FIN

 

// Programa que eleva un número x a la potencia y 

INICIO
  ENTERO x, y;
  
ENTERO i, total;

   LEER x;
  LEER y;
  i=1;
  total=1;
  MIENTRAS (i<=y) HACER
    total=total*x;
    i=i+1
  FIN;
  ESCRIBIR total
FIN

TOKEN_KEY

1             

INICIO

TOKEN_KEY

3             

ENTERO

TOKEN_ID

100         

x

TOKEN_KEY

25           

,

TOKEN_ID

100         

y

TOKEN_KEY

23           

;

TOKEN_KEY

3             

ENTERO

TOKEN_ID

100         

i

TOKEN_KEY 

25           

,

TOKEN_ID

100         

total

TOKEN_KEY

23           

;

TOKEN_KEY

15           

LEER

TOKEN_ID

100         

x

TOKEN_KEY

23           

;

TOKEN_KEY

15           

LEER

TOKEN_ID

100         

y

TOKEN_KEY

23           

;

TOKEN_ID

100         

i

TOKEN_KEY

26           

=

TOKEN_NUM

101         

1

TOKEN_KEY

23           

;

TOKEN_ID

100         

total

TOKEN_KEY

26           

=

TOKEN_NUM

101         

1

TOKEN_KEY

23           

;

TOKEN_KEY

13           

MIENTRAS

TOKEN_KEY

34           

(

TOKEN_ID

100         

i

TOKEN_KEY

38           

<=

TOKEN_ID

100         

y

TOKEN_KEY

35           

)

TOKEN_KEY

14           

HACER

TOKEN_ID

100         

total

TOKEN_KEY

26           

=

TOKEN_ID

100         

total

TOKEN_KEY

33           

*

TOKEN_ID

100         

x

TOKEN_KEY

23           

;

TOKEN_ID

100         

i

TOKEN_KEY

26           

=

TOKEN_ID

100         

i

TOKEN_KEY

31           

+

TOKEN_NUM

101         

1

TOKEN_KEY

2             

FIN

TOKEN_KEY

23           

;

TOKEN_KEY

16           

ESCRIBIR

TOKEN_ID

100         

total

TOKEN_KEY

2             

FIN

 

Autocorrección de la práctica

En la página web del laboratorio de Procesadores de Lenguaje hay disponible un enlace para que el alumno se descargue el fichero comprimido autocorreccion_lexico.zip. Este fichero contiene 15 programas escritos en ALFA y sus correspondientes 15 ficheros de salida que debe generar el programa prueba_lexico desarrollado en esta primera práctica. El alumno debe comparar las salidas que obtiene de su programa prueba_lexico con las salidas proporcionadas en el fichero autocorreccion_lexico.zip. Para realizar la comparación en Linux se puede utilizar el comando diff que compara el contenido de dos ficheros.

 

Evaluación de la práctica

La evaluación de los conocimientos adquiridos por el alumno durante el desarrollo de esta primera práctica se hará mediante una prueba individual realizada en una sesión de laboratorio en los días que se detallan en la lista adjunta.

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

 

Sugerencia

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 prueba_lexico.

 

Gramática del Lenguaje de Programación ALFA

1:

<programa>

::=

INICIO <declaraciones> <funciones> <sentencias> FIN

2:

<declaraciones>

::=

<declaracion>

3:

 

|

<declaracion> <declaraciones>

4:

<declaracion>

::=

<clase> <identificadores> ;

5:

<clase>

::=

<clase_escalar>

6:

 

|

<clase_puntero>

7:

 

|

<clase_vector>

8:

<tipo>

::=

ENTERO

9:

 

|

LOGICO

10:

<clase_escalar>

::=

<tipo>

11:

<clase_puntero>

::=

<tipo> #

12:

 

|

<clase_puntero> #

13:

<clase_vector>

::=

VECTOR <tipo> DE <constante_entera>

14:

 

|

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

15:

<identificadores>

::=

<identificador>

16:

 

|

<identificador> , <identificadores>

17: <funciones> ::= <funcion> <funciones>
18: |
19: <funcion> ::= FUNCION <tipo> <identificador> ( <parametros_funcion> ) INICIO <declaraciones_funcion> <sentencias> FIN
20: <parametros_funcion> ::= <parametro_funcion> <resto_parametros_funcion>
21: |
22: <resto_parametros_funcion> ::= ; <parametro_funcion> <resto_parametros_funcion>
23: |
24: <parametro_funcion> ::= <tipo> <identificador>
25: <declaraciones_funcion> ::= <declaraciones>
26: |

27:

<sentencias>

::=

<sentencia>

28:

 

|

<sentencia> ; <sentencias>

29:

<sentencia>

::=

<asignacion>

30:

 

|

<condicional>

31:

 

|

<bucle>

32:

 

|

<lectura_escritura>

33:

 

|

<liberacion>

34: | <retorno>
35: | <seleccion>
36: <seleccion> ::= SELECCIONAR ( <exp> ) <casos_seleccion> FIN
37: <casos_seleccion> ::= <casos_estandar> <caso_defecto>
38: <casos_estandar> ::= <caso_estandar>
39: | <casos_estandar> <caso_estandar>
40: <caso_estandar> ::= CASO <constante_entera> : <sentencias>
41: <caso_defecto> ::= DEFECTO <sentencias>
42: <retorno> ::= DEVOLVER <exp>

43:

<asignacion>

::=

<identificador> = <exp>

44:

 

|

<elemento_vector> = <exp>

45:

 

|

<acceso> = <exp>

46:

 

|

<identificador> = RESERVAR

47:

 

|

<identificador> = <- <identificador>

48:

<elemento_vector>

::=

<identificador> [ <exp> ]

49:

 

|

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

50:

<condicional>

::=

SI <exp> ENTONCES <sentencias> FIN

51:

 

|

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

52:

<bucle>

::=

MIENTRAS <exp> HACER <sentencias> FIN

53: | DESDE <identificador> = <exp> HASTA <exp> HACER <sentencias> FIN

54:

<lectura_escritura>

::=

LEER <identificador>

55:

 

|

LEER <elemento_vector>

56:

 

|

ESCRIBIR <exp>

57:

<liberacion>

::=

LIBERAR <identificador>

58:

<acceso>

::=

-> <identificador>

59:

 

|

-> <acceso>

60:

<exp>

::=

<exp> + <exp>

61:

 

|

<exp> - <exp>

62: | <exp> / <exp>

63:

 

|

<exp> * <exp>

64:

 

|

- <exp>

65:

 

|

<exp> Y <exp>

66:

 

|

<exp> O <exp>

67:

 

|

NO <exp>

68:

 

|

<identificador>

69:

 

|

<constante>

70:

 

|

( <exp> )

71:

 

|

( <comparacion> )

72:

 

|

<acceso>

73:

 

|

<elemento_vector>

74: | <identificador> ( <lista_exp> )
75: <lista_exp> ::= <exp> <resto_lista_exp>
76: |
77: <resto_lista_exp> ::= , <exp> <resto_lista_exp>
78: |

79:

<comparacion>

::=

<exp> == <exp>

80:

 

|

<exp> != <exp>

81:

 

|

<exp> <= <exp>

82:

 

|

<exp> >= <exp>

83:

 

|

<exp> < <exp>

84:

 

|

<exp> > <exp>

85:

<constante>

::=

<constante_logica>

86:

 

|

<constante_entera>

87:

<constante_logica>

::=

VERDADERO

88:

 

|

FALSO

89:

<constante_entera>

::=

<numero>

90:

<numero>

::=

<digito>

91:

 

|

<numero> <digito>

92:

<identificador>

::=

<letra>

93:

 

|

<letra> <cola_identificador>

94:

<cola_identificador>

::=

<alfanumerico>

95:

 

|

<alfanumerico> <cola_identificador>

96:

<alfanumerico>

::=

<letra>

97:

 

|

<digito>

98:

<letra>

::=

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

99:

<digito>

::=

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

Consideraciones Adicionales

Entre // y el final de la línea.