- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将编写一个 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/
我想做以下事情: import StringIO, uu my_data = StringIO.StringIO() # this is a file-like object uu.encode(in
我需要一个 Parser () 类型的值,它将在空(长度为 0)输入时成功(并返回 ()),而在所有其他情况下失败。 pSatisfy (const False) 没有完全满足要求。 pEnd 甚至不
问题 今天遇到一个问题,不知道怎么解决。这对我来说很奇怪,因为我写的代码应该(根据我目前的知识)是正确的。 因此,您可以在下面找到示例解析器组合器。最重要的是pOperator ,它以非常简单的方式(
我遇到以下问题,但尚未找到最佳解决方案。假设我有一个具有以下值的整数: int 毫秒 = 65111; 我想使用 printf() 函数将其打印到流中。有什么办法可以做到以下几点: printf("时
我想使用 uu.encode() 对文件进行编码方法并在脚本中使用编码文本。为此,我必须将该输出写入文件,默认情况下 uu.encode(input_file, output_file) 需要输出文件
让我们看一下代码片段: pSegmentBegin p i = pIndentExact i *> ((:) p i ((pEOL *> pSegment p i) pure [])) 如果
这是此功能分支的当前状态。 最近的步骤: 远程开发分支分散 已获取远程开发分支 stash 我想要保留的本地功能分支的分歧更改 基于本地开发分支的功能分支 stash pop 功能分支更改 stash
我想创建一个解析器组合器,它将收集当前位置以下的所有行,缩进级别将大于或等于 i .我认为这个想法很简单: 使用一行 - 如果它的缩进是: 好的 -> 为下一行做 错误 -> 失败 让我们考虑以下代码
问题 我知道Parsec和 uu-parsinglib我已经在他们两个中编写了解析器。最近发现uu-parsinglib有问题,这可能会显着影响其性能,我看不到解决方法。 让我们考虑以下 Parsec
是否可以: 在 Haskell 中使用 uu-parsinglib 抛出自定义解析器错误? (我特别想打印带有位置信息的自定义错误消息) 自定义向用户显示错误的方式? 以某种方式控制自动更正在何处发生
我的网络应用程序使用谷歌 javascript 客户端 API,但从昨天开始它就不能工作了。 Firefox 控制台中出现错误消息,如:TypeError: _.Uu is not a functio
我正在 Fedora(版本 20)中安装 OpenDAP。 OpenDAP 依赖于 UUID,因此我安装了 uuid-devel 及其依赖项。当我编译OpenDAP时,遇到以下错误: DODSFilt
我正在测量一些 curl 请求,我使用了 microtime(true)。示例输出为 3.1745569706 这是 3.1745569706 秒。我想将其转换为更易读的格式,比方说 00:00:03
我将编写一个 verilog(或 vhdl)语言的解析器,并对解析的数据进行大量操作(某种转换)。我打算解析非常大的文件(完整的 Verilog 设计,大至 10K 行),并且我最终将支持大多数 Ve
我想用 C 代码而不是 "hwclock" shell 命令来传达从我的 RTC 读取的信息。 但是,当我使用 i2cdetect 时,它显示 0x68(这是我的 RTC 从地址)的状态为 "UU",
我在包含德语特殊字符 Ää、Öö、Üü、ß 的实时链接中有文档和文件夹。我使用 LiveLink API 服务器版本 9.2.0.0 和客户端版本 API 版本 LiveLink 9.5.0.0 的以
如何在不将该文件添加到下一次提交的情况下解决 UU( merge 冲突)。 例如,我刚刚挑选了一个提交到另一个分支并且存在 merge 问题。我解决了 merge 问题并希望将 UU readme.t
我正在尝试在 Raspberry pi 上安装 AODV 协议(protocol)。当我尝试执行“make”时,从“https://github.com/erimatnor/aodv-uu”完成 gi
我是一名优秀的程序员,十分优秀!