Prácticas de Procesadores de lenguaje

Curso 2006/2007


Práctica 2: analizador sintáctico

Objetivo de la práctica

Desarrollo de la práctica

Codificación de una especificación para bison

Resolución de conflictos

Modificación de la 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

El fichero está formado por un conjunto de líneas de dos tipos, en concreto:

Cada línea debe correspondiente a un Token desplazado debe contener la siguiente información y formato:
                        
                    D:    <token>

Donde <token> es el fragmento de entrada reconocido por el analizador morfológico y “D:” y “<token<” van separados por un tabulador.

Cada línea correspondiente a una  regla reducida tendrá el formato siguiente

                    R<nº regla>:    <regla>

Donde <nº regla> es el número que identifica la regla que se reduce según aparece en la gramática y <regla> es el texto de la regla reducida según aparece en la gramática.
“R<nº regla>” y “<regla>” van separados por un tabulador.
Los elementos que forman “<regla>” irán separados por espacios. Ejemplo:

        “<bucle> ::= MIENTRAS <exp> HACER <sentencias> FIN”

Ejemplos

//

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

//

 

INICIO

   ENTERO x, resultado;

   LEER x;

   resultado=x*x;

   ESCRIBIR resultado

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


D: INICIO

D: ENTERO

R8: <tipo> ::= ENTERO

D: x

R10: <clase_escalar> ::= <tipo>

R5: <clase> ::= <clase_escalar>

R67: <identificador> ::= TOKEN_ID

D: ,

D: y

R67: <identificador> ::= TOKEN_ID

D: ;

R15: <identificadores> ::= <identificador>

R16: <identificadores> ::= <identificador> , <identificadores>

R4: <declaracion> ::= <clase> <identificadores> ;

D: ENTERO

R8: <tipo> ::= ENTERO

D: i

R10: <clase_escalar> ::= <tipo>

R5: <clase> ::= <clase_escalar>

R67: <identificador> ::= TOKEN_ID

D: ,

D: total

R67: <identificador> ::= TOKEN_ID

D: ;

R15: <identificadores> ::= <identificador>

R16: <identificadores> ::= <identificador> , <identificadores>

R4: <declaracion> ::= <clase> <identificadores> ;

D: LEER

R2: <declaraciones> ::= <declaracion>

R3: <declaraciones> ::= <declaracion> <declaraciones>

D: x

D: ;

R34: <lectura_escritura> ::= LEER <identificador>

R22: <sentencia> ::= <lectura_escritura>

D: LEER

D: y

D: ;

R34: <lectura_escritura> ::= LEER <identificador>

R22: <sentencia> ::= <lectura_escritura>

D: i

D: =

D: 1

R64: <constante_entera> ::= TOKEN_NUM

R61: <constante> ::= <constante_entera>

R49: <exp> ::= <constante>

D: ;

R24: <asignacion> ::= <identificador> = <exp>

R19: <sentencia> ::= <asignacion>

D: total

D: =

D: 1

R64: <constante_entera> ::= TOKEN_NUM

R61: <constante> ::= <constante_entera>

R49: <exp> ::= <constante>

D: ;

R24: <asignacion> ::= <identificador> = <exp>

R19: <sentencia> ::= <asignacion>

D: MIENTRAS

D: (

D: i

D: <=

R48: <exp> ::= <identificador>

D: y

D: )

R48: <exp> ::= <identificador>

R56: <comparacion> ::= <exp> <= <exp>

R51: <exp> ::= ( <comparacion> )

D: HACER

D: total

D: =

D: total

D: *

R48: <exp> ::= <identificador>

D: x

D: ;

R48: <exp> ::= <identificador>

R43: <exp> ::= <exp> * <exp>

R24: <asignacion> ::= <identificador> = <exp>

R19: <sentencia> ::= <asignacion>

D: i

D: =

D: i

D: +

R48: <exp> ::= <identificador>

D: 1

R64: <constante_entera> ::= TOKEN_NUM

R61: <constante> ::= <constante_entera>

R49: <exp> ::= <constante>

D: FIN

R40: <exp> ::= <exp> + <exp>

R24: <asignacion> ::= <identificador> = <exp>

R19: <sentencia> ::= <asignacion>

R17: <sentencias> ::= <sentencia>

R18: <sentencias> ::= <sentencia> ; <sentencias>

R33: <bucle> ::= MIENTRAS <exp> HACER <sentencias> FIN

R21: <sentencia> ::= <bucle>

D: ;

D: ESCRIBIR

D: total

D: FIN

R48: <exp> ::= <identificador>

R36: <lectura_escritura> ::= ESCRIBIR <exp>

R22: <sentencia> ::= <lectura_escritura>

R17: <sentencias> ::= <sentencia>

R18: <sentencias> ::= <sentencia> ; <sentencias>

R18: <sentencias> ::= <sentencia> ; <sentencias>

R18: <sentencias> ::= <sentencia> ; <sentencias>

R18: <sentencias> ::= <sentencia> ; <sentencias>

R18: <sentencias> ::= <sentencia> ; <sentencias>

R1: <programa> ::= INICIO <declaraciones> <sentencias> FIN


Resultado Final

 

El nombre del fichero zip será p2_gg_pp.zip, donde gg corresponde al grupo de prácticas y pp al número de pareja. Por ejemplo, el fichero comprimido de la pareja 5 del grupo Ma se llamará p2_ma_05.zip



Observación muy importante

Fechas de entrega