【问题标题】:Parsec or happy (with alex) or uu-parsinglibParsec 或 happy (with alex) 或 uu-parsinglib
【发布时间】:2013-01-24 06:29:12
【问题描述】:

我将编写一个verilog(或vhdl)语言的解析器,并对解析的数据进行大量操作(某种转换)。我打算解析非常大的文件(完整的 Verilog 设计,大至 10K 行),我最终将支持大部分 Verilog。我不介意打字,但我不想在添加对其他规则的支持时重写代码的任何部分。

在 Haskell 中,您会推荐哪个库?我知道 Haskell 并且之前使用过 Happy(玩)。我觉得使用 Parsec 来转换代码中的解析字符串是有可能的(这是一个很大的优势)。我没有使用 uu-paringlib 的经验。

那么要解析verilog/VHDL 的完整语法,推荐使用哪一个?我主要关心的是我可以随心所欲地操纵解析数据的易用性和“正确性”。速度不是主要问题。

【问题讨论】:

  • 这是一个庞大的项目。 Verilog 解析器非常复杂。
  • 是的,确实如此。支持 verilog 的某些部分足以表明我希望在博士期间使用 verilog。但即使在我获得博士学位后,我也想继续这样做。所以这是一项非常长期的投资。我想知道 Haskell 是否符合要求。我喜欢这种语言。
  • 那么,你最后做了什么?您对自己的选择满意吗?
  • 你的意思是BNFC包吗? hackage.haskell.org/package/BNFC
  • 是的.. 这个包还带有一个可执行命令。真的很好。

标签: parsing haskell parsec happy uu-parsinglib


【解决方案1】:

我个人更喜欢 Parsec 在 Alex 的帮助下进行词法分析。

我更喜欢 Parsec 而不是 Happy,因为 1) Parsec 是一个库,而 Happy 是一个程序,如果您使用 Happy 然后用 Happy 编译,您将使用不同的语言编写。 2) Parsec 凭借其一元接口为您提供上下文相关的解析能力。您可以使用额外的状态进行上下文相关的解析,然后根据该状态进行检查和决定。或者只是在之前查看一些解析值并决定下一个解析器等(如a <- parseSomething; if test a then ... do ...)当您不需要任何上下文相关信息时,您可以简单地使用应用样式并获得类似在 YACC 或类似的工具。

作为 Parsec 的一个缺点,您永远不会知道您的 Parsec 解析器是否包含左递归,并且您的解析器将在运行时卡住(因为 Parsec 基本上是一个自上而下的递归下降解析器)。你必须找到左递归并消除它们。 YACC 风格的解析器可以为您提供一些静态保证和信息(如移位/减少冲突、未使用的终端等),这些是 Parsec 无法获得的。

强烈建议 Alex 在这两种情况下进行词法分析(如果您决定继续使用 Happy,我认为您必须使用 Alex)。因为即使您使用 Parsec,它也确实简化了您的解析器实现,并且也捕获了大量错误(例如:将关键字解析为标识符是我在没​​有 Alex 的情况下使用 Parsec 时遇到的常见错误。这只是一个示例)。

你可以看看我在 Alex+Parsec 中实现的 Lua parser 这里是 code to use Alex-generated tokens in Parsec

编辑:感谢John L 的更正。显然,您也可以使用 Happy 进行上下文相关解析。此外,Happy 中不需要 Alex 进行词法分析,但建议这样做。

【讨论】:

  • 感谢您分享您的 Lua 解析器。亲眼目睹 Alex 会很有帮助,而不仅仅是文档中的一些玩具示例。
  • 这个答案中关于快乐的很多细节都是错误的。 Happy 支持上下文相关解析(因为解析器可以在任意 monad 中运行)。 Happy 不需要 Alex,您可以使用任何词法分析器。您甚至可以直接在 Happy 中进行词法分析,尽管不建议这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多