我对Parsec的一个常见问题是,如果它出现在“正确”的位置,它往往会忽略无效输入。
作为一个具体的例子,假设我们有integer :: Parser Int
,我写了
expression = sepBy integer (char '+')
(暂时忽略空白问题。)
这正确解析类似“123 + 456 + 789”的内容。但是,如果我喂它“123 + 456-789”,它会愉快地忽略非法的“ - ”字符和表达式的尾部;我实际上想要一条错误消息告诉我有关无效输入的信息,而不仅仅是让它无声地忽略该部分。
我理解为什么会发生这种情况;我不确定的是如何解决它。设计使用所有提供的输入的解析器的一般方法是什么?只有当所有它是一个有效的表达式时才能成功?
答案 0 :(得分:28)
实际上非常简单 - 只需确保它后跟eof
:
parse (expression <* eof) "<interactive>" "123+456-789"
eof
匹配输入的结尾,即使输入只是一个字符串而不是文件。
显然,这只适用于解析器的顶层。