TP N° 2: Analizador Léxico

Anuncio
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:________
Descargar