CC41A Lenguajes de Programación
Martes 3 Abril
Los siguientes problemas deben ser enviados en un solo archivo de
nombre
abc2.sml (donde abc son las
inciales de su nombre y dos apellidos; por ejemplo
el archivo de José Fernández Herrera será jfh2.sml;
el 2 es por tarea 2)
en attachment a cgutierr@dcc.uchile.cl
con subject abc1.sml. Si el archivo no compila directamente,
la tarea tiene un 1.
Considere la gramática formal
E -> E and E | E or E | not E | (E)
E -> true | false
donde la precedencia es: not > and > or. Para este ejercicio no consideraremos asociatividad (de hecho no influye en la evaluación final). Definamos los siguientes tipos de datos:
datatype Simbolo = AND | OR | NOT | TRUE | FALSE | Pder | Pizq
datatype Arbol = T | F | Nodo of Simbolo*Arbol*Arbol |
Neg of Arbol
Para cada item más abajo escriba una función con el nombre dado que compute el problema respectivo.
procLexico .
Tipo string -> Simbolo list que tome una expresión
escrita en la gramática y retorne la lista de Simbolos que forman
la expresión. Por ejemplo
procLexico "true or (not false)" = [TRUE, OR, Pder, NOT, FALSE, Pizq] .
procSintactico .
Tipo Simbolo list -> Arbol .
Toma una lista de símbolos y computa el arbol sintáctico
correspondiente. Ejemplo:
procSintactico [TRUE, OR, Pder, NOT, FALSE, Pizq] =
Nodo (OR, T, Neg F) .
eval . Tipo Arbol -> bool .
Evalua el arbol sintáctico.
Ejemplo:
eval Nodo (OR, T, Neg F) = true .