2010-04-02 89 views
8

我正在掸掉我的一个旧项目,该项目计算大量关于大型软件项目的简单度量标准。其中一个指标是文件/类/方法的长度。目前,我的代码“猜测”类/方法边界基于非常粗糙的算法(遍历文件,保持“当前深度”并在遇到未引用的括号时对其进行调整;当您返回到级别时,类或方法开始,考虑退出)。然而,这个程序存在很多问题,而且检测深度变化的“简单”方法并不总是有效。编程语言解析器的来源?

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

很明显,解析器已经为所有这些语言编写过,所以看起来我不应该重复这种努力(即使编写解析器很有趣)。 是否有一些开源项目为一系列源语言收集了即用解析器库?还是应该使用ANTLR从头开始创建自己的?(注:我会很高兴,以港口项目到另一种语言来利用一个伟大的现有的资源,因此,如果您知道的,所以无所谓什么语言它用)。

+1

有语法高亮库(想到pygments)处理许多不同的语言。我想知道他们中的一个是否会为您的案例提供足够的信息。我怀疑不是,但它可能值得一看。 – Ken 2010-04-02 15:03:56

回答

6

如果您想要进行语言准确的语法分析,特别是面对诸如宏和预处理器条件语言等复杂语言时,您需要完整的语言分析器。实际上这些构建工作非常多,大多数语言都不能很好地适应各种各样的解析器生成器。语言解析器的大多数作者也不喜欢其他语言;他们倾向于选择一些解析器生成器,它们在启动时显然不是一个巨大的障碍,为他们打算的特定目的实现解析器,然后继续前进。

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

我已经花了15年时间来定义用于程序分析和转换的基础机器,并且构建了另一个这样的库,称为DMS Software Reengineering Toolkit。它具有用于C,C++,C#,Java,COBOL(IBM Enterprise版本),JCL,PHP,Python等的生产质量分析器。您的意见当然可能因我而异,但这些日常与DMS一起使用来执行批量更改任务在大量代码上。

我不知道任何其他语言定义是否成熟并且建立在单一基础之上......可能是IBM的编译器是这样一个集合,但是IBM不提供这些机器或语言定义。如果你只想计算简单的度量标准,你可能只能使用词法分析器和ad hoc计数(正如你所描述的那样)。即使这比在大多数情况下使它正常工作更困难(请查看Python的,Perl和PHP的疯狂字符串语法)。当所有事情都说完之后,甚至C为了定义一个精确的词法分析器也是一项惊人的工作:我们有几千行复杂的正则表达式来涵盖您在Microsoft和/或GNU C中找到的所有陌生词汇。

由于DMS为多种语言提供了一致定义的,成熟的解析器,因此DMS一致定义了相同语言的成熟词法分析器。我们实际上构建了一个Source Code Search Engine (SCSE),它提供了多种语言的大型代码体快速搜索,通过搜索它所遇到的语言并对这些词法进行索引来快速查找。 SCSE恰好可以计算出你正在讨论的指标的类型,因为它索引代码库的方式与您描述的方式非常相似,只是它有这些语言准确的词法分析器可供使用。

+0

艾拉,谢谢你的一个迷人的答案! DMS Software Reengineering Toolkit看起来更像是一个我想要做的更大(更深思熟虑,更少指标)的版本。嗯。 有趣的是,你提到PHP,因为这正是让我决定需要一个真正的解析器。 如果我可能会问,如果我决定为几种语言编写我自己的解析器,您有任何建议吗? (再看看语义设计网站,编写这样一系列解析器的策略可能会接近商业秘密!如果是这样,请忽略这个问题。) – Arkaaito 2010-04-02 18:45:13

+1

我们不会做任何秘密的事情。轻松编写解析器的策略是获得最强大的解析技术(GLR),最精确的语言定义(PHP未能完成此测试),编写语法,并通过查找数百万行代码来查找失败。真正的问题只是汗水。即使采用这种策略,每种语言也需要耗费大量精力。构建DMS的关键是避免为每种新语言重复使用通用基础架构(在我决定构建DMS之前,我已经做了25年这样的事情)。 – 2010-04-02 20:25:17

2

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

+0

gcc-xml不会给出关于函数体的任何信息,只是声明。当你只看到函数头时很难获得有用的指标。 – 2011-11-07 08:17:39