如何编写一个代码检查工具?

25
在我的工作中,我和团队中的其他人经常使用Verilog-AMS编写大量硬件模型。这是一种由商业供应商和一些开源模拟器项目主要支持的语言。 有一件事情会更有帮助,那就是使用 Linter 检查我们的代码是否存在常见问题,并协助强制执行共享代码格式样式。当然,我希望能够添加自己的规则,并在向团队证明其实用性后推广使用这些规则。我不介意做必须要做的工作,但当然也希望利用现有项目的工作成果。
在 yacc 或 bison 格式中允许语法的话,这是否能够给我一个优势?还是应该将每个语言语句嵌入 perl 字符串中,使用模式匹配来查找我不喜欢的内容?
(大多数语法和编译错误都可以轻松地被商业工具捕捉到... 但我们有一些自己的扩展。)
7个回答

19
lex/flex和yacc/bison提供易于使用、广为人知的词法分析器和语法分析器生成器,我强烈建议您使用它们而不是在例如Perl中以过程化方式处理。正则表达式对于相对固定但不是完全固定结构的字符串进行拆分非常有用。对于任何真正的编程语言,除了使用真正的词法分析器/语法分析器之外,状态机的大小会变得难以管理。想象一下处理Verilog AMS之类允许关键字、标识符、运算符、多余括号、多余分号和注释之间所有可能的交错时,仅使用正则表达式和过程化代码就已经无法胜任。
毫无疑问,存在着相当大的学习曲线,但编写一个您可以在flex和bison中使用的语法,以及对bison输出的语法树执行一些有用操作,比编写大量特殊情况的字符串处理代码要好得多,因为这些特殊情况本来就更适合使用语法树来处理。此外,采用这种方式编写的内容将真正扩展您的技能范围,而编写一堆Perl代码则不会,因此如果您有条件,我非常推荐这样做 ;-)
此外,如果您懒得自己写,可以看看Eclipse插件,它们为Verilog和VHDL提供语法高亮和基本重构。据我上次检查所知,它们处于非常原始的状态,但它们可能具有您正在寻找的某些代码,或者至少具有一个基准代码供您参考,以更好地指导您自己的方法。

2
我写过一些Verilog解析器,如果你喜欢的编程语言是C/C++/Java,我建议使用PCCTS/ANTLR。你可以从PCCTS/ANTLR Verilog语法开始。我最喜欢的解析器生成器是基于Common Lisp的Zebu
当然,重要的工作是指定所有的linting规则。制定一些语言来指定linting规则也是有意义的。

2
不要低估代码检查器所需的工作量。解析很容易,因为你有工具(bison、flex、ANTLR/PCCTS)可以自动化大部分内容。但是一旦你有了一个解析结果,接下来呢?你必须为设计构建一个语义树。根据你的输入有多复杂,你必须详细阐述 Verilog-AMS 设计(例如解决参数、展开生成等)。只有在此之后才能尝试实施规则。除非用户数量和潜在节省时间足以证明开发时间的价值,否则我会认真考虑其他可能的解决方案,而不是编写代码检查器。

阿门。请访问http://www.semanticdesigns.com/Products/DMS/DMSToolkit了解超越仅仅解析的通用分析机器。DMS用于构建定制工具。即便如此,为VerilogAMS构建Linter仍将是一项相当大的任务。 - Ira Baxter

0

在寻找答案时,我在ANTLR上找到了这个 - 可能会有用


0

我的“IDE”是Cadence Library Manager + Nedit,具有(内置的)Verilog语法高亮功能,我添加了自己的模式以支持Verilog-A和Verilog-AMS。对于我正在进行的工作类型,我不认为Java有太多价值。 - jbdavid

0

yacc/bison 绝对能让你事半功倍,因为好的 linting 需要解析程序。正则表达式(至少是真正的正则表达式)可能可以处理一些微不足道的情况,但很容易写出无法匹配的代码,但仍然是糟糕的风格。


0

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

快速阅读FLEX手册让我想到它可能是那种正则表达式类型思想的框架..

好的..我会再让这个想法酝酿一段时间,然后看看我能多快地在其中一个中构建原型解析器。

再等一会儿。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接