我有一些代碼,包括用於域特定語言(邏輯)一個menhir
基於解析器。對於我的理智,而調試的緣故,這將是巨大的,可以直接在像這樣的頂級鍵入(公式)這種語言的實例:在OCaml頂層嵌入領域特定語言 - 對Camlp4還是不?
# f = << P(x,y) & x!=y >>
是campl4/5
我唯一的選擇?如果是的話,我覺得文件相當嚇人。是否有一個示例/教程與我的用例非常接近,我可以想象適應嗎? (例如,引入新關鍵字的語法擴展似乎不相關)。謝謝!
我有一些代碼,包括用於域特定語言(邏輯)一個menhir
基於解析器。對於我的理智,而調試的緣故,這將是巨大的,可以直接在像這樣的頂級鍵入(公式)這種語言的實例:在OCaml頂層嵌入領域特定語言 - 對Camlp4還是不?
# f = << P(x,y) & x!=y >>
是campl4/5
我唯一的選擇?如果是的話,我覺得文件相當嚇人。是否有一個示例/教程與我的用例非常接近,我可以想象適應嗎? (例如,引入新關鍵字的語法擴展似乎不相關)。謝謝!
如果您願意調用函數來執行解析,則可以使用ocamlmktop
將解析器包含到頂層。然後,您可以使用#install_printer
爲您的類型安裝打印機。會議可能看起來像這樣然後:
# let x = parse()
<< type your expression here >>
# x : type = <<formatted version>>
我已經使用specialed打印機,他們肯定幫助了很多與複雜的類型。我從來沒有得到使用ocamlmktop
。我總是隻加載我的代碼#load
和#use
。
這比掌握camlp4/5(恕我直言)容易很多。但也許這太粗暴了。
是的,你可以使用camlp4,它可以很好地工作(包括在頂層),但不,它沒有很好的記錄,你將不得不應對這一點。
有關與您的用例相近的示例,請參閱Camlp4 wiki的Lambda calculus quotation示例。
對於頂層,它將很容易工作。您可以動態加載「camlp4o.cmo」,然後在頂級語法擴展中使用您的語法擴展,或者使用findlib,它可以處理:從頂級的#use "topfind";;
,然後#camlp4o;;
,然後#require "myfoo.syntax";;
,其中myfoo.syntax
是您創建的用於部署的findlib軟件包的名稱你的擴展。
謝謝,這是低維護方法的一個好處。使用字符串解析器可以將其改進到幾乎完全符合我的要求:'#f = parse_str(「P(x,y)&x!= y」);;' – Nikos 2012-07-15 18:07:34