了解Parsec

时间:2018-02-09 17:10:41

标签: haskell parsec

我对SourceNameparse函数中Parsec的含义有疑问。似乎我阅读的所有书籍/博客/教程都跳过了它的内容并使用"stdin""(stdin)"或任意字符串,例如"test parser"。指定为SourceName的是什么?

我试图阅读Parsec的{​​{3}},似乎它用于创建一个位置。但是为什么它是什么来源(确实是String)。听起来我在大多数情况下不需要担心它。

提前致谢!

1 个答案:

答案 0 :(得分:2)

在Parsec中,SourceNameString,用于生成错误消息。在REPL中,这不是很重要:

λ> parse expression "<stdin>" ")"
Left "<stdin>" (line 1, column 1):
unexpected ")"
expecting expression

如果我们使用的是"foo"而不是"<stdin>",那么会改为:

Left "foo" (line 1, column 1):
unexpected ")"
expecting expression

在编写将多个文件作为输入的程序(如编译器或解释器)时,这非常有用。例如,在我的翻译中,我有以下功能:

runFile :: FilePath -> IO ()
runFile path = do code  <- readFile path
                  start <- prelude
                  evalString path start code >>= putStrLn

这里我将path - 你正在运行的文件的路径 - 传递给解析表达式的函数。这样,错误消息将告诉您哪个文件具有解析错误以及行号。

λ> runFile "/Users/tikhon/tmp/foo.tpl"
Error: "/Users/tikhon/tmp/foo.tpl" (line 1, column 1):
unexpected ')'
expecting expression or end of input!