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