2012-07-15 60 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軟件包的名稱你的擴展。