Parsing 解析编程语言并识别其组件

Parsing 解析编程语言并识别其组件,parsing,inverted-index,code-search-engine,Parsing,Inverted Index,Code Search Engine,我正在寻找解决这个问题的步骤/库/方法 给定一个编程语言的源文件,我需要解析它并将其细分为组件 例如: 给定一个Java文件,我需要在其中找到以下内容 进口清单 课程在其中 类中的属性 方法-沿参数(如果有)。 等等 我需要提取这些并单独存储。 我想做这件事的原因是什么 我想在这些组件的顶部建立一个反向索引 反向索引的示例查询 1.查找类名为Sample的文件列表 2.查找AAA类中使用变量XXX的位置 我需要支持像上面这样的查询 所以,我的计划是给一个文件,如果我从中构建这些组件,那么在上面构

我正在寻找解决这个问题的步骤/库/方法

  • 给定一个编程语言的源文件,我需要解析它并将其细分为组件
  • 例如: 给定一个Java文件,我需要在其中找到以下内容

  • 进口清单
  • 课程在其中
  • 类中的属性
  • 方法-沿参数(如果有)。 等等
  • 我需要提取这些并单独存储。 我想做这件事的原因是什么

  • 我想在这些组件的顶部建立一个反向索引
  • 反向索引的示例查询 1.查找类名为Sample的文件列表 2.查找AAA类中使用变量XXX的位置

    我需要支持像上面这样的查询

    所以,我的计划是给一个文件,如果我从中构建这些组件,那么在上面构建一个反向索引就很容易了

    示例:Sample--Class-Sample.java(关键字-Component-FileName) 我想建立一个像上面那样的反向索引

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

    提前感谢。

    您可以尝试“仅”使用解析器来完成此操作;对于您的特定示例,这可能就足够了

    但是每种语言都需要一个解析器。如果你坚持只使用Java,你可以很容易地找到Java解析器;只要重用一个,就没有必要再创造一组语法规则来描述Java

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

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

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

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

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

    您可以尝试“仅仅”通过解析器来实现这一点;对于您的特定示例,这可能就足够了

    但是每种语言都需要一个解析器。如果你坚持只使用Java,你可以很容易地找到Java解析器;只要重用一个,就没有必要再创造一组语法规则来描述Java

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

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

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

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

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