【问题标题】:Source of parsers for programming languages?编程语言解析器的来源?
【发布时间】:2011-02-03 14:57:06
【问题描述】:

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

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

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

【问题讨论】:

  • 有处理许多不同语言的语法高亮库(想到 pygments)。我想知道其中一个是否会为您的案件提供足够的信息。我怀疑不是,但可能值得一看。

标签: parsing antlr code-metrics parser-generator


【解决方案1】:

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

后果:使用单一形式或共享基础定义的语言定义库很少。 ANTLR 人群维护着更大的集合之一恕我直言,尽管据我所知,这些解析器中的大多数都不具备生产能力。总是有 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 恰好也计算您正在讨论的指标类型,因为它为代码库编制索引,几乎与您描述的方式一样,除了它有这些语言准确的词法分析器可供使用。

【讨论】:

  • 艾拉,感谢您的精彩回答! DMS Software Reengineering Toolkit 看起来更像是我正在尝试做的更大(更深思熟虑,更少关注指标)版本。唔。您提到 PHP 很有趣,因为这正是促使我决定需要一个真正的解析器的原因。如果我可能会问,如果我决定为多种语言编写自己的解析器,您有什么建议吗? (再说一遍,看看 Semantic Designs 网站,编写这样一系列解析器的策略可能会接近商业机密!如果是这样,请忽略这个问题。)
  • 我们不做任何保密的事情。轻松编写解析器的策略是获得最强大的解析技术(GLR),最精确的语言定义(PHP 很糟糕地未能通过这个测试),编写语法并通过它来查找失败的数百万行代码。真正的问题只是汗水。即使采用这种策略,每种语言也需要花费大量精力。构建 DMS 的目的是避免为每种新语言重复公共基础架构(在我决定构建 DMS 之前,我已经做了 25 年这种事情)。
【解决方案2】:

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

【讨论】:

  • gcc-xml 不会提供关于函数体的任何信息,只是声明。当您只看到函数标题时,很难获得有用的指标。​​
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多