与使用解析器组合器相比,使用像happy一样的解析器生成器有什么好处?

fuz*_*fuz 27 parsing haskell parsec parser-generator happy

要学习如何编写和解析无上下文语法,我想选择一个工具.对于Haskell,有两个很大的选项:Happy,它从语法描述中生成解析器,以及*Parsec,它允许您直接在Haskell中编写解析器代码.

这两种方法的(dis)优势是什么?

ham*_*mar 23

外部与内部DSL

Happy的解析器规范格式是外部DSL,而使用Parsec,您在定义解析器时可以使用Haskell的全部功能.这意味着您可以编写函数来生成解析器,使用Template Haskell等.

优先规则

使用Happy,您可以使用优先级来简化语法,而使用Parsec,您必须自己正确地嵌套语法规则.因此,在Parsec中更改运算符的优先级会更加繁琐.

静态检查

Happy会在编译时警告你语法的模糊性.(虽然告诉你它们在哪里并不好.)使用Parsec,在解析器在运行时失败之前,你不会收到任何警告.

  • `Text.ParserCombinators.Parsec.Expr`中的`buildExpressionParser`为你做了表达式语法嵌套. (13认同)

Ing*_*ngo 5

这是传统的决定:我使用 lex/yacc (快乐)还是编写自己的(主要是递归下降)解析器,只是 parsec 库就像一个 DSL 一样可以正确完成它。

如果您有 yacc/lex 方法的经验,那么使用 happy 将是一个更小的学习曲线。