Haskell 解析器分隔符
Haskell Parser Seperator
我正在使用 Parsec 为日志文件编写解析器。该日志文件的每一行都遵循一个共同的结构 A:B:C:D
,组件 A、B、C 和 D 遵循简单的规则。我已经为每个组件编写了解析器,我想将它们组合成一个解析器。我目前的方法有效,但我觉得必须有更好的解决方案。一个直接的缺点是它不能很好地扩展超过 4 个组件的日志文件。
parser :: (a -> b -> c -> d -> e) -> Parser a -> Parser b -> Parser c -> Parser d -> Parser e
parser f pa pb pc pd = f <$> pa <* (char ':') <*> pb <* (char ':') <*> pc <* (char ':') <*> pd
我搜索了一个合适的解析器组合器,但唯一接近的组合器是 sepBy
,它不适用于此用例。感谢您的帮助!
我认为最好的选择是引入你自己的操作符,例如:
infixl 4 <:>
p <:> q = p <* char ':' <*> q
那你就不用单独定义parse
函数了,直接写实现就好了:
myParser = f <$> pa <:> pb <:> pc <:> pd
这很容易扩展:
myParser2 = g <$> pa <:> pb <:> pc <:> pd <:> pe
我正在使用 Parsec 为日志文件编写解析器。该日志文件的每一行都遵循一个共同的结构 A:B:C:D
,组件 A、B、C 和 D 遵循简单的规则。我已经为每个组件编写了解析器,我想将它们组合成一个解析器。我目前的方法有效,但我觉得必须有更好的解决方案。一个直接的缺点是它不能很好地扩展超过 4 个组件的日志文件。
parser :: (a -> b -> c -> d -> e) -> Parser a -> Parser b -> Parser c -> Parser d -> Parser e
parser f pa pb pc pd = f <$> pa <* (char ':') <*> pb <* (char ':') <*> pc <* (char ':') <*> pd
我搜索了一个合适的解析器组合器,但唯一接近的组合器是 sepBy
,它不适用于此用例。感谢您的帮助!
我认为最好的选择是引入你自己的操作符,例如:
infixl 4 <:>
p <:> q = p <* char ':' <*> q
那你就不用单独定义parse
函数了,直接写实现就好了:
myParser = f <$> pa <:> pb <:> pc <:> pd
这很容易扩展:
myParser2 = g <$> pa <:> pb <:> pc <:> pd <:> pe