24

在我的日常工作中,我和团队中的其他人用 Verilog-AMS 编写了很多硬件模型,这是一种主要由商业供应商和一些开源模拟器项目支持的语言。让相互支持代码更有帮助的一件事是 LINTER,它可以检查我们的代码是否存在常见问题,并协助执行共享代码格式样式。我当然希望能够添加自己的规则,并且在我证明它们对自己有用之后,将它们推广给团队的其他成员。我不介意做必须完成的工作,但当然也希望利用其他现有项目的工作。

拥有 yacc 或 bison 格式的允许语言语法是否可以帮助我?还是我应该将每个语言语句吸进一个 perl 字符串,然后使用模式匹配来查找我不喜欢的东西?

(大多数语法和编译错误很容易被商业工具捕获。但我们有一些自己的扩展。)

4

7 回答 7

19

lex/flex 和 yacc/bison 提供了易于使用、易于理解的词法分析器和解析器生成器,我真的建议您这样做,而不是在例如 Perl 中按程序进行。正则表达式是一种强大的东西,可以用来分割具有相对但不是完全固定结构的字符串。使用任何真正的编程语言,您的状态机的大小将变得无法使用 Real Lexer/Parser (tm) 之外的任何东西进行管理。想象一下,仅使用正则表达式和过程代码来处理 Verilog AMS 等允许的关键字、标识符、运算符、无关括号、无关分号和注释的所有可能交错。

不可否认,那里有相当长的学习曲线,但是编写一个可用于 flex 和 bison 的语法,并在来自 bison 的语法树上做一些有用的事情,将比编写一个更好地利用你的时间大量特殊情况的字符串处理代码,首先使用语法树更自然地处理。此外,您以这种方式编写它所学到的东西将真正拓宽您的技能组合,而编写一堆骇人听闻的 Perl 代码则不会,因此,如果您有能力,我强烈推荐它;-)

此外,如果您很懒惰,请查看为 Verilog 和 VHDL 进行语法突出显示和基本重构的 Eclipse 插件。它们处于令人难以置信的原始状态,我上次检查过,但它们可能有一些你正在寻找的代码,或者至少有一段基线代码可供查看,以便更好地了解你自己滚动的方法。

于 2008-09-19T05:50:49.373 回答
2

我写了几个verilog解析器,如果你最喜欢的编程语言是C/C++/Java,我会推荐PCCTS/ANTLR。您可以从PCCTS/ANTLR Verilog 语法开始。我最喜欢的解析器生成器是基于 Common Lisp的Zebu 。

当然,最重要的工作是指定所有的 linting 规则。使用某种语言来指定 linting 规则也是有意义的。

于 2008-11-16T21:23:48.810 回答
2

不要低估进入 linter 的工作量。解析是很容易的部分,因为您有工具(bison、flex、ANTLR/PCCTS)来自动化大部分内容。

但是一旦你有了解析,然后呢?您必须为设计构建语义树。根据输入的复杂程度,您必须详细说明 Verilog-AMS 设计(即解析参数、展开生成等。如果您使用这些功能)。只有这样,您才能尝试执行规则。

在编写 linter 之前,我会认真考虑其他可能的解决方案,除非用户数量和潜在的时间节省由此证明开发时间是合理的。

于 2009-06-15T18:20:35.013 回答
0

在试图找到我的答案时,我在ANTLR上找到了这个- 可能有用

于 2008-09-16T09:29:20.980 回答
0

如果您完全使用 Java(因此使用 IDEA),则可能会使用IDE 的自定义语言扩展

于 2008-09-16T09:30:15.563 回答
0

yacc/bison绝对可以帮助您,因为良好的 linting 需要解析程序。正则表达式(至少是真正的正则表达式)可能涵盖琐碎的情况,但是很容易编写正则表达式不匹配但仍然是糟糕风格的代码。

于 2008-09-16T09:30:17.467 回答
0

ANTLR 看起来是更常见的(好吧,我之前听说过)YACC/BISON 方法的替代路径,事实证明它也通常使用 LEX/FLEX 作为前端。

快速阅读 FLEX 手册页让我觉得它可能是那种正则表达式类型想法的框架。

好的..我会让这个炖久一点,然后看看我能多快地在其中一个或另一个中构建一个原型解析器。

再长一点

于 2008-09-16T10:14:11.510 回答