2012-10-12 83 views
7

alguien puede darme alguna ayuda la construcción de un intérprete para el lenguaje ocaml con la sintaxis:ocaml intérprete

Prog ::= Def* Expr 
Def ::= id id* = Expr 
Expr ::= int | id | Expr '+' Expr | Expr '*' Expr | id Expr* | if Expr then Expr else Expr 

hasta el momento que hice esto:

type expr = I of int 
| Id of string 
| Add of expr * expr 
| Multiply of expr * expr 
| If of expr * expr * expr 

let rec evaluate = function 
| I n -> n 
| Add(e1,e2) -> evaluate e1 + evaluate e2 
| Multiply(e1,e2) -> evaluate e1 * evaluate e2 
| If(a,b,c) -> if evaluate a<>0 then evaluate b else evaluate c 

Es esto bueno?

Respuesta

6

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.

+0

¿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

+0

@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

+0

¿Puede mostrarme el tipo def de Agregar y Multiplicar en mi intérprete para que pueda comprenderlo por completo? – Spreadzz