Java 在抽象语法树中搜索特定节点

Java 在抽象语法树中搜索特定节点,java,abstract-syntax-tree,Java,Abstract Syntax Tree,我试图在AST抽象语法树中搜索特定节点。基本思想是: 有一个从源代码解析的AST,它包含大约10000个节点。 我想在AST中搜索50个项目的列表。 问:在AST中搜索这50个项目的最佳方式是什么 现在,我正在考虑使用包含这50项的Arraylist。然后,遍历AST并使用循环将每个节点与Arraylist进行比较。就性能而言,这是个好主意吗?我希望手术快点完成。还有其他方法可以解决这个问题吗?我不会使用Arralylist,因为它需要您每次扫描它,这只是开销。您可以编写50个谓词作为p1或p2

我试图在AST抽象语法树中搜索特定节点。基本思想是:

有一个从源代码解析的AST,它包含大约10000个节点。 我想在AST中搜索50个项目的列表。 问:在AST中搜索这50个项目的最佳方式是什么


现在,我正在考虑使用包含这50项的Arraylist。然后,遍历AST并使用循环将每个节点与Arraylist进行比较。就性能而言,这是个好主意吗?我希望手术快点完成。还有其他方法可以解决这个问题吗?

我不会使用Arralylist,因为它需要您每次扫描它,这只是开销。您可以编写50个谓词作为p1或p2或。。。。同样容易

您可以搜索树一次,应用50个谓词来确定是否有感兴趣的节点,也可以搜索树50次,在每个单独的过程中应用一个谓词。在这两种情况下,您都必须运行谓词,因此它们不会以任何方式更改下面的成本注释

如果搜索一次,则需要或同时搜索50个谓词的答案,需要49个or,因此额外的成本是49*[或的成本][节点数]。如果搜索-50,则额外成本为49[访问树节点的成本]*[节点数]。因此,问题是or的成本是否小于访问树节点的成本。或者在大多数机器上速度相当快,因为它只使用可能已经在缓存中的寄存器和值。访问树节点可能非常快,但可能需要几个指令;更糟糕的是,它触及了记忆。如果您的树足够大,无法放入缓存,那么如果谓词便宜的话,您的搜索50成本可能主要取决于内存访问时间

现在,我们可以用一些有趣的方式作弊。首先,可能是谓词之间有一些关系;如果谓词A暗示谓词B,我可以先检查B,如果为false,我不必测试A。这可以减少or的数量,但对树访问没有帮助。第二,谓词可能共享子测试,例如谓词A实际上是a1和a2,而B实际上是a1和a2;在这种情况下,您可以对谓词进行因子分析,并减少对子谓词的求值次数;每个节点只需计算a1一次。用多重扫描技术做这件事并不容易。可能是某些谓词失败意味着不需要搜索子树;在这里,50次搜索可能会更快,因为每次搜索只会检查必要的子树,其中搜索一次几乎需要搜索到所有谓词都认为是停止点的节点

但是,对于每个谓词,您的程序可能希望做出不同的反应。所以你的程序结构实际上是一组if p1node然后是a1node。如果谓词便宜且触发频率相对较高,那么操作的主要成本可能比导航树节点的成本更高,那么这两种技术在性能方面都很好


最后,如果谓词和操作很复杂,您可能无法轻松猜出哪一个更便宜。很好,编码两种搜索并不是那么难,而是在真实数据上进行测量。

循环是首字母缩写吗?如果是的话,它代表什么?我想他的意思是使用forloop。你能描述一下你想搜索的50个项目吗?他们之间有什么联系吗?