在OCaml中编写一名翻译

时间:2015-12-06 17:33:46

标签: ocaml interpreter ml

我正在我的大学学习一门课程,要求我在OCaml中编写一个从其操作语义开始的语言翻译。不幸的是,除了课程幻灯片之外,他们没有给我们提供太多可以从中学习的资源。有人可以建议我一些书或一些网站,我可以找到它(或类似的)? 感谢。

3 个答案:

答案 0 :(得分:4)

可能你应该尝试B. Pierce的Types and Programming Languages,这可能是关于这个主题的一个很好的参考(特别是如果你的输入语言是有用的)。

如果你想深入了解语义,我会建议G. Winskel Formal Semantics of Programming Languages。但它不会帮助您实施。

最后,如果您需要编译语言而不是解释它,那么您应该看看A. Appel的Modern Compiler Implementation in ML

但是这些书可能对你想做的事情有些过分(你的讲座应该足够了)。

答案 1 :(得分:2)

一旦你拥有一个代表语言的合适数据类型,它主要是按规则翻译语义,使用模式匹配。

例如,鉴于这种简单的语言具有整数文字,加法和可赋值变量:

type Expression = Literal of int | Variable of string | Addition of Expression * Expression;;
type Statement = Assignment of string * Expression | Sequence of Statement * Statement;;

和用于存储变量值的商店:

type Store = <something>
lookup : Store -> string -> int
update : Store -> string -> int -> Store

我们可以定义像这样的语义函数(我将跳过正式定义语义的步骤):

let semE store = function
   | Literal l -> l
   | Variable x -> lookup store x
   | Addition e1 e2 -> (semE e1 store) + (semE e2 store);;

let semS store = function
   | Assignment x e -> update store x (semE e store)
   | Sequence (s1, s2) -> let store' = semS store s1 
                          in semS store' s2;;

这是该语言的完整解释器,但它没有用于将语言的语法转换为上述表示的解析器。

例如,

semS (Sequence (Assignment "x" (Literal 3), 
                Assignment "x" (Addition (Variable "x") (Literal 1)))) 
      empty_store

可能会在输入语言中显示为x := 3; x := x + 1,应该会生成Store,其中x的值为4

答案 2 :(得分:1)

我会建议这个MOOC(英文!):ocamlmooc

书籍(我使用的那些......但还有很多其他的):
Developping applications with Ocaml
real world ocaml

在第一本书中,看看Chapter 6,这应该是你。