如果您想要语言准确的解析,尤其是面对宏和预处理器条件等语言复杂性,您需要完整的语言解析器。这些实际上需要大量的工作来构建,并且大多数语言都不能很好地适应周围的各种解析器生成器。大多数语言解析器的作者也对其他语言不感兴趣。他们倾向于选择一些在他们开始时显然不是一个巨大障碍的解析器生成器,为他们想要的特定目的实现他们的解析器,然后继续前进。
结果:使用单一形式或共享基础定义的语言定义库很少。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 恰好也计算您正在讨论的指标类型,因为它索引代码库,几乎与您描述的方式一样,除了它有这些语言准确的词法分析器可供使用。