Procesadores del Lenguaje 1 Universidad Rey Juan Carlos Departamento de Lenguajes y Sistemas Informáticos I 8 de junio de 2009 Parcial primero. Conceptos básicos y problemas. Entrega en 90 minutos. Lea atentamente todo el enunciado de cada pregunta antes contestar. Especifique nombre y apellidos en todas las hojas que entregue. Cualquier suposición o decisión sobre el enunciado del examen debe ser detallada y justificada convenientemente. Apellidos y Nombre: Número de expediente: Conceptos básicos: 1,2 puntos Para poder aprobar el examen es obligatorio responder correctamente al menos a 4 de las 6 cuestiones a continuación planteadas. Especifique en el espacio siguiente a cada cuestión, si su contenido es cierto o falso, explicando su respuesta si lo cree necesario. La puntuación del apartado, siempre que el número de fallos pregunta sin responder o respondida erróneamente sea menor que 3, será: 1,2-(0,6*NúmeroDeFallos) 1. La gestión de la tabla de símbolos es exclusiva de las fases de análisis de un compilador mientras que la gestión de errores se usa tanto en las fases de análisis como de síntesis. FALSO, la gestión de la tabla de símbolos no es exclusiva de las fases de análisis puesto que también se puede usar en la generación de código intermedio y final de un compilador. La gestión de errores sí es exclusiva de las fases de análisis. 2. ([0-9])+. ([0-9])+ es el lexema que define al patrón constante_real, del cuál, un posible componente léxico es 34.8. FALSO, ([0-9])+. ([0-9])+ es el patrón, constante_real es el componente léxico y 34.8 es un lexema 3. Los autómatas finitos deterministas implementan analizadores léxicos, al igual que los autómatas de pila implementan analizadores sintácticos. FALSO. Efectivamente, un autómata de pila basta para implementar un analizador sintáctico, sin embargo para implementar un analizador léxico necesitamos un traductor finito determinista, es decir un autómata finito determinista ampliado con acciones semánticas.
Procesadores del Lenguaje 2 4. El último símbolo en aparecer en la pila de un analizador LL(1) es el axioma de la gramática. FALSO, los analizadores LL(1) funcionan por derivaciones a partir del axioma, por lo tanto este será el primer símbolo en aparecer en la pila, no el último. 5. Los analizadores sintácticos LR(1) se basan en derivación más a la derecha (Rightmost derivation). CIERTO. 6. Los analizadores ascendentes funcionan con las operaciones de desplazamiento/reduccion. CIERTO. Problema. (4 puntos) El lenguaje de descripción de hardware Verilog permite diseñar e implementar dispositivos donde se trabaja, entre otras posibilidades, con valores numéricos enteros. Algunas de las características de este lenguaje son: El espacio en blanco se usa para separar los tokens de los programas escritos en este lenguaje. Se permite especificar constantes en distintas bases numéricas. Se permite especificar constantes numéricas informando sobre su tamaño en bits. Esta información, aunque no es obligatoria, debe comunicarse al analizador semántico siempre que sea especificada por el programador. Independientemente de la base y tipo de constantes numéricas enteras, estas irán precedidas opcionalmente del signo correspondiente + o -, si no existe signo se supone que la constante numérica es positiva. Las posibles bases para especificar constantes numéricas son: binaria, octal, decimal y hexadecimal. Las constantes en base decimal son simples ristras de dígitos en base decimal. Sin embargo las constantes escritas en el resto de bases (binaria, octal y hexadecimal) deben especificar el tamaño en bits que van a ocupar así como la base en que están escritas. El formato de estas constantes es: una ristra de dígitos decimales que indica el tamaño en bits de la constante, un espacio en blanco opcional, una comilla simple e inmediatamente después la identificación de la base con la letra correspondiente b(binaria), o(octal) o h(hexadecimal), finalmente y separado de forma opcional por otro espacio en blanco la ristra de dígitos que indica el valor de la constante. Por motivos de legibilidad, en este lenguaje se permiten intercalar guiones bajos _ en cualquier ristra de dígitos, salvo al principio de la misma. A continuación se muestran algunos ejemplos correctos y erróneos de constantes numéricas enteras escritas según este lenguaje. Nótese que el caracter denota un espacio en blanco en los ejemplos y las comas separan los distintos ejemplos, pero ninguno de los dos caracteres forma parte del alfabeto de Verilog a contemplar en este ejercicio:
Procesadores del Lenguaje 3 Base Ejemplos correctos Ejemplos erróneos Decimal +0123, -45_6, 0_89 1 +_0123, -456A, 0_8G91 Binaria -4 b1_00, +5 b 01001, 3_0 b11_1-4 b+01_110, +5 b 0201 _3 b11_1 Octal -6 o5_3, +3 o 2, 1_2 o 77_1-6 o05_3, +3 o 8, _6 o7_1 Hexadecimal -8 h3_f, +4 h A, 02_0 h7d7_1-8 hb3_f, +4 h Q, _4 hd Los errores léxicos detectables mediante la inexistencia de transiciones en el autómata no tienen que notificartse explícitamente, pero el resto de errores léxicos sí. Para realizar tareas de traducción se permite el uso de las siguientes funcionalidades: ConvEnt(base, ristra-de-dígitos) Permite obtener el valor numérico de una ristra de dígitos sin signo, según la base especificada. ErrorLex(Mensaje) Permite notificar un error léxico que no haya sido detectado por el autómata. Además se podrá hacer uso de construcciones if-then-else, siempre que no sustituyan funcionalidades implementables mediante el autómata, así como variables, sentencias de asignación y expresiones aritméticas (suma, resta, multiplicación o división). Se pide, justificando las respuestas convenientemente, diseñar la parte del analizador léxico referente a las constantes numéricas enteras, sin cambiar los formatos descritos: 1. Determinar y explicar qué tokens devolverá el analizador léxico. 2. Construir el autómata finito determinista que los reconoce. 3. Definir las acciones semánticas necesarias y construir el traductor finito determinista. Solución al Problema. (4 puntos) 1. Determinar y explicar qué tokens devolverá el analizador léxico. Hay que diferenciar entre los tokens y las facilidades que se le ofrece al programador a la hora de especificar valores enteros. Las distintas bases pertenecen a estas últimas, no son tokens. El token básico representará a las constantes enteras <CTE-ENT, valor>. Sin embargo en el enunciado se especifica claramente: Se permite especificar constantes numéricas informando sobre su tamaño en bits. Esta información, aunque no es obligatoria, debe comunicarse al analizador semántico siempre que sea especificada por el programador. Por lo tanto devolveremos el token <CTE-ENT, valor> para las constantes numéricas y el token <CTE-ENT, valor, tamaño> para las constantes enteras en base binaria, octal y hexadecimal en las que se especifica siempre el tamaño.
Procesadores del Lenguaje 4 2. Construir el autómata finito determinista que los reconoce. Tanto en el autómata como en el traductor usaremos las siguientes definiciones regulares para los dígitos de las distintas bases numéricas: Base binaria: db [01] Base octal: do [0-7] Base decimal: d [0-9] Base hexadecimal: dh [0-9A-Fa-f] En primer lugar vemos el autómata que reconoce constantes numéricas en base decimal. Además este autómata reconocerá la longitud de las constantes en base binaria, octal y hexadecimal. A continuación vemos la parte del autómata que reconoce constantes en el resto de bases numéricas. Parte de este autómata se especifica de forma genérica para las tres bases numéricas: x α y z t 7 db 11 12 13 8 do 14 15 16 9 dh 17 18 19 Donde x representa a los estados de inicio de reconocimiento de la ristra de dígitos binarios(x = 7), octales(x = 8) o hexadecimales(x = 9). α representa a la definición regular correspondiente a los dígitos de la base que corresponda. Finalmente, los estados y, z y t aseguran el reconocimiento diferenciado del resto de la ristra de dígitos para cada base numérica. 3. Definir las acciones semánticas necesarias y construir el traductor finito determinista. La acción de leer el siguienbte caracter está implícita en cada transición del autómata, el resto de acciones semánticas a utilizar son: C Concatenar el carácter leído en el buffer de lexema. B Borrar el buffer de lexema. R Retroceder el puntero de lectura en una posición. P signo = 1;
Procesadores del Lenguaje 5 N signo = -1; D<... > Devolver token al analizador sintáctico con la información especificada entre <y >. DEC D<CTE-ENT, signo*convent(10,lexema)>; B; R; T tamaño = ConvEnt(10,lexema); cuenta=0; B; Bb base = 2; Dim = 1; /*1 bit por cada dígito binario*/ Bo base = 8; Dim = 3; /*3 bits por cada dígito octal*/ Bh base = 16; Dim = 4; /*4 bits por cada dígito hexadecimal*/ CC cuenta = cuenta + 1; C; RES if(cuenta*dim >tamaño) then ErrorLex( ERROR: El valor de la constante,lexema, en base,base, no se ajusta al tamaño especificado ); else D<CTE-ENT-D, signo*convent(base,lexema), tamaño>; B; En primer lugar vemos el traductor correspondiente a las constantes numéricas en base decimal. Además este traductor detectará la longitud de las constantes en base binaria, octal y hexadecimal. A continuación vemos la parte del traductor correspondiente a las constantes en el resto de bases numéricas. De nuevo parte de este traductor se especifica de forma genérica para las tres bases numéricas: x α y z t 7 db 11 12 13 8 do 14 15 16 9 dh 17 18 19
PROCESADORES DEL LENGUAJE CRITERIOS DE CORRECCIÓN JUNIO 2009 PARCIAL 1º Conceptos básicos (1,2 puntos) Especificado en el enunciado. Test de teoría (4,8 puntos) Especificado en el enunciado. Analizador léxico (4 puntos) Penalizaciones muy graves: Usar transiciones sin etiquetar. Usar transiciones con la misma entrada y desde el mismo estado que lleven a estados distintos. Usar definiciones regulares sin contenido, que provoquen no determinismo. Usar transiciones con origen en estados finales. Penalizaciones graves: Reconocimiento incorrecto: reconocer cadenas incorrectas o no reconocer cadenas correctas. No utilizar delimitadores cuando se debe. Omisión de acciones semánticas necesarias. Orden de ejecución de acciones semánticas incorrecto. No especificar correctamente el token devuelto. No reconocer/devolver el tamaño de las constantes. No reconocer el error léxico provocado por el tamaño. Realizar los cálculos erróneos. Usar acciones semánticas sin definir. Usar definiciones regulares sin contenido. No devolver valor asociado a los token. Penalizaciones leves: Mala utilización de la API de cálculo. No tratar el signo. Devolver por bases las constantes enteras.