TP N° 2: Analizador Léxico

Anuncio
UNIVERSIDAD NACIONAL DE JUJUY – FACULTAD DE INGENIERÍA
Compiladores
INGENIERIA EN INFORMÁTICA (2001) – LICENCIATURA EN SISTEMAS
2012
TRABAJO PRÁCTICO Nº 2: ANÁLISIS LÉXICO
Ejercicio 1: Dado el siguiente código en FORTRAN:
FUNCTION MAX (I,J)
RETORNA EL MAYOR DE LOS ENTEROS I, J
IF (I .GT. J) THEN
MAX = I
ELSE
MAX = J
ENDIF
RETURN
a) Especificar el conjunto de tokens que debe reconocer el analizador
b) Especificar el patrón léxico (expresión regular) que define cada posible token del
lenguaje
c) Construir el DT que reconoce el lenguaje anterior
Ejercicio 2: Se pretende construir una calculadora que evalúe expresiones matemáticas tales
como:
• A + -(A * B + -C)
• ((B * C) + -A) * C + D
Se requiere construir un analizador léxico de este lenguaje. Para ello se pide:
a) Especificar la colección de tokens del analizador
b) Especificar el patrón léxico (expresión regular) que define cada posible token del
lenguaje
c) Construir el DT que reconozca los componentes léxicos para este analizador.
d) Construir la tabla de transiciones para el autómata obtenido en el punto c)
Ejercicio 3: Identificar los Lexemas, Patrones, Tokens y Atributos para un Analizador
Léxico (AL) que reconozca como entrada las siguientes porciones de código. Nota: Para cada
lenguaje se implementará un AL.
APELLIDO Y NOMBRE:__________________________________________
LU:________
UNIVERSIDAD NACIONAL DE JUJUY – FACULTAD DE INGENIERÍA
INGENIERIA EN INFORMÁTICA (2001) – LICENCIATURA EN SISTEMAS
Compiladores
2012
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;
}
Ejercicio 4: Escribir las expresiones regulares para reconocer identificadores, números
reales, cadenas de caracteres y comentarios utilizados para un programa escrito en C.
a) Construir el DT que reconozca los componentes léxicos para la expresión regular
definida para números reales.
b) Construir la tabla de transiciones para el autómata obtenido en el punto a)
Ejercicio 5: Implementar un reconocedor de lexemas (Analizador Léxico) para la siguiente
entrada:
program problema2;
function F2 (uno, dos: integer)
{
function F1 (uno, dos: integer)
{
var a, b: integer;
a:= 5;
b:= 10;
b:= ((a * uno) + (b * dos))
return b;
}
var c, d: integer;
c:= uno;
APELLIDO Y NOMBRE:__________________________________________
LU:________
UNIVERSIDAD NACIONAL DE JUJUY – FACULTAD DE INGENIERÍA
Compiladores
INGENIERIA EN INFORMÁTICA (2001) – LICENCIATURA EN SISTEMAS
2012
d:= dos;
return ( (c + F1(c, d)) * (d + F1(3, 4))
}
var uno: integer;
begin
uno := 1;
uno := F2 (uno, 1);
end.
en donde la salida debería ser la siguiente:
PROGRAM ID ; FUNCTION ID ( ID , ID : INTEGER) { ...
(Nota: puede recibir la entrada desde el teclado ó desde un archivo de acuerdo al criterio
elegido al momento de diseñar el AL).
Ejercicio 6: Crear un analizador para el ejemplo 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 7: Dada la siguiente especificación:
%{
#include <stdio.h>
%}
blanco " "|\n|\t
letra [a-zA-Z]
digito [0-9]
ident {letra}({digito}|{letra})*
numero {digito}+
%%
{blanco}* {;}
"if" {printf(" IF ");}
"else" {printf(" ELSE ");}
"while" {printf(" WHILE ");}
"void" {printf(" VOID ");}
{ident} {printf(" IDENT ");}
{numero} {printf(" NUMERO ");}
. {printf(" %c ",yytext[0]);}
%%
a) Indicar qué tipo de lexemas permite reconocer.
b) Si tomamos como entrada lo siguiente:
void main (void)
{
if(a>12)
APELLIDO Y NOMBRE:__________________________________________
LU:________
UNIVERSIDAD NACIONAL DE JUJUY – FACULTAD DE INGENIERÍA
Compiladores
2012
INGENIERIA EN INFORMÁTICA (2001) – LICENCIATURA EN SISTEMAS
while(b1<10)
a = a + 1;
}
¿Cuál sería la salida?
c) Compilar y ejecutar la especificación en Flex. ¿Qué ocurre si colocamos la regla que
reconoce los identificadores en primer lugar? ¿Y si colocamos la regla del ‘.’ en primer
lugar? ¿Qué ocurrió con el identificador ‘main’ en ambos casos? ¿Y con el identificador ‘a’?
¿Por qué?
Ejercicio 8: 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 7: Especificar un analizador léxico que reconozca sentencias para asignar
expresiones matemáticas (con sumas (+), restas (-), productos (*), divisiones (/), potencias
(^) y paréntesis). Por ejemplo:
• A := 3 * (2 – 5^3)
• B3 := 4 – C+ 8 / (6 – D)
Se pide:
a) Indicar la estructura de los tokens
b) Expresar los patrones léxicos de cada uno de ellos
c) Construir el scanner (analizador léxico) que reconoce el lenguaje
Ejercicio 9: Diseñar un analizador léxico que reconozca los siguientes componentes:
TOKEN
ID
ENTERO
DESCRIPCIÓN
EJEMPLO
Identificadores. Comienzan por una letra, a la
que pueden seguir caracteres alfanuméricos
var, var1, a
Números enteros con o sin signo
-6, 40 +99
REAL
Números reales con o sin signo. No se admiten
construcciones como .2 o 50.
-0.6, 72.2, +0.2
EXP
Números enteros o reales con signo y con
exponente
5.2e-3, 30e20,
3e+2, -1e+10
PR_IF
PR_THEN
Palabra reservada "if"
Palabra reservada "then"
APELLIDO Y NOMBRE:__________________________________________
IF
THEN
LU:________
UNIVERSIDAD NACIONAL DE JUJUY – FACULTAD DE INGENIERÍA
Compiladores
2012
INGENIERIA EN INFORMÁTICA (2001) – LICENCIATURA EN SISTEMAS
PR_ELSE
Palabra reservada "else"
ELSE
OP_ASIGNACION
Símbolo ":="
<-
OP_DIV
Símbolo "/"
/
Se pide:
a) Expresiones regulares para ID, ENTERO, REAL y EXP.
b) Indicar los tokens reconocidos por el analizador para las siguientes entradas:
area<- 12e2/50e-x
resultado2<- var/3.3/2e-10
Ejercicio 10: Construir un analizador léxico para un lenguaje con las siguientes
especificaciones:
•
•
•
•
•
•
Los identificadores empiezan por consonante
Existen los tipos entero y caracter. (int, char)
Existe un operador de asignación (::=)
Existen operadores comparación (=, < y >)
Existen sentencias if-then-else (if {} then {} else {})
Existen funciones no anidadas sin parámetros de entrada (function f())
APELLIDO Y NOMBRE:__________________________________________
LU:________
Descargar