Parsec:消耗所有输入

时间:2013-04-25 07:55:28

标签: haskell parsec

我对Parsec的一个常见问题是,如果它出现在“正确”的位置,它往往会忽略无效输入。

作为一个具体的例子,假设我们有integer :: Parser Int,我写了

expression = sepBy integer (char '+')

(暂时忽略空白问题。)

这正确解析类似“123 + 456 + 789”的内容。但是,如果我喂它“123 + 456-789”,它会愉快地忽略非法的“ - ”字符和表达式的尾部;我实际上想要一条错误消息告诉我有关无效输入的信息,而不仅仅是让它无声地忽略该部分。

我理解为什么会发生这种情况;我不确定的是如何解决它。设计使用所有提供的输入的解析器的一般方法是什么?只有当所有它是一个有效的表达式时才能成功?

1 个答案:

答案 0 :(得分:28)

实际上非常简单 - 只需确保它后跟eof

parse (expression <* eof) "<interactive>" "123+456-789"

eof匹配输入的结尾,即使输入只是一个字符串而不是文件。

显然,这只适用于解析器的顶层。