gpt4 book ai didi

parsing - Parsec 或 happy (与 alex) 或 uu-parsinglib

转载 作者:行者123 更新时间:2023-12-02 09:00:22 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

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

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

关于parsing - Parsec 或 happy (与 alex) 或 uu-parsinglib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14773440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com