算法的名称 - AST中的匹配子树

时间:2011-06-16 12:01:00

标签: algorithm parsing programming-languages compiler-theory

我有一组S的“小”树S[i] 我需要在更大的 中找到它们的位置,这些 用作查找的模式在较大的T中匹配子树。在我开始构建S(这是一个解析树)之前我知道T,所以我正在考虑使用切割平面方法来匹配节点(当解析器生成CST时。

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

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

基本上我知道自己想要做什么,感觉就像是一个“除了et impra for trees”,它有一个堆栈,我可以在那里找到匹配的候选者,在LALR解析器的每个班次我复制堆栈的顶部并从i中消除候选S[i],无论如何都不会匹配,并且在减少之后我从堆栈中弹出。起初,S的所有成员都是可能的候选人。

请注意:这只是AST,ASG是另一个故事......

附录

这是一个解析树T

T - the parse tree

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

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

S
  1. 那么我应该在现有文献中寻找什么?
  2. 还有其他任何建议吗?
  3. 是否已有可以查询元注释树的语言?一个开源的C(而不是C ++)库是理想的。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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