繁体   English   中英

ocaml解释器

[英]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 ::= idExpr ::= id Expr*匹配。 换句话说,没有办法区分空函数应用程序(假设id Expr*生产应该与函数应用程序匹配)和变量。 也许您的意思是id Expr+ (禁止使用空函数)。

您现有的代码看起来不错,但是不完整:

您的expr类型缺少语法的id Expr*生成的构造函数,即,您缺少表示函数应用程序的构造函数。 您应该添加一个,然后再将一个案例添加到evaluate函数中。

在您的evaluate函数中,您缺少Id构造函数的大小写。 这种情况下应该在从标识符到值(int)的映射中查找给定标识符的值。 为此,您的evaluate函数应将此类映射作为附加参数。 它还应采用从标识符到函数的另一种映射,然后在函数应用程序的情况下,可以使用它们来映射函数名称。

说到这些映射,您目前没有任何代码可以表示或处理定义。 您应该提出一个代表定义的类型,另一个代表函数。 后一种类型应包含函数参数的名称,主体应为expr

然后,您应该编写一个函数,该函数带有定义列表,并为变量和函数创建映射。 对于每个变量定义,它应该评估右边的表达式,并将结果值添加到变量映射中。 对于每个函数定义,应在函数映射中添加函数类型的值。 在处理完定义之后,您应该通过调用带有该表达式的evaluate函数和作为参数创建的两个映射来评估最终表达式。

最后,您没有任何代码可以实际解析程序,但是我认为这可能是故意的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM