使用ReadP
解析语法时,我注意到解析器经常是指数级的。大多数时候,我最终发现问题是由skipSpaces
的一些不良用法引发的,尽管我不确定究竟发生了什么。使用ReadP解析时,处理可选空格的正确方法是什么?
答案 0 :(得分:4)
我见过处理空间的最流行的技巧是让每个令牌立即占用空白区域。
如下所示的便利组合器可以帮助解决这个问题:
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 '|')) = ...
唯一需要注意的是,您必须确保在输入开始时删除/跳过任何空格。