Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 要解析和检查Haskell代码的库?_Parsing_Haskell_Code Generation - Fatal编程技术网

Parsing 要解析和检查Haskell代码的库?

Parsing 要解析和检查Haskell代码的库?,parsing,haskell,code-generation,Parsing,Haskell,Code Generation,hackage中是否有任何库可以解析haskell代码并检查其是否有效 我愿意使用一个进化模型,我想检查生成的代码字符串是否可以编译,而无需将它们写入磁盘并运行编译器 理想情况下,也可以在字符串中运行代码,但只检查代码的有效性是可以的 如果您了解检查其他语言(lisp、C等)的解析器库(在haskell中),那也很好 要解析Haskell代码,可以使用 或 后者处理所有GHC扩展(然后是一些),而前者只解析Haskell 98。下面是一个用法示例: Prelude> import L

hackage中是否有任何库可以解析haskell代码并检查其是否有效

我愿意使用一个进化模型,我想检查生成的代码字符串是否可以编译,而无需将它们写入磁盘并运行编译器

理想情况下,也可以在字符串中运行代码,但只检查代码的有效性是可以的


如果您了解检查其他语言(lisp、C等)的解析器库(在haskell中),那也很好

要解析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>import Language.Haskell.Exts.Parser
Prelude Language.Haskell.Exts.Parser>parseModule“main=putStrLn\“Hello”
ParseOk(Module(SrcLoc{srcFilename=“.hs”,srcLine=1,srcolumn=1})(ModuleName“Main”)[]无任何内容(只是[EVar(UnQual(Ident“Main”))])[]PatBind(SrcLoc{srcFilename=“.hs”,srcLine=1,srcolumn=1})(PVar(Ident“Main”))无任何内容(App(Var(UnQual(Ident“putStrLn”)))(Lit(String“Hello”))))(cls[]))
Prelude Language.Haskell.Exts.Parser>parseModule“main==putStrLn\“Hello”
ParseFailed(SrcLoc{srcFilename=“.hs”,srcLine=1,srclumn=25})“TemplateHaskell未启用”
请注意,即使代码解析正确,也不意味着它将进行类型检查:

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 [])])
Prelude Language.Haskell.Exts.Parser>parseModule“main=putStrLn2\“Hello”
ParseOk(Module(SrcLoc{srcFilename=“.hs”,srcLine=1,srcolumn=1})(ModuleName“Main”)[]无任何内容(只是[EVar(UnQual(Ident“Main”)])][]PatBind(SrcLoc{srcFilename=“.hs”,srcLine=1,srcolumn=1})(PVar(Ident“Main”))无任何内容(App(Var(UnQual(Ident(Ident“putStrLn2”))(Lit(String“Hello”)))))(cls[]))
因此,对于您的特定用例,最好使用它,它还允许您键入已解析的代码,或者在您的文件上运行
ghc-c

对于解析C代码,有两种方法


如果您需要解析其他语言,请查看Hackage上的category。例如,.

请看一个明显的要点——“首先不要生成语法错误的程序”。Haskell中有许多EDSL的例子遵循这一格言。即使是遗传编程,你也应该能够生成有效的代码。@stephen tetley Hi。我有一个特定的理由允许不正确的程序。我对使用遗传编程生成解决特定问题的程序不感兴趣,但我对代码字符串的演变感兴趣。我只是想看看我是否能写一个适应度函数,让一个语法正确的程序从一群自我复制的随机字符串进化而来。这不是一个CS问题,但可能是一个理论生物学问题。看起来不太可能,但我还是想试试。:)另请参阅,以获得一种更简单的方法来连接GHCAPI。你知道这个软件包有什么好的文档/示例代码源吗?