Laboratorio

Anuncio
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.
Descargar