如何写一个lint?
在我的日常工作中,我和团队中的其他人在Verilog-AMS中编写了许多硬件模型,这种语言主要由商业供应商和一些开源模拟器项目支持。
可以使相互支持的代码更有用的一件事是LINTER,它可以检查我们的代码中是否存在常见问题,并有助于实施共享代码格式样式。
我当然希望能够添加自己的规则,并在向自己证明其实用性之后,将其推广给团队的其他成员。
我不介意做必须要做的工作,但是当然也想利用其他现有项目的工作。
以yacc或者野牛格式使用允许的语言语法是否对我有帮助?
还是我应该将每个语言语句都吸收到一个perl字符串中,并使用模式匹配来查找我不喜欢的东西?
(大多数语法和编译错误很容易被商用工具捕获。.但是我们有一些自己的扩展。)
解决方案
回答
在尝试找到答案时,我发现在ANTLR上可能有用
回答
如果我们完全使用Java(因此也使用IDEA),则可能会使用自定义语言的IDE扩展
回答
yacc
/bison
肯定会给我们带来帮助,因为良好的棉绒需要分析程序。正则表达式(至少是真正的正则表达式)可能涵盖了一些琐碎的情况,但是很容易编写与正则表达式不匹配但风格仍然很差的代码。
回答
ANTLR似乎是更常见的YACC / BISON方法的替代方法(我之前听说过),事实证明它也通常使用LEX / FLEX作为前端。
快速阅读FLEX手册页让我觉得它可能是该正则表达式类型的框架。
好吧..我让它炖一会儿,然后看看我能以多快的速度在一个或者另一个中构建原型解析器。
还有一点点
回答
lex / flex和yacc / bison提供了易于使用,易于理解的lexer和解析器生成器,我真的建议这样做,而不是像在程序中那样做。 Perl。正则表达式对于将具有相对固定但不是完全固定的结构的字符串分开来是很有用的。对于任何真正的编程语言,除了Real Lexer / Parser(tm)之外的任何东西,状态机的大小都变得根本无法管理。想象一下处理诸如Verilog AMS之类的关键字,标识符,运算符,多余的括号,多余的分号和注释的所有可能的交织,而仅使用正则表达式和过程代码。
不可否认那里有一个实质性的学习曲线,但是编写一个可用于flex和bison的语法,并对bison产生的语法树做一些有用的事情,比起编写大量的特殊情况下的字符串处理代码,更自然的是首先使用语法树来处理。另外,我们学到的以这种方式编写的内容将真正地扩展技能,而这将不会编写一堆骇人的Perl代码,因此,如果我们有能力,我强烈建议我们;-)
另外,如果我们很懒惰,请查看Eclipse插件,该插件为Verilog和VHDL进行语法高亮显示和基本重构。上次我检查了一下,它们处于非常原始的状态,但是它们可能包含我们要查找的某些代码,或者至少包含一些基准代码,以更好地指导我们滚动自己的方法。
回答
我已经编写了几个Verilog解析器,如果我们最喜欢的编程语言是C / C ++ / Java,我建议PCCTS / ANTLR。我们可以从PCCTS / ANTLR Verilog语法开始。我最喜欢的解析器生成器是Zebu,它基于Common Lisp。
当然,最重要的工作是指定所有起毛规则。也可以使用某种语言来指定起毛规则。
回答
不要低估了皮棉机的工作量。解析是最简单的部分,因为我们有工具(野牛,flex,ANTLR / PCCTS)可以使其中的大部分自动化。
但是一旦有了解析,那又如何呢?我们必须为设计构建语义树。根据输入的复杂程度,我们必须详细说明Verilog-AMS设计(即解析参数,展开生成等。如果使用这些功能)。只有这样,我们才能尝试执行规则。
在编写linter之前,我会认真考虑其他可能的解决方案,除非用户数量和潜在的时间节省可以证明开发时间是合理的。