要学习如何编写和解析上下文无关语法,我想选择一个工具。对于 Haskell,有两个大选项:Happy,它从语法描述生成解析器和 *Parsec,它允许您直接在 Haskell 中编写解析器。
两种方法的(缺点)优点是什么?
最佳答案
外部与内部 DSL
Happy 的解析器规范格式是外部 DSL,而使用 Parsec,您可以在定义解析器时使用 Haskell 的全部功能。这意味着您可以编写函数来生成解析器,使用 Template Haskell 等等。
优先规则
使用 Happy,您可以使用 precedences为了简化您的语法,而使用 Parsec 您必须自己正确嵌套语法规则。因此,在 Parsec 中更改运算符的优先级要繁琐得多。
静态检查
Happy 会在编译时警告您语法中的歧义。 (虽然它不能很好地告诉您它们在哪里。)使用 Parsec,您不会收到任何警告,直到您的解析器在运行时失败。
关于parsing - 与使用解析器组合器相比,使用快乐之类的解析器生成器有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7269025/