8

我正在清理我的一个旧项目,它计算了一些关于大型软件项目的简单指标。指标之一是文件/类/方法的长度。目前我的代码“猜测”其中类/方法边界基于非常粗略的算法(遍历文件,保持“当前深度”并在遇到不带引号的括号时对其进行调整;当您返回到类或方法开始的级别时,认为它已退出)。但是,此过程存在许多问题,并且检测深度何时发生变化的“简单”方法并不总是有效的。

为了得到准确的结果,我需要使用规范的方式(在每种语言中)检测函数定义、类定义和深度变化。这相当于编写一个简单的解析器来为我希望我的项目适用的每种语言生成至少包含这些元素的解析树。

显然,之前已经为所有这些语言编写过解析器,所以看起来我不应该重复这项工作(即使编写解析器很有趣)。 是否有一些开源项目为一堆源语言收集现成的解析器库?或者我应该只是使用 ANTLR 从头开始​​制作我自己的? (注意:我很高兴将项目移植到另一种语言以利用现有的大量资源,因此,如果您知道其中一种,那么它是用哪种语言编写的并不重要。)

4

2 回答 2

6

如果您想要语言准确的解析,尤其是面对宏和预处理器条件等语言复杂性,您需要完整的语言解析器。这些实际上需要大量的工作来构建,并且大多数语言都不能很好地适应周围的各种解析器生成器。大多数语言解析器的作者也对其他语言不感兴趣。他们倾向于选择一些在他们开始时显然不是一个巨大障碍的解析器生成器,为他们想要的特定目的实现他们的解析器,然后继续前进。

结果:使用单一形式或共享基础定义的语言定义库很少。ANTLR 人群维护着更大的集合之一恕我直言,尽管据我所知,这些解析器中的大多数都不具备生产能力。总是有 Bison,它已经存在了足够长的时间,所以你会期望在某个地方收集一个语言定义库,但我从未见过。

在过去的 15 年中,我一直在为程序分析和转换定义基础机制,并构建了另一个这样的库,称为DMS 软件再工程工具包。它具有适用于 C、C++、C#、Java、COBOL(IBM 企业版)、JCL、PHP、Python 等的生产质量解析器。您的意见当然可能与我的不同,但这些解析器每天都与 DMS 一起用于执行大规模更改任务在大量代码上。

我不知道其他任何语言定义集成熟并建立在单一基础上的...可能是 IBM 的编译器就是这样一个集合,但 IBM 不提供机器或语言定义。

如果您只想计算简单的指标,那么您可能只使用词法分析器和临时嵌套计数(如您所描述的)。即使在大多数情况下,这也比看起来更难让它正常工作(查看 Python、Perl 和 PHP 的疯狂字符串语法)。总而言之,即使是 C 也需要大量工作来定义一个准确的词法分析器:我们有数千行复杂的正则表达式来涵盖您在 Microsoft 和/或 GNU C 中发现的所有奇怪的词位。

因为 DMS 对许多语言都有一致定义的、成熟的解析器,所以 DMS 对相同的语言也有一致的定义、成熟的词法分析器。我们实际上构建了一个源代码搜索引擎 (SCSE),它通过对遇到的语言进行词法分析并对这些词位进行索引以进行快速查找,从而在多种语言的大量代码中提供快速搜索。SCSE 恰好也计算您正在讨论的指标类型,因为它索引代码库,几乎与您描述的方式一样,除了它有这些语言准确的词法分析器可供使用。

于 2010-04-02T03:56:39.727 回答
2

如果您正在解析 C++ ,您可能对gcc-xml感兴趣。Java CUP具有 Java 语言的语法。

于 2010-04-02T03:17:51.777 回答