有人能帮我构建一个针对以下语法的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
这个好吗?
type def = Def of string * string list * expr
,或者如果你想区分变量和函数定义的话,可以使用type def = VarDef of string * expression | FunDef of string * string list * expression
。 - sepp2kdef
应该表示定义。函数定义由函数名称、函数参数名称列表和函数体(作为expr
)组成。函数的主体当然可以包含加法或乘法,但这并不重要,因为在处理def
时,您只需要将主体与函数名称和参数列表一起存储,然后在调用函数时检索该信息即可。主体是什么类型的表达式并不重要。 - sepp2k