2014-04-23 208 views
4

我想用OCaml分析OCaml文件(.ml)。我想將文件分解爲抽象語法樹進行分析。我試圖使用camlp4,但沒有運氣。有沒有其他人之前成功做到這一點?這是解析OCaml文件的最佳方式嗎?用OCaml解析OCaml文件

回答

5

(我假定你知道OCaml中的基本部分已經:如何編寫OCaml的代碼,如何鏈接模塊和庫,如何編寫構建腳本等等。如果你不這樣做,先學會它們。)

最好的方法是使用OCaml編譯器本身使用的真正的OCaml代碼分析器,因爲它根據定義是100%兼容的。

CamlP4還實現了OCaml解析器,但它與真正的解析器略有不兼容,解析樹有點專門用於編寫語法擴展:對任何其他類型的分析都不太好。

您可能想要使用P4解析帶有語法擴展的.ml文件。即使在這種情況下,您也應該堅持正確的解析器:您可以通過P4解析源代碼,然後使用真正的解析器將結果發送到分析器。

要使用OCaml編譯器的解析器,最簡單的方法是使用compiler-libs.common OCamlFind包。它包含OCaml編譯器的解析器和類型檢查器。

從OCaml編譯器源碼修改driver/compile.ml開始,它實現了主要的編譯階段:調用預處理器,解析,鍵入和代碼生成。要解析.ml文件,您應該修改(或簡化)Compile.implementation。對於.mli文件Compile.interface

祝你好運。

+0

感謝您的建議。這很有幫助。希望我能理解compile.ml及其限制性文檔。 – cmanning

2

難道你不能在ocaml編譯器中使用-dparsetree選項嗎?

hello.ml:

let _ = print_endline "Hello AST" 

現在編譯:

$ ocamlc -dparsetree hello.ml 

導致:

[ 
    structure_item (hello.ml[1,0+0]..[1,0+33]) 
    Pstr_eval 
    expression (hello.ml[1,0+8]..[1,0+33]) 
     Pexp_apply 
     expression (hello.ml[1,0+8]..[1,0+21]) 
     Pexp_ident "print_endline" (hello.ml[1,0+8]..[1,0+21]) 
     [ 
     <label> "" 
      expression (hello.ml[1,0+22]..[1,0+33]) 
      Pexp_constant Const_string("Hello AST",None) 
     ] 
] 

參見this blog post on -ppx extensions這對擴展點語法擴展一些信息(在OCaml 4.02中編寫語法擴展的新方法)。有各種AST操縱模塊的信息。

+0

這是有點我認爲我正在尋找。很高興知道我可以通過cli來做到這一點。現在,只需將此輸出轉換爲我可以操作的數據類型即可。 – cmanning