我正在清理我的一个旧项目,该项目计算有关大型软件项目的许多简单指标。指标之一是文件/类/方法的长度。目前,我的代码“猜测”类/方法边界的位置基于非常粗略的算法(遍历文件,维护“当前深度”,并在遇到未加引号的括号时调整它;当您返回到类或方法开始的级别时,认为它已退出)。然而,此过程存在许多问题,并且检测深度何时发生变化的“简单”方法并不总是有效。
为了使其给出准确的结果,我需要使用规范的方式(在每种语言中)来检测函数定义、类定义和深度变化。这相当于编写一个简单的解析器来生成至少包含我希望项目适用的每种语言的这些元素的解析树。
显然,以前已经为所有这些语言编写了解析器,因此似乎我不必重复这项工作(尽管编写解析器很有趣)。是否有一些开源项目为一堆源语言收集现成的解析器库?或者我应该使用 ANTLR 从头开始制作自己的?(注意:我很高兴将该项目移植到另一种语言,以利用现有的优秀资源,因此,如果您知道其中一种资源,那么它是用什么语言编写的并不重要。)
如果您想要语言精确的解析,特别是面对宏和预处理器条件等语言复杂性,您需要完整的语言解析器。这些实际上需要大量的工作来构建,并且大多数语言都不能很好地适应周围各种类型的解析器生成器。大多数语言解析器的作者对其他语言也不感兴趣。他们倾向于选择一些解析器生成器,这些生成器在开始时显然不是一个巨大的障碍,为他们想要的特定目的实现解析器,然后继续前进。
结果:很少有语言定义库是使用单一形式主义或共享基础定义的。 ANTLR 人群维护着较大的集合之一,恕我直言,尽管据我所知,大多数解析器都没有完全的生产能力。总是有 Bison,它已经存在了足够长的时间,所以你会期望在某个地方收集一个语言定义库,但我从未见过它。
在过去的 15 年里,我一直在定义程序分析和转换的基础机制,并构建了另一个这样的库,称为DMS 软件再造工具包 http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html。它具有适用于 C、C++、C#、Java、COBOL(IBM 企业版)、JCL、PHP、Python 等的生产质量解析器。您的意见当然可能与我的不同,但这些解析器每天与 DMS 一起使用来执行大规模更改任务在大量代码上。
我不知道还有其他任何语言定义集是成熟的并且构建在单一基础上的......IBM 的编译器可能就是这样的一个集,但 IBM 不提供机器或语言定义。
如果您想做的只是计算简单的指标,那么您可能可以只使用词法分析器和临时嵌套计数(如您所描述的)。即使在大多数情况下使其正常工作也比看起来更困难(查看 Python、Perl 和 PHP 的疯狂字符串语法)。总而言之,即使只是定义一个准确的词法分析器,C 语言的工作量也令人惊讶:我们有几千行复杂的正则表达式来涵盖您在 Microsoft 和/或 GNU C 中找到的所有奇怪的词素。
由于 DMS 为许多语言提供了一致定义的成熟解析器,因此 DMS 也为相同语言提供了一致定义的成熟词法分析器。我们实际上构建了一个源代码搜索引擎 (SCSE) http://www.semanticdesigns.com/Products/SearchEngine它提供了对多种语言的大量代码的快速搜索,其工作原理是对遇到的语言进行词法分析并对这些词素进行索引以进行快速查找。 SCSE 恰好也计算您正在讨论的指标类型,因为它索引代码库,几乎按照您描述的方式,只是它有这些语言准确的词法分析器可供使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)