使用解析器组合器的原因是什么?

What are the reasons for using parser combinators?

我正在查看 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, compile-time guarantees, elimination of runtime errors. Or some subsequent benefit when you starting parsing DSLs and using 个免费单子的一些好处。

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

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

  • 解析器组合器是手写自上而下解析器的概括。在您手写解析器的情况下,使用解析器组合器来抽象掉常见的模式。
  • 与解析器生成器不同,解析器组合器可能是动态的,允许在运行时进行决策。如果可以根据输入重新定义语言的语法,则此方面可能很有用。
  • 解析器首先是 class 个对象。