【问题标题】:Algorithm's name - matching subtrees in ASTs算法名称 - 匹配 AST 中的子树
【发布时间】:2011-06-16 12:01:00
【问题描述】:

我有一组 S 的“小”树 S[i] 我需要在更大的树中找到它们的位置 它们用作模式以在更大的T。在我开始构造 T(这是一个解析树)之前,我知道 S,所以我正在考虑使用 cutting-plane 方法 来匹配节点(因为解析器生成CST)。

S 中的树与 T 的 AST 不同 - 考虑一下 XPath 与 XML - S 包含 XPath 的树表示,而 T 是源代码的实际 AST -我需要iT 的匹配节点向量之间的映射。

但是我不确定我将使用的算法的名称。

基本上我知道我想做什么,感觉就像一个“divide et impera for trees”,在我复制的 LALR 解析器的每一个转变中,我都有一个堆栈来保存可能的候选匹配堆栈的顶部并从S[i] 中消除候选人i,这无论如何都不会匹配,并且在减少之后我从堆栈中弹出。一开始S的所有成员都是可能的候选人。

请注意:这只是关于 AST,ASG 是另一回事......

附录

这是一个解析树T

解析函数将知道我称之为“树路径”的列表,以规范的形式,也表示为树,存储在S 中。但它们看起来不像分析树,它们有自己的语言来表示,类似于 XPath。

获取所有返回值为变量的函数的树路径示例:

function[body[return[expr[@type="variable"]]]]]
  1. 那么我应该在现有文献中寻找什么?
  2. 还有其他建议吗?
  3. 是否已经有可以像这样查询元注释树的语言?一个开源的 C(不是 C++)库是理想的。

【问题讨论】:

  • 这听起来像tiling,有时用于编译器中的指令选择。标准编译器书籍应该涵盖它。但是,如果您有 S[i] 子树和 T 子树的特定示例以及预期的输出,则可能更容易给您一个好的答案。更新:实际上它听起来也像很多其他 PL 技术:模式匹配和函数式语言中的类型推断/统一。或者 Prolog 子句选择....很多 PL 工作是树匹配。
  • 请看我的编辑。 XPath -> XML 类比应该更清楚。
  • 我会画点东西,任何阅读此内容的人:不要急于回答,书签:D
  • 完成,看图,会提示重新阅读整个问题,其中有一些重要的编辑。

标签: algorithm parsing programming-languages compiler-theory


【解决方案1】:

1) 您作为 XPath 的 S 树对应于一些 T 树。为什么不提前构造 T 树,然后进行模式匹配呢?

2) 如果你想将一个模式与一个结构进行匹配,你可以想象将模式编译成某种状态机,当匹配的树的给定部分时,它会转换。如果状态机曾经进入接受状态,那么您已经找到了匹配项。如果您有多个模式,则每个模式都可以视为状态机,您可以“并行”运行它们(通过模拟)。为了提高效率,计算所有状态机的叉积;现在只有一个,每个输入只发生一个转换。这个想法我称之为“模式产品”,你会在各种高效匹配器中看到类似的东西。与您想要做的最接近的是Rete Algorithm,它会在输入的数据发生变化时跟踪哪些“模式”是实时的。

【讨论】:

    【解决方案2】:

    可能值得研究一下 JXPath:http://commons.apache.org/jxpath/ 我不确定您的目标是什么语言,但可能值得一试。

    无论如何,如果我必须尝试实现类似的东西,我的第一个冲动就是找到一种方法来“序列化”两棵树,并将问题简化为简单的字符串匹配。

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 2011-12-18
      • 1970-01-01
      • 2017-12-23
      • 2022-08-23
      • 2021-02-25
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      相关资源
      最近更新 更多