解析编程语言并识别它的组成部分

时间:2016-01-17 13:22:17

标签: parsing inverted-index code-search-engine

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

  1. 鉴于编程语言的源文件,我需要解析它并将其细分为组件。
  2. 实施例: 给定一个Java文件,我需要在其中找到以下内容。

    1. 进口清单
    2. 其中的课程
    3. 班级中的属性
    4. 其中的方法 - 沿着参数(如果有的话)。 等。
    5. 我需要提取这些并将其单独存储。 原因我为什么要这样做?

      1. 我想在这些组件的顶部构建一个倒置索引。
      2. 对反向索引的示例查询 1.找到具有类名称的文件列表:Sample 2.找到在AAA类中使用变量XXX的位置。

        我需要支持上述

        之类的查询

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

        示例:示例 - 类 - Sample.java(关键字 - 组件 - FileName) 我想构建一个像上面这样的反向索引。

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

        提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

将所有这些组合成一个整体的努力将会非常努力。

一个复杂的问题是,您可能需要的不仅仅是原始语法;您可能想知道符号的含义,并且对于每个符号,确切地知道在哪个文件中定义它的位置。毕竟,您希望您的索引在大小上是准确的,这将需要区分foo变量名称和foo函数名称。可以说你需要符号表。 作为一般规则,这是纯语言分解的地方; 有严重的Life After Parsing

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

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