Prácticas Compiladores Solución Problemas 1. A que parte del compilador proporciona datos el analizador morfológico. Solución Al sintáctico (según la esquema). 2.¿Quien a quien llama? • el sintáctico al morfológico. • el morfológico al sintáctico. • Depende del lenguaje. Solución El sintáctico llama al morfológico si se trata de un solo programa con un hilo. La respuesta es consecuencia de la respuesta del problema 1. Problemas 3...6. Se supone que tenemos un lenguaje donde todos los identificadores están escritos en mayúscula y contienen mas de 2 letras. 3. Dada la siguiente función pre-hash prh = id[0]ˆid[1]; ¿Cuantos bines no vacı́os puede tener un hash con tabla de tamaño N=1000 elementos? Solución No más que 32 bines no vacı́os. 0 0 A tiene código 01000001B y 0 Z 0 – 01011010B. Por lo tanto los primeros 3 bits del resultado son 000. Hay que comprobar que para cualquer valor v entre 0 y 31 existen letras cuyo xor da v. Si v < 16 y v 6= 1, v ˆ 0 A0 produce codigo de una letra que está entre ’A’ y ’O’ y v =0 A0 ˆv ˆ 0 A0 . v = 1 se consigue con 0 A0 ˆ 0 C 0 . Si v > 15, utilizando 0 P 0 = 01010000B o 0 Q0 y una letra entre 0 A0 y 0 O0 se consiguen en manera parecida todos los valores entre 16 y 31. 4. Ídem problema 3 para prh = id[0] + id[1]; 1 Solución: Hay 26+26=52 posibles resultados, porque los códigos ASCII de ’A’ a ’Z’ son 26 números consecutivos. 5. Si los identificadores contienen solo las letras ’A’ ’B’ y ’C’ con igual probabilidad y la función pre-hash es prh = id[0] + id[1]; dar limitación superior del tiempo medio del acceso al hash con 81000 elementos almacenados, si cada comparación tarda 1 ms y numero de bines 10000. Solución: Notar que hay valores duplicados, por ejemplo, ’A’+’B’=’B’+’A’. Los valores posibles del pre hash son ((0 A0 +0 A0 ), (0 A0 +0 B 0 ,0 B 0 +0 A0 ), (0 A0 +0 C 0 ,0 B 0 +0 B 0 ,0 C 0 +0 A0 ), (0 B 0 +0 C 0 ,0 C 0 +0 B 0 ), (0 C 0 +0 C 0 )) entonces hay 5 grupos con probabilidades pi = (1/9, 2/9, 3/9, 2/9, 1/9). El numero de bines es mayor que 5. Por lo tanto el tiempo medio de comparaciones no es mejor que T = X 1 × 1ms × 81000elementos × p2i = 9.5seg. 2 También se acepta respuesta 19 seg. porque no está especificado de qué tipo de acceso se trata. 2 Todavı́a estáis a tiempo 6. Problema para resolver en casa (no obligatorio). Utilizando la funcionalidad del hash de la primera practica y un fichero de casi todas las palabras en ingles (part-of-speech.txt), hacer un comprobador de ortografı́a con entrada un fichero de palabras (palabra por linea), que para cada palabra no encontrada el part-of -speech.txt, escribe la pantalla por pantalla. La funcionalidad del programa tiene que estar igual al del siguiente script: awk ’{if (FILENAME=="pos/part-of-speech.txt") dict[\$1]=1; else { if (\$1 in dict) ; else print \$1;} }’ pos/part-of-speech.txt pos/part-of-speech.txt se puede conseguir, por ejemplo de: http://prdownloads.sourceforge.net/wordlist/pos-1.tar.gz?use mirror=umn Se puede utilizar el siguiente script para separar un texto en palabras: sed ’s/[^a-zA-Z]/ /g’ | awk ’\{for(i=1;i<=NF;i++) print upper(\$i);\}’ 3