我正在清理我的一个旧项目,它计算了一些关于大型软件项目的简单指标。其中一个指标是文件/类/方法的长度。目前我的代码“猜测”类/方法边界基于一个非常粗略的算法(遍历文件,保持“当前深度”并在遇到不带引号的括号时调整它;当你返回到关卡时,类或方法开始于,考虑退出)。但是,这个程序存在许多问题,并且检测深度变化的“简单”方法并不总是有效。
为了使这个结果准确,我需要使用检测函数定义,类定义和深度变化的规范方法(在每种语言中)。这相当于编写一个简单的解析器来生成解析树,该解析树至少包含我希望我的项目适用的每种语言的这些元素。
显然之前已经为所有这些语言编写了解析器,所以看起来我不应该重复这种努力(即使编写解析器很有趣)。 是否有一些开源项目为一堆源语言收集现成的解析器库?或者我应该只是使用ANTLR从头开始创建自己的东西?(注意:我很高兴将项目移植到另一种语言以利用现有的资源,所以如果你知道一个,那么它无论写什么语言都无所谓。)
答案 0 :(得分:6)
如果您需要语言准确的解析,尤其是面对语言复杂性(如宏和预处理器条件),则需要完整的语言解析器。这些实际上构建起来相当多,而且大多数语言都不适合各种各样的解析器生成器。大多数语言分析器的作者也不会对其他语言感兴趣;他们倾向于选择一些解析器生成器,当它们启动时显然不是一个巨大的障碍,为他们想要的特定目的实现解析器,然后继续前进。
后果:使用单一形式主义或共享基础定义的语言定义库很少。 ANTLR人群维持着较大的集合IMHO之一,尽管据我所知,大多数解析器都不具备生产能力。 Bison总是存在很长时间,所以你希望在某个地方收集一个语言定义库,但我从来没有见过。
我花了15年时间为程序分析和转换定义基础机器,并建立另一个名为DMS Software Reengineering Toolkit的库。它具有适用于C,C ++,C#,Java,COBOL(IBM企业版),JCL,PHP,Python等的生产质量解析器。您的意见当然可能与我的不同,但每天都与DMS一起使用以执行批量更改任务在大量代码上。
我不知道其他任何一套语言定义是否成熟并构建在一个基础上......可能是IBM的编译器就是这样一个集合,但是IBM没有提供机器或者语言定义。
如果您只想计算简单的指标,那么您可能只能使用词法分析器和临时嵌套计数(如您所述)。在大多数情况下,甚至比它看起来更难以正常工作(查看Python,Perl和PHP疯狂的字符串语法)。当所有的事情都说完了,即使是C也只是为了定义一个准确的词法分析器而做了大量的工作:我们有几千行复杂的正则表达式来涵盖你在Microsoft和/或GNU C中找到的所有奇怪的词法。
由于DMS具有针对多种语言的一致定义的成熟解析器,因此DMS始终为相同的语言定义了成熟的词法分析器。我们实际上构建了一个Source Code Search Engine (SCSE),它提供了跨多种语言的大量代码的快速搜索,这些代码通过使用它所遇到的语言并将这些词汇编入索引来快速查找。 SCSE恰好计算了你正在讨论的指标类型,因为它为代码库编制索引,就像你描述的方式一样,除了它有这些语言准确的词法分析器可供使用。
答案 1 :(得分:2)