Parsing Haskell Src Exts解析多个语句

Parsing Haskell Src Exts解析多个语句,parsing,haskell,ghc,ghci,haskell-src-exts,Parsing,Haskell,Ghc,Ghci,Haskell Src Exts,我想分析Haskell语句的列表。例如,假设我有以下代码: let a = b c = e out <- return 3 设a=b c=e 输出ParseResult Stmt,如果尝试parseStmt“let a=3”,则结果是成功的ParseOk。但是,如果提供多条语句,此函数会发出抱怨,因为字符串中有多条语句 如何解析多个语句,而不将它们包装在do块中?或者,如何在字符串中找到作为Haskell语句分隔符的位置,以便将它们分隔开来,然后从Haskell src exts

我想分析Haskell语句的列表。例如,假设我有以下代码:

let a = b
    c = e
out <- return 3
设a=b
c=e
输出ParseResult Stmt
,如果尝试
parseStmt“let a=3”
,则结果是成功的
ParseOk
。但是,如果提供多条语句,此函数会发出抱怨,因为字符串中有多条语句

如何解析多个语句,而不将它们包装在
do
块中?或者,如何在字符串中找到作为Haskell语句分隔符的位置,以便将它们分隔开来,然后从
Haskell src exts
中使用
parseStmt


谢谢

您正在查找
parseExp
,尽管输出有点大:

> :m + Language.Haskell.Exts.Parser
> parseExp "do\n  let a = b\n      c = e\n  out <- return 3\n  return $ a + c + out"
ParseOk (Do [LetStmt (BDecls [PatBind (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 2, srcColumn = 7}) (PVar (Ident "a")) Nothing (UnGuardedRhs (Var (UnQual (Ident "b")))) (BDecls []),PatBind (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 3, srcColumn = 7}) (PVar (Ident "c")) Nothing (UnGuardedRhs (Var (UnQual (Ident "e")))) (BDecls [])]),Generator (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 4, srcColumn = 3}) (PVar (Ident "out")) (App (Var (UnQual (Ident "return"))) (Lit (Int 3))),Qualifier (InfixApp (Var (UnQual (Ident "return"))) (QVarOp (UnQual (Symbol "$"))) (InfixApp (InfixApp (Var (UnQual (Ident "a"))) (QVarOp (UnQual (Symbol "+"))) (Var (UnQual (Ident "c")))) (QVarOp (UnQual (Symbol "+"))) (Var (UnQual (Ident "out")))))])
:m+Language.Haskell.Exts.Parser

>parseExp“不要让a=b\n c=e\n out我不认为haskell src exts
提供了一个现成的函数来做你想做的事情,所以不管怎样,你都必须编写一些自己的解析代码。也就是说,并不是所有的东西都丢了。您可能需要对haskell src exts本身进行黑客攻击,以暴露它的一些内部构件,但这应该不太难——如果您已经熟悉它使用的任何解析技术(alex/happy,我想?),则需要花费数小时的工作才能得到一些像样的东西,或者如果您必须学习解析技术,则需要加倍努力,也是


我敢肯定,为了使这类事情更简单,软件包中的一些补丁也会受到欢迎。

我认为这是一个解决方案,但它需要添加一个
do
,在末尾添加一个
return
,并缩进
do
的所有内容。这是可行的(明白吗?
-able?),但有点难看,并且希望有更好的解决方案。@AndrewGibiansky您想解析正确的haskell源代码,对吗?如果没有正确缩进并添加return语句,则无法从中构造AST。你想简单地将代码解析成比AST更不正式的结构吗?@AndrewGibiansky我不太熟悉使用这个库,但看起来你可以使用
Language.Haskell.Exts.Lexer
模块中的
lexTokenStream
函数,它会将代码转换成令牌,但与之合作可能仍然很难。这看起来像是一个镜头的工作。我想我会继续使用这个黑客。我需要这个来解析我给GHCi提供的东西。给定一个文本块,我需要提取语句,将它们分开,然后将每个语句提供给GHCi进行评估——为此,我需要能够将语句分开。谢谢