要解析 Haskell 代码,您可以使用
- Haskell-src http://hackage.haskell.org/package/haskell-src
- or Haskell-src-exts http://hackage.haskell.org/package/haskell-src-exts
后者处理所有 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 http://www.haskell.org/haskellwiki/GHC/As_a_library它还可以让您检查解析的代码,或者只是运行ghc -c
在你的档案上。
对于解析C代码,有c语言 http://hackage.haskell.org/package/language-c.
如果您需要解析其他语言,请查看this http://hackage.haskell.org/packages/archive/pkg-list.html#cat%3alanguageHackage 上的类别。例如,这里是S 表达式的解析器 http://hackage.haskell.org/package/lispparser.