2011-06-02 86 views
13

在hackage中是否有任何庫可以解析haskell代碼並檢查它是否是有效代碼?庫來解析和檢查Haskell代碼?

我願意打了一下與進化模型,我想檢查的代碼生成字符串將編譯而不必將它們寫入磁盤並運行編譯器。

理想情況下,能夠在字符串中運行代碼也很好,但只能檢查代碼的有效性。

如果你知道關於檢查其他語言(LISP,C,...),這將是很好過的解析器庫(在Haskell)。

+1

請參閱http://stackoverflow.com/questions/6065951/parsing-haskell-preserving-comments-formatting – 2011-06-02 01:18:26

+2

有一個明顯的觀點 - 「首先不要生成語法錯誤的程序」。 Haskell中有許多EDSL遵循這個格言。即使對於遺傳編程,您也應該能夠生成有效的代碼。 – 2011-06-02 06:52:38

+1

@stephen tetley嗨。我有一個特定的原因允許錯誤的程序。我對使用遺傳編程生成解決特定問題的程序不感興趣,但我對代碼字符串的演變感興趣。我只想看看我是否可以編寫一個適應函數,使得語法上正確的程序能夠從自我複製的隨機字符串羣發展而來。這不是一個CS問題,但也許是理論上的生物學問題。這似乎不太可能,但我想試試。 :) – 2011-06-02 12:38:36

回答

14

爲了解析Haskell代碼,您可以使用只

後者處理所有的GHC擴展(然後一些),而前者解析Haskell 98.以下是使用示例:

Prelude> import Language.Haskell.Exts.Parser 

Prelude Language.Haskell.Exts.Parser> parseModule "main = putStrLn \"Hello\"" 
ParseOk (Module (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 1}) (ModuleName "Main") [] Nothing (Just [EVar (UnQual (Ident "main"))]) [] [PatBind (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 1}) (PVar (Ident "main")) Nothing (UnGuardedRhs (App (Var (UnQual (Ident "putStrLn"))) (Lit (String "Hello")))) (BDecls [])]) 

Prelude Language.Haskell.Exts.Parser> parseModule "main == putStrLn \"Hello\"" 
ParseFailed (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 25}) "TemplateHaskell is not enabled" 

注意,即使代碼解析正確的,但這並不意味着它會進行類型檢查:

Prelude Language.Haskell.Exts.Parser> parseModule "main = putStrLn2 \"Hello\"" 
ParseOk (Module (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 1}) (ModuleName "Main") [] Nothing (Just [EVar (UnQual (Ident "main"))]) [] [PatBind (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 1, srcColumn = 1}) (PVar (Ident "main")) Nothing (UnGuardedRhs (App (Var (UnQual (Ident "putStrLn2"))) (Lit (String "Hello")))) (BDecls [])]) 

因此,對於您的具體使用情況下,它可能是更好的使用GHC API這也可以讓你進行類型檢查解析的代碼,或只是在您的文件上運行ghc -c

爲了解析C代碼,有language-c

如果你需要分析一些其他的語言,看看this類別上Hackage。例如,這裏是a parser for S-expressions

+1

另請參閱[提示](http://hackage.haskell.org/package/hint),以獲取更簡單的方法來連接到GHC API。 – luqui 2011-06-02 01:42:55

+0

太棒了!謝謝!! – 2011-06-02 11:56:43

+0

您提到了language-c。你知道這個包的文檔/示例代碼的好來源嗎? – 2016-04-03 02:59:27