2012-07-15 63 views
2

我有一些代码,包括用于特定语言(逻辑)一个menhir基于解析器。对于我的理智,而调试的缘故,这将是巨大的,可以直接在像这样的顶级键入(公式)这种语言的实例:在OCaml顶层嵌入领域特定语言 - 对Camlp4还是不?

# f = << P(x,y) & x!=y >> 

campl4/5我唯一的选择?如果是的话,我觉得文件相当吓人。是否有一个示例/教程与我的用例非常接近,我可以想象适应吗? (例如,引入新关键字的语法扩展似乎不相关)。谢谢!

回答

4

如果您愿意调用函数来执行解析,则可以使用ocamlmktop将解析器包含到顶层。然后,您可以使用#install_printer为您的类型安装打印机。会议可能看起来像这样然后:

# let x = parse() 
<< type your expression here >> 
# x : type = <<formatted version>> 

我已经使用specialed打印机,他们肯定帮助了很多与复杂的类型。我从来没有得到使用ocamlmktop。我总是只加载我的代码#load#use

这比掌握camlp4/5(恕我直言)容易很多。但也许这太粗暴了。

+0

谢谢,这是低维护方法的一个好处。使用字符串解析器可以将其改进到几乎完全符合我的要求:'#f = parse_str(“P(x,y)&x!= y”);;' – Nikos 2012-07-15 18:07:34

3

是的,你可以使用camlp4,它可以很好地工作(包括在顶层),但不,它没有很好的记录,你将不得不应对这一点。

有关与您的用例相近的示例,请参阅Camlp4 wiki的Lambda calculus quotation示例。

对于顶层,它将很容易工作。您可以动态加载“camlp4o.cmo”,然后在顶级语法扩展中使用您的语法扩展,或者使用findlib,它可以处理:从顶级的#use "topfind";;,然后#camlp4o;;,然后#require "myfoo.syntax";;,其中myfoo.syntax是您创建的用于部署的findlib软件包的名称你的扩展。