1

Haskell ステートメントのリストを解析したいと思います。たとえば、次のコードがあるとします。

let a = b
    c = e
out <- return 3

たとえばparseStmts、これを解析された形式で返すことができる関数が欲しいです。

私は調べてhaskell-src-exts見ましたparseStmt。これは、単一のステートメントに対して機能します。型parseStmt :: String -> ParseResult Stmtがあり、試してみるとparseStmt "let a = 3"結果は成功ParseOkです。ただし、複数のステートメントを指定すると、文字列に複数のステートメントがあるため、この関数はエラーを出します。

do複数のステートメントをブロックにラップせずに解析するにはどうすればよいですか? または、Haskell ステートメントの区切りである文字列内の場所を見つけるにはどうすればよいparseStmtですhaskell-src-extsか?

ありがとう!

4

2 に答える 2

2

を探しています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")))))])

を最後に追加する必要がありました。そうしないと、有効なブロックreturn $ a + c + outと見なされないため、エラーがスローされます。do

于 2013-10-11T20:00:57.030 に答える