Parsec如何优化between组合子的错误提示信息
解决方案
你遇到的错误提示冗余问题,根源是many $ char '.'解析器会默认把.加入到任意位置的期望符号列表中,包括输入已经到末尾、仅能补充]的场景。
仅需用Parsec内置的<?>标签覆盖不需要的错误提示即可,无需修改现有逻辑结构,也可以完整保留between组合子的使用:
import Text.Parsec.String (Parser) import Control.Applicative hiding ((<|>)) import Text.ParserCombinators.Parsec hiding (many) inBracketsP :: Parser [String] -- 仅修改了两处<?>标签 inBracketsP = (many $ between (char '[') (char ']' <?> "]") (many (char '.') <?> "")) <* eof main :: IO () main = putStr $ show $ parse inBracketsP "" "[...][..."
原理说明
<?>操作符可以自定义解析失败时显示的期望内容:
- 把
many (char '.')的期望内容设为空字符串,就不会在错误提示里显示多余的期望.的内容 - 为闭合方括号解析器显式指定期望提示为
],保证错误提示只展示有效内容
修改后运行的输出结果完全符合预期:
Left (line 1, column 10): unexpected end of input expecting ']'
内容的提问来源于stack exchange,提问作者Dawid Łakomy
相关产品推荐
相关产品推荐

