En su gramática, una única identificación puede ser igualada por la producción Expr ::= id
o Expr ::= id Expr*
. En otras palabras, no hay forma de distinguir entre una aplicación de función nullary (suponiendo que se supone que la producción de id Expr*
coincide con las aplicaciones de función) y las variables. Quizás se refirió a id Expr+
en su lugar (no permite aplicaciones de funciones nullary).
su código existente se ve bien, pero es incompleta:
Su tipo expr
le falta un constructor para la producción id Expr*
de la gramática, es decir, que se está perdiendo un constructor que representa aplicaciones de función. Debe agregar uno y luego agregarle un caso a la función evaluate
también.
En su función evaluate
, falta un caso para el constructor Id
. Ese caso debe buscar el valor del identificador dado en una asignación de identificadores a valores (ints). Para ello, su función evaluate
debe tomar dicha asignación como un argumento adicional. También debería tomar otra asignación de identificadores a funciones, que luego puede usar para vincular nombres de funciones en el caso de aplicaciones de funciones.
Hablando de esas asignaciones, actualmente no tiene ningún código para representar o procesar las definiciones. Debería encontrar un tipo para representar una definición y otro para representar funciones. El último tipo debe contener el nombre de los parámetros de la función y el cuerpo como expr
.
Luego debe escribir una función que tome una lista de definiciones y cree las asignaciones para variables y funciones. Para cada definición de variable, debe evaluar la expresión de la derecha y agregar los valores resultantes a su asignación de variables. Para cada definición de función, debe agregar un valor de su tipo de función a la asignación de función. Después de procesar las definiciones, debe evaluar la expresión final llamando a su función evaluate
con esa expresión y las dos asignaciones que creó como argumentos.
Finalmente, no tiene ningún código para analizar realmente el programa, pero creo que podría ser intencional.
¿Puede mostrarme un ejemplo de un código para representar el proceso de las definiciones? No necesito código para analizar, y no escribí el constructor de Id porque no sabía cómo, si me puede mostrar por favor. – Spreadzz
@Spreadzz El tipo sería algo así como 'tipo def = Def de cadena * lista de cadenas * expr' o, si desea distinguir entre las definiciones de variables y funciones,' escriba def = VarDef de cadena * expresión | FunDef de cadena * lista de cadenas * expresión'. – sepp2k
¿Puede mostrarme el tipo def de Agregar y Multiplicar en mi intérprete para que pueda comprenderlo por completo? – Spreadzz