2013-04-25 60 views
14

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

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

expression = sepBy integer (char '+') 

(忽略了片刻空白的问题。)

这正确解析像 “123 + 456 + 789”。然而,如果我喂它“123 + 456-789”,它愉快地忽略了非法的“ - ”字符和表达的尾部;我实际上想要一个错误消息告诉我关于无效输入的信息,而不仅仅是让它默默地忽略那个部分。

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

回答

26

这其实很简单 - 只要确保它的后面eof

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

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

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