2012-09-18 102 views
6

作爲學習Haskell(和折磨自己)的練習,我正在考慮編寫一個可配置的Haskell代碼美化器。Haskell解析器到AST

它將支持(或更好的東西?)寫在JSON或YAML的配置文件指定像進口排序,排序/分組dataclass語句,章節之間的行數等

我的選擇尋找Haskell 98的解析器,生成抽象語法樹(AST)並保留評論。解析GHC及其語言擴展將是一項獎勵。

在沒有這樣的事情的情況下,我想我可以編寫一個遞歸下降解析器或一個使用Parsec或解析器生成器。也許滾動我自己會增加學習(和酷刑:-))。

是否有一個完整的Haskell-> AST解析器在其中一個開源許可下可用?如果我在這個項目上取得進展,我會把它放在github上。

+0

我的一個寵物小偷是醜陋的代碼。我的大部分工作都是用Java編寫的,它讓我驚訝於人們如何檢查代碼中沒有大括號對齊,操作符間的間距不一致等等。他們不讀他們自己的代碼嗎?它不打擾他們嗎?也許是我的強迫症。無論如何,我同意開箱即用的Haskell是一個更好看的數量級。但我仍然想寫一個美化:-)。 – Ralph

+0

是的。我真的在開玩笑,因爲我喜歡你建議的那種事情。爲什麼不把haskell本身用於配置文件的語言?我確定我讀了一些關於某人漸漸發展他們的域配置語言的知識,直到他們意識到他們只是想要haskell,但[this](http://www.jmreardon.com/posts/2011-07-17-typesafe-config -in-haskell.html)是我能找到的最接近的。或者你可以使用[ConfigFile](http://hackage.haskell.org/package/ConfigFile)包。 – AndrewC

回答

16

haskell-src-exts軟件包中有一個解析器。解析器不僅解析大部分GHC擴展,它也可以識別常見的擴展,如語法XML文字等。如果您還想訪問評論信息,則應該使用parseModuleWithComments函數。

但是請注意,註釋並未存儲在實際的語法樹中;它們作爲單獨的評論列表與位置信息一起存儲。如果您真的需要在樹中包含註釋,那麼通過使用線性合併算法將樹與列表合併(兩個序列可以被視爲「排序」),將註釋包含在樹中應該是相當簡單的。註釋甚至可以與關聯的AST節點一起存儲,因爲「註釋」的AST可以包含每個節點中的任意元數據(默認情況下,只有SrcSpanInfo)。之所以在實際的haskell-src-exts包中沒有這樣做,大概是因爲AST解析器是在註釋解析器之前編寫的。

2

我寫了一個超級簡單的工具,它自動生成Haskell代碼。它通過使用來自haskell-src-exts的解析和漂亮打印功能來完成。你可以在https://github.com/djv/small/blob/master/tidy.hs找到它。這可能是更靈活和強大的一個開始。