1

我正在寻找解决此问题陈述的步骤/库/方法。

  1. 给定一个编程语言的源文件,我需要对其进行解析并将其细分为组件。

示例:给定一个 Java 文件,我需要在其中找到以下内容。

  1. 进口清单
  2. 里面的类
  3. 类中的属性
  4. 其中的方法 - 沿着参数(如果有)。等等

我需要提取这些并单独存储。为什么我想这样做?

  1. 我想在这些组件的顶部构建一个倒排索引。

对倒排索引的示例查询 1. 查找具有类名称的文件列表:示例 2. 查找变量 XXX 在 AAA 类中使用的位置。

我需要支持上述查询

所以,我的计划有一个文件,如果我从中构建这些组件,那么在它的顶部构建一个倒排索引会很容易。

示例:Sample -- Class - Sample.java(Keyword - Component - FileName ) 我想像上面那样构建一个倒排索引。

我看到它正在许多像 IntelliJ 这样的 IDE 中实现。我感兴趣的是构建这样的东西需要付出多少努力。我想尝试为至少一种语言实现相同的功能。

提前致谢。

4

1 回答 1

0

您可以尝试“只是”一个解析器;对于您的具体示例,这可能就足够了。

但是您需要为每种语言提供一个解析器。如果你只使用 Java,你可以很容易地找到 Java 解析器;只是重用一个,你重新发明一套语法规则来描述Java没有什么意义。

对于不止一种语言,这开始变得棘手。你可以:

  • 尝试为每种语言找到一个单独的解析器。这对于主流语言来说可能有点成功。当你接触到鲜为人知的语言时,这些会变得更难找到。如果你成功了,你就会遇到解析器可能是不兼容的技术的问题;现在将它们粘合在一起以共同收集您的索引信息将变得一团糟。
  • 选择一种解析技术并获取您关心的所有语言的语法。你只有两个现实的选择:YACC/Bison 和 ANTLR。作为一个实际问题,YACC 和 Bison 已被用于实现很多语言......但语法文件不是收集在一个地方,所以很难找到它们。ANTLR 至少有一个存储库,您可以在他们的网站上找到。所以这可能有点工作。

将所有这些组合成一个完整的整体将是相当大的努力。

一个复杂的问题是,您可能需要的不仅仅是原始语法;您可能想知道符号的含义,以及对于每个符号,确切地说它是在哪个文件中定义的。毕竟,您希望您的索引在规模上是准确的,这将需要将变量名 foo 与函数名 foo 区分开来。可以说你需要符号表。作为一般规则,这就是语言的纯解析失败的地方。解析后有严重的生命

在这种情况下,您需要一套用于从不同语言中提取信息的集成工具。

我们的DMS Software Reengineering Toolkit就是这样一个框架,并为它预定义了大约 40 种语言。我们使用类似 OP 建议的流程来为基于 DMS 的搜索工具构建代码库索引。构建像 DMS 这样的东西是一项巨大的工作。

于 2016-07-15T19:58:55.937 回答