[英]ocaml interpreter
有人可以帮我一些帮助,用语法为该语言构建ocaml解释器:
Prog ::= Def* Expr
Def ::= id id* = Expr
Expr ::= int | id | Expr '+' Expr | Expr '*' Expr | id Expr* | if Expr then Expr else Expr
到目前为止,我做到了:
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
这样好吗?
在语法中,单个id可以与生产Expr ::= id
或Expr ::= id Expr*
匹配。 换句话说,没有办法区分空函数应用程序(假设id Expr*
生产应该与函数应用程序匹配)和变量。 也许您的意思是id Expr+
(禁止使用空函数)。
您现有的代码看起来不错,但是不完整:
您的expr
类型缺少语法的id Expr*
生成的构造函数,即,您缺少表示函数应用程序的构造函数。 您应该添加一个,然后再将一个案例添加到evaluate
函数中。
在您的evaluate
函数中,您缺少Id
构造函数的大小写。 这种情况下应该在从标识符到值(int)的映射中查找给定标识符的值。 为此,您的evaluate
函数应将此类映射作为附加参数。 它还应采用从标识符到函数的另一种映射,然后在函数应用程序的情况下,可以使用它们来映射函数名称。
说到这些映射,您目前没有任何代码可以表示或处理定义。 您应该提出一个代表定义的类型,另一个代表函数。 后一种类型应包含函数参数的名称,主体应为expr
。
然后,您应该编写一个函数,该函数带有定义列表,并为变量和函数创建映射。 对于每个变量定义,它应该评估右边的表达式,并将结果值添加到变量映射中。 对于每个函数定义,应在函数映射中添加函数类型的值。 在处理完定义之后,您应该通过调用带有该表达式的evaluate
函数和作为参数创建的两个映射来评估最终表达式。
最后,您没有任何代码可以实际解析程序,但是我认为这可能是故意的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.