【发布时间】:2017-12-06 11:11:58
【问题描述】:
我正在查看 following approach 在 Haskell 中使用解析器组合器。作者给出了以下 Parser Combinators 的例子:
windSpeed :: String -> Maybe Int
windSpeed windInfo =
parseMaybe windSpeedParser windInfo
windSpeedParser :: ReadP Int
windSpeedParser = do
direction <- numbers 3
speed <- numbers 2 <|> numbers 3
unit <- string "KT" <|> string "MPS"
return speed
作者对这种做法给出以下理由:
- 易于阅读(我同意这一点)
- 与规范类似的格式,即解析器本身基本上是对其解析内容的描述(我同意这一点)
我不禁觉得我错过了选择解析器组合器的一些原因。 using Haskell,编译时 guarantees,elimination 运行时错误的一些好处。或者当您启动 parsing DSLs and using 免费 monads 时的一些后续好处。
我的问题是:使用解析器组合器的原因是什么?
【问题讨论】:
-
因为数据往往是分层结构的,所以你可以为某个子元素编写一个解析器,然后构建一个级联的解析器,每个解析器做一个部分的拼图? IE。对于 XML 解析器,首先是解析属性值的解析器,然后是使用前一个解析器解析
key="value"的解析器,然后重复该解析器以解析任意数量的键/值对,然后解析标签,然后解析标签层次结构等。 -
我认为您可以重用库函数,并且与基于 BNF 的方法不同,您不仅限于上下文无关语法。
-
谢谢-您能否将其扩展为答案?
标签: parsing haskell parser-combinators