PROCESADORES DE LENGUAJE (LABORATORIO) 4º Curso Ingeniería Informática Nombre: Apellidos: Junio-2008 Tiempo: 2 horas Grupo: (3 ptos) Pregunta 1: Nos piden que describamos el siguiente problema mediante una gramática que sea LL(1). El problema que se plantea es reconocer la información almacenada en un fichero referente a los datos que tienen en un juzgado sobre los procedimientos que en el se han llevado a cabo. Desde los juzgados nos informan de que en el fichero hay, al menos, información sobre un procedimiento y que los datos tienen la siguiente estructura: Fecha 06/06/2008 Letrado Francisco Álvarez de Alarcón Acusado Prudencio Índigo Fiscal Armenio Plómez. Denunciante Cuerpo de Policía Inicio Cargos Disturbio público. Inicio Cargos Con agravante por ser en la cercanía de un Colegio. Cargos Con agravante por ir bebido Fin Cargos Oposición a la autoridad. Cargos Agresión a la policía. Fin Resolucion Pasa a proceso judicial Sentencia Todavía no se ha dictado sentencia, por lo que este campo podría estar en blanco. Las palabras reservadas son: Fecha, Letrado, Acusado, Fiscal, Denunciante, Cargos, Resolucion y Sentencia, Inicio, Fin. Y como símbolo especial tenemos: “/”. Las condiciones impuestas al formato: - En el fichero de datos existe información de al menos un procedimiento, pero pueden existir más. - Cada procedimiento consta de estas 8 partes cada una de ellas introducida por la palabra reservada correspondiente y en el orden que marca el ejemplo. - Cada una de las partes termina al comenzar la siguiente y, la única parte que puede repetirse más de una vez es la correspondiente a los “Cargos”. - Detrás de las palabras reservadas: Letrado, Acusado, Fiscal y Denunciante; tiene que ir necesariamente uno o más tokens de tipo identificador, es decir, no pueden estar vacíos. - Detrás de la palabra reservada: Fecha; va especificado el día, mes y año en números y con el siguiente formato: DD/MM/AAAA. - El apartado “Cargos” puede aparecer una o más veces y debe siempre ir seguido de identificadores o de tokens ortográficos o números. Puede haber Cargos dentro de Cargos. - Los apartados referentes a Resolucion y Sentencia, deben estar siempre aunque pueden estar vacíos o aparecer identificadores o números o símbolos ortográficos. Se pide: a) (1,0 ptos.) Diseñar una gramática LL(1) que genere dicho lenguaje. b) (0,5 ptos.) Diseñar un atributo e indicar en la gramática qué acciones semánticas añadirías que nos permitan calcular cuántos cargos hay en el “procedimiento judicial”. c) (1,5 ptos.) Implementar el procedimiento que reconoce los cargos y añadir además el código necesario para la recuperación en modo de pánico en caso de que no se haya encontrado el TKN_CARGOS, indicando el correspondiente mensaje de error: qué se ha encontrado y qué se esperaba. PROCESADORES DE LENGUAJE (LABORATORIO) 4º Curso Ingeniería Informática Nombre: Apellidos: Junio-2008 Tiempo: 2 horas Grupo: (3 ptos) Pregunta 2: Dada la siguiente gramática (que es una versión reducida de la empleada en la práctica 2 donde se ha quitado la definición de registros): Program module id ; DeclarationsVar DeclarationsFunc begin StatementList end id . DeclarationsVar var id IdList : SimpleType ; VarList | DeclarationsFunc VarList IdList id IdList : SimpleType ; VarList | , id IdList | Parameter SimpleType id ParameterList | ParameterList SimpleType Statement Statement ; StatementList | AssignStm | FunctionStm | ReturnStm AssignStm id = Expression FunctionStm ReturnStm , SimpleType id ParameterList | char | integer | boolean StatementList Arg function id ( Parameter ) : SimpleType ; DeclarationsVar begin StatementList end id ; DeclarationsFunc | id ( Arg ) return id num ArgList | - num ArgList | id ArgList | - id ArgList | ArgList , num ArgList | , - num ArgList | , id ArgList | , - id ArgList | Expression → id | num | Expression * Expression | Expression / Expression | Expression - Expression | Expression + Expression | - Expression | ( Expression ) | FunctionStm a) (0,5 ptos.) Escribe la estructura de tabla de símbolos utilizada en la práctica (adaptada a este caso simplificado) y los prototipos de las funciones para el manejo de la tabla de símbolos. b) (1,0 ptos.) Realiza un programa en BISON que, utilizando tu tabla y funciones, implemente la comprobación de tipos en la llamada a funciones y en el valor de retorno de la función (en el rerturn). (Nota: Es imprescindible toda la estructura del Bison, definiciones de tokens, precedencia de operadores, etc. aunque no es necesario copiar las producciones que no se vayan a usar en este apartado o en el siguiente). c) (1,5 ptos.) Introduce las acciones necesarias para que cada vez que se evalúe una expresión aritmética, escriba en pantalla el resultado de evaluar la expresión. (Nota: Obligatorio utilizar las variables $ de BISON). Comentar las modificaciones que habría que hacer sobre el fichero de Flex para el intercambio de información entre Flex y BISON. PROCESADORES DE LENGUAJE (LABORATORIO) 4º Curso Ingeniería Informática Nombre: Apellidos: Junio-2008 Tiempo: 2 horas Grupo: (4 ptos) Pregunta 3: Sea la siguiente gramática, versión muy reducida de la gramática de la práctica 3. Program module id ; begin StatementList end id . StatementList Statement WhileStm while BoolExpression do StatementList end DoWhileStm WriteStm Statement ; StatementList | WhileStm | WriteStm | DoWhileStm do StatementList while BoolExpression end write Expression BoolExpression true | false | not BoolExpression | BoolExpression and BoolExpression | BoolExpression or BoolExpression | RelExpression RelExpression Expression Expression < Expression | Expression > Expression | Expression == Expression id | num | - id | - num a) (1,2 ptos.) Compacta la gramática (y modifícala si es necesario para tener en cuenta la precedencia de operadores) escribiéndola dentro de la clase del PCCTS MiParser e introduce los operadores para la creación del árbol sintáctico de forma que, para el siguiente ejemplo, se genere exactamente el árbol que se muestra a continuación: module Ejemplo ; begin write a; while a < -1 or b <-1 and c < 0 do write a; write b; write c; end ; end Ejemplo . Recorrido en preorden del árbol: (module Ejemplo (begin (write a ) (while (and (or (< a (UNARIO 1 ))(< b (UNARIO 1 ))) (< c 0)) do (write a )( write b )( write c )) end )) b) (2 ptos.) Implementa toda la función genera_codigo en PCCTS de forma que saque el siguiente código intermedio (el mismo que en la práctica excluyendo la cuenta de cuádruplos y variables): WRITE a NULL NULL ASSIG_C t0 1 NULL NEG t1 t0 NULL IS_LESS t2 a t1 ASSIG_C t3 1 NULL NEG t4 t3 NULL IS_LESS t5 b t4 OR t6 t2 t5 ASSIG_C t7 0 NULL IS_LESS t8 c t7 AND t9 t6 t8 NOT t10 t9 NULL //esta sería la instrucción 0 GOTO_REL t10 5 NULL WRITE a NULL NULL WRITE b NULL NULL WRITE c NULL NULL GOTO_ABS 1 NULL NULL //salto absoluto a la instrucción 1 HALT NULL NULL NULL c) (0,8 ptos.) Indica las modificaciones a realizar y como variaría el código para que, si en lugar del WHILE … DO tuviésemos el DO … WHILE y se tuviese que obtener la misma salida de cuádruplos que en el caso anterior.