为了学习如何编写和解析上下文无关的语法,我想选择一个工具。对于Haskell,有两个很大的选择: Happy和*Parsec,前者从语法描述生成解析器,后者允许您在Haskell中直接编写解析器。
这两种方法的(不)优点是什么?
发布于 2011-09-01 21:18:08
外部与内部数字用户线路
Happy的解析器规范格式是一个外部DSL,而使用Parsec,您可以在定义解析器时使用Haskell的全部功能。这意味着你可以写一些函数来生成解析器,使用模板Haskell等等。
优先级规则
使用Happy,您可以使用precedences来简化语法,而使用Parsec,您必须自己正确地嵌套语法规则。因此,在Parsec中,更改运算符的优先级要繁琐得多。
静态检查
Happy会在编译时警告你语法中的歧义。(尽管它不能很好地告诉您它们在哪里。)使用Parsec,直到解析器在运行时失败,您才会得到任何警告。
发布于 2011-09-01 19:06:56
这是一个传统的决定:我是使用lex/yacc (愉快的)还是我自己编写(主要是递归下降的)解析器,只是parsec库就像是一个DSL来做正确的事情。
如果有使用yacc/lex方法的经验,使用happy将是一个较小的学习曲线。
发布于 2011-09-01 19:13:37
在我看来,Parsec隐藏了大部分令人讨厌的语法细节,让您可以更直观地编写解析器。如果你想从一开始就学习这些东西,可以使用像Happy这样的解析器生成器(甚至可以自己实现一个)。
https://stackoverflow.com/questions/7269025
复制相似问题