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,在解析器在运行时失败之前,你不会收到任何警告.
这是传统的决定:我使用 lex/yacc (快乐)还是编写自己的(主要是递归下降)解析器,只是 parsec 库就像一个 DSL 一样可以正确完成它。
如果您有 yacc/lex 方法的经验,那么使用 happy 将是一个更小的学习曲线。