UNIVERSIDAD NACIONAL DE JUJUY – FACULTAD DE INGENIERÍA INGENIERIA EN INFORMÁTICA (2001) – LICENCIATURA EN SISTEMAS Compiladores 2012 TRABAJO PRÁCTICO Nº 2: ANALIZADOR LÉXICO EJERCICIOS ADICIONALES Ejercicio 1: Implementar un reconocedor de lexemas (Analizador Léxico) para cada una de las siguientes entradas: a) Pascal procedure sumatoria; begin writeln('Numero: ');Redln(numero); sumatoria:=0; for contador:=1 to numero do begin sumatoria:=sumatoria+contador; end; write('Sumatoria: ',sumatoria) end; b) C #include <stdio.h> int main() { int contador = 1; do { printf( "%d ", contador ); } while ( ++contador <= 10 ); return 0; } c) HTML <HTML> <HEAD> <TITLE> Ejercicio1 de compiladores </TITLE> </HEAD> <BODY> <!-- Esto es un comentario --> <HR> <H1>Titulo1</H1> <H2>Titulo2</H2> <P>Esto es un párrafo</P> <H3>Titulo3</H3> <H4>Titulo4</H4> APELLIDO Y NOMBRE:__________________________________________ LU:________ UNIVERSIDAD NACIONAL DE JUJUY – FACULTAD DE INGENIERÍA INGENIERIA EN INFORMÁTICA (2001) – LICENCIATURA EN SISTEMAS Compiladores 2012 <UL> <LI> Linea uno </LI> <LI> Linea dos </LI> <LI> Linea tres </LI> </UL> </BODY> </HTML> d) Pascal uses crt; var cantidad, cont, numero, s:integer; begin ClrScr; s:=0; write('Cantidad: ');Read(cantidad); for cont:=1 to cantidad do begin write('Numero ',cont,': '); Read(numero); s:=s+numero; end; write('Promedio: ',s/cantidad:0:2); ReadKey; end; Ejercicio 2: Crear un AL para los ejercicios anteriores, que muestre como salida la secuencia de tokens (lexemas) correspondiente, manteniendo la estructura (espacios, tabuladores y saltos de línea) y mostrando para los identificadores, el lexema en lugar del token (por ejemplo, si la variable Num es reconocida por el AL como un identificador, la salida para este lexema deberá ser el mismo lexema “Num” en lugar de la palabra ID). Ejercicio 3: Dada la siguiente especificación en Flex: /* AL para un lenguaje de prueba al estilo de Pascal */ %{ #include <math.h> /* se necesita esto para la llamada a atof() mas abajo */ #include <stdio.h> %} digito [0-9] id [a-z][a-z0-9]* %% {digito}+ {printf("Un entero: %s (%d)\n", yytext, atoi(yytext));} {digito}+"."{digito}* {printf("Un real: %s (%g)\n", yytext, atof(yytext));} APELLIDO Y NOMBRE:__________________________________________ LU:________ UNIVERSIDAD NACIONAL DE JUJUY – FACULTAD DE INGENIERÍA INGENIERIA EN INFORMÁTICA (2001) – LICENCIATURA EN SISTEMAS Compiladores 2012 "if"|"then"|"begin"|"end"|"procedure"|"function" {id} "+"|"-"|"*"|"/" "{"[^}\n]*"}" [ \t\n]+ . %% {printf("Una palabra clave: %s\n", yytext);} {printf("Un identificador: %s\n", yytext);} {printf("Un operador: %s\n", yytext);} {;} /* ignora una linea de comentarios */ {;} /* ignora los espacios en blanco */ {printf( "Caracter no reconocido: %s\n", yytext);} a) Indicar qué tipo de lexemas permite reconocer. b) Compilar y ejecutar la especificación en Flex tomando como entrada lo siguiente: procedure sumatoria; {procedimiento que calcula la sumatoria de numeros} begin writeln('Numero: ');Redln(numero); sumatoria:=0; for contador:=1 to numero do begin sumatoria:=sumatoria+contador; end; write('Sumatoria: ',sumatoria) end; ¿Cuál sería la salida? Ejercicio 4: Crear un analizador basado en la especificación del ejercicio anterior, que muestre como salida la secuencia de tokens correspondiente, manteniendo la estructura (espacios, tabuladores y saltos de línea) y mostrando para los identificadores el lexema en lugar del token. Ejercicio 5: Compilar la siguiente especificación en FLEX y en caso de obtener errores de compilación, corregir los mismos hasta que la misma compile sin errores. int num_lineas = 0, num_caracteres = 0; %% \n . ++num_lineas; ++num_caracteres; ++num_caracteres; Ejercicio 6: Definir una entrada para la especificación anterior y ejecutar el AL obtenido en el punto 5. Ejercicio 7: Compilar la siguiente especificación en FLEX y en caso de obtener errores de compilación, corregir los mismos hasta que la misma compile sin errores. APELLIDO Y NOMBRE:__________________________________________ LU:________ UNIVERSIDAD NACIONAL DE JUJUY – FACULTAD DE INGENIERÍA INGENIERIA EN INFORMÁTICA (2001) – LICENCIATURA EN SISTEMAS %{ #include <stdio.h> #include <stdlib.h> int linea=0; %} DIGITO NUMERO letra id %% {NUMERO} {id} {NUM} "=" "+" "-" ";" "*" "/" "(" ")" "\n" [\t\r\f] "" . %% Compiladores 2012 [0-9] {DIGITO}+("."{DIGITO}+)? [a-zA-Z] [a-zA-Z] letra|{DIGITO} {printf("Total de numeros: %s \n", yytext);} {printf("Identificador: %s \n", yytext);} {;} {printf("%c \n", yytext[0]);} {printf("%c \n", yytext[0]);} {printf("%c \n", yytext[0])} {printf("%c \n", yytext[0]);} {printf("%c \n", yytext[0]);} {printf("%d \n", yytext[0]);} {printf("( \n");} {printf(") \n");} {linea++;} {;} {;} {printf("Error lexico en linea %d",linea);} Ejercicio 8: Definir una entrada para la especificación anterior y ejecutar el AL obtenido en el punto 7. APELLIDO Y NOMBRE:__________________________________________ LU:________