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