我想用OCaml分析OCaml文件(.ml)。我想將文件分解爲抽象語法樹進行分析。我試圖使用camlp4,但沒有運氣。有沒有其他人之前成功做到這一點?這是解析OCaml文件的最佳方式嗎?用OCaml解析OCaml文件
回答
(我假定你知道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
。
祝你好運。
難道你不能在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操縱模塊的信息。
這是有點我認爲我正在尋找。很高興知道我可以通過cli來做到這一點。現在,只需將此輸出轉換爲我可以操作的數據類型即可。 – cmanning
- 1. Ocaml - 文件和解析
- 2. 用OCaml解析HTML
- 3. OCaml - 解析
- 4. 解析器爲OCaml
- 5. OCaml解析函數
- 6. Yojson解析int64(ocaml)
- 7. OCaml解析器:: case
- 8. OCaml解析列表
- 9. 解析C到Ocaml
- 10. 使用OCaml解析語法
- 11. OCaml的解析器代碼
- 12. 在ocaml中解析yaml
- 13. OCaml解析和lexing使用流
- 14. ocaml的解釋
- 15. ocaml的解析字符串,使樹
- 16. OCaml - 解析樹中級別的節點
- 17. OCaml:解析JSON到循環類型
- 18. Ocaml線程誤解
- 19. OCaml文件讀取器
- 20. OCaml中的文件轉換
- 21. 在ocaml中截斷文件
- 22. 編譯多個Ocaml文件
- 23. OCaml如何寫入文件?
- 24. ocaml的:在MLI文件
- 25. 從文件返回值 - ocaml
- 26. 剖析OCaml的編譯器
- 27. Ocaml自引用
- 28. OCaml構造函數解包
- 29. Ocaml語法解釋請嗎?
- 30. Ocaml,瞭解一個函數
感謝您的建議。這很有幫助。希望我能理解compile.ml及其限制性文檔。 – cmanning