前页 后页

Code Miner查询语言(mFQL)

Code Miner系统提供对现有源代码中信息的快速,全面访问。通过解析所有源代码并将生成的抽象语法树(AST)存储在经过读取优化的数据库中,系统以机器可理解的格式提供了对原始源代码各方面的完整访问。

该系统的核心目标是及时有效地访问隐藏在源代码中的数据。在提供尽可能简单的接口的同时,竭尽全力确保最大的性能。结果,该系统可用于分析程序结构,计算指标,跟踪关系,甚至执行重构。

mFQL

mFQL是Code Miner的查询语言。语言本身相当简单,只提供少量命令。语言很简单,它支持任意大小和复杂度的查询。该设计为所有查询(无论大小)都提供了出色的性能。

语言是基于集合的;它主要对通过离散垂直索引获得的抽象数据集进行操作。就我们的目的而言,集合是有序的数字数组,每个数字都是指向AST存储中的节点的指针。离散垂直索引提供了一种通过离散值检索集的机制。

该语言包括三个基本的集合连接操作。它们是“相交”,“联合”和“除外”。更准确地说,“除外”联接是“对称差异”联接。可以通过使用简短的子查询来实现“互补”联接。这在“除外”联接文档中有详细说明。此处还详细讨论了“ offsetIntersect”连接。

Code Miner数据库在其AST存储中提供了三个离散的垂直索引。这些索引是“节点名称”,“属性名称”和“属性值”。可以为每个垂直索引查询一个离散值,该离散值将返回存在该值的所有节点的集合。使用函数“ getByNode”,“ getByName”和“ getByValue”分别查询三个垂直索引。

集合“遍历例程”提供了根据AST中的模式过滤集合的机制。遍历例程是破坏性的(移动)或非破坏性的(过滤器)。破坏性遍历修改设置的成员值以指向目标节点。非破坏性遍历可确保目标节点存在。在这两种情况下,都将删除无法完成遍历的节点。

请注意,mFQL中的所有遍历都是向上的。向下遍历在技术上很复杂,因为一个节点可以有任意数量的子节点。相反,向上遍历要简单得多,每个节点都有零个或一个父节点。由于这些原因,查询语言不支持向下遍历。

尽管mFQL中的操作数量很少,但是该语言能够表达非常细粒度和复杂的查询。该语言在设计上具有功能,并支持任意嵌套调用。

mFQL查询以闪电般的速度执行。后端数据库是专为读取性能而设计的。查询解析器是手动优化的。知道它始终具有纯有序集,因此低级代码采用了几种快捷方式来以最小的工作量执行连接。

为了有效地使用nBNF,必须掌握目标语言的使用知识,以及对用于解析它的语法的深入了解。

学到更多