如何正确处理ReadP上的可选空格?

时间:2015-11-03 11:21:18

标签: algorithm parsing haskell

使用ReadP解析语法时,我注意到解析器经常是指数级的。大多数时候,我最终发现问题是由skipSpaces的一些不良用法引发的,尽管我不确定究竟发生了什么。使用ReadP解析时,处理可选空格的正确方法是什么?

1 个答案:

答案 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 '|')) = ...

唯一需要注意的是,您必须确保在输入开始时删除/跳过任何空格。