我是Haskell和Parsec的新手.在阅读了第16章使用真实世界Haskell的Parsec之后,我脑子里出现了一个问题:为什么以及何时Parsec比Yacc/Bison/Antlr等其他解析器生成器更好?
我的理解是Parsec创建了一个很好的编写解析器的DSL,而Haskell使它非常容易和富有表现力.但解析是一种标准/流行的技术,值得使用自己的语言,输出到多种目标语言.那么我们何时应该使用Parsec而不是从Bison/Antlr生成Haskell代码呢?
这个问题可能会超越技术,进入行业实践领域.从头开始编写解析器时,与Bison/Antlr或类似的东西相比,拾取Haskell/Parsec有什么好处?
顺便说一句:我的问题与这个问题非常相似,但在那里没有得到令人满意的回答.
"愉快"的含义,例如:你可以以"自然"的方式编写语法而不必以复杂的方式重写它们,而不必引入枯燥的样板.
让我们为这个问题的目的规定,除非技术性能在病理上是坏的,否则性能不是最重要的问题.
尽管如此,你可能想提一下,当出于性能原因而不得不重写语法时,技术是否会失败.
在回答这个问题时,请让我了解你曾经使用的语法的大小和复杂性.此外,您是否使用了相关技术的任何值得注意的"高级"功能,以及您对这些功能的印象.
当然,这个问题的答案可能取决于领域,在这种情况下,我很乐意了解这一事实.
Haskell中有许多可供我们使用的开源解析器实现.Parsec似乎是文本解析的标准,而attoparsec似乎是二进制解析的流行选择,但除此之外我不太了解.是否存在选择解析器实现的特定决策树?您是否了解过有关图书馆优势或劣势的任何有趣内容?
要学习如何编写和解析无上下文语法,我想选择一个工具.对于Haskell,有两个很大的选项:Happy,它从语法描述中生成解析器,以及*Parsec,它允许您直接在Haskell中编写解析器代码.
这两种方法的(dis)优势是什么?
我将编写一个verilog(或vhdl)语言的解析器,并将对解析数据进行大量操作(某种转换).我打算解析真正的大文件(完整的Verilog设计,大到10K行),我最终会支持大部分的Verilog.我不介意输入,但每当我添加对其他规则的支持时,我不想重写代码的任何部分.
在Haskell,你会推荐哪个图书馆?我知道Haskell并且之前使用过Happy(玩).我觉得有可能使用Parsec来转换代码中的解析字符串(这是一个很好的加分).我没有使用uu-paringlib的经验.
那么要解析verilog/VHDL的全语法,推荐其中一个?我主要担心的是我可以随心所欲地操纵解析数据的简易性和"正确性".速度不是主要问题.