【问题标题】:Parsing a Programming Language and Identifying Components of it解析编程语言并识别它的组件
【发布时间】:2016-04-22 16:24:33
【问题描述】:

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

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

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

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

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

  1. 我想在这些组件之上构建一个倒排索引。

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

我需要支持上述查询

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

示例:示例——类——Sample.java(关键字——组件——文件名) 我想建立一个像上面那样的倒排索引。

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 2016-11-24
      • 2011-01-23
      • 1970-01-01
      相关资源
      最近更新 更多