在Ocaml中实现解释器
我正在尝试用Ocaml编写一个解释器,我已经为大多数操作定义了语法和语义。 我正在尝试执行另外两个操作: Ntimes:这有两个参数,一个整数和一个函数。Ntimes必须应用该功能n次 管道:这与linux bash中的管道相同 NTIME示例:在Ocaml中实现解释器,ocaml,interpreter,caml,Ocaml,Interpreter,Caml,我正在尝试用Ocaml编写一个解释器,我已经为大多数操作定义了语法和语义。 我正在尝试执行另外两个操作: Ntimes:这有两个参数,一个整数和一个函数。Ntimes必须应用该功能n次 管道:这与linux bash中的管道相同 NTIME示例: Ntimes(Int(4),f);; 管道示例: Pipe(f1,(f2,(f3,(f4,(f5,Nil)))));; 我的对讲机是这样的: 语法 type ide = string;; type operator = Plus | Mi
Ntimes(Int(4),f);;
管道示例:
Pipe(f1,(f2,(f3,(f4,(f5,Nil)))));;
我的对讲机是这样的:
语法
type ide = string;;
type operator = Plus | Minus | Mul | Div | And | Or | Eq;;
type exp = Int of int
| Bool of bool
| Den of string
| Op of exp * operator * exp
| Let of ide * exp * exp
| Fun of ide * exp
| Apply of exp * exp
| Ifz of exp * exp * exp
| Etup of tuple
| Pipe of tuple
| ManyTimes of int * exp
and tuple = Nil | Seq of exp * tuple;;
type dexp = Dint of int | Dbool of bool | Dstring of string | Unbound | Dtuple of dexp list | Funval of efun and efun = ide * exp * dexp env ;;
运行时支持
let rec eval ((e: exp), (r:dexp env)) = match e with
Int i -> Dint i
| Bool i -> Dbool i
.
.
.
.
| Etup e1 -> let v = (evalList e1 r) in Dtuple v
| Apply(e1, e2) -> (match eval(e1, r) with
| Funval(i, a, r1) -> eval(a, bind(r1, i, eval(e2, r)))
| _ -> failwith("no funct in apply"))
| NTimes(i,e) -> *I have no idea*
| Pipe(e) -> * I have no idea*
;;
谢谢你们给我的任何帮助 为什么不使用一个简单的
列表
而不是那些“tuple
s”?尝试将时刻
/管道
重写为应用
s,然后调用eval
。我没有使用列表
,因为我必须用tuple
实现它。元组是:元组是可以是不同类型的元素序列<代码>让p2=p2中的eval(让(“t”,Etup(序号(Int 3,序号(Int 33,序号(Bool true,Nil))),Den“t”),emptyenv Unbound)@BergiYeah,你仍然应该意识到它们形成了一个列表结构,你可以(应该)对其使用结构递归。或者你把它转换成一个exp列表
,如果这能简化它的话。@PatJ实际上作业是编写整个解释器,我只是错过了这两个操作。我不是要代码,但我只是在寻找一些想法。