当ReadP
用于解析语法时,我注意到解析器经常会呈指数形式。大多数情况下,我最终会确定问题是由的错误使用引起的skipSpaces
,尽管我不确定确切的时间是什么时候发生的。用ReadP解析时处理可选空间的正确方法是什么?
我见过的最常见的处理空格的技术是让每个令牌立即消耗紧随其后的空白。
如下所示的便捷组合器可以帮助解决此问题:
tok p = p <* spaces
例如,以下组合器定义:
adt d = Adt <$> between (string "#(") (char ')') (sepBySpaced ctor (char '|')) = ...
将被写为:
adt d = Adt <$> between (tok $ string "#(") (tok $ char ')') (sepBySpaced ctor (tok $ char '|')) = ...
唯一需要注意的是,您必须确保在输入开始时删除/跳过任何空白区域。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句