16

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

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

expression = sepBy integer (char '+')

(暂时忽略空白问题。)

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

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

4

1 回答 1

33

它实际上很简单——只要确保它后面跟着eof

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

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

显然,这只在解析器的顶层才有意义。

于 2013-04-25T07:58:09.150 回答