【问题标题】:What are the reasons for using parser combinators?使用解析器组合器的原因是什么?
【发布时间】: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,编译时 guaranteeselimination 运行时错误的一些好处。或者当您启动 parsing DSLs and using 免费 monads 时的一些后续好处。

我的问题是:使用解析器组合器的原因是什么?

【问题讨论】:

  • 因为数据往往是分层结构的,所以你可以为某个子元素编写一个解析器,然后构建一个级联的解析器,每个解析器做一个部分的拼图? IE。对于 XML 解析器,首先是解析属性值的解析器,然后是使用前一个解析器解析 key="value" 的解析器,然后重复该解析器以解析任意数量的键/值对,然后解析标签,然后解析标签层次结构等。
  • 我认为您可以重用库函数,并且与基于 BNF 的方法不同,您不仅限于上下文无关语法。
  • 谢谢-您能否将其扩展为答案?
  • 我想你可以在这里找到答案:softwareengineering.stackexchange.com/questions/338665/…

标签: parsing haskell parser-combinators


【解决方案1】:

我看到了使用解析器组合器的几个好处:

  • 解析器组合器是手写自上而下解析器的泛化。如果您手动编写解析器,请使用解析器组合器来抽象出常见的模式。
  • 与解析器生成器不同,解析器组合器可能是动态的,允许在运行时做出决策。如果可以根据输入重新定义语言的语法,这方面可能会很有用。
  • 解析器是一流的对象。

【讨论】:

    猜你喜欢
    • 2012-06-28
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2021-03-16
    • 2011-01-11
    相关资源
    最近更新 更多